* Returns a <code>Collection</code> of {@link Change}s within a base
* path, and removes them from the tracker.
*/
- List flushChanges(String aBasePath) {
+ public List flushChanges(String aBasePath) {
return flushChanges(aBasePath, new String[0]);
}
* path, exluding a list of excluded paths, and removes them from
* the tracker.
*/
- List flushChanges(String aBasePath, String[] anExcludedPaths) {
+ public List flushChanges(String aBasePath, String[] anExcludedPaths) {
synchronized (changes) {
List result = getChanges(aBasePath, anExcludedPaths);
--- /dev/null
+package mircoders.producer;\r
+\r
+import mir.producer.AbstractProducerNode;\r
+import mir.producer.ProducerFailure;\r
+import mir.log.LoggerWrapper;\r
+import mir.util.ParameterExpander;\r
+import mir.util.ExceptionRoutines;\r
+import mir.changetracker.ChangeTracker;\r
+\r
+import java.util.Map;\r
+import java.util.Vector;\r
+import java.util.Hashtable;\r
+import java.util.ArrayList;\r
+import java.util.Enumeration;\r
+import java.util.Collections;\r
+import java.util.Iterator;\r
+import java.util.Collection;\r
+import java.io.File;\r
+import java.io.OutputStream;\r
+import java.io.FileOutputStream;\r
+import java.io.Writer;\r
+import java.io.OutputStreamWriter;\r
+import java.io.FileNotFoundException;\r
+import java.io.IOException;\r
+\r
+import org.apache.xmlrpc.XmlRpcClient;\r
+import mircoders.global.MirGlobal;\r
+\r
+public class ChangeReportingProducerNode extends AbstractProducerNode {\r
+ private String format;\r
+ private String outputFile;\r
+ private String basePath;\r
+ private String baseUrl;\r
+ private String exclusionList;\r
+\r
+ public ChangeReportingProducerNode(String aFormat, String anOutputFile, String aBasePath, String aBaseUrl, String anExclusionList) {\r
+ format = aFormat;\r
+ outputFile = anOutputFile;\r
+ basePath = aBasePath;\r
+ baseUrl = aBaseUrl;\r
+ exclusionList = anExclusionList;\r
+ }\r
+\r
+ public void produce(Map aValueMap, String aVerb, LoggerWrapper aLogger) {\r
+ try {\r
+ File file = new File(ParameterExpander.expandExpression(aValueMap, outputFile));\r
+ OutputStream stream = null;\r
+ try {\r
+ stream = new FileOutputStream(file);\r
+ }\r
+ catch (FileNotFoundException e) {\r
+ aLogger.error("Can't write open report file", e);\r
+\r
+ return;\r
+ }\r
+\r
+ try {\r
+ Writer writer = new OutputStreamWriter(stream);\r
+ try {\r
+ String expandedBasePath = ParameterExpander.expandExpression(aValueMap, outputFile);\r
+ Collection changes = MirGlobal.getChangeEngine().getTracker().flushChanges(expandedBasePath);\r
+\r
+ Iterator i = changes.iterator();\r
+ while (i.hasNext()) {\r
+ ChangeTracker.Change change = (ChangeTracker.Change) i.next();\r
+\r
+ aValueMap.put("change", change);\r
+ String line = ParameterExpander.expandExpression(aValueMap, format);\r
+ try {\r
+ writer.write(line);\r
+ }\r
+ catch (IOException e) {\r
+ aLogger.error("Can't write to report file", e);\r
+\r
+ return;\r
+ }\r
+ }\r
+ }\r
+ finally {\r
+ try {\r
+ writer.close();\r
+ }\r
+ catch (Throwable t) {\r
+ aLogger.info("Can't close report file");\r
+ }\r
+ }\r
+ }\r
+ finally {\r
+ try {\r
+ stream.close();\r
+ }\r
+ catch (Throwable t) {\r
+ aLogger.info("Can't close report file");\r
+ }\r
+ }\r
+ }\r
+ catch (Throwable t) {\r
+ aLogger.error("Error while writing change report file", t);\r
+ }\r
+ }\r
+}\r
import mircoders.producer.MediaGeneratingProducerNode;
import mircoders.producer.RadicalendarProducerNode;
import mircoders.producer.UnIndexingProducerNode;
+import mircoders.producer.ChangeReportingProducerNode;
public class SupplementalProducerNodeBuilders {
aBuilderLibrary.registerFactory("UnIndexContent", new ContentUnIndexingProducerNodeBuilder.factory(aBasePath));
aBuilderLibrary.registerBuilder("Radicalendar", RadicalendarProducerNodeBuilder.class);
- aBuilderLibrary.registerFactory("IndexContent", new ContentIndexingProducerNodeBuilder.factory(aBasePath));
+ aBuilderLibrary.registerFactory("ReportChanges", new ContentIndexingProducerNodeBuilder.factory(aBasePath));
}
private final static String MARKER_KEY_ATTRIBUTE = DefaultProducerNodeBuilders.KEY_ATTRIBUTE;
}
}
+ public static class ChangeReportingProducerNodeBuilder extends DefaultProducerNodeBuilders.AbstractProducerNodeBuilder {
+ private final static String CHANGEREPORTING_FILE_ATTRIBUTE = "file";
+ private final static String CHANGEREPORTING_FORMAT_ATTRIBUTE = "format";
+ private final static String CHANGEREPORTING_BASEPATH_ATTRIBUTE = "basepath";
+ private final static String[] CHANGEREPORTING_REQUIRED_ATTRIBUTES = {CHANGEREPORTING_FILE_ATTRIBUTE,
+ CHANGEREPORTING_FORMAT_ATTRIBUTE, CHANGEREPORTING_BASEPATH_ATTRIBUTE};
+ private static final String[] CHANGEREPORTING_OPTIONAL_ATTRIBUTES = {};
+
+ private String file;
+ private String format;
+ private String basepath;
+
+ public ChangeReportingProducerNodeBuilder() {
+ super(new String[0]);
+ }
+
+ public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLParserExc {
+ XMLReaderTool.checkAttributes(anAttributes, CHANGEREPORTING_REQUIRED_ATTRIBUTES, CHANGEREPORTING_OPTIONAL_ATTRIBUTES);
+
+ file = (String) anAttributes.get(CHANGEREPORTING_FILE_ATTRIBUTE);
+ format = (String) anAttributes.get(CHANGEREPORTING_FORMAT_ATTRIBUTE);
+ basepath = (String) anAttributes.get(CHANGEREPORTING_BASEPATH_ATTRIBUTE);
+ }
+
+ public ProducerNode constructNode() {
+ return new ChangeReportingProducerNode(format, file, basepath, null, null);
+ }
+ }
}