You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ms...@apache.org on 2011/02/15 17:11:07 UTC

svn commit: r1070950 - in /myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/facelets: DatePropertyTagRule.java StringArrayPropertyTagRule.java

Author: mstarets
Date: Tue Feb 15 16:11:06 2011
New Revision: 1070950

URL: http://svn.apache.org/viewvc?rev=1070950&view=rev
Log:
TRINIDAD-2034 - DatePropertyTagRule and StringArrayPropertyTagRule cache mutable objects

Modified:
    myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/facelets/DatePropertyTagRule.java
    myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/facelets/StringArrayPropertyTagRule.java

Modified: myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/facelets/DatePropertyTagRule.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/facelets/DatePropertyTagRule.java?rev=1070950&r1=1070949&r2=1070950&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/facelets/DatePropertyTagRule.java (original)
+++ myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/facelets/DatePropertyTagRule.java Tue Feb 15 16:11:06 2011
@@ -59,14 +59,17 @@ class DatePropertyTagRule
     
     public void applyMetadata(FaceletContext ctx, Object instance)
     {
-      if (_params == null)
+      if (_time == null)
       {
         Date date = _coerceToDate(_attribute.getValue(), _adjustToEnd);
-        _params = new Object[]{date};
+        _time = (date == null) ? _UNKNOWN_TIME : date.getTime();
       }
       try
       {
-        _method.invoke(instance, _params);
+        // TRINIDAD-2034 - create a new instance of Date every time to avoid issues
+        // with sharing mutable objects
+        Object params[] = new Object[]{(_time.longValue() == _UNKNOWN_TIME) ? null : new Date(_time)};
+        _method.invoke(instance, params);
       }
       catch (InvocationTargetException e)
       {
@@ -81,7 +84,8 @@ class DatePropertyTagRule
     private final Method       _method;
     private final TagAttribute _attribute;
     private final boolean      _adjustToEnd;
-    private       Object[]     _params;
+    private       Long         _time;
+    private static final long  _UNKNOWN_TIME = -1;
   }
   
   public Metadata applyRule(String name, TagAttribute attribute,

Modified: myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/facelets/StringArrayPropertyTagRule.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/facelets/StringArrayPropertyTagRule.java?rev=1070950&r1=1070949&r2=1070950&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/facelets/StringArrayPropertyTagRule.java (original)
+++ myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/facelets/StringArrayPropertyTagRule.java Tue Feb 15 16:11:06 2011
@@ -21,8 +21,10 @@ package org.apache.myfaces.trinidadinter
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 
+import java.util.List;
 import java.util.ArrayList;
 import java.util.StringTokenizer;
+import java.util.Collections;
 
 import javax.faces.view.facelets.FaceletContext;
 import javax.faces.view.facelets.Metadata;
@@ -51,15 +53,17 @@ final class StringArrayPropertyTagRule e
     @Override
     public void applyMetadata(FaceletContext ctx, Object instance)
     {
-      if (_params == null)
+      if (_itemList == null)
       {
-        String[] strArray = _coerceToStringArray(_attribute.getValue());
-        _params = new Object[]{strArray};
+        _itemList = _coerceToStringArray(_attribute.getValue());
       }
       
       try
       {
-        _method.invoke(instance, _params);
+        // TRINIDAD-2034 - create a new String array instance every time to avoid issues
+        // with sharing mutable objects
+        Object params = new Object[]{_itemList.isEmpty() ? null : _itemList.toArray(new String[_itemList.size()])};
+        _method.invoke(instance, params);
       }
       catch (InvocationTargetException e)
       {
@@ -73,7 +77,7 @@ final class StringArrayPropertyTagRule e
 
     private final Method       _method;
     private final TagAttribute _attribute;
-    private       Object[]     _params;
+    private       List<String> _itemList;
   }
    
 
@@ -98,10 +102,10 @@ final class StringArrayPropertyTagRule e
     return null;
   }
 
-  static private String[] _coerceToStringArray(String str)
+  static private List<String> _coerceToStringArray(String str)
   {
     if (str == null)
-      return null;
+      return Collections.emptyList();
 
     ArrayList<String> list = new ArrayList<String>();
     StringTokenizer tokens = new StringTokenizer(str);
@@ -110,7 +114,7 @@ final class StringArrayPropertyTagRule e
       list.add(tokens.nextToken());
     }
     
-    return list.toArray(new String[list.size()]);
+    return list;
   }
 
   static private final Class<? extends String[]> _STRING_ARRAY_TYPE = (new String[0]).getClass();