svn commit: r567473 - in /lenya/trunk/src: impl/java/org/apache/lenya/cms/publication/ java/org/apache/lenya/cms/cocoon/components/modules/input/ java/org/apache/lenya/cms/cocoon/source/ java/org/apache/lenya/cms/publication/ modules-core/ac/java/src/o...

[email protected]
Newsgroups gmane.comp.cms.lenya.cvs
Message-ID <[email protected]>
Author: andreas
Date: Sun Aug 19 14:12:37 2007
New Revision: 567473

URL: http://svn.apache.org/viewvc?rev=567473&view=rev
Log:
Made publication manager more efficient and correct (avoid invalid publication objects)

Modified:
    lenya/trunk/src/impl/java/org/apache/lenya/cms/publication/DocumentFactoryImpl.java
    lenya/trunk/src/impl/java/org/apache/lenya/cms/publication/PublicationManagerImpl.java
    lenya/trunk/src/java/org/apache/lenya/cms/cocoon/components/modules/input/AbstractPageEnvelopeModule.java
    lenya/trunk/src/java/org/apache/lenya/cms/cocoon/source/AggregatingFallbackSourceFactory.java
    lenya/trunk/src/java/org/apache/lenya/cms/cocoon/source/FallbackSourceFactory.java
    lenya/trunk/src/java/org/apache/lenya/cms/publication/PublicationManager.java
    lenya/trunk/src/modules-core/ac/java/src/org/apache/lenya/cms/ac/PublicationAccessControllerResolver.java
    lenya/trunk/src/pubs/default/java/src/org/apache/lenya/defaultpub/cms/publication/templating/Instantiator.java

Modified: lenya/trunk/src/impl/java/org/apache/lenya/cms/publication/DocumentFactoryImpl.java
URL: http://svn.apache.org/viewvc/lenya/trunk/src/impl/java/org/apache/lenya/cms/publication/DocumentFactoryImpl.java?rev=567473&r1=567472&r2=567473&view=diff
==============================================================================
--- lenya/trunk/src/impl/java/org/apache/lenya/cms/publication/DocumentFactoryImpl.java (original)
+++ lenya/trunk/src/impl/java/org/apache/lenya/cms/publication/DocumentFactoryImpl.java Sun Aug 19 14:12:37 2007
@@ -17,6 +17,7 @@
  */
 package org.apache.lenya.cms.publication;
 
+import java.util.Arrays;
 import java.util.StringTokenizer;
 
 import org.apache.avalon.framework.container.ContainerUtil;
@@ -174,11 +175,13 @@
      */
     public boolean isDocument(String webappUrl) throws DocumentBuildException {
 
+        PublicationManager pubMgr = getPubManager();
         try {
-            Publication publication = PublicationUtil.getPublicationFromUrl(this.manager, this,
-                    webappUrl);
-            if (publication.exists()) {
-                DocumentBuilder builder = publication.getDocumentBuilder();
+            URLInformation info = new URLInformation(webappUrl);
+            String pubId = info.getPublicationId();
+            if (pubId != null && Arrays.asList(pubMgr.getPublicationIds()).contains(pubId)) {
+                Publication pub = pubMgr.getPublication(this, pubId);
+                DocumentBuilder builder = pub.getDocumentBuilder();
                 return builder.isDocument(this, webappUrl);
             } else {
                 return false;
@@ -307,35 +310,28 @@
     }
 
     public Publication getPublication(String id) throws PublicationException {
-        PublicationManager pubManager = null;
-        try {
-            pubManager = (PublicationManager) manager.lookup(PublicationManager.ROLE);
-            return pubManager.getPublication(this, id);
-        } catch (ServiceException e) {
-            throw new PublicationException(e);
-        } finally {
-            if (pubManager != null) {
-                manager.release(pubManager);
-            }
-        }
+        return getPubManager().getPublication(this, id);
     }
 
     public Publication[] getPublications() {
-        PublicationManager pubManager = null;
-        try {
-            pubManager = (PublicationManager) manager.lookup(PublicationManager.ROLE);
-            return pubManager.getPublications(this);
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        } finally {
-            if (pubManager != null) {
-                manager.release(pubManager);
-            }
-        }
+        return getPubManager().getPublications(this);
     }
 
     public boolean isSharable() {
         return false;
+    }
+
+    private PublicationManager pubManager;
+
+    protected PublicationManager getPubManager() {
+        if (this.pubManager == null) {
+            try {
+                this.pubManager = (PublicationManager) this.manager.lookup(PublicationManager.ROLE);
+            } catch (ServiceException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        return this.pubManager;
     }
 
 }

Modified: lenya/trunk/src/impl/java/org/apache/lenya/cms/publication/PublicationManagerImpl.java
URL: http://svn.apache.org/viewvc/lenya/trunk/src/impl/java/org/apache/lenya/cms/publication/PublicationManagerImpl.java?rev=567473&r1=567472&r2=567473&view=diff
==============================================================================
--- lenya/trunk/src/impl/java/org/apache/lenya/cms/publication/PublicationManagerImpl.java (original)
+++ lenya/trunk/src/impl/java/org/apache/lenya/cms/publication/PublicationManagerImpl.java Sun Aug 19 14:12:37 2007
@@ -24,8 +24,10 @@
 import java.io.FileFilter;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.avalon.framework.activity.Initializable;
 import org.apache.avalon.framework.container.ContainerUtil;
@@ -52,31 +54,37 @@
     public PublicationManagerImpl() {
     }
 
-    private static Map id2config = new HashMap();
+    private Map id2config;
 
-    public synchronized Publication getPublication(DocumentFactory factory, String id)
-            throws PublicationException {
-
-        Assert.notNull("publication ID", id);
-        if (id.indexOf("/") != -1) {
-            throw new PublicationException("The publication ID [" + id
-                    + "] must not contain a slash!");
+    protected synchronized Map getId2config() throws PublicationException {
+        if (this.id2config == null) {
+            this.id2config = new HashMap();
+            File servletContext = new File(this.servletContextPath);
+            File publicationsDirectory = new File(servletContext, Publication.PUBLICATION_PREFIX);
+            File[] publicationDirectories = publicationsDirectory.listFiles(new FileFilter() {
+                public boolean accept(File file) {
+                    File configFile = new File(file, PublicationConfiguration.CONFIGURATION_FILE);
+                    return configFile.exists();
+                }
+            });
+            for (int i = 0; i < publicationDirectories.length; i++) {
+                String id = publicationDirectories[i].getName();
+                addPublication(id);
+            }
         }
+        return this.id2config;
+    }
 
-        PublicationConfiguration config = null;
+    public Publication getPublication(DocumentFactory factory, String id)
+            throws PublicationException {
 
-        if (id2config.containsKey(id)) {
-            config = (PublicationConfiguration) id2config.get(id);
-        } else {
-            config = new PublicationConfiguration(id, servletContextPath);
-            ContainerUtil.enableLogging(config, getLogger());
-            id2config.put(id, config);
+        Assert.notNull("publication ID", id);
+        Map id2config = getId2config();
+        if (!id2config.containsKey(id)) {
+            throw new PublicationException("The publication [" + id + "] does not exist.");
         }
 
-        if (config == null) {
-            throw new PublicationException("The publication for ID [" + id
-                    + "] could not be created.");
-        }
+        PublicationConfiguration config = (PublicationConfiguration) id2config.get(id);
         PublicationFactory pubFactory = new PublicationFactory(this.manager, config);
         try {
             return (Publication) factory.getSession().getRepositoryItem(pubFactory, id);
@@ -85,31 +93,35 @@
         }
     }
 
-    public Publication[] getPublications(DocumentFactory factory) throws PublicationException {
+    public Publication[] getPublications(DocumentFactory factory) {
         List publications = new ArrayList();
 
         try {
-            File servletContext = new File(this.servletContextPath);
-            File publicationsDirectory = new File(servletContext, Publication.PUBLICATION_PREFIX);
-            File[] publicationDirectories = publicationsDirectory.listFiles(new FileFilter() {
-                public boolean accept(File file) {
-                    return file.isDirectory();
-                }
-            });
-
-            for (int i = 0; i < publicationDirectories.length; i++) {
-                String publicationId = publicationDirectories[i].getName();
+            Map id2config = getId2config();
+            for (Iterator i = id2config.keySet().iterator(); i.hasNext();) {
+                String publicationId = (String) i.next();
                 Publication publication = getPublication(factory, publicationId);
                 publications.add(publication);
             }
-
+        } catch (RuntimeException e) {
+            throw e;
         } catch (Exception e) {
-            throw new PublicationException(e);
+            throw new RuntimeException(e);
         }
 
         return (Publication[]) publications.toArray(new Publication[publications.size()]);
     }
 
+    public String[] getPublicationIds() {
+        Set ids;
+        try {
+            ids = getId2config().keySet();
+        } catch (PublicationException e) {
+            throw new RuntimeException(e);
+        }
+        return (String[]) ids.toArray(new String[ids.size()]);
+    }
+
     private String servletContextPath;
 
     private ServiceManager manager;
@@ -135,4 +147,18 @@
         }
     }
 
-}
\ No newline at end of file
+    public void addPublication(String pubId) throws PublicationException {
+        if (this.id2config.containsKey(pubId)) {
+            throw new PublicationException("The publication [" + pubId + "] already exists.");
+        }
+        PublicationConfiguration config = new PublicationConfiguration(pubId,
+                this.servletContextPath);
+        ContainerUtil.enableLogging(config, getLogger());
+        this.id2config.put(pubId, config);
+    }
+
+    protected String getServletContextPath() {
+        return this.servletContextPath;
+    }
+
+}

Modified: lenya/trunk/src/java/org/apache/lenya/cms/cocoon/components/modules/input/AbstractPageEnvelopeModule.java
URL: http://svn.apache.org/viewvc/lenya/trunk/src/java/org/apache/lenya/cms/cocoon/components/modules/input/AbstractPageEnvelopeModule.java?rev=567473&r1=567472&r2=567473&view=diff
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/cocoon/components/modules/input/AbstractPageEnvelopeModule.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/cocoon/components/modules/input/AbstractPageEnvelopeModule.java Sun Aug 19 14:12:37 2007
@@ -21,6 +21,7 @@
 package org.apache.lenya.cms.cocoon.components.modules.input;
 
 import java.io.File;
+import java.util.Arrays;
 import java.util.Map;
 
 import org.apache.avalon.framework.configuration.ConfigurationException;
@@ -31,7 +32,8 @@
 import org.apache.lenya.cms.publication.PageEnvelope;
 import org.apache.lenya.cms.publication.PageEnvelopeFactory;
 import org.apache.lenya.cms.publication.Publication;
-import org.apache.lenya.cms.publication.PublicationUtil;
+import org.apache.lenya.cms.publication.PublicationManager;
+import org.apache.lenya.cms.publication.URLInformation;
 import org.apache.lenya.util.ServletHelper;
 
 /**
@@ -71,9 +73,15 @@
             Context context = ObjectModelHelper.getContext(objectModel);
             String servletContextPath = context.getRealPath("");
 
+            PublicationManager pubMgr = null;
             try {
                 DocumentFactory factory = getDocumentFactory();
-                Publication pub = PublicationUtil.getPublicationFromUrl(this.manager, factory, webappUrl);
+                Publication pub = null;
+                pubMgr = (PublicationManager) this.manager.lookup(PublicationManager.ROLE);
+                String pubId = new URLInformation(webappUrl).getPublicationId();
+                if (pubId != null && Arrays.asList(pubMgr.getPublicationIds()).contains(pubId)) {
+                    pub = pubMgr.getPublication(factory, pubId);
+                }
                 envelope = PageEnvelopeFactory.getInstance().getPageEnvelope(
                         factory,
                         contextPath,
@@ -82,6 +90,10 @@
                         pub);
             } catch (Exception e) {
                 throw new ConfigurationException("Resolving page envelope failed: ", e);
+            } finally {
+                if (pubMgr != null) {
+                    this.manager.release(pubMgr);
+                }
             }
             request.setAttribute(PageEnvelope.class.getName(), envelope);
         }

Modified: lenya/trunk/src/java/org/apache/lenya/cms/cocoon/source/AggregatingFallbackSourceFactory.java
URL: http://svn.apache.org/viewvc/lenya/trunk/src/java/org/apache/lenya/cms/cocoon/source/AggregatingFallbackSourceFactory.java?rev=567473&r1=567472&r2=567473&view=diff
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/cocoon/source/AggregatingFallbackSourceFactory.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/cocoon/source/AggregatingFallbackSourceFactory.java Sun Aug 19 14:12:37 2007
@@ -102,11 +102,11 @@
 
             pubMgr = (PublicationManager) this.manager.lookup(PublicationManager.ROLE);
             DocumentFactory factory = DocumentUtil.getDocumentFactory(this.manager, request);
-            Publication pub = pubMgr.getPublication(factory, publicationId);
 
             String[] uris;
 
-            if (pub.exists()) {
+            if (Arrays.asList(pubMgr.getPublicationIds()).contains(publicationId)) {
+                Publication pub = pubMgr.getPublication(factory, publicationId);
                 AllExistingSourceResolver resolver = new AllExistingSourceResolver();
                 templateManager.visit(pub, path, resolver);
                 uris = resolver.getUris();

Modified: lenya/trunk/src/java/org/apache/lenya/cms/cocoon/source/FallbackSourceFactory.java
URL: http://svn.apache.org/viewvc/lenya/trunk/src/java/org/apache/lenya/cms/cocoon/source/FallbackSourceFactory.java?rev=567473&r1=567472&r2=567473&view=diff
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/cocoon/source/FallbackSourceFactory.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/cocoon/source/FallbackSourceFactory.java Sun Aug 19 14:12:37 2007
@@ -20,6 +20,7 @@
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.text.SimpleDateFormat;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.GregorianCalendar;
 import java.util.Map;
@@ -119,8 +120,8 @@
 
             pubMgr = (PublicationManager) this.manager.lookup(PublicationManager.ROLE);
             DocumentFactory factory = DocumentUtil.getDocumentFactory(this.manager, request);
-            Publication pub = pubMgr.getPublication(factory, publicationId);
-            if (pub.exists()) {
+            if (Arrays.asList(pubMgr.getPublicationIds()).contains(publicationId)) {
+                Publication pub = pubMgr.getPublication(factory, publicationId);
                 VisitingSourceResolver resolver = getSourceVisitor();
                 templateManager.visit(pub, path, resolver);
                 source = resolver.getSource();

Modified: lenya/trunk/src/java/org/apache/lenya/cms/publication/PublicationManager.java
URL: http://svn.apache.org/viewvc/lenya/trunk/src/java/org/apache/lenya/cms/publication/PublicationManager.java?rev=567473&r1=567472&r2=567473&view=diff
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/publication/PublicationManager.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/publication/PublicationManager.java Sun Aug 19 14:12:37 2007
@@ -30,16 +30,27 @@
     /**
      * @param factory The factory.
      * @return All publications.
-     * @throws PublicationException if an error occurrs.
      */
-    Publication[] getPublications(DocumentFactory factory) throws PublicationException;
+    Publication[] getPublications(DocumentFactory factory);
     
     /**
      * @param factory The factory.
      * @param id The publication ID.
      * @return A publication.
-     * @throws PublicationException if an error occurs.
+     * @throws PublicationException if the publication does not exist.
      */
     Publication getPublication(DocumentFactory factory, String id) throws PublicationException;
+    
+    /**
+     * @return The IDs of all available publications.
+     */
+    String[] getPublicationIds();
+    
+    /**
+     * Adds a publication.
+     * @param id The publication ID.
+     * @throws PublicationException if the publication already exists.
+     */
+    void addPublication(String id) throws PublicationException;
     
 }

Modified: lenya/trunk/src/modules-core/ac/java/src/org/apache/lenya/cms/ac/PublicationAccessControllerResolver.java
URL: http://svn.apache.org/viewvc/lenya/trunk/src/modules-core/ac/java/src/org/apache/lenya/cms/ac/PublicationAccessControllerResolver.java?rev=567473&r1=567472&r2=567473&view=diff
==============================================================================
--- lenya/trunk/src/modules-core/ac/java/src/org/apache/lenya/cms/ac/PublicationAccessControllerResolver.java (original)
+++ lenya/trunk/src/modules-core/ac/java/src/org/apache/lenya/cms/ac/PublicationAccessControllerResolver.java Sun Aug 19 14:12:37 2007
@@ -21,6 +21,7 @@
 package org.apache.lenya.cms.ac;
 
 import java.io.File;
+import java.util.Arrays;
 
 import org.apache.avalon.framework.activity.Initializable;
 import org.apache.avalon.framework.configuration.Configurable;
@@ -37,7 +38,7 @@
 import org.apache.lenya.cms.publication.DocumentFactory;
 import org.apache.lenya.cms.publication.DocumentUtil;
 import org.apache.lenya.cms.publication.Publication;
-import org.apache.lenya.cms.publication.PublicationUtil;
+import org.apache.lenya.cms.publication.PublicationManager;
 import org.apache.lenya.cms.publication.URLInformation;
 
 /**
@@ -104,28 +105,30 @@
         if (url.length() > 0) {
 
             URLInformation info = new URLInformation(webappUrl);
-            String publicationId = info.getPublicationId();
+            String pubId = info.getPublicationId();
 
+            PublicationManager pubMgr = null;
             ContextUtility util = null;
             try {
                 util = (ContextUtility) this.manager.lookup(ContextUtility.ROLE);
+                pubMgr = (PublicationManager) this.manager.lookup(PublicationManager.ROLE);
                 Request request = util.getRequest();
                 DocumentFactory factory = DocumentUtil.getDocumentFactory(manager, request);
-                publication = PublicationUtil.getPublicationFromUrl(this.manager,
-                        factory,
-                        webappUrl);
+                if (pubId != null && Arrays.asList(pubMgr.getPublicationIds()).contains(pubId)) {
+                    publication = pubMgr.getPublication(factory, pubId);
+                }
             } catch (Exception e) {
                 throw new AccessControlException(e);
             } finally {
                 if (util != null) {
                     this.manager.release(util);
                 }
+                if (pubMgr != null) {
+                    this.manager.release(pubMgr);
+                }
             }
-            if (publication.exists()) {
-                getLogger().debug("Publication [" + publicationId + "] exists.");
-            } else {
-                getLogger().debug("Publication [" + publicationId + "] does not exist.");
-                publication = null;
+            if (publication != null) {
+                getLogger().debug("Publication [" + pubId + "] exists.");
             }
         }
         return publication;

Modified: lenya/trunk/src/pubs/default/java/src/org/apache/lenya/defaultpub/cms/publication/templating/Instantiator.java
URL: http://svn.apache.org/viewvc/lenya/trunk/src/pubs/default/java/src/org/apache/lenya/defaultpub/cms/publication/templating/Instantiator.java?rev=567473&r1=567472&r2=567473&view=diff
==============================================================================
--- lenya/trunk/src/pubs/default/java/src/org/apache/lenya/defaultpub/cms/publication/templating/Instantiator.java (original)
+++ lenya/trunk/src/pubs/default/java/src/org/apache/lenya/defaultpub/cms/publication/templating/Instantiator.java Sun Aug 19 14:12:37 2007
@@ -45,6 +45,7 @@
 import org.apache.excalibur.source.SourceResolver;
 import org.apache.excalibur.source.impl.FileSource;
 import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.cms.publication.PublicationManager;
 // import org.apache.lenya.cms.publication.PublicationConfiguration;
 import org.apache.lenya.xml.DocumentHelper;
 import org.apache.lenya.xml.NamespaceHelper;
@@ -96,6 +97,7 @@
 
         SourceResolver resolver = null;
         Source publicationsSource = null;
+        PublicationManager pubManager = null;
         try {
             resolver = (SourceResolver) this.manager.lookup(SourceResolver.ROLE);
 
@@ -118,6 +120,9 @@
             configureSearchIndex(resolver, template, newPublicationId, publicationsUri);
 
             updateConfiguration(resolver, template, newPublicationId, publicationsUri);
+            
+            pubManager = (PublicationManager) this.manager.lookup(PublicationManager.ROLE);
+            pubManager.addPublication(newPublicationId);
 
         } finally {
             if (resolver != null) {
@@ -125,6 +130,9 @@
                 if (publicationsSource != null) {
                     resolver.release(publicationsSource);
                 }
+            }
+            if (pubManager != null) {
+                this.manager.release(pubManager);
             }
         }
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.