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]