svn commit: r633333 - in /lenya/sandbox/modules: navigation/ navigation/config/ navigation/config/cocoon-xconf/ navigation/config/sitemap/ navigation/java/ navigation/java/src/org/apache/lenya/modules/sitemeta/ sitemeta/

[email protected]
Newsgroups gmane.comp.cms.lenya.cvs
Message-ID <[email protected]>
Author: andreas
Date: Mon Mar  3 16:37:42 2008
New Revision: 633333

URL: http://svn.apache.org/viewvc?rev=633333&view=rev
Log:
Renaming sitemeta module to navigation module, adding SiteFragmentGenerator and supplementary classes.

Added:
    lenya/sandbox/modules/navigation/
      - copied from r633193, lenya/sandbox/modules/sitemeta/
    lenya/sandbox/modules/navigation/config/
      - copied from r633332, lenya/sandbox/modules/sitemeta/config/
    lenya/sandbox/modules/navigation/java/
      - copied from r633332, lenya/sandbox/modules/sitemeta/java/
    lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/BreadcrumbSelector.java
    lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/ChildrenSelector.java
    lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/FragmentSelector.java
    lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/NodeGenerator.java
    lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/SiteFragmentGenerator.java
    lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/SubtreeSelector.java
Removed:
    lenya/sandbox/modules/sitemeta/
Modified:
    lenya/sandbox/modules/navigation/config/cocoon-xconf/metadata-store.xconf
    lenya/sandbox/modules/navigation/config/module.xml
    lenya/sandbox/modules/navigation/config/sitemap/sitemeta-transformer.xmap
    lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/SiteMetaDataTransformer.java

Modified: lenya/sandbox/modules/navigation/config/cocoon-xconf/metadata-store.xconf
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/navigation/config/cocoon-xconf/metadata-store.xconf?rev=633333&r1=633332&r2=633333&view=diff
==============================================================================
--- lenya/sandbox/modules/navigation/config/cocoon-xconf/metadata-store.xconf (original)
+++ lenya/sandbox/modules/navigation/config/cocoon-xconf/metadata-store.xconf Mon Mar  3 16:37:42 2008
@@ -16,9 +16,9 @@
   limitations under the License.
 -->
 
-<xconf xpath="/cocoon" unless="/cocoon/component[@role = 'org.apache.lenya.modules.sitemeta.SiteMetaDataTransformerStore']">
-  <component role="org.apache.lenya.modules.sitemeta.SiteMetaDataTransformerStore"
-    class="org.apache.excalibur.store.impl.MRUMemoryStore" logger="lenya.source.sitemeta.store">
+<xconf xpath="/cocoon" unless="/cocoon/component[@role = 'org.apache.lenya.modules.navigation.SiteMetaDataTransformerStore']">
+  <component role="org.apache.lenya.modules.navigation.SiteMetaDataTransformerStore"
+    class="org.apache.excalibur.store.impl.MRUMemoryStore" logger="lenya.source.navigation.store">
     <parameter name="maxobjects" value="10000"/>
   </component>
 </xconf>

Modified: lenya/sandbox/modules/navigation/config/module.xml
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/navigation/config/module.xml?rev=633333&r1=633332&r2=633333&view=diff
==============================================================================
--- lenya/sandbox/modules/navigation/config/module.xml (original)
+++ lenya/sandbox/modules/navigation/config/module.xml Mon Mar  3 16:37:42 2008
@@ -1,13 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <module xmlns="http://apache.org/lenya/module/1.0">
-  <id>org.apache.lenya.modules.sitemeta</id>
-  <export package="org.apache.lenya.modules.sitemeta"/>
+  <id>org.apache.lenya.modules.navigation</id>
+  <export package="org.apache.lenya.modules.navigation"/>
   <package>org.apache.lenya.modules</package>
   <version>0.1-dev</version>
-  <name>sitemeta</name>
+  <name>navigation</name>
   <lenya-version>@lenya.version@</lenya-version>
   <description>
-    This module allows to configure the sitetree presentation of documents
-    based on meta data.
+    This module contains Java classes and resources to generate navigation widgets.
   </description>
 </module>

Modified: lenya/sandbox/modules/navigation/config/sitemap/sitemeta-transformer.xmap
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/navigation/config/sitemap/sitemeta-transformer.xmap?rev=633333&r1=633332&r2=633333&view=diff
==============================================================================
--- lenya/sandbox/modules/navigation/config/sitemap/sitemeta-transformer.xmap (original)
+++ lenya/sandbox/modules/navigation/config/sitemap/sitemeta-transformer.xmap Mon Mar  3 16:37:42 2008
@@ -21,6 +21,6 @@
   xmlns:map="http://apache.org/cocoon/sitemap/1.0">
     
   <map:transformer name="sitemeta" logger="lenya.sitemap.transformer.sitemeta"
-    src="org.apache.lenya.modules.sitemeta.SiteMetaDataTransformer"/>
+    src="org.apache.lenya.modules.navigation.SiteMetaDataTransformer"/>
   
 </xmap>

Added: lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/BreadcrumbSelector.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/BreadcrumbSelector.java?rev=633333&view=auto
==============================================================================
--- lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/BreadcrumbSelector.java (added)
+++ lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/BreadcrumbSelector.java Mon Mar  3 16:37:42 2008
@@ -0,0 +1,46 @@
+/*
+ * 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.lenya.modules.navigation;
+
+import java.util.StringTokenizer;
+
+import org.apache.lenya.cms.site.SiteException;
+import org.apache.lenya.cms.site.SiteNode;
+import org.apache.lenya.cms.site.SiteStructure;
+import org.xml.sax.SAXException;
+
+public class BreadcrumbSelector implements FragmentSelector {
+
+    public void selectFragment(NodeGenerator generator, SiteStructure site, String path) throws SAXException, SiteException {
+        StringTokenizer tokens = new StringTokenizer(path, "/");
+        StringBuffer currentPath = new StringBuffer();
+        while (tokens.hasMoreTokens()) {
+            String name = tokens.nextToken();
+            currentPath.append("/").append(name);
+            if (site.contains(path)) {
+                SiteNode node = site.getNode(path);
+                generator.startNode(node);
+                generator.endNode(node);
+            }
+            else {
+                break;
+            }
+        }
+    }
+
+}

Added: lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/ChildrenSelector.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/ChildrenSelector.java?rev=633333&view=auto
==============================================================================
--- lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/ChildrenSelector.java (added)
+++ lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/ChildrenSelector.java Mon Mar  3 16:37:42 2008
@@ -0,0 +1,49 @@
+/*
+ * 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.lenya.modules.navigation;
+
+import org.apache.lenya.cms.site.SiteException;
+import org.apache.lenya.cms.site.SiteNode;
+import org.apache.lenya.cms.site.SiteStructure;
+import org.xml.sax.SAXException;
+
+/**
+ * Select the child nodes of a node non-recursively. If the path is "" or "/", the top-level nodes are generated.
+ */
+public class ChildrenSelector implements FragmentSelector {
+
+    public void selectFragment(NodeGenerator generator, SiteStructure site, String path) throws SAXException, SiteException {
+        SiteNode[] nodes;
+        if (path.equals("/") || path.equals("")) {
+            nodes = site.getTopLevelNodes();
+        }
+        else {
+            if (site.contains(path)) {
+                nodes = site.getNode(path).getChildren();
+            }
+            else {
+                nodes = new SiteNode[0];
+            }
+        }
+        for (int i = 0; i < nodes.length; i++) {
+            generator.startNode(nodes[i]);
+            generator.endNode(nodes[i]);
+        }
+    }
+
+}

Added: lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/FragmentSelector.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/FragmentSelector.java?rev=633333&view=auto
==============================================================================
--- lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/FragmentSelector.java (added)
+++ lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/FragmentSelector.java Mon Mar  3 16:37:42 2008
@@ -0,0 +1,28 @@
+/*
+ * 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.lenya.modules.navigation;
+
+import org.apache.lenya.cms.site.SiteException;
+import org.apache.lenya.cms.site.SiteStructure;
+import org.xml.sax.SAXException;
+
+public interface FragmentSelector {
+    
+    void selectFragment(NodeGenerator generator, SiteStructure site, String path) throws SAXException, SiteException;
+
+}

Added: lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/NodeGenerator.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/NodeGenerator.java?rev=633333&view=auto
==============================================================================
--- lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/NodeGenerator.java (added)
+++ lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/NodeGenerator.java Mon Mar  3 16:37:42 2008
@@ -0,0 +1,30 @@
+/*
+ * 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.lenya.modules.navigation;
+
+import org.apache.cocoon.ProcessingException;
+import org.apache.lenya.cms.site.SiteNode;
+import org.xml.sax.SAXException;
+
+public interface NodeGenerator {
+    
+    void startNode(SiteNode node) throws SAXException;
+
+    void endNode(SiteNode node) throws SAXException;
+
+}

Added: lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/SiteFragmentGenerator.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/SiteFragmentGenerator.java?rev=633333&view=auto
==============================================================================
--- lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/SiteFragmentGenerator.java (added)
+++ lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/SiteFragmentGenerator.java Mon Mar  3 16:37:42 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.lenya.modules.navigation;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.Map;
+
+import org.apache.avalon.framework.configuration.Configurable;
+import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.ConfigurationException;
+import org.apache.avalon.framework.parameters.ParameterException;
+import org.apache.avalon.framework.parameters.Parameterizable;
+import org.apache.avalon.framework.parameters.Parameters;
+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.generation.ServiceableGenerator;
+import org.apache.excalibur.source.Source;
+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;
+import org.apache.lenya.cms.site.Link;
+import org.apache.lenya.cms.site.SiteException;
+import org.apache.lenya.cms.site.SiteNode;
+import org.apache.lenya.cms.site.SiteStructure;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.AttributesImpl;
+
+/**
+ * Generate a fragment of the site.
+ */
+public class SiteFragmentGenerator extends ServiceableGenerator implements
+        CacheableProcessingComponent, Parameterizable, NodeGenerator {
+
+    protected static final String PARAM_PUB = "pub";
+    protected static final String PARAM_AREA = "area";
+    protected static final String PARAM_LANG = "lang";
+    protected static final String PARAM_PATH = "path";
+    protected static final String PARAM_SELECTOR_PATH = "selectorPath";
+    protected static final String PARAM_SELECTOR = "selector";
+
+    protected static final String PREFIX = "site";
+    protected static final String NAMESPACE = "http://apache.org/lenya/site/1.0";
+    protected static final String ATTR_PUB = "pub";
+    protected static final String ATTR_AREA = "area";
+    protected static final String ELEM_FRAGMENT = "fragment";
+    protected static final String ELEM_NODE = "node";
+    protected static final String ELEM_LINK = "link";
+    protected static final String ATTR_UUID = "uuid";
+    protected static final String ATTR_NAME = "name";
+    protected static final String XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace";
+    protected static final String XML_PREFIX = "xml";
+    protected static final String ATTR_LANG = "lang";
+    protected static final String ATTR_LABEL = "label";
+    protected static final String ATTR_CURRENT = "current";
+    protected static final String ATTR_ANCESTOR_OF_CURRENT = "ancestorOfCurrent";
+    protected static final String ATTR_HREF = "href";
+
+    private SiteStructure site;
+    private String cacheKey;
+    private SourceValidity validity;
+    private String language;
+    private String selectorClass;
+    private String path;
+    private String selectorPath;
+
+    public void setup(org.apache.cocoon.environment.SourceResolver resolver, Map objectModel,
+            String src, Parameters params) throws ProcessingException, SAXException, IOException {
+        super.setup(resolver, objectModel, src, params);
+
+        Request request = ObjectModelHelper.getRequest(objectModel);
+
+        Source source = null;
+        try {
+            String pubId = params.getParameter(PARAM_PUB);
+            String area = params.getParameter(PARAM_AREA);
+            this.language = params.getParameter(PARAM_LANG);
+            this.path = params.getParameter(PARAM_PATH);
+            this.selectorPath = params.getParameter(PARAM_SELECTOR_PATH, "");
+
+            DocumentFactory factory = DocumentUtil.getDocumentFactory(this.manager, request);
+            Publication pub = factory.getPublication(pubId);
+            this.site = pub.getArea(area).getSite();
+
+            this.cacheKey = pubId + "/" + area;
+            source = resolver.resolveURI(this.site.getRepositoryNode().getSourceURI());
+            this.validity = source.getValidity();
+
+        } catch (Exception e) {
+            throw new ProcessingException("Could not setup transformer: ", e);
+        } finally {
+            if (source != null) {
+                resolver.release(source);
+            }
+        }
+    }
+
+    /**
+     * @return The site structure to generate from.
+     */
+    protected SiteStructure getSite() {
+        return this.site;
+    }
+
+    /**
+     * @return The language to generate the fragment for.
+     */
+    protected String getLanguage() {
+        return this.language;
+    }
+
+    public Serializable getKey() {
+        if (this.cacheKey == null) {
+            throw new IllegalStateException("setup() has not been called.");
+        }
+        return this.cacheKey;
+    }
+
+    public SourceValidity getValidity() {
+        if (this.validity == null) {
+            throw new IllegalStateException("setup() has not been called.");
+        }
+        return this.validity;
+    }
+
+    protected String getPath() {
+        return this.path;
+    }
+
+    public void generate() throws IOException, SAXException, ProcessingException {
+
+        this.contentHandler.startDocument();
+        this.contentHandler.startPrefixMapping(PREFIX, NAMESPACE);
+
+        AttributesImpl attrs = new AttributesImpl();
+        addAttribute(attrs, ATTR_PUB, this.site.getPublication().getId());
+        addAttribute(attrs, ATTR_AREA, this.site.getArea());
+        this.contentHandler.startElement(NAMESPACE, ELEM_FRAGMENT, PREFIX + ':' + ELEM_FRAGMENT,
+                attrs);
+
+        generateFragment();
+
+        this.contentHandler.endElement(NAMESPACE, ELEM_FRAGMENT, PREFIX + ':' + ELEM_FRAGMENT);
+
+        this.contentHandler.endPrefixMapping(PREFIX);
+        this.contentHandler.endDocument();
+
+    }
+
+    protected void generateFragment() throws ProcessingException {
+        try {
+            FragmentSelector selector = (FragmentSelector) Class.forName(this.selectorClass)
+                    .newInstance();
+            selector.selectFragment(this, getSite(), this.selectorPath);
+        } catch (Exception e) {
+            throw new ProcessingException(e);
+        }
+    }
+
+    public void startNode(SiteNode node) throws SAXException {
+        AttributesImpl attrs = new AttributesImpl();
+        addAttribute(attrs, ATTR_UUID, node.getUuid());
+        addAttribute(attrs, ATTR_NAME, node.getName());
+        
+        if (node.getPath().equals(getPath())) {
+            addAttribute(attrs, ATTR_CURRENT, Boolean.toString(true));
+        }
+        
+        if (getPath().startsWith(node.getPath() + "/")) {
+            addAttribute(attrs, ATTR_ANCESTOR_OF_CURRENT, Boolean.toString(true));
+        }
+        
+        this.contentHandler.startElement(NAMESPACE, ELEM_NODE, PREFIX + ':' + ELEM_NODE, attrs);
+
+        String lang = getLanguage();
+        if (node.isVisible() && node.hasLink(lang)) {
+            try {
+                generateLink(node.getLink(lang));
+            } catch (SiteException e) {
+                throw new SAXException(e);
+            }
+        }
+    }
+
+    public void endNode(SiteNode node) throws SAXException {
+        this.contentHandler.endElement(NAMESPACE, ELEM_NODE, PREFIX + ':' + ELEM_NODE);
+    }
+
+    protected void generateLink(Link link) throws SAXException {
+        AttributesImpl attrs = new AttributesImpl();
+        attrs.addAttribute(XML_NAMESPACE, ATTR_LANG, XML_PREFIX + ":" + ATTR_LANG, "CDATA", link
+                .getLanguage());
+        addAttribute(attrs, ATTR_LABEL, link.getLabel());
+        addAttribute(attrs, ATTR_HREF, getHref(link).getUri());
+        this.contentHandler.startElement(NAMESPACE, ELEM_LINK, PREFIX + ':' + ELEM_LINK, attrs);
+        this.contentHandler.endElement(NAMESPACE, ELEM_LINK, PREFIX + ':' + ELEM_LINK);
+    }
+
+    protected org.apache.lenya.cms.linking.Link getHref(Link link) {
+        org.apache.lenya.cms.linking.Link href = new org.apache.lenya.cms.linking.Link();
+        href.setPubId(getSite().getPublication().getId());
+        href.setArea(getSite().getArea());
+        href.setUuid(link.getNode().getUuid());
+        href.setLanguage(getLanguage());
+        return href;
+    }
+
+    protected void addAttribute(AttributesImpl attrs, String name, String value) {
+        attrs.addAttribute("", name, name, "CDATA", value);
+    }
+
+    public void parameterize(Parameters params) throws ParameterException {
+        this.selectorClass = params.getParameter(PARAM_SELECTOR);
+    }
+
+}

Modified: lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/SiteMetaDataTransformer.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/SiteMetaDataTransformer.java?rev=633333&r1=633332&r2=633333&view=diff
==============================================================================
--- lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/SiteMetaDataTransformer.java (original)
+++ lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/SiteMetaDataTransformer.java Mon Mar  3 16:37:42 2008
@@ -15,7 +15,7 @@
  *  limitations under the License.
  *
  */
-package org.apache.lenya.modules.sitemeta;
+package org.apache.lenya.modules.navigation;
 
 import java.io.IOException;
 import java.net.MalformedURLException;

Added: lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/SubtreeSelector.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/SubtreeSelector.java?rev=633333&view=auto
==============================================================================
--- lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/SubtreeSelector.java (added)
+++ lenya/sandbox/modules/navigation/java/src/org/apache/lenya/modules/sitemeta/SubtreeSelector.java Mon Mar  3 16:37:42 2008
@@ -0,0 +1,54 @@
+/*
+ * 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.lenya.modules.navigation;
+
+import org.apache.lenya.cms.site.SiteException;
+import org.apache.lenya.cms.site.SiteNode;
+import org.apache.lenya.cms.site.SiteStructure;
+import org.xml.sax.SAXException;
+
+/**
+ * Select a node and its children recursively. If the path is "" or "/", the
+ * whole site is generated.
+ */
+public class SubtreeSelector implements FragmentSelector {
+
+    public void selectFragment(NodeGenerator generator, SiteStructure site, String path)
+            throws SAXException, SiteException {
+        if (path.equals("/") || path.equals("")) {
+            SiteNode[] nodes = site.getTopLevelNodes();
+            selectNodes(generator, nodes);
+        } else if (site.contains(path)) {
+            SiteNode node = site.getNode(path);
+            selectSubtree(generator, node);
+        }
+    }
+    
+    protected void selectSubtree(NodeGenerator generator, SiteNode node) throws SAXException {
+        generator.startNode(node);
+        selectNodes(generator, node.getChildren());
+        generator.endNode(node);
+    }
+
+    protected void selectNodes(NodeGenerator generator, SiteNode[] nodes) throws SAXException {
+        for (int i = 0; i < nodes.length; i++) {
+            selectSubtree(generator, nodes[i]);
+        }
+    }
+
+}
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.