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/02/04 09:50:57 UTC

svn commit: r618204 - /lenya/trunk/src/modules/sitetree/java/src/org/apache/lenya/cms/cocoon/generation/SitetreeFragmentGenerator.java

Author: andreas
Date: Mon Feb  4 00:50:55 2008
New Revision: 618204

URL: http://svn.apache.org/viewvc?rev=618204&view=rev
Log:
Made SitetreeFragmentGenerator cacheable, allow to pass uuid+language as alternative to path.

Modified:
    lenya/trunk/src/modules/sitetree/java/src/org/apache/lenya/cms/cocoon/generation/SitetreeFragmentGenerator.java

Modified: lenya/trunk/src/modules/sitetree/java/src/org/apache/lenya/cms/cocoon/generation/SitetreeFragmentGenerator.java
URL: http://svn.apache.org/viewvc/lenya/trunk/src/modules/sitetree/java/src/org/apache/lenya/cms/cocoon/generation/SitetreeFragmentGenerator.java?rev=618204&r1=618203&r2=618204&view=diff
==============================================================================
--- lenya/trunk/src/modules/sitetree/java/src/org/apache/lenya/cms/cocoon/generation/SitetreeFragmentGenerator.java (original)
+++ lenya/trunk/src/modules/sitetree/java/src/org/apache/lenya/cms/cocoon/generation/SitetreeFragmentGenerator.java Mon Feb  4 00:50:55 2008
@@ -21,15 +21,18 @@
 package org.apache.lenya.cms.cocoon.generation;
 
 import java.io.IOException;
+import java.io.Serializable;
 import java.util.Map;
 
 import org.apache.avalon.framework.parameters.Parameters;
-import org.apache.avalon.framework.service.ServiceSelector;
 import org.apache.cocoon.ProcessingException;
+import org.apache.cocoon.caching.CacheableProcessingComponent;
 import org.apache.cocoon.environment.ObjectModelHelper;
 import org.apache.cocoon.environment.Request;
-import org.apache.cocoon.environment.SourceResolver;
 import org.apache.cocoon.generation.ServiceableGenerator;
+import org.apache.excalibur.source.Source;
+import org.apache.excalibur.source.SourceResolver;
+import org.apache.excalibur.source.SourceValidity;
 import org.apache.lenya.cms.publication.DocumentFactory;
 import org.apache.lenya.cms.publication.DocumentUtil;
 import org.apache.lenya.cms.publication.Publication;
@@ -39,7 +42,6 @@
 import org.apache.lenya.cms.repository.Session;
 import org.apache.lenya.cms.site.Link;
 import org.apache.lenya.cms.site.SiteException;
-import org.apache.lenya.cms.site.SiteManager;
 import org.apache.lenya.cms.site.SiteNode;
 import org.apache.lenya.cms.site.SiteStructure;
 import org.apache.lenya.util.ServletHelper;
@@ -48,26 +50,19 @@
 
 /**
  * Generates a fragment of the navigation XML from the sitetree, corresponding to a given node. The
- * node is specified by the sitemap parameters area/path. If the sitemap parameter initialTree
- * is true, the top nodes of the tree will be generated and the node given by the sitemap parameters
- * area/path will be unfolded. If initialTree is false, only the children of the selected node
- * will be generated.
+ * node is specified by the sitemap parameters area/path. If the sitemap parameter initialTree is
+ * true, the top nodes of the tree will be generated and the node given by the sitemap parameters
+ * area/path will be unfolded. If initialTree is false, only the children of the selected node will
+ * be generated.
  */
-public class SitetreeFragmentGenerator extends ServiceableGenerator {
-
-    protected Publication publication;
-
-    /** Parameter which denotes the path of the clicked node */
-    protected String path;
-
-    /** Parameter which denotes the area of the clicked node */
-    protected String area;
+public class SitetreeFragmentGenerator extends ServiceableGenerator implements
+        CacheableProcessingComponent {
 
     /**
      * Parameter which decides if the initial tree with the root nodes is generated
      */
     protected boolean initialTree;
-    
+
     /**
      * Parameter which decides if the node mime types should be reported
      */
@@ -81,9 +76,17 @@
      */
     protected AttributesImpl attributes;
 
+    private SiteStructure site;
+
+    private String path;
+
+    private SourceValidity validity;
+
     protected static final String PARAM_PUB = "pub";
     protected static final String PARAM_AREA = "area";
     protected static final String PARAM_PATH = "path";
+    protected static final String PARAM_UUID = "uuid";
+    protected static final String PARAM_LANGUAGE = "language";
     protected static final String PARAM_INITIAL = "initial";
     protected static final String PARAM_TYPE = "mimetype";
     protected static final String PARAM_AREAS = "areas";
@@ -119,8 +122,8 @@
      * @see org.apache.cocoon.sitemap.SitemapModelComponent#setup(org.apache.cocoon.environment.SourceResolver,
      *      java.util.Map, java.lang.String, org.apache.avalon.framework.parameters.Parameters)
      */
-    public void setup(SourceResolver _resolver, Map _objectModel, String src, Parameters par)
-            throws ProcessingException, SAXException, IOException {
+    public void setup(org.apache.cocoon.environment.SourceResolver _resolver, Map _objectModel,
+            String src, Parameters par) throws ProcessingException, SAXException, IOException {
         super.setup(_resolver, _objectModel, src, par);
 
         Request request = ObjectModelHelper.getRequest(_objectModel);
@@ -128,8 +131,10 @@
             getLogger().debug("Resolving page envelope for URL [" + request.getRequestURI() + "]");
         }
 
-        this.area = par.getParameter(PARAM_AREA, null);
+        String area = par.getParameter(PARAM_AREA, null);
         this.path = par.getParameter(PARAM_PATH, null);
+        String uuid = par.getParameter(PARAM_UUID, null);
+        String language = par.getParameter(PARAM_LANGUAGE, null);
 
         if (par.isParameter(PARAM_INITIAL)) {
             this.initialTree = Boolean.valueOf(par.getParameter(PARAM_INITIAL, null))
@@ -137,7 +142,7 @@
         } else {
             this.initialTree = false;
         }
-        
+
         if (par.isParameter(PARAM_TYPE)) {
             this.showType = Boolean.valueOf(par.getParameter(PARAM_TYPE, null)).booleanValue();
         } else {
@@ -153,8 +158,9 @@
         }
 
         if (this.getLogger().isDebugEnabled()) {
-            this.getLogger().debug("Parameter area: " + this.area);
-            this.getLogger().debug("Parameter path: " + this.path);
+            this.getLogger().debug("Parameter area: " + area);
+            this.getLogger().debug("Parameter path: " + path);
+            this.getLogger().debug("Parameter uuid: " + uuid);
             this.getLogger().debug("Parameter initialTree: " + this.initialTree);
             StringBuffer areasStr = new StringBuffer();
             for (int i = 0; i < this.areas.length; i++) {
@@ -162,20 +168,32 @@
             }
             this.getLogger().debug("Parameter areas: " + areasStr.toString());
         }
-        
+
         try {
             Session session = RepositoryUtil.getSession(this.manager, request);
             DocumentFactory factory = DocumentUtil.createDocumentFactory(this.manager, session);
             String pubId = null;
             if (par.isParameter(PARAM_PUB)) {
                 pubId = par.getParameter(PARAM_PUB);
-            }
-            else {
+            } else {
                 String webappUrl = ServletHelper.getWebappURI(request);
                 URLInformation info = new URLInformation(webappUrl);
                 pubId = info.getPublicationId();
             }
-            this.publication = factory.getPublication(pubId);
+            Publication pub = factory.getPublication(pubId);
+            this.site = pub.getArea(area).getSite();
+
+            if (this.path == null) {
+                if (site.containsByUuid(uuid, language)) {
+                    Link link = site.getByUuid(uuid, language);
+                    this.path = link.getNode().getPath();
+                } else {
+                    throw new ProcessingException(
+                            "Path parameter not provided, no node for UUID and language found.");
+                }
+            }
+        } catch (ProcessingException e) {
+            throw e;
         } catch (Exception e) {
             throw new ProcessingException("Could not create publication: ", e);
         }
@@ -195,17 +213,16 @@
             this.contentHandler.startPrefixMapping(PREFIX, URI);
 
             this.attributes.clear();
-            this.attributes.addAttribute("", ATTR_PUBLICATION, ATTR_PUBLICATION, "CDATA",
-                    this.publication.getId());
-            
+            this.attributes.addAttribute("", ATTR_PUBLICATION, ATTR_PUBLICATION, "CDATA", this.site
+                    .getPublication().getId());
+
             if (!this.initialTree) {
-                this.attributes.addAttribute("", ATTR_AREA, ATTR_AREA, "CDATA", this.area);
+                this.attributes
+                        .addAttribute("", ATTR_AREA, ATTR_AREA, "CDATA", this.site.getArea());
                 this.attributes.addAttribute("", ATTR_BASE, ATTR_BASE, "CDATA", this.path);
             }
 
-            this.contentHandler.startElement(URI,
-                    NODE_FRAGMENT,
-                    PREFIX + ':' + NODE_FRAGMENT,
+            this.contentHandler.startElement(URI, NODE_FRAGMENT, PREFIX + ':' + NODE_FRAGMENT,
                     this.attributes);
 
             if (this.initialTree) {
@@ -236,26 +253,13 @@
      * @throws ProcessingException
      */
     protected void generateFragment() throws SiteException, SAXException, ProcessingException {
-
-        if (!this.area.equals(Publication.AUTHORING_AREA)
-                && !this.area.equals(Publication.ARCHIVE_AREA)
-                && !this.area.equals(Publication.TRASH_AREA)
-                && !this.area.equals(Publication.LIVE_AREA)
-                && !this.area.equals(Publication.STAGING_AREA)) {
-            throw new ProcessingException("Invalid area: " + this.area);
-        }
-
         try {
-            
-            SiteStructure site = this.publication.getArea(this.area).getSite();
-
             SiteNode[] children;
-            
+
             if (this.path.equals("/")) {
-                children = site.getTopLevelNodes();
-            }
-            else {
-                SiteNode node = site.getNode(this.path);
+                children = this.site.getTopLevelNodes();
+            } else {
+                SiteNode node = this.site.getNode(this.path);
                 children = node.getChildren();
             }
 
@@ -269,7 +273,7 @@
      * Adds the given nodes (not recursive).
      * @param children
      * @throws SAXException
-     * @throws SiteException 
+     * @throws SiteException
      */
     protected void addNodes(SiteNode[] children) throws SAXException, SiteException {
         for (int i = 0; i < children.length; i++) {
@@ -289,68 +293,51 @@
      */
     protected void generateFragmentInitial(String siteArea) throws SiteException, SAXException,
             ProcessingException {
-        
-        ServiceSelector selector = null;
-        SiteManager siteManager = null;
-        try {
-            selector = (ServiceSelector) this.manager.lookup(SiteManager.ROLE + "Selector");
-            siteManager = (SiteManager) selector.select(this.publication.getSiteManagerHint());
-            SiteStructure siteTree = this.publication.getArea(siteArea).getSite();
-
-            String label = "";
-            String isFolder = "";
-
-            // FIXME: don't hardcode area label
-            if (siteArea.equals(Publication.AUTHORING_AREA))
-                label = "Authoring";
-            if (siteArea.equals(Publication.ARCHIVE_AREA))
-                label = "Archive";
-            if (siteArea.equals(Publication.TRASH_AREA))
-                label = "Trash";
-            if (siteArea.equals(Publication.LIVE_AREA))
-                label = "Live";
-            if (siteArea.equals(Publication.STAGING_AREA))
-                label = "Staging";
-
-            if (siteTree.getTopLevelNodes().length > 0)
-                isFolder = "true";
-            else
-                isFolder = "false";
 
-            this.attributes.clear();
-            this.attributes.addAttribute("", ATTR_AREA, ATTR_AREA, "CDATA", siteArea);
-            this.attributes.addAttribute("", ATTR_FOLDER, ATTR_FOLDER, "CDATA", isFolder);
-            this.attributes.addAttribute("", ATTR_LABEL, ATTR_LABEL, "CDATA", label);
+        String label = "";
+        String isFolder = "";
 
-            startNode(NODE_SITE);
+        // FIXME: don't hardcode area label
+        if (siteArea.equals(Publication.AUTHORING_AREA))
+            label = "Authoring";
+        if (siteArea.equals(Publication.ARCHIVE_AREA))
+            label = "Archive";
+        if (siteArea.equals(Publication.TRASH_AREA))
+            label = "Trash";
+        if (siteArea.equals(Publication.LIVE_AREA))
+            label = "Live";
+        if (siteArea.equals(Publication.STAGING_AREA))
+            label = "Staging";
+
+        if (this.site.getTopLevelNodes().length > 0)
+            isFolder = "true";
+        else
+            isFolder = "false";
 
-            if (this.area.equals(siteArea)) {
-                generateFragmentRecursive(siteTree.getTopLevelNodes(), this.path);
-            }
+        this.attributes.clear();
+        this.attributes.addAttribute("", ATTR_AREA, ATTR_AREA, "CDATA", siteArea);
+        this.attributes.addAttribute("", ATTR_FOLDER, ATTR_FOLDER, "CDATA", isFolder);
+        this.attributes.addAttribute("", ATTR_LABEL, ATTR_LABEL, "CDATA", label);
 
-            endNode(NODE_SITE);
-        } catch (Exception e) {
-            throw new ProcessingException(e);
-        } finally {
-            if (selector != null) {
-                if (siteManager != null) {
-                    selector.release(siteManager);
-                }
-                this.manager.release(selector);
-            }
+        startNode(NODE_SITE);
+
+        if (this.site.getArea().equals(siteArea)) {
+            generateFragmentRecursive(this.site.getTopLevelNodes(), this.path);
         }
+
+        endNode(NODE_SITE);
     }
 
     /**
-     * Follows the path to find the way in the sitetree to the specified node and opens all
-     * folders on its way.
+     * Follows the path to find the way in the sitetree to the specified node and opens all folders
+     * on its way.
      * @param nodes
      * @param path
      * @throws SiteException
      * @throws SAXException
      */
-    protected void generateFragmentRecursive(SiteNode[] nodes, String path)
-            throws SiteException, SAXException {
+    protected void generateFragmentRecursive(SiteNode[] nodes, String path) throws SiteException,
+            SAXException {
         String nodeid;
         String childid;
 
@@ -403,7 +390,7 @@
      * @param nodeName the name of the new node
      * @param node The attributes are taken from this node
      * @throws SAXException if an error occurs while creating the node
-     * @throws SiteException 
+     * @throws SiteException
      */
     protected void startNode(String nodeName, SiteNode node) throws SAXException, SiteException {
         setNodeAttributes(node);
@@ -415,7 +402,7 @@
      * language-suffix.
      * @param node
      * @throws SAXException if an error occurs while setting the attributes
-     * @throws SiteException 
+     * @throws SiteException
      */
     protected void setNodeAttributes(SiteNode node) throws SAXException, SiteException {
         this.attributes.clear();
@@ -450,18 +437,19 @@
         if (uuid != null)
             this.attributes.addAttribute("", ATTR_UUID, ATTR_UUID, "CDATA", uuid);
         this.attributes.addAttribute("", ATTR_FOLDER, ATTR_FOLDER, "CDATA", isFolder);
-        
+
         if (this.showType) {
             try {
-                String type = this.publication.getArea(this.area)
-                    .getDocument(node.getUuid(),this.publication.getDefaultLanguage())
-                    .getMimeType();
-                this.attributes.addAttribute("",ATTR_TYPE, ATTR_TYPE, "CDATA", type);
+                Publication pub = this.site.getPublication();
+                String area = this.site.getArea();
+                String type = pub.getArea(area).getDocument(node.getUuid(),
+                        pub.getDefaultLanguage()).getMimeType();
+                this.attributes.addAttribute("", ATTR_TYPE, ATTR_TYPE, "CDATA", type);
             } catch (PublicationException e) {
                 throw new SiteException(e);
             }
         }
-            
+
     }
 
     /**
@@ -513,19 +501,44 @@
      */
     protected void addLabel(String label, String language) throws SAXException {
         this.attributes.clear();
-        this.attributes.addAttribute(XML_URI,
-                ATTR_LANG,
-                XML_PREFIX + ":" + ATTR_LANG,
-                "CDATA",
+        this.attributes.addAttribute(XML_URI, ATTR_LANG, XML_PREFIX + ":" + ATTR_LANG, "CDATA",
                 language);
 
-        this.contentHandler.startElement(URI,
-                NODE_LABEL,
-                PREFIX + ':' + NODE_LABEL,
+        this.contentHandler.startElement(URI, NODE_LABEL, PREFIX + ':' + NODE_LABEL,
                 this.attributes);
         char[] labelArray = label.toCharArray();
         this.contentHandler.characters(labelArray, 0, labelArray.length);
         this.contentHandler.endElement(URI, NODE_LABEL, PREFIX + ':' + NODE_LABEL);
+    }
+
+    public Serializable getKey() {
+        String s = ":";
+        String pubId = this.site.getPublication().getId();
+        String area = this.site.getArea();
+        return pubId + s + area + this.path;
+    }
+
+    public SourceValidity getValidity() {
+        if (this.validity == null) {
+            String sourceUri = this.site.getRepositoryNode().getSourceURI();
+            SourceResolver resolver = null;
+            Source source = null;
+            try {
+                resolver = (SourceResolver) this.manager.lookup(SourceResolver.ROLE);
+                source = resolver.resolveURI(sourceUri);
+                this.validity = source.getValidity();
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            } finally {
+                if (resolver != null) {
+                    if (source != null) {
+                        resolver.release(source);
+                    }
+                    this.manager.release(resolver);
+                }
+            }
+        }
+        return this.validity;
     }
 
 }



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