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

Reply via email to