001: package org.drools.audit;
002:
003: /*
004: * Copyright 2005 JBoss Inc
005: *
006: * Licensed under the Apache License, Version 2.0 (the "License");
007: * you may not use this file except in compliance with the License.
008: * You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing, software
013: * distributed under the License is distributed on an "AS IS" BASIS,
014: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015: * See the License for the specific language governing permissions and
016: * limitations under the License.
017: */
018:
019: import java.io.FileNotFoundException;
020: import java.io.FileWriter;
021: import java.io.ObjectOutputStream;
022: import java.util.ArrayList;
023: import java.util.List;
024:
025: import org.drools.EventManager;
026: import org.drools.WorkingMemory;
027: import org.drools.audit.event.LogEvent;
028: import com.thoughtworks.xstream.XStream;
029:
030: /**
031: * A logger of events generated by a working memory.
032: * It stores its information in a file that can be specified.
033: * All the events logged are written to the file when the
034: * writeToDisk() method is invoked. The log will contain all
035: * the events logged serialized to XML using XStream.
036: * Every time a new logger is created, the old event log will
037: * be overwritten.
038: *
039: * TODO: make this class more scalable, for example
040: * - logging to several files if log becomes too large
041: * - automatically write updates to file at certain time intervals
042: * - ...
043: *
044: * @author <a href="mailto:kris_verlaenen@hotmail.com">Kris Verlaenen </a>
045: */
046: public class WorkingMemoryFileLogger extends WorkingMemoryLogger {
047:
048: private final List events = new ArrayList();
049: private String fileName = "event";
050: private int maxEventsInMemory = 1000;
051: private int nbOfFile = 0;
052:
053: /**
054: * Creates a new WorkingMemoryFileLogger for the given working memory.
055: * @param workingMemory
056: */
057: public WorkingMemoryFileLogger(final EventManager eventManager) {
058: super (eventManager);
059: }
060:
061: /**
062: * Sets the name of the file the events are logged in.
063: * No extensions should be given since .log is automatically appended
064: * to the file name.
065: * The default is an event.log file in the current working directory.
066: * This can be a path relative to the current working directory
067: * (e.g. "mydir/subDir/myLogFile"), or an absolute path
068: * (e.g. "C:/myLogFile").
069: *
070: * @param fileName The name of the file the events should be logged in.
071: */
072: public void setFileName(final String fileName) {
073: this .fileName = fileName;
074: }
075:
076: /**
077: * All events in the log are written to file.
078: * The log is automatically cleared afterwards.
079: */
080: public void writeToDisk() {
081: try {
082: final XStream xstream = new XStream();
083: final ObjectOutputStream out = xstream
084: .createObjectOutputStream(new FileWriter(
085: this .fileName
086: + (this .nbOfFile == 0 ? ".log"
087: : this .nbOfFile + ".log"),
088: false));
089: out.writeObject(this .events);
090: out.close();
091: this .nbOfFile++;
092: clear();
093: } catch (final FileNotFoundException exc) {
094: throw new RuntimeException(
095: "Could not create the log file. Please make sure that directory that the log file should be placed in does exist.");
096: } catch (final Throwable t) {
097: t.printStackTrace(System.err);
098: }
099: }
100:
101: /**
102: * Clears all the events in the log.
103: */
104: public void clear() {
105: this .events.clear();
106: }
107:
108: /**
109: * Sets the maximum number of log events that are allowed in memory.
110: * If this number is reached, all events are written to file.
111: * The default is 1000.
112: *
113: * @param maxEventsInMemory The maximum number of events in memory.
114: */
115: public void setMaxEventsInMemory(final int maxEventsInMemory) {
116: this .maxEventsInMemory = maxEventsInMemory;
117: }
118:
119: /**
120: * @see org.drools.audit.WorkingMemoryLogger
121: */
122: public void logEventCreated(final LogEvent logEvent) {
123: this .events.add(logEvent);
124: if (this .events.size() > this .maxEventsInMemory) {
125: writeToDisk();
126: }
127: }
128:
129: public void finalize() {
130: writeToDisk();
131: }
132: }
|