You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lenya.apache.org by an...@apache.org on 2008/12/30 16:30:11 UTC

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

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;
     }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@lenya.apache.org
For additional commands, e-mail: commits-help@lenya.apache.org