diff --git a/README.md b/README.md index 4eaf5ae..b5a2bcd 100644 --- a/README.md +++ b/README.md @@ -20,9 +20,9 @@ So logstash-forwarder-java is a solution for those who want a portable, lightwei ## How to install it ? Download one of the following archives : - - [logstash-forwarder-java-0.2.4-bin.zip](https://github.com/didfet/logstash-forwarder-java/releases/download/0.2.4/logstash-forwarder-java-0.2.4-bin.zip) - - [logstash-forwarder-java-0.2.4-bin.tar.gz](https://github.com/didfet/logstash-forwarder-java/releases/download/0.2.4/logstash-forwarder-java-0.2.4-bin.tar.gz) - - [logstash-forwarder-java-0.2.4-bin.tar.bz2](https://github.com/didfet/logstash-forwarder-java/releases/download/0.2.4/logstash-forwarder-java-0.2.4-bin.tar.bz2) + - [logstash-forwarder-java-0.2.6-bin.zip](https://github.com/toliman7/logstash-forwarder-java/releases/download/0.2.6/logstash-forwarder-java-0.2.6-bin.zip) + - [logstash-forwarder-java-0.2.6-bin.tar.gz](https://github.com/toliman7/logstash-forwarder-java/releases/download/0.2.6/logstash-forwarder-java-0.2.6-bin.tar.gz) + - [logstash-forwarder-java-0.2.6-bin.tar.bz2](https://github.com/toliman7/logstash-forwarder-java/releases/download/0.2.6/logstash-forwarder-java-0.2.6-bin.tar.bz2) Or download the maven project and run maven package. Then you can install one of the archives located in the target directory. diff --git a/pom.xml b/pom.xml index dd9c863..64e597e 100644 --- a/pom.xml +++ b/pom.xml @@ -3,12 +3,14 @@ 4.0.0 logstash-forwarder-java logstash-forwarder-java - 0.2.5-SNAPSHOT + 0.2.8-SNAPSHOT logstash-forwarder-java Java version of logstash forwarder https://github.com/didfet/logstash-forwarder-java UTF-8 + 1.7 + 1.7 @@ -81,6 +83,9 @@ 2.5.3 src/assembly/tarball.xml + + jar-with-dependencies + @@ -141,7 +146,7 @@ com.fasterxml.jackson.core jackson-databind - 2.1.5 + 2.12.0 junit @@ -166,5 +171,4 @@ 1.2 - diff --git a/src/main/java/info/fetter/logstashforwarder/FileReader.java b/src/main/java/info/fetter/logstashforwarder/FileReader.java index 8ee23b6..50d5ba1 100644 --- a/src/main/java/info/fetter/logstashforwarder/FileReader.java +++ b/src/main/java/info/fetter/logstashforwarder/FileReader.java @@ -1,242 +1,242 @@ -package info.fetter.logstashforwarder; - -/* - * Copyright 2015 Didier Fetter - * Copyright 2017 Alberto González Palomo https://sentido-labs.com - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -import info.fetter.logstashforwarder.util.AdapterException; -import info.fetter.logstashforwarder.util.RandomAccessFile; - -import java.io.File; -import java.io.IOException; -//import java.io.RandomAccessFile; -import java.nio.ByteBuffer; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import org.apache.log4j.Logger; - - -public class FileReader extends Reader { - private static Logger logger = Logger.getLogger(FileReader.class); - private static final byte[] ZIP_MAGIC = new byte[] {(byte) 0x50, (byte) 0x4b, (byte) 0x03, (byte) 0x04}; - private static final byte[] LZW_MAGIC = new byte[] {(byte) 0x1f, (byte) 0x9d}; - private static final byte[] LZH_MAGIC = new byte[] {(byte) 0x1f, (byte) 0xa0}; - private static final byte[] GZ_MAGIC = new byte[] {(byte) 0x1f, (byte) 0x8b, (byte) 0x08}; - private static final byte[][] MAGICS = new byte[][] {ZIP_MAGIC, LZW_MAGIC, LZH_MAGIC, GZ_MAGIC}; - private Map pointerMap; - ByteBuffer bufferedLines = ByteBuffer.allocate(BYTEBUFFER_CAPACITY); - - public FileReader(int spoolSize) { - super(spoolSize); - } - - public int readFiles(Collection fileList) throws AdapterException { - int eventCount = 0; - if(logger.isTraceEnabled()) { - logger.trace("Reading " + fileList.size() + " file(s)"); - } - pointerMap = new HashMap(fileList.size(),1); - for(FileState state : fileList) { - eventCount += readFile(state, spoolSize - eventCount); - } - if(eventCount > 0) { - try { - adapter.sendEvents(eventList); - } catch(AdapterException e) { - eventList.clear(); // Be sure no events will be sent twice after reconnect - throw e; - } - } - for(FileState state : fileList) { - state.setPointer(pointerMap.get(state.getFile())); - } - eventList.clear(); - return eventCount; // Return number of events sent to adapter - } - - private int readFile(FileState state, int spaceLeftInSpool) { - File file = state.getFile(); - long pointer = state.getPointer(); - int numberOfEvents = 0; - try { - if(state.isDeleted() || state.getRandomAccessFile() == null) { // Don't try to read this file - if(logger.isTraceEnabled()) { - logger.trace("File : " + file + " has been deleted"); - } - } else if(state.getRandomAccessFile().isEmpty()) { - if(logger.isTraceEnabled()) { - logger.trace("File : " + file + " is empty"); - } - } else { - int eventListSizeBefore = eventList.size(); - if(logger.isTraceEnabled()) { - logger.trace("File : " + file + " pointer : " + pointer); - logger.trace("Space left in spool : " + spaceLeftInSpool); - } - if(isCompressedFile(state)) { - pointer = file.length(); - } else { - pointer = readLines(state, spaceLeftInSpool); - } - numberOfEvents = eventList.size() - eventListSizeBefore; - } - } catch(IOException e) { - logger.warn("Exception raised while reading file : " + state.getFile(), e); - } - pointerMap.put(file, pointer); - return numberOfEvents; // Return number of events read - } - - private boolean isCompressedFile(FileState state) { - RandomAccessFile reader = state.getRandomAccessFile(); - - try { - for(byte[] magic : MAGICS) { - byte[] fileBytes = new byte[magic.length]; - reader.seek(0); - int read = reader.read(fileBytes); - if (read != magic.length) { - continue; - } - if(Arrays.equals(magic, fileBytes)) { - logger.debug("Compressed file detected : " + state.getFile()); - return true; - } - } - } catch(IOException e) { - logger.warn("Exception raised while reading file : " + state.getFile(), e); - } - return false; - } - - private static byte[] extractBytes(ByteBuffer byteBuffer) - { - byte[] bytes = new byte[byteBuffer.position()]; - byteBuffer.rewind(); - byteBuffer.get(bytes); - byteBuffer.clear(); - return bytes; - } - - private static void copyLineToBuffer(byte[] line, ByteBuffer byteBuffer) { - if(line.length <= byteBuffer.remaining()) { - byteBuffer.put(line); - } else { - byteBuffer.put(line, 0, byteBuffer.remaining()); - } - } - - private long readLines(FileState state, int spaceLeftInSpool) { - RandomAccessFile reader = state.getRandomAccessFile(); - long pos = state.getPointer(); - Multiline multiline = state.getMultiline(); - try { - reader.seek(pos); - byte[] line = readLine(reader); - bufferedLines.clear(); - - if(multiline != null && multiline.isPrevious()) { - spaceLeftInSpool--; - } - while (line != null && spaceLeftInSpool > 0) { - if(logger.isDebugEnabled()) { - logger.debug("-- Read line : " + new String(line)); - logger.debug("-- Space left in spool : " + spaceLeftInSpool); - } - pos = reader.getFilePointer(); - if(multiline == null) { - addEvent(state, pos, line); - spaceLeftInSpool--; - } - else { - if(logger.isDebugEnabled()) { - logger.debug("-- Multiline : " + multiline + " matches " + multiline.isPatternFound(line)); - } - if(multiline.isPatternFound(line)) { - // buffer the line - if(bufferedLines.position() > 0 && bufferedLines.hasRemaining()) { - bufferedLines.put(Multiline.JOINT); - } - copyLineToBuffer(line, bufferedLines); - } - else { - if(multiline.isPrevious()) { - // did not match, so new event started - if (bufferedLines.position() > 0) { - addEvent(state, pos, extractBytes(bufferedLines)); - spaceLeftInSpool--; - } - copyLineToBuffer(line, bufferedLines); - } - else { - // did not match, add the current line - if(bufferedLines.position() > 0) { - if(bufferedLines.hasRemaining()) { - bufferedLines.put(Multiline.JOINT); - } - copyLineToBuffer(line, bufferedLines); - addEvent(state, pos, extractBytes(bufferedLines)); - spaceLeftInSpool--; - } - else { - addEvent(state, pos, line); - spaceLeftInSpool--; - } - } - } - } - line = readLine(reader); - } - if(bufferedLines.position() > 0) { - addEvent(state, pos, extractBytes(bufferedLines)); // send any buffered lines left - } - reader.seek(pos); // Ensure we can re-read if necessary - } catch(IOException e) { - logger.warn("Exception raised while reading file : " + state.getFile(), e); - } - return pos; - } - - private byte[] readLine(RandomAccessFile reader) throws IOException { - byteBuffer.clear(); - int ch; - boolean seenCR = false; - while((ch=reader.read()) != -1) { - switch(ch) { - case '\n': - return extractBytes(byteBuffer); - case '\r': - seenCR = true; - break; - default: - if (seenCR) { - if(byteBuffer.hasRemaining()) { - byteBuffer.put((byte) '\r'); - } - seenCR = false; - } - if(byteBuffer.hasRemaining()) { - byteBuffer.put((byte)ch); - } - } - } - return null; - } - -} +package info.fetter.logstashforwarder; + +/* + * Copyright 2015 Didier Fetter + * Copyright 2017 Alberto González Palomo https://sentido-labs.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import info.fetter.logstashforwarder.util.AdapterException; +import info.fetter.logstashforwarder.util.RandomAccessFile; + +import java.io.File; +import java.io.IOException; +//import java.io.RandomAccessFile; +import java.nio.ByteBuffer; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import org.apache.log4j.Logger; + + +public class FileReader extends Reader { + private static Logger logger = Logger.getLogger(FileReader.class); + private static final byte[] ZIP_MAGIC = new byte[] {(byte) 0x50, (byte) 0x4b, (byte) 0x03, (byte) 0x04}; + private static final byte[] LZW_MAGIC = new byte[] {(byte) 0x1f, (byte) 0x9d}; + private static final byte[] LZH_MAGIC = new byte[] {(byte) 0x1f, (byte) 0xa0}; + private static final byte[] GZ_MAGIC = new byte[] {(byte) 0x1f, (byte) 0x8b, (byte) 0x08}; + private static final byte[][] MAGICS = new byte[][] {ZIP_MAGIC, LZW_MAGIC, LZH_MAGIC, GZ_MAGIC}; + private Map pointerMap; + ByteBuffer bufferedLines = ByteBuffer.allocate(BYTEBUFFER_CAPACITY); + + public FileReader(int spoolSize) { + super(spoolSize); + } + + public int readFiles(Collection fileList) throws AdapterException { + int eventCount = 0; + if(logger.isTraceEnabled()) { + logger.trace("Reading " + fileList.size() + " file(s)"); + } + pointerMap = new HashMap(fileList.size(),1); + for(FileState state : fileList) { + eventCount += readFile(state, spoolSize - eventCount); + } + if(eventCount > 0) { + try { + adapter.sendEvents(eventList); + } catch(AdapterException e) { + eventList.clear(); // Be sure no events will be sent twice after reconnect + throw e; + } + } + for(FileState state : fileList) { + state.setPointer(pointerMap.get(state.getFile())); + } + eventList.clear(); + return eventCount; // Return number of events sent to adapter + } + + private int readFile(FileState state, int spaceLeftInSpool) { + File file = state.getFile(); + long pointer = state.getPointer(); + int numberOfEvents = 0; + try { + if(state.isDeleted() || state.getRandomAccessFile() == null) { // Don't try to read this file + if(logger.isTraceEnabled()) { + logger.trace("File : " + file + " has been deleted"); + } + } else if(state.getRandomAccessFile().isEmpty()) { + if(logger.isTraceEnabled()) { + logger.trace("File : " + file + " is empty"); + } + } else { + int eventListSizeBefore = eventList.size(); + if(logger.isTraceEnabled()) { + logger.trace("File : " + file + " pointer : " + pointer); + logger.trace("Space left in spool : " + spaceLeftInSpool); + } + if(isCompressedFile(state)) { + pointer = file.length(); + } else { + pointer = readLines(state, spaceLeftInSpool); + } + numberOfEvents = eventList.size() - eventListSizeBefore; + } + } catch(IOException e) { + logger.warn("Exception raised while reading file : " + state.getFile(), e); + } + pointerMap.put(file, pointer); + return numberOfEvents; // Return number of events read + } + + private boolean isCompressedFile(FileState state) { + RandomAccessFile reader = state.getRandomAccessFile(); + + try { + for(byte[] magic : MAGICS) { + byte[] fileBytes = new byte[magic.length]; + reader.seek(0); + int read = reader.read(fileBytes); + if (read != magic.length) { + continue; + } + if(Arrays.equals(magic, fileBytes)) { + logger.debug("Compressed file detected : " + state.getFile()); + return true; + } + } + } catch(IOException e) { + logger.warn("Exception raised while reading file : " + state.getFile(), e); + } + return false; + } + + private static byte[] extractBytes(ByteBuffer byteBuffer) + { + byte[] bytes = new byte[byteBuffer.position()]; + byteBuffer.rewind(); + byteBuffer.get(bytes); + byteBuffer.clear(); + return bytes; + } + + private static void copyLineToBuffer(byte[] line, ByteBuffer byteBuffer) { + if(line.length <= byteBuffer.remaining()) { + byteBuffer.put(line); + } else { + byteBuffer.put(line, 0, byteBuffer.remaining()); + } + } + + private long readLines(FileState state, int spaceLeftInSpool) { + RandomAccessFile reader = state.getRandomAccessFile(); + long pos = state.getPointer(); + Multiline multiline = state.getMultiline(); + try { + reader.seek(pos); + byte[] line = readLine(reader); + bufferedLines.clear(); + + while (line != null && spaceLeftInSpool > 0) { + if(logger.isDebugEnabled()) { + logger.debug("-- Read line : " + new String(line)); + logger.debug("-- Space left in spool : " + spaceLeftInSpool); + } + long prevPos = pos; + pos = reader.getFilePointer(); + if(multiline == null) { + addEvent(state, pos, line); + spaceLeftInSpool--; + } + else { + if(logger.isDebugEnabled()) { + logger.debug("-- Multiline : " + multiline + " matches " + multiline.isPatternFound(line)); + } + if(multiline.isPatternFound(line)) { + // buffer the line + if(bufferedLines.position() > 0 && bufferedLines.hasRemaining()) { + bufferedLines.put(Multiline.JOINT); + } + copyLineToBuffer(line, bufferedLines); + } + else { + if(multiline.isPrevious()) { + // did not match, so new event started + if (bufferedLines.position() > 0) { + addEvent(state, prevPos, extractBytes(bufferedLines)); + spaceLeftInSpool--; + } + if (spaceLeftInSpool > 0) + copyLineToBuffer(line, bufferedLines); + else + pos = prevPos; + } + else { + // did not match, add the current line + if(bufferedLines.position() > 0) { + if(bufferedLines.hasRemaining()) { + bufferedLines.put(Multiline.JOINT); + } + copyLineToBuffer(line, bufferedLines); + addEvent(state, pos, extractBytes(bufferedLines)); + } + else { + addEvent(state, pos, line); + } + spaceLeftInSpool--; + } + } + } + line = readLine(reader); + } + if(bufferedLines.position() > 0) { + addEvent(state, pos, extractBytes(bufferedLines)); // send any buffered lines left + } + reader.seek(pos); // Ensure we can re-read if necessary + } catch(IOException e) { + logger.warn("Exception raised while reading file : " + state.getFile(), e); + } + return pos; + } + + private byte[] readLine(RandomAccessFile reader) throws IOException { + byteBuffer.clear(); + int ch; + boolean seenCR = false; + while((ch=reader.read()) != -1) { + switch(ch) { + case '\n': + return extractBytes(byteBuffer); + case '\r': + seenCR = true; + break; + default: + if (seenCR) { + if(byteBuffer.hasRemaining()) { + byteBuffer.put((byte) '\r'); + } + seenCR = false; + } + if(byteBuffer.hasRemaining()) { + byteBuffer.put((byte)ch); + } + } + } + return null; + } + +} diff --git a/src/test/java/info/fetter/logstashforwarder/FileReaderTest.java b/src/test/java/info/fetter/logstashforwarder/FileReaderTest.java index ca9b97a..f932ba6 100644 --- a/src/test/java/info/fetter/logstashforwarder/FileReaderTest.java +++ b/src/test/java/info/fetter/logstashforwarder/FileReaderTest.java @@ -1,99 +1,205 @@ -package info.fetter.logstashforwarder; - -/* - * Copyright 2015 Didier Fetter - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -import static org.apache.log4j.Level.*; -import info.fetter.logstashforwarder.util.AdapterException; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.commons.io.FileUtils; -import org.apache.log4j.BasicConfigurator; -import org.apache.log4j.Logger; -import org.apache.log4j.spi.RootLogger; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; - -public class FileReaderTest { - Logger logger = Logger.getLogger(FileReaderTest.class); - - @BeforeClass - public static void setUpBeforeClass() throws Exception { - BasicConfigurator.configure(); - RootLogger.getRootLogger().setLevel(TRACE); - } - - @AfterClass - public static void tearDownAfterClass() throws Exception { - BasicConfigurator.resetConfiguration(); - } - - @Test - public void testFileReader1() throws IOException, InterruptedException, AdapterException { - FileReader reader = new FileReader(2); - reader.setAdapter(new MockProtocolAdapter()); - List fileList = new ArrayList(1); - File file1 = new File("testFileReader1.txt"); - FileUtils.write(file1, "testFileReader1 line1\n"); - FileUtils.write(file1, " nl line12\n", true); - FileUtils.write(file1, "testFileReader1 line2\n", true); - FileUtils.write(file1, "testFileReader1 line3\n", true); - Thread.sleep(500); - FileState state = new FileState(file1); - fileList.add(state); - state.setFields(new Event().addField("testFileReader1", "testFileReader1")); - Map m = new HashMap(); - m.put("pattern", " nl"); - m.put("negate", "false"); - state.setMultiline(new Multiline(m)); - reader.readFiles(fileList); - reader.readFiles(fileList); - reader.readFiles(fileList); - //FileUtils.forceDelete(file1); - } - - @Test - public void testFileReader2() throws IOException, InterruptedException, AdapterException { - FileReader reader = new FileReader(2); - reader.setAdapter(new MockProtocolAdapter()); - List fileList = new ArrayList(1); - File file1 = new File("testFileReader1.txt"); - FileUtils.write(file1, "testFileReader1 line1\n"); - FileUtils.write(file1, " nl line12\n", true); - FileUtils.write(file1, "testFileReader1 line2\n", true); - FileUtils.write(file1, "testFileReader1 line3\n", true); - Thread.sleep(500); - FileState state = new FileState(file1); - fileList.add(state); - state.setFields(new Event().addField("testFileReader1", "testFileReader1")); - Map m = new HashMap(); - m.put("pattern", "testFileReader1"); - m.put("negate", "true"); - state.setMultiline(new Multiline(m)); - reader.readFiles(fileList); - reader.readFiles(fileList); - reader.readFiles(fileList); - //FileUtils.forceDelete(file1); - } -} +package info.fetter.logstashforwarder; + +/* + * Copyright 2015 Didier Fetter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import static junit.framework.TestCase.assertEquals; +import static org.apache.log4j.Level.*; +import info.fetter.logstashforwarder.util.AdapterException; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.io.FileUtils; +import org.apache.log4j.BasicConfigurator; +import org.apache.log4j.Logger; +import org.apache.log4j.spi.RootLogger; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +public class FileReaderTest { + Logger logger = Logger.getLogger(FileReaderTest.class); + + @BeforeClass + public static void setUpBeforeClass() throws Exception { + BasicConfigurator.configure(); + RootLogger.getRootLogger().setLevel(TRACE); + } + + @AfterClass + public static void tearDownAfterClass() throws Exception { + BasicConfigurator.resetConfiguration(); + } + + @Test + public void testFileReader1() throws IOException, InterruptedException, AdapterException { + FileReader reader = new FileReader(2); + reader.setAdapter(new MockProtocolAdapter()); + List fileList = new ArrayList(1); + File file1 = new File("testFileReader1.txt"); + FileUtils.write(file1, "testFileReader1 line1\n"); + FileUtils.write(file1, " nl line12\n", true); + FileUtils.write(file1, " nl line13\n", true); + FileUtils.write(file1, "testFileReader1 line2\n", true); + FileUtils.write(file1, "testFileReader1 line3\n", true); + Thread.sleep(500); + FileState state = new FileState(file1); + fileList.add(state); + state.setFields(new Event().addField("testFileReader1", "testFileReader1")); + Map m = new HashMap(); + m.put("pattern", " nl"); + m.put("negate", "false"); + state.setMultiline(new Multiline(m)); + assertEquals(2, reader.readFiles(fileList)); + assertEquals(1, reader.readFiles(fileList)); + assertEquals(0, reader.readFiles(fileList)); + FileUtils.forceDelete(file1); + } + + @Test + public void testFileReader2() throws IOException, InterruptedException, AdapterException { + FileReader reader = new FileReader(2); + reader.setAdapter(new MockProtocolAdapter()); + List fileList = new ArrayList(1); + File file1 = new File("testFileReader1.txt"); + FileUtils.write(file1, "testFileReader1 line1\n"); + FileUtils.write(file1, " nl line12\n", true); + FileUtils.write(file1, " nl line13\n", true); + FileUtils.write(file1, "testFileReader1 line2\n", true); + FileUtils.write(file1, "testFileReader1 line3\n", true); + Thread.sleep(500); + FileState state = new FileState(file1); + fileList.add(state); + state.setFields(new Event().addField("testFileReader1", "testFileReader1")); + Map m = new HashMap(); + m.put("pattern", "testFileReader1"); + m.put("negate", "true"); + state.setMultiline(new Multiline(m)); + assertEquals(2, reader.readFiles(fileList)); + assertEquals(1, reader.readFiles(fileList)); + assertEquals(0, reader.readFiles(fileList)); + FileUtils.forceDelete(file1); + } + + @Test + public void testFileReader3() throws IOException, InterruptedException, AdapterException { + FileReader reader = new FileReader(2); + reader.setAdapter(new MockProtocolAdapter()); + List fileList = new ArrayList(1); + File file1 = new File("testFileReader1.txt"); + FileUtils.write(file1, "1234 line1\n"); + FileUtils.write(file1, " nl line12\n", true); + FileUtils.write(file1, " nl line13\n", true); + FileUtils.write(file1, "2345 line2\n", true); + FileUtils.write(file1, "5524 line3\n", true); + FileUtils.write(file1, "7478 line4\n", true); + FileUtils.write(file1, " nl line42\n", true); + FileUtils.write(file1, "8234 line5\n", true); + FileUtils.write(file1, " nl line52\n", true); + Thread.sleep(500); + FileState state = new FileState(file1); + fileList.add(state); + state.setFields(new Event().addField("testFileReader1", "testFileReader1")); + Map m = new HashMap(); + m.put("pattern", "^[0-9]{4}"); + m.put("negate", "true"); + state.setMultiline(new Multiline(m)); + assertEquals(2, reader.readFiles(fileList)); + assertEquals(2, reader.readFiles(fileList)); + assertEquals(1, reader.readFiles(fileList)); + assertEquals(0, reader.readFiles(fileList)); + FileUtils.forceDelete(file1); + } + + @Test + public void testFileReader4() throws IOException, InterruptedException, AdapterException { + FileReader reader = new FileReader(2); + reader.setAdapter(new MockProtocolAdapter()); + List fileList = new ArrayList(1); + File file1 = new File("testFileReader1.txt"); + FileUtils.write(file1, "1234 line1\n"); + FileUtils.write(file1, " nl line12\n", true); + FileUtils.write(file1, "8234 line5\n", true); + FileUtils.write(file1, " nl line52\n", true); + Thread.sleep(500); + FileState state = new FileState(file1); + fileList.add(state); + state.setFields(new Event().addField("testFileReader1", "testFileReader1")); + Map m = new HashMap(); + m.put("pattern", "^[0-9]{4}"); + m.put("negate", "true"); + state.setMultiline(new Multiline(m)); + assertEquals(2, reader.readFiles(fileList)); + assertEquals(0, reader.readFiles(fileList)); + FileUtils.forceDelete(file1); + } + + @Test + public void testFileReader5() throws IOException, InterruptedException, AdapterException { + FileReader reader = new FileReader(2); + reader.setAdapter(new MockProtocolAdapter()); + List fileList = new ArrayList(1); + File file1 = new File("testFileReader1.txt"); + FileUtils.write(file1, "testFileReader1 line1\n"); + FileUtils.write(file1, "testFileReader1 line2\n", true); + FileUtils.write(file1, "testFileReader1 line3\n", true); + Thread.sleep(500); + FileState state = new FileState(file1); + fileList.add(state); + state.setFields(new Event().addField("testFileReader1", "testFileReader1")); + assertEquals(2, reader.readFiles(fileList)); + assertEquals(1, reader.readFiles(fileList)); + assertEquals(0, reader.readFiles(fileList)); + FileUtils.forceDelete(file1); + } + + @Test + public void testFileReader6() throws IOException, InterruptedException, AdapterException { + FileReader reader = new FileReader(100); + reader.setAdapter(new MockProtocolAdapter()); + List fileList = new ArrayList(1); + File file1 = new File("testFileReader6.txt"); + FileUtils.write(file1, "0000 line1\n"); + for (int i=0; i<700; i+=7) { + FileUtils.write(file1, String.format("%04d line\n", i), true); + FileUtils.write(file1, String.format(" nl line%04d\n", i+1), true); + FileUtils.write(file1, String.format("%04d line\n", i+2), true); + FileUtils.write(file1, String.format("%04d line\n", i+3), true); + FileUtils.write(file1, String.format("%04d line\n", i+4), true); + FileUtils.write(file1, String.format(" nl line%04d\n", i+5), true); + FileUtils.write(file1, String.format(" nl line%04d\n", i+6), true); + } + Thread.sleep(500); + FileState state = new FileState(file1); + fileList.add(state); + state.setFields(new Event().addField("testFileReader6", "testFileReader6")); + Map m = new HashMap(); + m.put("pattern", "^[0-9]{4}"); + m.put("negate", "true"); + state.setMultiline(new Multiline(m)); + for (int i=0; i<4; i++) + assertEquals(100, reader.readFiles(fileList)); + assertEquals(1, reader.readFiles(fileList)); + assertEquals(0, reader.readFiles(fileList)); + FileUtils.forceDelete(file1); + } +}