Author: taylor
Date: Wed Nov 25 20:35:29 2009
New Revision: 884254

URL: http://svn.apache.org/viewvc?rev=884254&view=rev
Log:
https://issues.apache.org/jira/browse/JS2-1085
A Bug surfaced in Category Portlet Selector when storing defaults, the selector 
threw an NPE during store to persistent preferences. Discovered that the 
selector was still coded against 2.1.3 apis, and needed to be updated. Then 
discovered the PortletDefinitionImpl never keeps a copy of the Preferences 
collection, but always delegates to the Preferences Provider to retrieve 
preferences, and then wrappers the result from the provider with every accessor 
call. The selector was often dereferencing the prefs collection. This should 
not be a problem in a normal transactional environment... For now, the problem 
can be avoided by only dereferencing once, making manipulations to the held 
Preferences, and then 'committing' with a new storeDefaults api which takes a 
second Preferences handle. Also got bogged down in an OJB debugging session 
that turned out to be a simple typo in the OJB mapping file (username is not a 
primary key(!)). 

Modified:
    
portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/main/java/JETSPEED-INF/ojb/registry_repository.xml
    
portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/main/java/org/apache/jetspeed/components/portletpreferences/PortletPreferencesServiceImpl.java
    
portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/main/java/org/apache/jetspeed/components/portletregistry/PersistenceBrokerPortletRegistry.java
    
portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/main/java/org/apache/jetspeed/om/portlet/impl/PortletDefinitionImpl.java
    
portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/test/java/org/apache/jetspeed/components/portletpreferences/TestPortletPreferencesProvider.java
    
portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/components/portletpreferences/PortletPreferencesProvider.java

Modified: 
portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/main/java/JETSPEED-INF/ojb/registry_repository.xml
URL: 
http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/main/java/JETSPEED-INF/ojb/registry_repository.xml?rev=884254&r1=884253&r2=884254&view=diff
==============================================================================
--- 
portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/main/java/JETSPEED-INF/ojb/registry_repository.xml
 (original)
+++ 
portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/main/java/JETSPEED-INF/ojb/registry_repository.xml
 Wed Nov 25 20:35:29 2009
@@ -959,8 +959,8 @@
           name="userName"
           column="USER_NAME"
           jdbc-type="VARCHAR"
-          nullable="false"
-          primarykey="true"
+          nullable="true"
+          primarykey="false"
           length="80"
       >
       </field-descriptor>
@@ -984,6 +984,7 @@
       <collection-descriptor
           name="values"
           
element-class-ref="org.apache.jetspeed.components.portletpreferences.DatabasePreferenceValue"
+                 
collection-class="org.apache.jetspeed.util.ojb.CollectionUtils$SynchronizedRemovalAwareList"
          
           auto-retrieve="true"
           auto-update="object"
           auto-delete="object"

Modified: 
portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/main/java/org/apache/jetspeed/components/portletpreferences/PortletPreferencesServiceImpl.java
URL: 
http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/main/java/org/apache/jetspeed/components/portletpreferences/PortletPreferencesServiceImpl.java?rev=884254&r1=884253&r2=884254&view=diff
==============================================================================
--- 
portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/main/java/org/apache/jetspeed/components/portletpreferences/PortletPreferencesServiceImpl.java
 (original)
+++ 
portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/main/java/org/apache/jetspeed/components/portletpreferences/PortletPreferencesServiceImpl.java
 Wed Nov 25 20:35:29 2009
@@ -290,7 +290,8 @@
                 }
                 else
                 {
-                    updates.add(preference);
+                    if (isModified(preference, found))                    
+                        updates.add(preference);
                 }
                 mergeMap.put(preference.getName(), preference); 
                 
@@ -363,7 +364,7 @@
         return 
portletFactory.getPreferencesValidator((org.apache.jetspeed.om.portlet.PortletDefinition)pd);
     }
 
-    private String getPorletPreferenceKey(String applicationName, String 
portletName)
+    private String getPortletPreferenceKey(String applicationName, String 
portletName)
     {
         return DISCRIMINATOR_PORTLET + KEY_SEPARATOR + applicationName + 
KEY_SEPARATOR + portletName;        
     }
@@ -400,7 +401,7 @@
             if (preference.getPortletName().equals(previousPortletName))
             {
                 map = new JetspeedPreferencesMap();
-                String defaultsCacheKey = 
getPorletPreferenceKey(portletApplicationName, preference.getPortletName());    
            
+                String defaultsCacheKey = 
getPortletPreferenceKey(portletApplicationName, preference.getPortletName());   
             
                 
preferenceCache.put(preferenceCache.createElement(defaultsCacheKey, map));
                 previousPortletName = preference.getPortletName();
             }
@@ -466,44 +467,22 @@
     {
         for (org.apache.jetspeed.om.portlet.PortletDefinition pd : 
app.getPortlets())
         {
-            storeDefaults(pd);
+            storeDefaults(pd, (Preferences)null);
         }
     }
     
     /**
      * Jetspeed: PortletPreferencesProvider
      */    
-    public void storeDefaults(org.apache.jetspeed.om.portlet.PortletDefinition 
pd)
+    public void storeDefaults(org.apache.jetspeed.om.portlet.PortletDefinition 
pd, Preferences newprefs)
     {
-        Preferences preferences = pd.getDescriptorPreferences();
-        String defaultsCacheKey = 
getPorletPreferenceKey(pd.getApplication().getName(), pd.getPortletName());     
       
-        JetspeedPreferencesMap map = new JetspeedPreferencesMap(); 
+        Preferences preferences = (newprefs == null) ? 
pd.getDescriptorPreferences() : newprefs; 
+        JetspeedPreferencesMap map = new JetspeedPreferencesMap();
         for (Preference preference : preferences.getPortletPreferences())
         {
-            DatabasePreference dbPref = new DatabasePreference();
-            dbPref.setDtype(DISCRIMINATOR_PORTLET);
-            dbPref.setApplicationName(pd.getApplication().getName());
-            dbPref.setPortletName(pd.getPortletName());
-            dbPref.setEntityId(EMPTY_VALUE);
-            dbPref.setUserName(EMPTY_VALUE);
-            dbPref.setName(preference.getName());
-            dbPref.setReadOnly(preference.isReadOnly());
-            short index = 0;
-            for (String value : preference.getValues())
-            {
-                DatabasePreferenceValue dbValue = new 
DatabasePreferenceValue();
-                dbValue.setIndex(index);
-                dbValue.setValue(value);
-                dbPref.getPreferenceValues().add(dbValue);
-                index++;
-                
-            }                       
-            JetspeedPreferenceImpl cached = new 
JetspeedPreferenceImpl(dbPref.getName(), dbPref.getValues());
-            cached.setReadOnly(dbPref.isReadOnly());
-            map.put(preference.getName(), cached);
-            getPersistenceBrokerTemplate().store(dbPref);
+            map.put(preference.getName(), new 
JetspeedPreferenceImpl(preference.getName(), preference.getValues().toArray(new 
String[preference.getValues().size()])));
         }
-        preferenceCache.put(preferenceCache.createElement(defaultsCacheKey, 
map));                    
+        this.storePortletPreference(pd, null, null, map);
     }
 
     public void storeDefaults(org.apache.jetspeed.om.portlet.PortletDefinition 
pd, Preference preference)
@@ -550,7 +529,7 @@
 
         JetspeedPreferenceImpl cached = new 
JetspeedPreferenceImpl(preferenceName, dbPref.getValues());
         cached.setReadOnly(dbPref.isReadOnly());
-        String defaultsCacheKey = getPorletPreferenceKey(appName, portletName);
+        String defaultsCacheKey = getPortletPreferenceKey(appName, 
portletName);
         CacheElement cacheElement = preferenceCache.get(defaultsCacheKey);
         JetspeedPreferencesMap map = (cacheElement != null ? 
(JetspeedPreferencesMap) cacheElement.getContent() : new 
JetspeedPreferencesMap());
         map.put(preferenceName, cached);
@@ -622,7 +601,7 @@
         c.addEqualTo("portletName", pd.getPortletName());                
         QueryByCriteria query = 
QueryFactory.newQuery(DatabasePreference.class, c);
         getPersistenceBrokerTemplate().deleteByQuery(query);
-        String defaultsCacheKey = 
getPorletPreferenceKey(pd.getApplication().getName(), pd.getPortletName());     
       
+        String defaultsCacheKey = 
getPortletPreferenceKey(pd.getApplication().getName(), pd.getPortletName());    
        
         preferenceCache.remove(defaultsCacheKey);
     }
 
@@ -636,7 +615,7 @@
         QueryByCriteria query = 
QueryFactory.newQuery(DatabasePreference.class, c);
         getPersistenceBrokerTemplate().deleteByQuery(query);
         
-        String defaultsCacheKey = 
getPorletPreferenceKey(pd.getApplication().getName(), pd.getPortletName());
+        String defaultsCacheKey = 
getPortletPreferenceKey(pd.getApplication().getName(), pd.getPortletName());
         JetspeedPreferencesMap map = (JetspeedPreferencesMap) 
preferenceCache.get(defaultsCacheKey).getContent();
         map.remove(preferenceName);
         preferenceCache.put(preferenceCache.createElement(defaultsCacheKey, 
map));
@@ -654,7 +633,7 @@
         getPersistenceBrokerTemplate().deleteByQuery(query);
         for (PortletDefinition pd : app.getPortlets())
         {
-            String defaultsCacheKey = 
getPorletPreferenceKey(pd.getApplication().getName(), pd.getPortletName());     
       
+            String defaultsCacheKey = 
getPortletPreferenceKey(pd.getApplication().getName(), pd.getPortletName());    
        
             preferenceCache.remove(defaultsCacheKey);            
         }
     }
@@ -666,7 +645,7 @@
     {
         String appName = pd.getApplication().getName();
         String portletName = pd.getPortletName();        
-        String defaultsCacheKey = getPorletPreferenceKey(appName, portletName);
+        String defaultsCacheKey = getPortletPreferenceKey(appName, 
portletName);
         JetspeedPreferencesMap defaultsMap;         
         // first search in cache        
         CacheElement cachedDefaults = preferenceCache.get(defaultsCacheKey);
@@ -784,6 +763,22 @@
         storePortletPreference(appName, portletName, windowId, userName, map);
     }
 
+    private boolean isModified(DatabasePreference dbPref, PortletPreference 
pref)
+    {
+        String[] dbValues = dbPref.getValues();
+        String[] values = pref.getValues();
+        if (dbValues == null || values == null)
+            return true;
+        if (dbValues.length != values.length)
+            return true;
+        for (int ix = 0; ix < values.length; ix++)
+        {
+            if (!values[ix].equals(dbValues[ix]))
+                return true;
+        }
+        return false;
+    }
+    
     /* (non-Javadoc)
      * @see 
org.apache.jetspeed.components.portletpreferences.PortletPreferencesProvider#storePortletPreference(java.lang.String,
 java.lang.String, java.lang.String, java.lang.String, java.util.Map)
      */
@@ -791,11 +786,9 @@
     {
         // always read in to get a fresh copy for merge
         Criteria c = new Criteria();
-        c.addEqualTo("dtype", DISCRIMINATOR_USER);
+        c.addEqualTo("dtype", DISCRIMINATOR_PORTLET);
         c.addEqualTo("applicationName", appName);
-        c.addEqualTo("portletName", portletName);
-        c.addEqualTo("entityId", windowId);
-        c.addEqualTo("userName", userName);
+        c.addEqualTo("portletName", portletName);         
         QueryByCriteria query = 
QueryFactory.newQuery(DatabasePreference.class, c);
         Map<String, DatabasePreference> mergeMap = new HashMap<String, 
DatabasePreference>();
         List<DatabasePreference> deletes = new 
LinkedList<DatabasePreference>();
@@ -812,7 +805,8 @@
             }
             else
             {
-                updates.add(preference);
+                if (isModified(preference, found))
+                    updates.add(preference);
             }
             mergeMap.put(preference.getName(), preference);
         }
@@ -832,7 +826,7 @@
         for (PortletPreference preference : inserts)
         {
             DatabasePreference dbPref = new DatabasePreference();
-            dbPref.setDtype(DISCRIMINATOR_USER);
+            dbPref.setDtype(DISCRIMINATOR_PORTLET);
             dbPref.setApplicationName(appName);
             dbPref.setPortletName(portletName);
             dbPref.setEntityId(windowId);
@@ -866,7 +860,7 @@
             getPersistenceBrokerTemplate().store(dbPref);
         }
         // remove from cache to send distributed notification
-        String cacheKey = getUserPreferenceKey(appName, portletName, windowId, 
userName);
+        String cacheKey = this.getPortletPreferenceKey(appName, portletName); 
//getUserPreferenceKey(appName, portletName, windowId, userName);
         preferenceCache.remove(cacheKey);
     }
 

Modified: 
portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/main/java/org/apache/jetspeed/components/portletregistry/PersistenceBrokerPortletRegistry.java
URL: 
http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/main/java/org/apache/jetspeed/components/portletregistry/PersistenceBrokerPortletRegistry.java?rev=884254&r1=884253&r2=884254&view=diff
==============================================================================
--- 
portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/main/java/org/apache/jetspeed/components/portletregistry/PersistenceBrokerPortletRegistry.java
 (original)
+++ 
portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/main/java/org/apache/jetspeed/components/portletregistry/PersistenceBrokerPortletRegistry.java
 Wed Nov 25 20:35:29 2009
@@ -37,6 +37,7 @@
 import org.apache.jetspeed.om.portlet.PortletApplication;
 import org.apache.jetspeed.om.portlet.PortletDefinition;
 import org.apache.jetspeed.om.portlet.Preference;
+import org.apache.jetspeed.om.portlet.Preferences;
 import org.apache.jetspeed.om.portlet.SecurityRoleRef;
 import org.apache.jetspeed.om.portlet.Supports;
 import org.apache.jetspeed.om.portlet.impl.PortletApplicationDefinitionImpl;
@@ -470,7 +471,7 @@
         }
         try
         {
-            preferenceService.storeDefaults(copy);
+            preferenceService.storeDefaults(copy, (Preferences)null);
         }
         catch (Throwable e)
         {

Modified: 
portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/main/java/org/apache/jetspeed/om/portlet/impl/PortletDefinitionImpl.java
URL: 
http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/main/java/org/apache/jetspeed/om/portlet/impl/PortletDefinitionImpl.java?rev=884254&r1=884253&r2=884254&view=diff
==============================================================================
--- 
portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/main/java/org/apache/jetspeed/om/portlet/impl/PortletDefinitionImpl.java
 (original)
+++ 
portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/main/java/org/apache/jetspeed/om/portlet/impl/PortletDefinitionImpl.java
 Wed Nov 25 20:35:29 2009
@@ -142,7 +142,6 @@
 
     public Preferences getPortletPreferences()
     {
-        //System.out.println(">>> Getting prefs ");
         if (PortletDefinitionImpl.portletPreferencesProvider == null)
         {
             return new PreferencesImpl();            

Modified: 
portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/test/java/org/apache/jetspeed/components/portletpreferences/TestPortletPreferencesProvider.java
URL: 
http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/test/java/org/apache/jetspeed/components/portletpreferences/TestPortletPreferencesProvider.java?rev=884254&r1=884253&r2=884254&view=diff
==============================================================================
--- 
portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/test/java/org/apache/jetspeed/components/portletpreferences/TestPortletPreferencesProvider.java
 (original)
+++ 
portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/test/java/org/apache/jetspeed/components/portletpreferences/TestPortletPreferencesProvider.java
 Wed Nov 25 20:35:29 2009
@@ -17,6 +17,7 @@
 package org.apache.jetspeed.components.portletpreferences;
 
 import org.apache.jetspeed.Jetspeed;
+import org.apache.jetspeed.components.portletregistry.PortletRegistry;
 import org.apache.jetspeed.components.util.DatasourceEnabledSpringTestCase;
 import org.apache.jetspeed.engine.MockJetspeedEngine;
 
@@ -25,8 +26,8 @@
 {
 
     private static MockJetspeedEngine mockEngine = new MockJetspeedEngine();
-       private PortletPreferencesProvider prefs;
-       
+       private PortletPreferencesProvider prefsProvider;
+       private PortletRegistry registry;
        
        @Override
        protected String[] getConfigurations() {
@@ -39,10 +40,12 @@
         super.setUp();
         mockEngine.setComponentManager(scm);
         Jetspeed.setEngine(mockEngine);
-        this.prefs = (PortletPreferencesProvider) 
scm.getComponent("org.apache.jetspeed.components.portletpreferences.PortletPreferencesProvider");
+        this.prefsProvider = (PortletPreferencesProvider) 
scm.getComponent("org.apache.jetspeed.components.portletpreferences.PortletPreferencesProvider");
         PortletPreferencesProvider temp = (PortletPreferencesProvider) 
scm.getComponent("portletPreferencesProvider");
         System.out.println("temp = " + temp);
-        System.out.println("prefs = " + prefs);        
+        System.out.println("prefs = " + prefsProvider);
+        this.registry = (PortletRegistry) scm.getComponent("portletRegistry");
+
 //        teardownTestData();
 //        setupTestData();
     }
@@ -53,10 +56,26 @@
         Jetspeed.setEngine(null);
         super.tearDown();
     }
-    
+
     public void testEntities() throws Exception
-    {
-       System.out.println("Testing baby");     
-    }
+    {}
+    
+//    public void testPrefs() throws Exception
+//    {
+//        System.out.println("Testing prefs");
+//        PortletDefinition pd = 
registry.getPortletDefinitionByUniqueName("j2-admin::CategoryPortletSelector");
+//        PortletDefinitionImpl.setPortletPreferencesProvider(prefsProvider);
+//        assertNotNull(pd);
+//        Preferences prefs = pd.getPortletPreferences();
+//        assertNotNull(prefs);
+//        Preference pref = prefs.getPortletPreference("Keywords:Fun");
+//        assertNotNull(pref);
+//        List<String> values = pref.getValues();
+//        assert(values.size() > 0);
+//        String oldValue = values.get(0); 
+//        oldValue += ",UPDATED";
+//        values.set(0, oldValue);
+//        prefsProvider.storeDefaults(pd, prefs);
+//    }
     
 }

Modified: 
portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/components/portletpreferences/PortletPreferencesProvider.java
URL: 
http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/components/portletpreferences/PortletPreferencesProvider.java?rev=884254&r1=884253&r2=884254&view=diff
==============================================================================
--- 
portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/components/portletpreferences/PortletPreferencesProvider.java
 (original)
+++ 
portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/components/portletpreferences/PortletPreferencesProvider.java
 Wed Nov 25 20:35:29 2009
@@ -24,6 +24,7 @@
 import org.apache.jetspeed.om.portlet.PortletApplication;
 import org.apache.jetspeed.om.portlet.PortletDefinition;
 import org.apache.jetspeed.om.portlet.Preference;
+import org.apache.jetspeed.om.portlet.Preferences;
 import org.apache.pluto.container.PortletPreference;
 import org.apache.pluto.container.PortletPreferencesService;
 
@@ -58,7 +59,7 @@
      * Store the default preferences by descriptor preferences for a given 
portlet definition
      * @param pd
      */
-    public void storeDefaults(PortletDefinition pd);
+    public void storeDefaults(PortletDefinition pd, Preferences prefs);
     
     /**
      * Store the default preferences by input preference for a given portlet 
definition



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to