I noticed that the testForFields4 test method in TestPeriodType was failing when running independently, so I decided to investigate.
The current cache implementation in PeriodType fails if the PeriodType object with fields out-of-order is added first. This is because the object with fields out of order is added to the cache, but PeriodType.equals expects the fields to be in order (as it is using Arrays.equals). The next object then falsely misses in the cache. The fix is to cache a PeriodType object with fields in order. This bug was not picked up by tests because the testForFields3 method was running first and adding an object with the fields in the correct order to the cache. Therefore, I also made a change to testForFields4 to make it independent from testForFields3. Thanks for the work on joda-time! PS. Most of the credit goes to my wife (Laura Inozemtseva) for catching the test case failure and troubleshooting. diff -urp joda-time-2.0.orig/src/main/java/org/joda/time/PeriodType.java joda-time-2.0/src/main/java/org/joda/time/PeriodType.java --- joda-time-2.0.orig/src/main/java/org/joda/time/PeriodType.java 2011-12-06 01:56:23.406957436 -0500 +++ joda-time-2.0/src/main/java/org/joda/time/PeriodType.java 2011-12-06 06:01:15.725820494 -0500 @@ -569,10 +569,10 @@ public class PeriodType implements Seria PeriodType checkPartType = new PeriodType(null, type.iTypes, null); PeriodType checkedType = (PeriodType) cache.get(checkPartType); if (checkedType != null) { - cache.put(inPartType, checkedType); + cache.put(checkPartType, checkedType); return checkedType; } - cache.put(inPartType, type); + cache.put(checkPartType, type); return type; } diff -urp joda-time-2.0.orig/src/test/java/org/joda/time/TestPeriodType.java joda-time-2.0/src/test/java/org/joda/time/TestPeriodType.java --- joda-time-2.0.orig/src/test/java/org/joda/time/TestPeriodType.java 2011-12-06 01:56:23.390957347 -0500 +++ joda-time-2.0/src/test/java/org/joda/time/TestPeriodType.java 2011-12-06 06:00:05.321471377 -0500 @@ -522,12 +522,12 @@ public class TestPeriodType extends Test public void testForFields4() throws Exception { DurationFieldType[] types = new DurationFieldType[] { - DurationFieldType.weeks(), + DurationFieldType.days(), DurationFieldType.months(), }; DurationFieldType[] types2 = new DurationFieldType[] { DurationFieldType.months(), - DurationFieldType.weeks(), + DurationFieldType.days(), }; PeriodType type = PeriodType.forFields(types); PeriodType type2 = PeriodType.forFields(types2); ------------------------------------------------------------------------------ Cloud Services Checklist: Pricing and Packaging Optimization This white paper is intended to serve as a reference, checklist and point of discussion for anyone considering optimizing the pricing and packaging model of a cloud services business. Read Now! http://www.accelacomm.com/jaw/sfnl/114/51491232/ _______________________________________________ Joda-interest mailing list Joda-interest@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/joda-interest