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]