svn commit: r595667 - in /lenya/sandbox/modules: externallinks/ externallinks/config/ externallinks/config/sitemap/ externallinks/java/ externallinks/java/src/ externallinks/java/src/org/ externallinks/java/src/org/apache/ externallinks/java/src/org/ap...

[email protected]
Newsgroups gmane.comp.cms.lenya.cvs
Message-ID <[email protected]>
Author: andreas
Date: Fri Nov 16 06:07:44 2007
New Revision: 595667

URL: http://svn.apache.org/viewvc?rev=595667&view=rev
Log:
Added externallinks and propertiesdocument modules

Added:
    lenya/sandbox/modules/externallinks/
    lenya/sandbox/modules/externallinks/config/
    lenya/sandbox/modules/externallinks/config/module.xml
    lenya/sandbox/modules/externallinks/config/sitemap/
    lenya/sandbox/modules/externallinks/config/sitemap/transformers.xmap
    lenya/sandbox/modules/externallinks/java/
    lenya/sandbox/modules/externallinks/java/src/
    lenya/sandbox/modules/externallinks/java/src/org/
    lenya/sandbox/modules/externallinks/java/src/org/apache/
    lenya/sandbox/modules/externallinks/java/src/org/apache/lenya/
    lenya/sandbox/modules/externallinks/java/src/org/apache/lenya/modules/
    lenya/sandbox/modules/externallinks/java/src/org/apache/lenya/modules/externallinks/
    lenya/sandbox/modules/externallinks/java/src/org/apache/lenya/modules/externallinks/ExternalLinks.java
    lenya/sandbox/modules/externallinks/java/src/org/apache/lenya/modules/externallinks/ExternalLinksRewriter.java
    lenya/sandbox/modules/externallinks/java/src/org/apache/lenya/modules/externallinks/ExternalLinksTransformer.java
    lenya/sandbox/modules/propertiesdocument/
    lenya/sandbox/modules/propertiesdocument/config/
    lenya/sandbox/modules/propertiesdocument/config/cocoon-xconf/
    lenya/sandbox/modules/propertiesdocument/config/cocoon-xconf/resourcetype-properties.xconf
    lenya/sandbox/modules/propertiesdocument/config/module.xml
    lenya/sandbox/modules/propertiesdocument/java/
    lenya/sandbox/modules/propertiesdocument/java/src/
    lenya/sandbox/modules/propertiesdocument/java/src/org/
    lenya/sandbox/modules/propertiesdocument/java/src/org/apache/
    lenya/sandbox/modules/propertiesdocument/java/src/org/apache/lenya/
    lenya/sandbox/modules/propertiesdocument/java/src/org/apache/lenya/modules/
    lenya/sandbox/modules/propertiesdocument/java/src/org/apache/lenya/modules/propertiesdocument/
    lenya/sandbox/modules/propertiesdocument/java/src/org/apache/lenya/modules/propertiesdocument/PropertiesDocument.java
    lenya/sandbox/modules/propertiesdocument/java/test/
    lenya/sandbox/modules/propertiesdocument/java/test/org/
    lenya/sandbox/modules/propertiesdocument/java/test/org/apache/
    lenya/sandbox/modules/propertiesdocument/java/test/org/apache/lenya/
    lenya/sandbox/modules/propertiesdocument/java/test/org/apache/lenya/module/
    lenya/sandbox/modules/propertiesdocument/java/test/org/apache/lenya/module/propertiesdocument/
    lenya/sandbox/modules/propertiesdocument/java/test/org/apache/lenya/module/propertiesdocument/PropertiesDocumentTest.java
    lenya/sandbox/modules/propertiesdocument/resources/
    lenya/sandbox/modules/propertiesdocument/resources/samples/
    lenya/sandbox/modules/propertiesdocument/resources/samples/properties.xml
    lenya/sandbox/modules/propertiesdocument/resources/schemas/
    lenya/sandbox/modules/propertiesdocument/resources/schemas/properties.rng

Added: lenya/sandbox/modules/externallinks/config/module.xml
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/externallinks/config/module.xml?rev=595667&view=auto
==============================================================================
--- lenya/sandbox/modules/externallinks/config/module.xml (added)
+++ lenya/sandbox/modules/externallinks/config/module.xml Fri Nov 16 06:07:44 2007
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+
+<!-- $Id: publication.xml 374687 2006-02-03 15:24:55Z michi $ -->
+
+<module xmlns="http://apache.org/lenya/module/1.0">
+  <id>org.apache.lenya.modules.externallinks</id>
+  <export package="org.apache.lenya.modules.externallinks"/>
+  <depends module="org.apache.lenya.modules.propertiesdocument"/>
+  <package>org.apache.lenya.modules</package>
+  <version>0.1-dev</version>
+  <name>External Links</name>
+  <lenya-version>@lenya.version@</lenya-version>
+  <description>Manage external links</description>
+</module>

Added: lenya/sandbox/modules/externallinks/config/sitemap/transformers.xmap
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/externallinks/config/sitemap/transformers.xmap?rev=595667&view=auto
==============================================================================
--- lenya/sandbox/modules/externallinks/config/sitemap/transformers.xmap (added)
+++ lenya/sandbox/modules/externallinks/config/sitemap/transformers.xmap Fri Nov 16 06:07:44 2007
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<!--
+  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.
+-->
+
+<xmap xpath="/sitemap/components/transformers" 
+  unless="/sitemap/components/transformers/transformer[@name = 'uuid2url']"
+  xmlns:map="http://apache.org/cocoon/sitemap/1.0">
+  
+  <map:transformer name="externallinks-xhtml" logger="lenya.sitemap.transformer.externallinks-xhtml"
+    src="org.apache.lenya.modules.externallinks.ExternalLinksTransformer">
+    <transform namespace="http://www.w3.org/1999/xhtml" element="a" attribute="href"/>
+    <transform namespace="http://www.w3.org/1999/xhtml" element="object" attribute="data"/>
+    <transform namespace="http://www.w3.org/1999/xhtml" element="img" attribute="src"/>
+    <transform namespace="http://www.w3.org/1999/xhtml" element="link" attribute="href"/>
+    <transform namespace="http://www.w3.org/1999/xhtml" element="form" attribute="action"/>
+    <transform namespace="http://www.w3.org/1999/xhtml" element="script" attribute="src"/>
+  </map:transformer>
+
+</xmap>

Added: lenya/sandbox/modules/externallinks/java/src/org/apache/lenya/modules/externallinks/ExternalLinks.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/externallinks/java/src/org/apache/lenya/modules/externallinks/ExternalLinks.java?rev=595667&view=auto
==============================================================================
--- lenya/sandbox/modules/externallinks/java/src/org/apache/lenya/modules/externallinks/ExternalLinks.java (added)
+++ lenya/sandbox/modules/externallinks/java/src/org/apache/lenya/modules/externallinks/ExternalLinks.java Fri Nov 16 06:07:44 2007
@@ -0,0 +1,60 @@
+/*
+ * 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.externallinks;
+
+import org.apache.avalon.framework.container.ContainerUtil;
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.avalon.framework.logger.Logger;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.lenya.cms.publication.Area;
+import org.apache.lenya.modules.propertiesdocument.PropertiesDocument;
+
+/**
+ * Manage external links. The links are stored in a document at the path
+ * {@link #PATH} with the publication's default language.
+ */
+public class ExternalLinks extends AbstractLogEnabled {
+
+    public static final String PATH = "/externallinks";
+
+    public ExternalLinks(ServiceManager manager, Area area, Logger logger) {
+        ContainerUtil.enableLogging(this, logger);
+        this.properties = new PropertiesDocument(manager, area, PATH, logger);
+    }
+
+    private PropertiesDocument properties;
+
+    public void setUri(String name, String uri) {
+        this.properties.put(name, uri);
+        this.properties.save();
+    }
+
+    public boolean contains(String name) {
+        return this.properties.containsKey(name);
+    }
+
+    /**
+     * @param name The name of the link.
+     * @return A URI.
+     * @throws IllegalArgumentException if no link exists with this name.
+     */
+    public String getUri(String name) {
+        return this.properties.get(name);
+    }
+
+}

Added: lenya/sandbox/modules/externallinks/java/src/org/apache/lenya/modules/externallinks/ExternalLinksRewriter.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/externallinks/java/src/org/apache/lenya/modules/externallinks/ExternalLinksRewriter.java?rev=595667&view=auto
==============================================================================
--- lenya/sandbox/modules/externallinks/java/src/org/apache/lenya/modules/externallinks/ExternalLinksRewriter.java (added)
+++ lenya/sandbox/modules/externallinks/java/src/org/apache/lenya/modules/externallinks/ExternalLinksRewriter.java Fri Nov 16 06:07:44 2007
@@ -0,0 +1,50 @@
+/*
+ * 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.externallinks;
+
+import org.apache.avalon.framework.container.ContainerUtil;
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.avalon.framework.logger.Logger;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.lenya.cms.linking.LinkRewriter;
+import org.apache.lenya.cms.publication.Area;
+
+public class ExternalLinksRewriter extends AbstractLogEnabled implements LinkRewriter {
+    
+    private ExternalLinks links;
+
+    public ExternalLinksRewriter(ServiceManager manager, Area area, Logger logger) {
+        ContainerUtil.enableLogging(this, logger);
+        this.links = new ExternalLinks(manager, area, logger);
+    }
+
+    protected static final String PROTOCOL = "ext:";
+
+    public boolean matches(String url) {
+        return url.startsWith(PROTOCOL) && this.links.contains(getLinkName(url));
+    }
+
+    protected String getLinkName(String url) {
+        return url.substring(PROTOCOL.length());
+    }
+
+    public String rewrite(String url) {
+        return this.links.getUri(getLinkName(url));
+    }
+
+}

Added: lenya/sandbox/modules/externallinks/java/src/org/apache/lenya/modules/externallinks/ExternalLinksTransformer.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/externallinks/java/src/org/apache/lenya/modules/externallinks/ExternalLinksTransformer.java?rev=595667&view=auto
==============================================================================
--- lenya/sandbox/modules/externallinks/java/src/org/apache/lenya/modules/externallinks/ExternalLinksTransformer.java (added)
+++ lenya/sandbox/modules/externallinks/java/src/org/apache/lenya/modules/externallinks/ExternalLinksTransformer.java Fri Nov 16 06:07:44 2007
@@ -0,0 +1,64 @@
+/*
+ * 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.externallinks;
+
+import java.io.IOException;
+import java.util.Map;
+
+import org.apache.avalon.framework.parameters.Parameters;
+import org.apache.cocoon.ProcessingException;
+import org.apache.cocoon.environment.ObjectModelHelper;
+import org.apache.cocoon.environment.Request;
+import org.apache.cocoon.environment.SourceResolver;
+import org.apache.lenya.cms.cocoon.transformation.AbstractLinkTransformer;
+import org.apache.lenya.cms.linking.LinkRewriter;
+import org.apache.lenya.cms.publication.Area;
+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.URLInformation;
+import org.apache.lenya.cms.repository.RepositoryUtil;
+import org.apache.lenya.cms.repository.Session;
+import org.apache.lenya.util.ServletHelper;
+import org.xml.sax.SAXException;
+
+public class ExternalLinksTransformer extends AbstractLinkTransformer {
+
+    private Area area;
+
+    public void setup(SourceResolver resolver, Map objectModel, String src, Parameters params)
+            throws ProcessingException, SAXException, IOException {
+        super.setup(resolver, objectModel, src, params);
+        try {
+            Request request = ObjectModelHelper.getRequest(objectModel);
+            Session session = RepositoryUtil.getSession(this.manager, request);
+            DocumentFactory factory = DocumentUtil.createDocumentFactory(this.manager, session);
+            String webappUrl = ServletHelper.getWebappURI(request);
+            URLInformation info = new URLInformation(webappUrl);
+            Publication pub = factory.getPublication(info.getPublicationId());
+            this.area = pub.getArea(info.getArea());
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    protected LinkRewriter getLinkRewriter() {
+        return new ExternalLinksRewriter(this.manager, this.area, getLogger());
+    }
+
+}

Added: lenya/sandbox/modules/propertiesdocument/config/cocoon-xconf/resourcetype-properties.xconf
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/propertiesdocument/config/cocoon-xconf/resourcetype-properties.xconf?rev=595667&view=auto
==============================================================================
--- lenya/sandbox/modules/propertiesdocument/config/cocoon-xconf/resourcetype-properties.xconf (added)
+++ lenya/sandbox/modules/propertiesdocument/config/cocoon-xconf/resourcetype-properties.xconf Fri Nov 16 06:07:44 2007
@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+<!--
+  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.
+-->
+
+<!-- $Id: doctypes.xconf 164635 2005-04-25 20:01:43Z tschlabach $ -->
+
+<xconf xpath="/cocoon/resource-types" unless="/cocoon/resource-types/component-instance[@name = 'properties']">
+  
+  <component-instance name="properties"
+    logger="lenya.resourcetypes.properties"
+    class="org.apache.lenya.cms.publication.ResourceTypeImpl">
+    <schema 
+      namespace="http://relaxng.org/ns/structure/0.9"
+      uri="fallback://lenya/modules/propertiesdocument/resources/schemas/properties.rng"/>
+    
+    <!-- Default time in seconds until the resource-type has expired -->  
+    <expires seconds="3600" />
+    
+    <sample 
+      mime-type="application/xml" 
+      uri="fallback://lenya/modules/propertiesdocument/resources/samples/properties.xml"
+    />
+    
+    <format name="xhtml" uri="cocoon://modules/propertiesdocument/xhtml.xml"/>
+    <format name="icon" uri="cocoon://modules/propertiesdocument/icon"/>
+    
+  </component-instance>
+  
+</xconf>

Added: lenya/sandbox/modules/propertiesdocument/config/module.xml
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/propertiesdocument/config/module.xml?rev=595667&view=auto
==============================================================================
--- lenya/sandbox/modules/propertiesdocument/config/module.xml (added)
+++ lenya/sandbox/modules/propertiesdocument/config/module.xml Fri Nov 16 06:07:44 2007
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+
+<!-- $Id: publication.xml 374687 2006-02-03 15:24:55Z michi $ -->
+
+<module xmlns="http://apache.org/lenya/module/1.0">
+  <id>org.apache.lenya.modules.propertiesdocument</id>
+  <export package="org.apache.lenya.modules.propertiesdocument"/>
+  <package>org.apache.lenya.modules</package>
+  <version>0.1-dev</version>
+  <name>Properties Resource Type</name>
+  <lenya-version>@lenya.version@</lenya-version>
+  <description>Resource type to store key-value pairs in documents.</description>
+</module>

Added: lenya/sandbox/modules/propertiesdocument/java/src/org/apache/lenya/modules/propertiesdocument/PropertiesDocument.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/propertiesdocument/java/src/org/apache/lenya/modules/propertiesdocument/PropertiesDocument.java?rev=595667&view=auto
==============================================================================
--- lenya/sandbox/modules/propertiesdocument/java/src/org/apache/lenya/modules/propertiesdocument/PropertiesDocument.java (added)
+++ lenya/sandbox/modules/propertiesdocument/java/src/org/apache/lenya/modules/propertiesdocument/PropertiesDocument.java Fri Nov 16 06:07:44 2007
@@ -0,0 +1,199 @@
+/*
+ * 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.propertiesdocument;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.apache.avalon.framework.container.ContainerUtil;
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.avalon.framework.logger.Logger;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.avalon.framework.service.ServiceSelector;
+import org.apache.lenya.cms.publication.Area;
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.publication.DocumentManager;
+import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.cms.publication.ResourceType;
+import org.apache.lenya.cms.site.SiteNode;
+import org.apache.lenya.cms.site.SiteStructure;
+import org.apache.lenya.util.Assert;
+import org.apache.lenya.xml.DocumentHelper;
+import org.apache.lenya.xml.NamespaceHelper;
+import org.w3c.dom.Element;
+
+public class PropertiesDocument extends AbstractLogEnabled {
+
+    protected static final String RESOURCE_TYPE = "properties";
+    protected static final String EXTENSION = "xml";
+    protected static final String TITLE = "Properties";
+    protected static final String NAMESPACE = "http://apache.org/lenya/propertiesdocument/1.0";
+    protected static final String PREFIX = "";
+    protected static final String ELEM_PROPERTIES = "properties";
+    protected static final String ELEM_PROPERTY = "property";
+    protected static final String ATTR_NAME = "name";
+    protected static final String ATTR_VALUE = "value";
+
+    private Document delegate;
+    private Area area;
+    private String path;
+    private ServiceManager manager;
+    private Map properties;
+
+    public PropertiesDocument(ServiceManager manager, Area area, String path, Logger logger) {
+        ContainerUtil.enableLogging(this, logger);
+        this.area = area;
+        this.path = path;
+        this.manager = manager;
+    }
+    
+    public boolean containsKey(String key) {
+        return properties().containsKey(key);
+    }
+
+    /**
+     * @param name The key.
+     * @return A string.
+     * @throws IllegalArgumentException if no value exists for this name.
+     */
+    public String get(String key) {
+        String value = (String) properties().get(key);
+        if (value == null) {
+            throw new IllegalArgumentException("No value for key [" + key + "].");
+        }
+        return value;
+    }
+
+    public String get(String key, String defaultValue) {
+        String value = (String) properties().get(key);
+        return value == null ? defaultValue : value;
+    }
+    
+    public void put(String key, String value) {
+        Assert.notNull("key", key);
+        Assert.notNull("value", value);
+        properties().put(key, value);
+    }
+
+    protected Map properties() {
+        if (this.properties == null) {
+            this.properties = load();
+        }
+        return this.properties;
+    }
+
+    public void save() {
+        NamespaceHelper helper = createEmptyNamespaceHelper();
+        Map properties = properties();
+        for (Iterator i = properties.keySet().iterator(); i.hasNext(); ) {
+            String name = (String) i.next();
+            String value = (String) properties.get(name);
+            Element element = helper.createElement(ELEM_PROPERTY);
+            element.setAttribute(ATTR_NAME, name);
+            element.setAttribute(ATTR_VALUE, value);
+            helper.getDocument().getDocumentElement().appendChild(element);
+        }
+        helper.save(delegate().getOutputStream());
+    }
+
+    protected Map load() {
+        Map properties = new HashMap();
+        NamespaceHelper helper = getNamespaceHelper();
+        Element[] elements = helper.getChildren(helper.getDocument().getDocumentElement());
+        for (int i = 0; i < elements.length; i++) {
+            String name = elements[i].getAttribute("name");
+            String value = elements[i].getAttribute("value");
+            Assert.notNull("name", name);
+            Assert.notNull("value", value);
+            properties.put(name, value);
+        }
+        return properties;
+    }
+
+    protected NamespaceHelper getNamespaceHelper() {
+        NamespaceHelper helper;
+        Document delegate = delegate();
+        try {
+            if (delegate.getContentLength() == 0) {
+                helper = createEmptyNamespaceHelper();
+            }
+            else {
+                org.w3c.dom.Document xml = DocumentHelper.readDocument(delegate.getInputStream());
+                helper = new NamespaceHelper(NAMESPACE, PREFIX, xml);
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        return helper;
+    }
+
+    protected NamespaceHelper createEmptyNamespaceHelper() {
+        try {
+            return new NamespaceHelper(NAMESPACE, PREFIX, ELEM_PROPERTIES);
+        } catch (ParserConfigurationException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    protected Document delegate() {
+        if (this.delegate == null) {
+            Publication pub = area.getPublication();
+            String language = pub.getDefaultLanguage();
+            SiteStructure site = area.getSite();
+            try {
+                if (site.contains(path)) {
+                    SiteNode node = site.getNode(path);
+                    if (node.getUuid() != null && node.hasLink(language)) {
+                        this.delegate = node.getLink(language).getDocument();
+                    }
+                }
+                if (this.delegate == null) {
+                    ServiceSelector selector = null;
+                    ResourceType type = null;
+                    DocumentManager docMgr = null;
+                    try {
+                        selector = (ServiceSelector) this.manager.lookup(ResourceType.ROLE
+                                + "Selector");
+                        type = (ResourceType) selector.select(RESOURCE_TYPE);
+                        docMgr = (DocumentManager) this.manager.lookup(DocumentManager.ROLE);
+                        String sourceUri = type.getSample(type.getSampleNames()[0]).getUri();
+                        this.delegate = docMgr.add(pub.getFactory(), type, sourceUri, pub, area
+                                .getName(), path, language, EXTENSION, TITLE, false);
+                    } finally {
+                        if (docMgr != null) {
+                            this.manager.release(docMgr);
+                        }
+                        if (selector != null) {
+                            if (type != null) {
+                                selector.release(type);
+                            }
+                            this.manager.release(selector);
+                        }
+                    }
+                }
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        }
+        return this.delegate;
+    }
+}

Added: lenya/sandbox/modules/propertiesdocument/java/test/org/apache/lenya/module/propertiesdocument/PropertiesDocumentTest.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/propertiesdocument/java/test/org/apache/lenya/module/propertiesdocument/PropertiesDocumentTest.java?rev=595667&view=auto
==============================================================================
--- lenya/sandbox/modules/propertiesdocument/java/test/org/apache/lenya/module/propertiesdocument/PropertiesDocumentTest.java (added)
+++ lenya/sandbox/modules/propertiesdocument/java/test/org/apache/lenya/module/propertiesdocument/PropertiesDocumentTest.java Fri Nov 16 06:07:44 2007
@@ -0,0 +1,52 @@
+/*
+ * 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.module.propertiesdocument;
+
+import org.apache.lenya.ac.impl.AbstractAccessControlTest;
+import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.cms.publication.PublicationException;
+import org.apache.lenya.modules.propertiesdocument.PropertiesDocument;
+
+public class PropertiesDocumentTest extends AbstractAccessControlTest {
+
+    protected static final String VALUE = "testValue";
+    protected static final String NAME = "testName";
+
+    public void testPropertiesDocument() throws Exception {
+        
+        login("lenya");
+        
+        PropertiesDocument properties = getPropertiesDocument();
+        
+        properties.put(NAME, VALUE);
+        assertEquals(properties.get(NAME), VALUE);
+        properties.save();
+        
+        PropertiesDocument properties2 = getPropertiesDocument();
+        assertEquals(properties2.get(NAME), VALUE);
+        
+    }
+
+    protected PropertiesDocument getPropertiesDocument() throws PublicationException {
+        Publication pub = getPublication("test");
+        return new PropertiesDocument(getManager(), pub.getArea(Publication.AUTHORING_AREA),
+                "/properties", getLogger());
+    }
+    
+}

Added: lenya/sandbox/modules/propertiesdocument/resources/samples/properties.xml
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/propertiesdocument/resources/samples/properties.xml?rev=595667&view=auto
==============================================================================
--- lenya/sandbox/modules/propertiesdocument/resources/samples/properties.xml (added)
+++ lenya/sandbox/modules/propertiesdocument/resources/samples/properties.xml Fri Nov 16 06:07:44 2007
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<properties xmlns="http://apache.org/lenya/propertiesdocument/1.0">
+  <property name="foo" value="bar"/>
+</properties>
\ No newline at end of file

Added: lenya/sandbox/modules/propertiesdocument/resources/schemas/properties.rng
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/propertiesdocument/resources/schemas/properties.rng?rev=595667&view=auto
==============================================================================
--- lenya/sandbox/modules/propertiesdocument/resources/schemas/properties.rng (added)
+++ lenya/sandbox/modules/propertiesdocument/resources/schemas/properties.rng Fri Nov 16 06:07:44 2007
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<grammar 
+  xmlns="http://relaxng.org/ns/structure/1.0"
+  xmlns:xsp="http://apache.org/xsp/core/v1"
+  xmlns:s="http://www.ascc.net/xml/schematron"
+  xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0"
+  xmlns:f="http://axkit.org/NS/xsp/perform/v1"
+  xmlns:p="http://apache.org/lenya/propertiesdocument/1.0"
+  datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+  <start>
+    <element name="p:properties">
+      <zeroOrMore>
+        <element name="p:property">
+          <attribute name="name"><text/></attribute>
+          <attribute name="value"><text/></attribute>
+        </element>
+      </zeroOrMore>
+    </element>
+  </start>
+</grammar>
\ No newline at end of file
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.