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 at...@apache.org on 2008/03/31 21:55:58 UTC

svn commit: r643116 - in /portals/jetspeed-2/portal/trunk: components/jetspeed-prefs/ components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/ jetspeed-commons/src/main/java/org/apache/jetspeed/util/ jetspeed-portal-resources/src/main/re...

Author: ate
Date: Mon Mar 31 12:55:46 2008
New Revision: 643116

URL: http://svn.apache.org/viewvc?rev=643116&view=rev
Log:
Fixing a serious flaw in the initialization of Jetspeed (persistent) Preferences.
Java Preferences initializes the preferences spi using the default *or* provided PreferencesFactory only *once* per JVM.
The instantiated PreferencesFactory is stored as static *final* instance globally for the full JVM.
Restarting Jetspeed or its Spring container (like when running multiple unforked unit tests) will never lead to instantiating a new/fresh instance of its PreferencesFactory.
As our current implementation loads an OJB based PreferencesProvider in the JetspeedPreferences, reloading the Spring container leads to broken/invalid proxies and/or Class cast exceptions!
The following fix resolves this issue by wrapping the Jetspeed Preferences userRoot and systemRoot themselves (trough a higher (system) classloader loaded Observer interface).
Restarting the Jetspeed Spring container within the same JVM now properly injects a new/clean instance of the PersistenceBrokerPreferencesProvider, even if the Spring container is reloaded through a new classloader.

Added:
    portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PreferencesProviderWrapper.java   (with props)
    portals/jetspeed-2/portal/trunk/jetspeed-commons/src/main/java/org/apache/jetspeed/util/PreferencesRootWrapper.java   (with props)
Modified:
    portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/pom.xml
    portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PersistenceBrokerPreferencesProvider.java
    portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PreferencesFactoryImpl.java
    portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PreferencesImpl.java
    portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/prefs.xml

Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/pom.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/pom.xml?rev=643116&r1=643115&r2=643116&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/pom.xml (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/pom.xml Mon Mar 31 12:55:46 2008
@@ -47,6 +47,11 @@
         </dependency>
         <dependency>
             <groupId>${pom.groupId}</groupId>
+            <artifactId>jetspeed-commons</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>${pom.groupId}</groupId>
             <artifactId>jetspeed-rdbms</artifactId>
         </dependency>
 

Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PersistenceBrokerPreferencesProvider.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PersistenceBrokerPreferencesProvider.java?rev=643116&r1=643115&r2=643116&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PersistenceBrokerPreferencesProvider.java (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PersistenceBrokerPreferencesProvider.java Mon Mar 31 12:55:46 2008
@@ -215,6 +215,13 @@
         this.preloadedApplications = apps;
         this.preloadEntities = preloadEntities;
     }
+    
+    public void destroy()
+    {
+        NodeImplProxy.setProvider(null);
+        preferenceCache = null;
+        preloadedApplications = null;
+    }
 
     protected void addToCache(NodeCache content)
     {

Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PreferencesFactoryImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PreferencesFactoryImpl.java?rev=643116&r1=643115&r2=643116&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PreferencesFactoryImpl.java (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PreferencesFactoryImpl.java Mon Mar 31 12:55:46 2008
@@ -16,35 +16,54 @@
  */
 package org.apache.jetspeed.prefs.impl;
 
+import java.util.Observer;
 import java.util.prefs.Preferences;
 import java.util.prefs.PreferencesFactory;
 
 import org.apache.jetspeed.prefs.PreferencesException;
 import org.apache.jetspeed.prefs.PreferencesProvider;
+import org.apache.jetspeed.util.PreferencesRootWrapper;
 
 /**
  * <p>{@link java.util.prefs.PreferencesFactory} implementation to
  * return {@link PreferencesImpl}.</p>
  *
  * @author <a href="mailto:dlestrat@apache.org">David Le Strat</a>
+ * @author <a href="mailto:ate@douma.nu">Ate Douma</a>
+ * @version $Id$
  */
 public class PreferencesFactoryImpl implements PreferencesFactory
 {
+    private Preferences userRootWrapper;
+    private Preferences systemRootWrapper;
+    private PreferencesImpl userRoot;
+    private PreferencesImpl systemRoot;
+    private PreferencesProvider preferencesProvider;
     
-    protected static PreferencesProvider prefsProvider;
-
+    /**
+     * Java Preferences invoked constructor
+     */
     public PreferencesFactoryImpl()
     {
-        super();        
-        System.setProperty("java.util.prefs.PreferencesFactory", getClass().getName());
-    }  
+        userRootWrapper = new PreferencesRootWrapper();
+        systemRootWrapper = new PreferencesRootWrapper();
+    }
 
     /**
+     * Spring invoked constructor with a dummy parameter to distinguish it from the default constructor invoked by the Java Preferences
+     * @param dummy
+     */
+    public PreferencesFactoryImpl(int dummy)
+    {
+        System.setProperty("java.util.prefs.PreferencesFactory", getClass().getName());
+    }
+    
+    /**
      * @see java.util.prefs.PreferencesFactory#systemRoot()
      */
     public Preferences systemRoot()
     {
-      return  PreferencesImpl.systemRoot;
+      return  systemRootWrapper;
     }
 
     /**
@@ -52,7 +71,7 @@
      */
     public Preferences userRoot()
     {
-        return  PreferencesImpl.userRoot;
+        return  userRootWrapper;
     }
     
     /**
@@ -65,24 +84,32 @@
     public void init() throws Exception
     {        
         try
-        {           
-              PreferencesImpl.setPreferencesProvider(prefsProvider);
-              PreferencesImpl.systemRoot = new PreferencesImpl(null, "", PreferencesImpl.SYSTEM_NODE_TYPE);
-              PreferencesImpl.userRoot =  new PreferencesImpl(null, "", PreferencesImpl.USER_NODE_TYPE);            
+        {   
+            // Wrap the PreferencesProvider to provide a single instance to be stored in the Preferences nodes
+            // which can be disposed at once for all
+            PreferencesProviderWrapper ppw = new PreferencesProviderWrapper(preferencesProvider);
+            preferencesProvider = null;
+            userRoot = new PreferencesImpl(null, ppw, "", PreferencesImpl.USER_NODE_TYPE);
+            systemRoot = new PreferencesImpl(null, ppw, "", PreferencesImpl.SYSTEM_NODE_TYPE);
+            // set/update the Java Preferences userRoot and systeRoot PreferencesRootWrapper instances
+            ((Observer)Preferences.userRoot()).update(null, userRoot);
+            ((Observer)Preferences.systemRoot()).update(null, systemRoot);
         }
         catch(Throwable e)
         {
-	    e.printStackTrace();
-            throw new PreferencesException("Failed to initialize prefs api.  "+e.toString());
+            throw new PreferencesException("Failed to initialize prefs api.  "+e.getMessage(), e);
         }
     }
     
-    /**
-     * @return The {@link PreferencesProvider}
-     */
-    public PreferencesProvider getPrefsProvider()
+    public void dispose()
     {
-        return prefsProvider;
+        ((Observer)Preferences.userRoot()).update(null, null);
+        ((Observer)Preferences.systemRoot()).update(null, null);
+        userRoot.disposeNode();
+        systemRoot.disposeNode();
+        userRoot.ppw.dispose();
+        userRoot = null;
+        systemRoot = null;
     }
     
     /**
@@ -90,10 +117,10 @@
      * Set the preferences provider.
      * </p>
      * 
-     * @param prefsProvider The {@link PreferencesProvider}
+     * @param preferencesProvider The {@link PreferencesProvider}
      */
-    public void setPrefsProvider(PreferencesProvider prefsProvider)
+    public void setPrefsProvider(PreferencesProvider preferencesProvider)
     {
-        PreferencesFactoryImpl.prefsProvider = prefsProvider;
+        this.preferencesProvider = preferencesProvider;
     }
 }

Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PreferencesImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PreferencesImpl.java?rev=643116&r1=643115&r2=643116&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PreferencesImpl.java (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PreferencesImpl.java Mon Mar 31 12:55:46 2008
@@ -29,7 +29,6 @@
 import org.apache.jetspeed.prefs.FailedToCreateNodeException;
 import org.apache.jetspeed.prefs.NodeAlreadyExistsException;
 import org.apache.jetspeed.prefs.NodeDoesNotExistException;
-import org.apache.jetspeed.prefs.PreferencesProvider;
 import org.apache.jetspeed.prefs.om.Node;
 import org.apache.jetspeed.prefs.om.Property;
 import org.apache.jetspeed.prefs.om.impl.PropertyImpl;
@@ -41,6 +40,8 @@
  * </p>
  * 
  * @author <a href="mailto:dlestrat@apache.org">David Le Strat </a>
+ * @author <a href="mailto:ate@douma.nu">Ate Douma</a>
+ * @version $Id$
  */
 public class PreferencesImpl extends AbstractPreferences
 {
@@ -57,12 +58,13 @@
     /** Logger. */
     private static final Log log = LogFactory.getLog(PreferencesImpl.class);
 
-    protected static PreferencesProvider prefsProvider;
-
-    static PreferencesImpl systemRoot;
-
-    static PreferencesImpl userRoot;
-
+    PreferencesProviderWrapper ppw;
+    
+    void disposeNode()
+    {
+        node = null;
+    }
+    
     /**
      * <p>
      * Constructs a root node in the underlying datastore if they have not yet
@@ -76,19 +78,20 @@
      * @param nodeName The node name.
      * @param nodeType The node type.
      */
-    public PreferencesImpl(PreferencesImpl parent, String nodeName, int nodeType) throws IllegalStateException
+    PreferencesImpl(PreferencesImpl parent, PreferencesProviderWrapper ppw, String nodeName, int nodeType) throws IllegalStateException
     {
         super(parent, nodeName);
 
         try
         {
+            this.ppw = ppw;
             if (parent != null)
             {
-                this.node = prefsProvider.createNode(parent.getNode(), nodeName, nodeType, this.absolutePath());
+                this.node = ppw.provider().createNode(parent.getNode(), nodeName, nodeType, this.absolutePath());
             }
             else
             {
-                this.node = prefsProvider.createNode(null, nodeName, nodeType, this.absolutePath());
+                this.node = ppw.provider().createNode(null, nodeName, nodeType, this.absolutePath());
             }
 
             newNode = true;
@@ -104,7 +107,7 @@
         {
             try
             {
-                node = prefsProvider.getNode(this.absolutePath(), nodeType);
+                node = ppw.provider().getNode(this.absolutePath(), nodeType);
                 newNode = false;
             }
             catch (NodeDoesNotExistException e1)
@@ -128,7 +131,7 @@
      */
     public String[] childrenNamesSpi() throws BackingStoreException
     {
-        Collection nodes = prefsProvider.getChildren(getNode());
+        Collection nodes = ppw.provider().getChildren(getNode());
 
         if (null != nodes)
         {
@@ -153,7 +156,7 @@
      */
     public AbstractPreferences childSpi(String name)
     {
-        return new PreferencesImpl(this, name, node.getNodeType());
+        return new PreferencesImpl(this, ppw, name, node.getNodeType());
     }
 
     /**
@@ -161,7 +164,7 @@
      */
     public void flushSpi() throws BackingStoreException
     {
-        prefsProvider.storeNode(this.node);
+        ppw.provider().storeNode(this.node);
     }
 
     /**
@@ -243,7 +246,7 @@
             properties.add(new PropertyImpl(node.getNodeId(), key, value));
         }
 
-        prefsProvider.storeNode(node);
+        ppw.provider().storeNode(node);
     }
 
     /**
@@ -257,7 +260,7 @@
         {
             parentNode = ((PreferencesImpl) parent).getNode();
         }
-        prefsProvider.removeNode(parentNode, node);
+        ppw.provider().removeNode(parentNode, node);
     }
 
     /**
@@ -277,7 +280,7 @@
             }
         }
         // Update node.
-        prefsProvider.storeNode(node);
+        ppw.provider().storeNode(node);
     }
 
     /**
@@ -299,21 +302,5 @@
     public Node getNode()
     {
         return node;
-    }
-
-    /**
-     * 
-     * <p>
-     * setPreferencesProvider
-     * </p>
-     * Sets the <code>org.apache.jetspeed.prefs.PreferencesProvider</code>
-     * that will support backing store operations for all
-     * <code>PreferencesImpls</code>
-     * 
-     * @param prefsProvider
-     */
-    public static void setPreferencesProvider(PreferencesProvider prefsProvider)
-    {
-        PreferencesImpl.prefsProvider = prefsProvider;
     }
 }

Added: portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PreferencesProviderWrapper.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PreferencesProviderWrapper.java?rev=643116&view=auto
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PreferencesProviderWrapper.java (added)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PreferencesProviderWrapper.java Mon Mar 31 12:55:46 2008
@@ -0,0 +1,42 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jetspeed.prefs.impl;
+
+import org.apache.jetspeed.prefs.PreferencesProvider;
+
+/**
+ * @author <a href="mailto:ate@douma.nu">Ate Douma</a>
+ * @version $Id$
+ */
+public class PreferencesProviderWrapper
+{
+    PreferencesProvider provider;
+    PreferencesProviderWrapper(PreferencesProvider provider)
+    {
+        this.provider = provider;
+    }
+    
+    PreferencesProvider provider()
+    {
+        return provider;
+    }
+    
+    void dispose()
+    {
+        provider = null;
+    }
+}

Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PreferencesProviderWrapper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PreferencesProviderWrapper.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: portals/jetspeed-2/portal/trunk/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PreferencesProviderWrapper.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: portals/jetspeed-2/portal/trunk/jetspeed-commons/src/main/java/org/apache/jetspeed/util/PreferencesRootWrapper.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/jetspeed-commons/src/main/java/org/apache/jetspeed/util/PreferencesRootWrapper.java?rev=643116&view=auto
==============================================================================
--- portals/jetspeed-2/portal/trunk/jetspeed-commons/src/main/java/org/apache/jetspeed/util/PreferencesRootWrapper.java (added)
+++ portals/jetspeed-2/portal/trunk/jetspeed-commons/src/main/java/org/apache/jetspeed/util/PreferencesRootWrapper.java Mon Mar 31 12:55:46 2008
@@ -0,0 +1,234 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jetspeed.util;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Observable;
+import java.util.Observer;
+import java.util.prefs.BackingStoreException;
+import java.util.prefs.NodeChangeListener;
+import java.util.prefs.PreferenceChangeListener;
+import java.util.prefs.Preferences;
+
+/**
+ * PreferencesRootWrapper is a lightweight wrapper around the Jetspeed persistent PreferencesImpl to allow
+ * restarting the Jetspeed Portal.
+ * <p>
+ * As the (Sun) Java Preferences implementation only creates a PreferencesFactory instance *once* per JVM
+ * (as static final), reloading the Jetspeed Portal (using a new classloader) requires a wrapper solution
+ * to prevent ClassCastExceptions and/or out-of-sync kept proxies and caches.
+ * </p>
+ * <p>
+ * As a newly created Jetspeed Portal classloader can no longer cast a previous Preferences root to its
+ * own PreferencesImpl, a "trick" is used by also implementing the Observer interface (which is provided by
+ * the Java system classloader). The Observer interface is used because it is very lightweight and allows
+ * passing an Object instance through its update method. That update method is used to "inject" the newly
+ * created Preferences root instance. 
+ * </p>
+ * @author <a href="mailto:ate@douma.nu">Ate Douma</a>
+ * @version $Id$
+ */
+public class PreferencesRootWrapper extends Preferences implements Observer
+{
+    private Preferences root;
+    
+    public String absolutePath()
+    {
+        return root.absolutePath();
+    }
+
+    public void addNodeChangeListener(NodeChangeListener ncl)
+    {
+        root.addNodeChangeListener(ncl);
+    }
+
+    public void addPreferenceChangeListener(PreferenceChangeListener pcl)
+    {
+        root.addPreferenceChangeListener(pcl);
+    }
+
+    public String[] childrenNames() throws BackingStoreException
+    {
+        return root.childrenNames();
+    }
+
+    public void clear() throws BackingStoreException
+    {
+        root.clear();
+    }
+
+    public boolean equals(Object obj)
+    {
+        return root.equals(obj);
+    }
+
+    public void exportNode(OutputStream os) throws IOException, BackingStoreException
+    {
+        root.exportNode(os);
+    }
+
+    public void exportSubtree(OutputStream os) throws IOException, BackingStoreException
+    {
+        root.exportSubtree(os);
+    }
+
+    public void flush() throws BackingStoreException
+    {
+        root.flush();
+    }
+
+    public String get(String key, String def)
+    {
+        return root.get(key, def);
+    }
+
+    public boolean getBoolean(String key, boolean def)
+    {
+        return root.getBoolean(key, def);
+    }
+
+    public byte[] getByteArray(String key, byte[] def)
+    {
+        return root.getByteArray(key, def);
+    }
+
+    public double getDouble(String key, double def)
+    {
+        return root.getDouble(key, def);
+    }
+
+    public float getFloat(String key, float def)
+    {
+        return root.getFloat(key, def);
+    }
+
+    public int getInt(String key, int def)
+    {
+        return root.getInt(key, def);
+    }
+
+    public long getLong(String key, long def)
+    {
+        return root.getLong(key, def);
+    }
+
+    public int hashCode()
+    {
+        return root.hashCode();
+    }
+
+    public boolean isUserNode()
+    {
+        return root.isUserNode();
+    }
+
+    public String[] keys() throws BackingStoreException
+    {
+        return root.keys();
+    }
+
+    public String name()
+    {
+        return root.name();
+    }
+
+    public Preferences node(String pathName)
+    {
+        return root.node(pathName);
+    }
+
+    public boolean nodeExists(String pathName) throws BackingStoreException
+    {
+        return root.nodeExists(pathName);
+    }
+
+    public Preferences parent()
+    {
+        return root.parent();
+    }
+
+    public void put(String key, String value)
+    {
+        root.put(key, value);
+    }
+
+    public void putBoolean(String key, boolean value)
+    {
+        root.putBoolean(key, value);
+    }
+
+    public void putByteArray(String key, byte[] value)
+    {
+        root.putByteArray(key, value);
+    }
+
+    public void putDouble(String key, double value)
+    {
+        root.putDouble(key, value);
+    }
+
+    public void putFloat(String key, float value)
+    {
+        root.putFloat(key, value);
+    }
+
+    public void putInt(String key, int value)
+    {
+        root.putInt(key, value);
+    }
+
+    public void putLong(String key, long value)
+    {
+        root.putLong(key, value);
+    }
+
+    public void remove(String key)
+    {
+        root.remove(key);
+    }
+
+    public void removeNode() throws BackingStoreException
+    {
+        root.removeNode();
+    }
+
+    public void removeNodeChangeListener(NodeChangeListener ncl)
+    {
+        root.removeNodeChangeListener(ncl);
+    }
+
+    public void removePreferenceChangeListener(PreferenceChangeListener pcl)
+    {
+        root.removePreferenceChangeListener(pcl);
+    }
+
+    public void sync() throws BackingStoreException
+    {
+        root.sync();
+    }
+
+    public String toString()
+    {
+        return root.toString();
+    }
+
+    public void update(Observable o, Object arg)
+    {
+        root = (Preferences)arg;
+    }
+}

Propchange: portals/jetspeed-2/portal/trunk/jetspeed-commons/src/main/java/org/apache/jetspeed/util/PreferencesRootWrapper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: portals/jetspeed-2/portal/trunk/jetspeed-commons/src/main/java/org/apache/jetspeed/util/PreferencesRootWrapper.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: portals/jetspeed-2/portal/trunk/jetspeed-commons/src/main/java/org/apache/jetspeed/util/PreferencesRootWrapper.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/prefs.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/prefs.xml?rev=643116&r1=643115&r2=643116&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/prefs.xml (original)
+++ portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/prefs.xml Mon Mar 31 12:55:46 2008
@@ -20,7 +20,7 @@
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
     
     <!-- Preferences Implementation -->
-    <bean id="PreferencesProviderImpl" class="org.apache.jetspeed.prefs.impl.PersistenceBrokerPreferencesProvider" name="prefsPersistenceBroker" init-method="init">
+    <bean id="PreferencesProviderImpl" class="org.apache.jetspeed.prefs.impl.PersistenceBrokerPreferencesProvider" name="prefsPersistenceBroker" init-method="init" destroy-method="destroy">
         <constructor-arg index="0">
             <value>JETSPEED-INF/ojb/prefs_repository.xml</value>
         </constructor-arg>
@@ -37,7 +37,7 @@
         <constructor-arg index='3'><value type="boolean">false</value></constructor-arg>        
     </bean>
 
-    <bean id="org.apache.jetspeed.prefs.PreferencesProvider" parent="baseTransactionProxy" name="prefsProvider">
+    <bean id="org.apache.jetspeed.prefs.PreferencesProvider" parent="baseTransactionProxy" name="prefsProvider" destroy-method="destroy">
         <property name="proxyInterfaces">
             <value>org.apache.jetspeed.prefs.PreferencesProvider</value>
         </property>
@@ -56,7 +56,9 @@
     </bean>
 
     <!-- PreferencesFactory implementation -->
-    <bean id="java.util.prefs.PreferencesFactory" class="org.apache.jetspeed.prefs.impl.PreferencesFactoryImpl" name="prefsFactory" init-method="init">
+    <bean id="java.util.prefs.PreferencesFactory" class="org.apache.jetspeed.prefs.impl.PreferencesFactoryImpl" name="prefsFactory" init-method="init" destroy-method="destroy">
+        <!-- dummy constructor argument to distinguish it from the default constructor invoked by the Java Preferences itself --> 
+        <constructor-arg><value>1</value></constructor-arg>
         <property name="prefsProvider">
             <ref bean="prefsProvider" />
         </property>



---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@portals.apache.org
For additional commands, e-mail: jetspeed-dev-help@portals.apache.org