svn commit: r730153 - in /lenya/trunk/src: impl/java/org/apache/lenya/cms/repository/SharedItemStoreImpl.java java/org/apache/lenya/cms/repository/SharedItemStore.java modules/sitetree/java/src/org/apache/lenya/cms/site/tree2/SiteTreeFactory.java

[email protected]
Newsgroups gmane.comp.cms.lenya.cvs
Message-ID <[email protected]>
Author: andreas
Date: Tue Dec 30 07:30:11 2008
New Revision: 730153

URL: http://svn.apache.org/viewvc?rev=730153&view=rev
Log:
Use separate session for SharedItemStore. This way it can be avoided that a client object (e.g., DelegatingSiteTree) contains items from various identity maps when the SharedItemStore has been re-set in the meantime.

Modified:
    lenya/trunk/src/impl/java/org/apache/lenya/cms/repository/SharedItemStoreImpl.java
    lenya/trunk/src/java/org/apache/lenya/cms/repository/SharedItemStore.java
    lenya/trunk/src/modules/sitetree/java/src/org/apache/lenya/cms/site/tree2/SiteTreeFactory.java

Modified: lenya/trunk/src/impl/java/org/apache/lenya/cms/repository/SharedItemStoreImpl.java
URL: http://svn.apache.org/viewvc/lenya/trunk/src/impl/java/org/apache/lenya/cms/repository/SharedItemStoreImpl.java?rev=730153&r1=730152&r2=730153&view=diff
==============================================================================
--- lenya/trunk/src/impl/java/org/apache/lenya/cms/repository/SharedItemStoreImpl.java (original)
+++ lenya/trunk/src/impl/java/org/apache/lenya/cms/repository/SharedItemStoreImpl.java Tue Dec 30 07:30:11 2008
@@ -18,12 +18,13 @@
 package org.apache.lenya.cms.repository;
 
 import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.avalon.framework.service.Serviceable;
 import org.apache.avalon.framework.thread.ThreadSafe;
 import org.apache.lenya.ac.Identity;
 import org.apache.lenya.cms.observation.RepositoryEvent;
 import org.apache.lenya.cms.observation.RepositoryListener;
-import org.apache.lenya.transaction.IdentityMap;
-import org.apache.lenya.transaction.IdentityMapImpl;
 import org.apache.lenya.transaction.Lock;
 import org.apache.lenya.transaction.Lockable;
 import org.apache.lenya.transaction.TransactionException;
@@ -32,15 +33,20 @@
 /**
  * Shared item store implementation.
  */
-public class SharedItemStoreImpl extends AbstractLogEnabled implements SharedItemStore, ThreadSafe {
+public class SharedItemStoreImpl extends AbstractLogEnabled implements SharedItemStore, ThreadSafe, Serviceable {
 
-    private IdentityMap map;
+    private Session session;
+    private ServiceManager manager;
 
-    protected synchronized IdentityMap getIdentityMap() {
-        if (this.map == null) {
-            this.map = new IdentityMapImpl(getLogger());
+    public synchronized Session getSession() {
+        if (this.session == null) {
+            try {
+                this.session = RepositoryUtil.createSession(this.manager, new Identity(getLogger()), false);
+            } catch (RepositoryException e) {
+                throw new RuntimeException(e);
+            }
         }
-        return this.map;
+        return this.session;
     }
 
     public void addListener(RepositoryListener listener) throws RepositoryException {
@@ -61,8 +67,7 @@
 
     public RepositoryItem getRepositoryItem(RepositoryItemFactory factory, String key)
             throws RepositoryException {
-        RepositoryItemFactoryWrapper wrapper = new RepositoryItemFactoryWrapper(factory, this);
-        return (RepositoryItem) getIdentityMap().get(wrapper, key);
+        return (RepositoryItem) getSession().getRepositoryItem(factory, key);
     }
 
     public boolean isListenerRegistered(RepositoryListener listener) {
@@ -106,11 +111,18 @@
     }
 
     public synchronized void clear() {
-        this.map = null;
+        this.session = null;
     }
 
     public String getId() {
         return getClass().getName();
     }
+
+    public void addListener(SharedItemStoreListener listener) {
+    }
+
+    public void service(ServiceManager manager) throws ServiceException {
+        this.manager = manager;
+    }
     
 }

Modified: lenya/trunk/src/java/org/apache/lenya/cms/repository/SharedItemStore.java
URL: http://svn.apache.org/viewvc/lenya/trunk/src/java/org/apache/lenya/cms/repository/SharedItemStore.java?rev=730153&r1=730152&r2=730153&view=diff
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/repository/SharedItemStore.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/repository/SharedItemStore.java Tue Dec 30 07:30:11 2008
@@ -17,6 +17,8 @@
  */
 package org.apache.lenya.cms.repository;
 
+import org.apache.lenya.transaction.IdentityMap;
+
 /**
  * Store for read-only items which are shared by all sessions for performance reasons.
  */
@@ -31,5 +33,7 @@
      * Clears the store when a session has been committed.
      */
     void clear();
+    
+    Session getSession();
 
 }

Modified: lenya/trunk/src/modules/sitetree/java/src/org/apache/lenya/cms/site/tree2/SiteTreeFactory.java
URL: http://svn.apache.org/viewvc/lenya/trunk/src/modules/sitetree/java/src/org/apache/lenya/cms/site/tree2/SiteTreeFactory.java?rev=730153&r1=730152&r2=730153&view=diff
==============================================================================
--- lenya/trunk/src/modules/sitetree/java/src/org/apache/lenya/cms/site/tree2/SiteTreeFactory.java (original)
+++ lenya/trunk/src/modules/sitetree/java/src/org/apache/lenya/cms/site/tree2/SiteTreeFactory.java Tue Dec 30 07:30:11 2008
@@ -56,28 +56,24 @@
         String publicationId = snippets[0];
         String areaName = snippets[1];
         SiteTree tree;
+        SharedItemStore store = null;
         try {
             DocumentFactory factory = DocumentUtil.createDocumentFactory(this.manager, session);
             Publication publication = factory.getPublication(publicationId);
-            Area  area = publication.getArea(areaName);
-            
-            if (session.isModifiable() || session instanceof SharedItemStore) {
+            Area area = publication.getArea(areaName);
+            store = (SharedItemStore) this.manager.lookup(SharedItemStore.ROLE);
+
+            if (session.isModifiable() || session == store.getSession()) {
                 tree = new SiteTreeImpl(this.manager, area, getLogger());
-            }
-            else {
-                SharedItemStore store = null;
-                try {
-                    store = (SharedItemStore) this.manager.lookup(SharedItemStore.ROLE);
-                    tree = new DelegatingSiteTree(this.manager, area, this, store, key);
-                }
-                finally {
-                    if (store != null) {
-                        this.manager.release(store);
-                    }
-                }
+            } else {
+                tree = new DelegatingSiteTree(this.manager, area, this, store, key);
             }
         } catch (Exception e) {
             throw new RepositoryException(e);
+        } finally {
+            if (store != null) {
+                this.manager.release(store);
+            }
         }
         return tree;
     }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.