[jboss-svn-commits] JBL Code SVN: r18452 - labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Feb 10 21:22:36 EST 2008


Author: KrisVerlaenen
Date: 2008-02-10 21:22:36 -0500 (Sun, 10 Feb 2008)
New Revision: 18452

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/ThreadedWorkingMemoryFileLogger.java
Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/WorkingMemoryFileLogger.java
Log:
JSR-1462: Improve audit to support realtime auditing

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/ThreadedWorkingMemoryFileLogger.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/ThreadedWorkingMemoryFileLogger.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/ThreadedWorkingMemoryFileLogger.java	2008-02-11 02:22:36 UTC (rev 18452)
@@ -0,0 +1,52 @@
+package org.drools.audit;
+
+import org.drools.WorkingMemory;
+import org.drools.audit.event.LogEvent;
+
+public class ThreadedWorkingMemoryFileLogger extends WorkingMemoryFileLogger {
+    
+    private int interval = 1000;
+    private Writer writer;
+    
+    public ThreadedWorkingMemoryFileLogger(WorkingMemory workingMemory) {
+        super(workingMemory);
+        setSplit(false);
+    }
+    
+    public void start(int interval) {
+        this.interval = interval;
+        writer = new Writer();
+        new Thread(writer).start();
+    }
+    
+    public void stop() {
+        writer.interrupt();
+        writeToDisk();
+    }
+    
+    public synchronized void logEventCreated(final LogEvent logEvent) {
+        super.logEventCreated(logEvent);
+    }
+    
+    public synchronized void writeToDisk() {
+        super.writeToDisk();
+    }
+    
+    private class Writer implements Runnable {
+        private boolean interrupt = false;
+        public void run() {
+            while (!interrupt) {
+                try {
+                    Thread.sleep(interval);
+                } catch (Throwable t) {
+                    // do nothing
+                }
+                writeToDisk();
+            }
+        }
+        public void interrupt() {
+            this.interrupt = true;
+        }
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/WorkingMemoryFileLogger.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/WorkingMemoryFileLogger.java	2008-02-11 02:22:32 UTC (rev 18451)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/audit/WorkingMemoryFileLogger.java	2008-02-11 02:22:36 UTC (rev 18452)
@@ -18,7 +18,6 @@
 
 import java.io.FileNotFoundException;
 import java.io.FileWriter;
-import java.io.ObjectOutputStream;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -45,10 +44,12 @@
  */
 public class WorkingMemoryFileLogger extends WorkingMemoryLogger {
 
-    private final List events            = new ArrayList();
+    private final List<LogEvent> events  = new ArrayList<LogEvent>();
     private String     fileName          = "event";
     private int        maxEventsInMemory = 1000;
     private int        nbOfFile          = 0;
+    private boolean    split             = true;
+    private boolean    initialized       = false;
 
     /**
      * Creates a new WorkingMemoryFileLogger for the given working memory.
@@ -78,27 +79,47 @@
      * The log is automatically cleared afterwards.
      */
     public void writeToDisk() {
-        ObjectOutputStream out = null; 
+        if (!initialized) {
+            initializeLog();
+        }
+        FileWriter fileWriter = null;
         try {
+            fileWriter = new FileWriter(this.fileName + (this.nbOfFile == 0 ? ".log" : this.nbOfFile + ".log"), !split );
             final XStream xstream = new XStream();
-            out = xstream.createObjectOutputStream( new FileWriter( this.fileName + (this.nbOfFile == 0 ? ".log" : this.nbOfFile + ".log"),
-                                                                                             false ) );
-            out.writeObject( this.events );
-            this.nbOfFile++;
+            for (LogEvent event : this.events) {
+                fileWriter.write(xstream.toXML(event) + "\n");
+            }
+            if (split) {
+                this.nbOfFile++;
+                initialized = false;
+            }
             clear();
         } catch ( final FileNotFoundException exc ) {
             throw new RuntimeException( "Could not create the log file.  Please make sure that directory that the log file should be placed in does exist." );
         } catch ( final Throwable t ) {
             t.printStackTrace( System.err );
         } finally {
-            if( out != null ) { try { out.close(); } catch(Exception e) {} }
+            if( fileWriter != null ) { try { fileWriter.close(); } catch(Exception e) {} }
         }
     }
 
+    private void initializeLog() {
+        try {
+            FileWriter writer = new FileWriter(this.fileName + (this.nbOfFile == 0 ? ".log" : this.nbOfFile + ".log"), false);
+            writer.append("<object-stream>\n");
+            writer.close();
+            initialized = true;
+        } catch ( final FileNotFoundException exc ) {
+            throw new RuntimeException( "Could not create the log file.  Please make sure that directory that the log file should be placed in does exist." );
+        } catch ( final Throwable t ) {
+            t.printStackTrace( System.err );
+        }
+    }
+
     /**
      * Clears all the events in the log.
      */
-    public void clear() {
+    private void clear() {
         this.events.clear();
     }
 
@@ -122,5 +143,9 @@
             writeToDisk();
         }
     }
+    
+    public void setSplit(boolean split) {
+        this.split = split;
+    }
 
 }




More information about the jboss-svn-commits mailing list