Author: ate
Date: Sun Feb 18 17:13:56 2007
New Revision: 509044

URL: http://svn.apache.org/viewvc?view=rev&rev=509044
Log:
Fix for JS2-607: storing null values in preferences

Modified:
    
portals/jetspeed-2/trunk/components/registry/src/java/org/apache/jetspeed/om/preference/impl/PrefsPreference.java
    
portals/jetspeed-2/trunk/components/registry/src/test/org/apache/jetspeed/components/portletentity/TestPortletEntityDAO.java

Modified: 
portals/jetspeed-2/trunk/components/registry/src/java/org/apache/jetspeed/om/preference/impl/PrefsPreference.java
URL: 
http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/registry/src/java/org/apache/jetspeed/om/preference/impl/PrefsPreference.java?view=diff&rev=509044&r1=509043&r2=509044
==============================================================================
--- 
portals/jetspeed-2/trunk/components/registry/src/java/org/apache/jetspeed/om/preference/impl/PrefsPreference.java
 (original)
+++ 
portals/jetspeed-2/trunk/components/registry/src/java/org/apache/jetspeed/om/preference/impl/PrefsPreference.java
 Sun Feb 18 17:13:56 2007
@@ -35,10 +35,12 @@
 public class PrefsPreference implements PreferenceComposite
 {
     protected static final String VALUES_PATH = "values";
+    protected static final String VALUES_SIZE = "size";
   
     public static final String PORTLET_PREFERENCES_ROOT = "preferences";
     protected static final String LOCALE_TOKEN = "_";
     protected Preferences prefValueNode;
+    protected Preferences prefValueSizeNode;
     protected Preferences prefNode;
     protected String name;
     public static final String[] DEFAULT_OPEN_NODES = new String[] 
{MutablePortletEntity.PORTLET_ENTITY_ROOT, 
PortletDefinitionComposite.PORTLETS_PREFS_ROOT};
@@ -61,6 +63,7 @@
         }
         
         this.prefValueNode = prefNode.node(VALUES_PATH);
+        this.prefValueSizeNode = prefNode.node(VALUES_SIZE);
     }
     
     public PrefsPreference(PortletDefinitionComposite portlet, String name)
@@ -68,6 +71,33 @@
         this(createPrefenceNode(portlet).node(name), name);
     }
 
+    
+    private int getPrefValueSize(boolean store)
+    {
+        int size = prefValueSizeNode.getInt(VALUES_SIZE, -1);
+        if ( size == -1 )
+        {
+            // prefSizeNode doesn't exist
+            // if values exists (upgrading issue), determine from number of 
values keys
+            try
+            {
+                size = prefValueNode.keys().length;
+            }
+            catch (BackingStoreException e)
+            {
+                String msg = "Preference backing store failed: "+e.toString();
+                IllegalStateException ise = new IllegalStateException(msg);
+                ise.initCause(e);
+                throw ise;
+            }
+            if (store)
+            {
+                prefValueSizeNode.putInt(VALUES_SIZE,size);
+            }
+        }
+        return size;
+    }
+    
     /**
      * <p>
      * addDescription
@@ -120,7 +150,22 @@
     
     public void removeValueAt(int index)
     {
-        prefValueNode.remove(String.valueOf(index));
+        int size;
+        if (index > -1 && index < (size = getPrefValueSize(true)) )
+        {
+            String[] values = new String[size-1];
+            for (int i = 0; i < index; i++)
+            {
+                values[i] = prefValueNode.get(String.valueOf(i),null);
+            }
+            for ( int i = index+1; i < size; i++)
+            {
+                values[i] = prefValueNode.get(String.valueOf(i),null);
+            }
+            setValues(values);
+        }
+        else
+            throw new IndexOutOfBoundsException();
     }
 
     /**
@@ -135,8 +180,32 @@
      */
     public void setValueAt( int index, String value )
     {
-        prefValueNode.put(String.valueOf(index), value);
-
+        if ( index > -1 )
+        {
+            int size = getPrefValueSize(true);
+            if ( index < size )
+            {
+                if ( value != null )
+                {
+                    prefValueNode.put(String.valueOf(index), value);
+                }
+                else
+                {
+                    prefValueNode.remove(String.valueOf(index));
+                }
+            }
+            else
+            {
+                prefValueSizeNode.putInt(VALUES_SIZE, index+1);
+                if ( value != null )
+                {
+                    prefValueNode.put(String.valueOf(index),value);
+                }
+            }
+            
+        }
+        else
+            throw new IndexOutOfBoundsException();
     }
 
     /**
@@ -149,33 +218,12 @@
      */
     public void addValue( String value )
     {
-       String stringKey = null;
-        try
-        {
-            String[] keys = prefValueNode.keys();
-            if (keys.length > 0)
-            {
-                Arrays.sort(keys);
-                stringKey = keys[keys.length - 1];
-                int nextIndex = Integer.parseInt(stringKey) + 1;
-                setValueAt(nextIndex, value);
-            }
-            else
-            {
-                setValueAt(0, value);
-            }
-        }
-        catch (NumberFormatException e)
-        {
-            throw new IllegalArgumentException("Could not convert preference 
key "+stringKey+" to an int.");
-        }
-        catch (BackingStoreException e)
-        {            
-            String msg = "Preference backing store failed: "+e.toString();
-            IllegalStateException ise = new IllegalStateException(msg);
-            ise.initCause(e);
-            throw ise;
-        }
+       int size = getPrefValueSize(true);
+       prefValueSizeNode.putInt(VALUES_SIZE, size+1);
+       if ( value != null )
+       {
+           prefValueNode.put(String.valueOf(size),value);
+       }
     }
 
     /**
@@ -188,31 +236,13 @@
      */
     public String[] getValueArray()
     {
-        try
-        {
-            String[] keys = prefValueNode.keys();
-            if (keys.length > 0)
-            {
-                String[] values = new String[keys.length];
-                Arrays.sort(keys);
-                for (int i = 0; i < keys.length; i++)
-                {
-                    values[i] = prefValueNode.get(String.valueOf(i), null);
-                }
-                return values;
-            }
-            else
-            {
-                return new String[0];
-            }
-        }
-        catch (BackingStoreException e)
+        int size = getPrefValueSize(false);
+        String[] values = new String[size];
+        for (int i = 0; i < size; i++)
         {
-            String msg = "Preference backing store failed: "+e.toString();
-            IllegalStateException ise = new IllegalStateException(msg);
-            ise.initCause(e);
-            throw ise;
+            values[i] = prefValueNode.get(String.valueOf(i),null);
         }
+        return values;
     }
 
     /**
@@ -227,12 +257,14 @@
     {
         try
         {
-            if (stringValues != null)
+            prefValueNode.clear();
+            int size = stringValues != null ? stringValues.length : 0;
+            prefValueSizeNode.putInt(VALUES_SIZE, size);
+            for (int i = 0; i < size; i++)
             {
-                prefValueNode.clear();
-                for (int i = 0; i < stringValues.length; i++)
+                if (stringValues[i] != null)
                 {
-                    setValueAt(i, stringValues[i]);
+                    prefValueNode.put(String.valueOf(i), stringValues[i]);
                 }
             }
         }
@@ -380,7 +412,7 @@
      */
     public boolean isValueSet()
     {
-        return getValueArray().length > 0;
+        return getPrefValueSize(false) > 0;
     }
 
     protected Locale parseLocal( String localString )

Modified: 
portals/jetspeed-2/trunk/components/registry/src/test/org/apache/jetspeed/components/portletentity/TestPortletEntityDAO.java
URL: 
http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/registry/src/test/org/apache/jetspeed/components/portletentity/TestPortletEntityDAO.java?view=diff&rev=509044&r1=509043&r2=509044
==============================================================================
--- 
portals/jetspeed-2/trunk/components/registry/src/test/org/apache/jetspeed/components/portletentity/TestPortletEntityDAO.java
 (original)
+++ 
portals/jetspeed-2/trunk/components/registry/src/test/org/apache/jetspeed/components/portletentity/TestPortletEntityDAO.java
 Sun Feb 18 17:13:56 2007
@@ -18,17 +18,11 @@
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Iterator;
-import java.util.List;
 import java.util.Locale;
-import java.util.Map;
 import java.util.prefs.Preferences;
 
-import org.apache.jetspeed.aggregator.PortletContent;
 import org.apache.jetspeed.components.portletregistry.PortletRegistry;
 import org.apache.jetspeed.components.util.DatasourceEnabledSpringTestCase;
-import org.apache.jetspeed.decoration.Decoration;
-import org.apache.jetspeed.om.common.SecurityConstraint;
-import org.apache.jetspeed.om.common.SecurityConstraints;
 import org.apache.jetspeed.om.common.portlet.MutablePortletApplication;
 import org.apache.jetspeed.om.common.portlet.MutablePortletEntity;
 import org.apache.jetspeed.om.common.portlet.PortletDefinitionComposite;
@@ -196,6 +190,32 @@
             count++;
         }
         assertEquals(2, count);
+
+        // testing preferences null values assignments fix, issue JS2-607
+        pref2.setValueAt(0, null);        
+        assertNull("pref2.value[0] should be null", pref2.getValueAt(0));      
  
+        String[] values = pref2.getValueArray();
+        assertEquals(2, values.length);
+        assertNull("pref2.value[0] should be null", values[0]);
+        assertEquals("3", values[1]);
+        pref2.setValues(new String[]{"2",null,"3"});
+        assertNull("pref2.value[1] should be null", pref2.getValueAt(1));
+        values = pref2.getValueArray();
+        assertEquals(3, values.length);
+        assertEquals("2", values[0]);
+        assertNull("pref2.value[1] should be null", values[1]);
+        assertEquals("3", values[2]);
+        assertTrue(pref2.isValueSet());
+        pref2.setValues((String[])null);
+        assertFalse(pref2.isValueSet());
+        assertTrue(pref2.getValueArray().length == 0);
+        entity.reset();
+        assertTrue(pref2.getValueArray().length == 2);
+        pref2.setValues(new String[]{});
+        assertFalse(pref2.isValueSet());
+        assertTrue(pref2.getValueArray().length == 0);
+        entity.reset();
+        assertTrue(pref2.getValueArray().length == 2);
 
         MutablePortletEntity entity2 = 
entityAccess.getPortletEntityForFragment(f1);
         assertTrue("entity id ", 
entity2.getId().toString().equals(TEST_ENTITY));



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to