You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-dev@portals.apache.org by ta...@apache.org on 2009/11/25 21:35:31 UTC
svn commit: r884254 - in /portals/jetspeed-2/portal/trunk:
components/jetspeed-registry/src/main/java/JETSPEED-INF/ojb/
components/jetspeed-registry/src/main/java/org/apache/jetspeed/components/portletpreferences/
components/jetspeed-registry/src/main/...
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: jetspeed-dev-unsubscribe@portals.apache.org
For additional commands, e-mail: jetspeed-dev-help@portals.apache.org