diff --git a/spring-integration-core/src/main/java/org/springframework/integration/transformer/SyslogToMapTransformer.java b/spring-integration-core/src/main/java/org/springframework/integration/transformer/SyslogToMapTransformer.java index 719e415e6c..c7b945492a 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/transformer/SyslogToMapTransformer.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/transformer/SyslogToMapTransformer.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,6 +26,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import org.springframework.util.Assert; +import org.springframework.util.StringUtils; /** * Transforms a packet in Syslog (RFC3164) format to a Map. @@ -35,6 +36,7 @@ import org.springframework.util.Assert; * * @author Gary Russell * @author Artem Bilan + * @author Karol Dowbecki * @since 2.2 * */ @@ -54,7 +56,7 @@ public class SyslogToMapTransformer extends AbstractPayloadTransformer]+)>(.{15}) ([^ ]+) (?:([^:]+): )?(.*)", Pattern.DOTALL); + private final Pattern pattern = Pattern.compile("<([^>]+)>(.{15}) ([^ ]+) ([a-zA-Z0-9]{0,32})(.*)", Pattern.DOTALL); private final SimpleDateFormat dateFormat = new SimpleDateFormat("MMM dd HH:mm:ss"); @@ -126,7 +128,7 @@ public class SyslogToMapTransformer extends AbstractPayloadTransformer transformed = t.transformPayload( - "<158>JUL 26 22:08:35 WEBERN TESTING[70729]: TEST SYSLOG MESSAGE".getBytes()); + String syslog = "<158>JUL 26 22:08:35 WEBERN TESTING[70729]: TEST SYSLOG MESSAGE"; + Map transformed = sut.transformPayload(syslog.getBytes()); assertEquals(6, transformed.size()); assertEquals(19, transformed.get(SyslogToMapTransformer.FACILITY)); assertEquals(6, transformed.get(SyslogToMapTransformer.SEVERITY)); Object date = transformed.get(SyslogToMapTransformer.TIMESTAMP); assertTrue(date instanceof Date || date instanceof String); assertEquals("WEBERN", transformed.get(SyslogToMapTransformer.HOST)); - assertEquals("TESTING[70729]", transformed.get(SyslogToMapTransformer.TAG)); - assertEquals("TEST SYSLOG MESSAGE", transformed.get(SyslogToMapTransformer.MESSAGE)); + assertEquals("TESTING", transformed.get(SyslogToMapTransformer.TAG)); + assertEquals("[70729]: TEST SYSLOG MESSAGE", transformed.get(SyslogToMapTransformer.MESSAGE)); - String[] fields = new String[] {SyslogToMapTransformer.FACILITY, - SyslogToMapTransformer.SEVERITY, SyslogToMapTransformer.TIMESTAMP, SyslogToMapTransformer.HOST, + String[] fields = {SyslogToMapTransformer.FACILITY, SyslogToMapTransformer.SEVERITY, + SyslogToMapTransformer.TIMESTAMP, SyslogToMapTransformer.HOST, SyslogToMapTransformer.TAG, SyslogToMapTransformer.MESSAGE}; - Object[] values = new Object[] {19, 6, date, "WEBERN", "TESTING[70729]", "TEST SYSLOG MESSAGE"}; - // check iteration order - int n = 0; - for (Entry entry : transformed.entrySet()) { - assertEquals(fields[n++], entry.getKey()); - } - n = 0; - for (String key : transformed.keySet()) { - assertEquals(fields[n++], key); - } - n = 0; - for (Object value : transformed.values()) { - assertEquals(values[n++], value); - } + Object[] values = {19, 6, date, "WEBERN", "TESTING", "[70729]: TEST SYSLOG MESSAGE"}; + assertIterationOrder(fields, values, transformed); } @Test public void testBadPattern() throws Exception { - SyslogToMapTransformer t = new SyslogToMapTransformer(); String syslog = "&158>JUL 26 22:08:35 WEBERN TESTING[70729]: TEST SYSLOG MESSAGE"; - Map transformed = t.transformPayload( - syslog.getBytes()); + Map transformed = sut.transformPayload(syslog.getBytes()); assertEquals(1, transformed.size()); assertEquals(syslog, transformed.get(SyslogToMapTransformer.UNDECODED)); } @Test public void testBadFacilitySeverity() throws Exception { - SyslogToMapTransformer t = new SyslogToMapTransformer(); String syslog = "JUL 26 22:08:35 WEBERN TESTING[70729]: TEST SYSLOG MESSAGE"; - Map transformed = t.transformPayload( - syslog.getBytes()); + Map transformed = sut.transformPayload(syslog.getBytes()); assertEquals(1, transformed.size()); assertEquals(syslog, transformed.get(SyslogToMapTransformer.UNDECODED)); } @Test public void testWithoutTag() throws Exception { - SyslogToMapTransformer t = new SyslogToMapTransformer(); - Map transformed = t.transformPayload( - "<158>JUL 26 22:08:35 WEBERN TEST SYSLOG MESSAGE".getBytes()); + String syslog = "<158>JUL 26 22:08:35 WEBERN [70729]: TEST SYSLOG MESSAGE"; + Map transformed = sut.transformPayload(syslog.getBytes()); assertEquals(5, transformed.size()); assertEquals(19, transformed.get(SyslogToMapTransformer.FACILITY)); assertEquals(6, transformed.get(SyslogToMapTransformer.SEVERITY)); @@ -97,25 +81,48 @@ public class SysLogTransformerTests { assertTrue(date instanceof Date || date instanceof String); assertEquals("WEBERN", transformed.get(SyslogToMapTransformer.HOST)); assertFalse(transformed.containsKey(SyslogToMapTransformer.TAG)); - assertEquals("TEST SYSLOG MESSAGE", transformed.get(SyslogToMapTransformer.MESSAGE)); + assertEquals("[70729]: TEST SYSLOG MESSAGE", transformed.get(SyslogToMapTransformer.MESSAGE)); - String[] fields = new String[] {SyslogToMapTransformer.FACILITY, - SyslogToMapTransformer.SEVERITY, SyslogToMapTransformer.TIMESTAMP, SyslogToMapTransformer.HOST, + String[] fields = {SyslogToMapTransformer.FACILITY, SyslogToMapTransformer.SEVERITY, + SyslogToMapTransformer.TIMESTAMP, SyslogToMapTransformer.HOST, SyslogToMapTransformer.MESSAGE}; + Object[] values = {19, 6, date, "WEBERN", "[70729]: TEST SYSLOG MESSAGE"}; + assertIterationOrder(fields, values, transformed); + } - Object[] values = new Object[] {19, 6, date, "WEBERN", "TEST SYSLOG MESSAGE"}; - // check iteration order + @Test + public void testTagMaxLength() throws Exception { + String syslog = "<158>JUL 26 22:08:35 WEBERN ABCDE1234567890ABCDE1234567890UVXYZ TEST SYSLOG MESSAGE"; + Map transformed = sut.transformPayload(syslog.getBytes()); + assertEquals(6, transformed.size()); + assertEquals(19, transformed.get(SyslogToMapTransformer.FACILITY)); + assertEquals(6, transformed.get(SyslogToMapTransformer.SEVERITY)); + Object date = transformed.get(SyslogToMapTransformer.TIMESTAMP); + assertTrue(date instanceof Date || date instanceof String); + assertEquals("WEBERN", transformed.get(SyslogToMapTransformer.HOST)); + assertEquals("ABCDE1234567890ABCDE1234567890UV", transformed.get(SyslogToMapTransformer.TAG)); + assertEquals("XYZ TEST SYSLOG MESSAGE", transformed.get(SyslogToMapTransformer.MESSAGE)); + + String[] fields = {SyslogToMapTransformer.FACILITY, SyslogToMapTransformer.SEVERITY, + SyslogToMapTransformer.TIMESTAMP, SyslogToMapTransformer.HOST, + SyslogToMapTransformer.TAG, SyslogToMapTransformer.MESSAGE}; + Object[] values = {19, 6, date, "WEBERN", "ABCDE1234567890ABCDE1234567890UV", "XYZ TEST SYSLOG MESSAGE"}; + assertIterationOrder(fields, values, transformed); + } + + private static void assertIterationOrder(String[] expectedFields, Object[] expectedValues, + Map actualTransformed) { int n = 0; - for (Entry entry : transformed.entrySet()) { - assertEquals(fields[n++], entry.getKey()); + for (Entry entry : actualTransformed.entrySet()) { + assertEquals(expectedFields[n++], entry.getKey()); } n = 0; - for (String key : transformed.keySet()) { - assertEquals(fields[n++], key); + for (String key : actualTransformed.keySet()) { + assertEquals(expectedFields[n++], key); } n = 0; - for (Object value : transformed.values()) { - assertEquals(values[n++], value); + for (Object value : actualTransformed.values()) { + assertEquals(expectedValues[n++], value); } }