From 33f50488a1b729cd146f94440134a371d1450a3f Mon Sep 17 00:00:00 2001 From: didfet Date: Sun, 15 Mar 2015 17:17:53 +0100 Subject: [PATCH] Added FileModificationListener. --- .../info/fetter/logstashforwarder/Event.java | 9 ++- .../FileModificationListener.java | 49 +++++++++++++++ .../fetter/logstashforwarder/FileWatcher.java | 61 +++++++------------ .../logstashforwarder/FileWatcherTest.java | 4 +- 4 files changed, 78 insertions(+), 45 deletions(-) create mode 100644 src/main/java/info/fetter/logstashforwarder/FileModificationListener.java diff --git a/src/main/java/info/fetter/logstashforwarder/Event.java b/src/main/java/info/fetter/logstashforwarder/Event.java index d2752ac..45b1136 100644 --- a/src/main/java/info/fetter/logstashforwarder/Event.java +++ b/src/main/java/info/fetter/logstashforwarder/Event.java @@ -32,16 +32,19 @@ public class Event { } } - public void addField(String key, byte[] value) { + public Event addField(String key, byte[] value) { keyValues.put(key, value); + return this; } - public void addField(String key, String value) { + public Event addField(String key, String value) { keyValues.put(key, value.getBytes()); + return this; } - public void addField(String key, long value) { + public Event addField(String key, long value) { keyValues.put(key, String.valueOf(value).getBytes()); + return this; } public Map getKeyValues() { diff --git a/src/main/java/info/fetter/logstashforwarder/FileModificationListener.java b/src/main/java/info/fetter/logstashforwarder/FileModificationListener.java new file mode 100644 index 0000000..bf73ed0 --- /dev/null +++ b/src/main/java/info/fetter/logstashforwarder/FileModificationListener.java @@ -0,0 +1,49 @@ +package info.fetter.logstashforwarder; + +import java.io.File; + +import org.apache.commons.io.monitor.FileAlterationListener; +import org.apache.commons.io.monitor.FileAlterationObserver; + +public class FileModificationListener implements FileAlterationListener { + private Event fields; + private FileWatcher watcher; + + public FileModificationListener(FileWatcher watcher, Event fields) { + this.watcher = watcher; + this.fields = fields; + } + + public void onDirectoryChange(File file) { + // Not implemented + } + + public void onDirectoryCreate(File file) { + // Not implemented + } + + public void onDirectoryDelete(File file) { + // Not implemented + } + + public void onFileChange(File file) { + watcher.onFileChange(file, fields); + } + + public void onFileCreate(File file) { + watcher.onFileCreate(file, fields); + } + + public void onFileDelete(File file) { + watcher.onFileDelete(file); + } + + public void onStart(FileAlterationObserver file) { + // Not implemented + } + + public void onStop(FileAlterationObserver file) { + // Not implemented + } + +} diff --git a/src/main/java/info/fetter/logstashforwarder/FileWatcher.java b/src/main/java/info/fetter/logstashforwarder/FileWatcher.java index 65af0fc..59f740c 100644 --- a/src/main/java/info/fetter/logstashforwarder/FileWatcher.java +++ b/src/main/java/info/fetter/logstashforwarder/FileWatcher.java @@ -31,11 +31,10 @@ import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.filefilter.FileFilterUtils; import org.apache.commons.io.filefilter.IOFileFilter; import org.apache.commons.io.filefilter.WildcardFileFilter; -import org.apache.commons.io.monitor.FileAlterationListener; import org.apache.commons.io.monitor.FileAlterationObserver; import org.apache.log4j.Logger; -public class FileWatcher implements FileAlterationListener { +public class FileWatcher { private static final Logger logger = Logger.getLogger(FileWatcher.class); private List observerList = new ArrayList(); private static final int ONE_DAY = 24 * 3600 * 1000; @@ -52,14 +51,14 @@ public class FileWatcher implements FileAlterationListener { this(ONE_DAY); } - public void addFilesToWatch(String fileToWatch) { + public void addFilesToWatch(String fileToWatch, Event fields) { try { if(fileToWatch.equals("-")) { - addStdIn(); + addStdIn(fields); } else if(fileToWatch.contains("*")) { - addWildCardFiles(fileToWatch); + addWildCardFiles(fileToWatch, fields); } else { - addSingleFile(fileToWatch); + addSingleFile(fileToWatch, fields); } } catch(Exception e) { throw new RuntimeException(e); @@ -175,7 +174,7 @@ public class FileWatcher implements FileAlterationListener { removeMarkedFilesFromWatchMap(); } - private void addSingleFile(String fileToWatch) throws Exception { + private void addSingleFile(String fileToWatch, Event fields) throws Exception { logger.info("Watching file : " + new File(fileToWatch).getCanonicalPath()); String directory = FilenameUtils.getFullPath(fileToWatch); String fileName = FilenameUtils.getName(fileToWatch); @@ -183,10 +182,10 @@ public class FileWatcher implements FileAlterationListener { FileFilterUtils.fileFileFilter(), FileFilterUtils.nameFileFilter(fileName), new LastModifiedFileFilter(deadTime)); - initializeWatchMap(new File(directory), fileFilter); + initializeWatchMap(new File(directory), fileFilter, fields); } - private void addWildCardFiles(String filesToWatch) throws Exception { + private void addWildCardFiles(String filesToWatch, Event fields) throws Exception { logger.info("Watching wildcard files : " + filesToWatch); String directory = FilenameUtils.getFullPath(filesToWatch); String wildcard = FilenameUtils.getName(filesToWatch); @@ -195,26 +194,28 @@ public class FileWatcher implements FileAlterationListener { FileFilterUtils.fileFileFilter(), new WildcardFileFilter(wildcard), new LastModifiedFileFilter(deadTime)); - initializeWatchMap(new File(directory), fileFilter); + initializeWatchMap(new File(directory), fileFilter, fields); } - private void addStdIn() { - logger.info("Watching stdin : not implemented yet"); + private void addStdIn(Event fields) { + logger.error("Watching stdin : not implemented yet"); } - private void initializeWatchMap(File directory, IOFileFilter fileFilter) throws Exception { + private void initializeWatchMap(File directory, IOFileFilter fileFilter, Event fields) throws Exception { FileAlterationObserver observer = new FileAlterationObserver(directory, fileFilter); - observer.addListener(this); + FileModificationListener listener = new FileModificationListener(this, fields); + observer.addListener(listener); observerList.add(observer); observer.initialize(); for(File file : FileUtils.listFiles(directory, fileFilter, null)) { - addFileToWatchMap(watchMap, file); + addFileToWatchMap(watchMap, file, fields); } } - private void addFileToWatchMap(Map map, File file) { + private void addFileToWatchMap(Map map, File file, Event fields) { try { FileState state = new FileState(file); + state.setFields(fields); int signatureLength = (int) (state.getSize() > MAX_SIGNATURE_LENGTH ? MAX_SIGNATURE_LENGTH : state.getSize()); state.setSignatureLength(signatureLength); long signature = FileSigner.computeSignature(state.getRandomAccessFile(), signatureLength); @@ -226,19 +227,19 @@ public class FileWatcher implements FileAlterationListener { } } - public void onFileChange(File file) { + public void onFileChange(File file, Event fields) { try { logger.debug("Change detected on file : " + file.getCanonicalPath()); - addFileToWatchMap(changedWatchMap, file); + addFileToWatchMap(changedWatchMap, file, fields); } catch (IOException e) { logger.error("Caught IOException : " + e.getMessage()); } } - public void onFileCreate(File file) { + public void onFileCreate(File file, Event fields) { try { logger.debug("Create detected on file : " + file.getCanonicalPath()); - addFileToWatchMap(changedWatchMap, file); + addFileToWatchMap(changedWatchMap, file, fields); } catch (IOException e) { logger.error("Caught IOException : " + e.getMessage()); } @@ -292,24 +293,4 @@ public class FileWatcher implements FileAlterationListener { } } - public void onDirectoryChange(File directory) { - // Do nothing - } - - public void onDirectoryCreate(File directory) { - // Do nothing - } - - public void onDirectoryDelete(File directory) { - // Do nothing - } - - public void onStart(FileAlterationObserver observer) { - // TODO Auto-generated method stub - } - - public void onStop(FileAlterationObserver observer) { - // TODO Auto-generated method stub - } - } diff --git a/src/test/java/info/fetter/logstashforwarder/FileWatcherTest.java b/src/test/java/info/fetter/logstashforwarder/FileWatcherTest.java index 4f767e9..e47c1a2 100644 --- a/src/test/java/info/fetter/logstashforwarder/FileWatcherTest.java +++ b/src/test/java/info/fetter/logstashforwarder/FileWatcherTest.java @@ -30,7 +30,7 @@ public class FileWatcherTest { //@Test public void testFileWatch() throws InterruptedException, IOException { FileWatcher watcher = new FileWatcher(); - watcher.addFilesToWatch("./test.txt"); + watcher.addFilesToWatch("./test.txt", new Event().addField("test", "test")); for(int i = 0; i < 100; i++) { Thread.sleep(1000); watcher.checkFiles(); @@ -40,7 +40,7 @@ public class FileWatcherTest { @Test public void testWildcardWatch() throws InterruptedException, IOException { FileWatcher watcher = new FileWatcher(); - watcher.addFilesToWatch("./test*.txt"); + watcher.addFilesToWatch("./test*.txt", new Event().addField("test", "test")); File file1 = new File("test1.txt"); File file2 = new File("test2.txt");