diff --git a/src/main/java/com/joestelmach/natty/Parser.java b/src/main/java/com/joestelmach/natty/Parser.java index 76c0ff81..e5097fe0 100644 --- a/src/main/java/com/joestelmach/natty/Parser.java +++ b/src/main/java/com/joestelmach/natty/Parser.java @@ -2,14 +2,13 @@ import java.io.ByteArrayInputStream; import java.io.IOException; +import java.io.Serializable; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.TimeZone; -import java.util.logging.ConsoleHandler; import java.util.logging.Level; import java.util.logging.Logger; -import java.util.logging.SimpleFormatter; import org.antlr.runtime.ANTLRInputStream; import org.antlr.runtime.CommonTokenStream; @@ -18,6 +17,8 @@ import org.antlr.runtime.tree.CommonTree; import org.antlr.runtime.tree.CommonTreeNodeStream; import org.antlr.runtime.tree.Tree; +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.HashCodeBuilder; import com.joestelmach.natty.generated.DateLexer; import com.joestelmach.natty.generated.DateParser; @@ -28,7 +29,10 @@ * * @author Joe Stelmach */ -public class Parser { +public class Parser implements Serializable { + + private static final long serialVersionUID = 233282586086252203L; + private TimeZone _defaultTimeZone; private static final Logger _logger = Logger.getLogger("com.joestelmach.natty"); @@ -313,4 +317,27 @@ else if(skip) { } } } + + @Override + public int hashCode() { + // use two randomly chosen prime numbers + return new HashCodeBuilder(17, 31). + append(_defaultTimeZone). + toHashCode(); + } + + @Override + public boolean equals(Object obj) { + boolean isEqual = false; + + if (obj instanceof Parser) { + Parser other = (Parser) obj; + + isEqual = new EqualsBuilder(). + append(_defaultTimeZone, other._defaultTimeZone). + isEquals(); + } + + return isEqual; + } } diff --git a/src/test/java/com/joestelmach/natty/ParserTest.java b/src/test/java/com/joestelmach/natty/ParserTest.java new file mode 100644 index 00000000..f8ba61d3 --- /dev/null +++ b/src/test/java/com/joestelmach/natty/ParserTest.java @@ -0,0 +1,47 @@ +package com.joestelmach.natty; + +import static org.junit.Assert.*; + +import java.util.TimeZone; + +import org.apache.commons.lang.SerializationUtils; +import org.junit.Test; + +public class ParserTest { + + @Test + public void testParser() { + // Test serializing of a basic parser which does not have a + // user-supplied TimeZone. + Parser parser = new Parser(); + + byte[] serialized = SerializationUtils.serialize(parser); + Parser deserialized = (Parser) SerializationUtils.deserialize(serialized); + + // Check the parser + // Note: if a.equals(b), then a.hashcode() MUST equal b.hashcode() + // see http://stackoverflow.com/a/27609 for more. + assertEquals(parser, deserialized); + assertEquals(parser.hashCode(), deserialized.hashCode()); + } + + @Test + public void testParserTimeZone() { + // TODO this could be improved by mocking TimeZone since it is not part + // of the system under test. + TimeZone defaultTimeZone = TimeZone.getDefault(); + + // Test serializing of an alternate parser with a + // user-supplied TimeZone. + Parser parser = new Parser(defaultTimeZone); + + byte[] serialized = SerializationUtils.serialize(parser); + Parser deserialized = (Parser) SerializationUtils.deserialize(serialized); + + // Check the parser + // Note: if a.equals(b), then a.hashcode() MUST equal b.hashcode() + // see http://stackoverflow.com/a/27609 for more. + assertEquals(parser, deserialized); + assertEquals(parser.hashCode(), deserialized.hashCode()); + } +}