svn commit: r755981 [1/3] - in /lenya/contributions/2_0_X/modules: atom/ atom/config/ atom/config/cocoon-xconf/ atom/java/ atom/java/src/ atom/java/src/org/ atom/java/src/org/apache/ atom/java/src/org/apache/lenya/ atom/java/src/org/apache/lenya/module...

[email protected]
Newsgroups gmane.comp.cms.lenya.cvs
Message-ID <[email protected]>
Author: andreas
Date: Thu Mar 19 13:05:10 2009
New Revision: 755981

URL: http://svn.apache.org/viewvc?rev=755981&view=rev
Log:
Adding atom and rest modules.

Added:
    lenya/contributions/2_0_X/modules/atom/
    lenya/contributions/2_0_X/modules/atom/config/
    lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/
    lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Assets.xconf
    lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Children.xconf
    lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Content.xconf
    lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Entry.xconf
    lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Lock.xconf
    lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Locks.xconf
    lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Workspace.xconf
    lenya/contributions/2_0_X/modules/atom/config/module.xml
    lenya/contributions/2_0_X/modules/atom/java/
    lenya/contributions/2_0_X/modules/atom/java/src/
    lenya/contributions/2_0_X/modules/atom/java/src/org/
    lenya/contributions/2_0_X/modules/atom/java/src/org/apache/
    lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/
    lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/
    lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/
    lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Assets.java
    lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/AssetsView.java
    lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/AtomHandler.java
    lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/AtomUtil.java
    lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Children.java
    lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/ChildrenView.java
    lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Content.java
    lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/DocumentWrapper.java
    lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Entry.java
    lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/EntryView.java
    lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Lock.java
    lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/LockView.java
    lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Locks.java
    lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/LocksView.java
    lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/MessageView.java
    lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Workspace.java
    lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/WorkspaceView.java
    lenya/contributions/2_0_X/modules/atom/jx/
    lenya/contributions/2_0_X/modules/atom/jx/assets.jx
    lenya/contributions/2_0_X/modules/atom/jx/children.jx
    lenya/contributions/2_0_X/modules/atom/jx/entry.jx
    lenya/contributions/2_0_X/modules/atom/jx/lock.jx
    lenya/contributions/2_0_X/modules/atom/jx/locks.jx
    lenya/contributions/2_0_X/modules/atom/jx/message.jx
    lenya/contributions/2_0_X/modules/atom/jx/serviceLinks.jx
    lenya/contributions/2_0_X/modules/atom/jx/uuid2url.jx
    lenya/contributions/2_0_X/modules/atom/jx/workspace.jx
    lenya/contributions/2_0_X/modules/atom/sitemap.xmap
    lenya/contributions/2_0_X/modules/atom/test/
    lenya/contributions/2_0_X/modules/atom/test/canoo/
    lenya/contributions/2_0_X/modules/atom/test/canoo/dtd/
    lenya/contributions/2_0_X/modules/atom/test/canoo/dtd/Project.dtd
    lenya/contributions/2_0_X/modules/atom/test/canoo/resources/
    lenya/contributions/2_0_X/modules/atom/test/canoo/resources/concepts.html
    lenya/contributions/2_0_X/modules/atom/test/canoo/resources/conceptsEdited.html
    lenya/contributions/2_0_X/modules/atom/test/canoo/resources/conceptsInvalid.html
    lenya/contributions/2_0_X/modules/atom/test/canoo/resources/entry.xml
    lenya/contributions/2_0_X/modules/atom/test/canoo/resources/lock.xml
    lenya/contributions/2_0_X/modules/atom/test/canoo/resources/project-logo.png   (with props)
    lenya/contributions/2_0_X/modules/atom/test/canoo/results/
    lenya/contributions/2_0_X/modules/atom/test/canoo/results/WebTestOverview.junit.xml
    lenya/contributions/2_0_X/modules/atom/test/canoo/results/WebTestOverview.xml
    lenya/contributions/2_0_X/modules/atom/test/canoo/results/index.html
    lenya/contributions/2_0_X/modules/atom/test/canoo/results/resources/
    lenya/contributions/2_0_X/modules/atom/test/canoo/results/resources/images/
    lenya/contributions/2_0_X/modules/atom/test/canoo/results/resources/images/canoo.gif   (with props)
    lenya/contributions/2_0_X/modules/atom/test/canoo/results/resources/images/collapseall.png   (with props)
    lenya/contributions/2_0_X/modules/atom/test/canoo/results/resources/images/expandMinus.png   (with props)
    lenya/contributions/2_0_X/modules/atom/test/canoo/results/resources/images/expandPlus.png   (with props)
    lenya/contributions/2_0_X/modules/atom/test/canoo/results/resources/images/expandall.png   (with props)
    lenya/contributions/2_0_X/modules/atom/test/canoo/results/resources/images/failed.gif   (with props)
    lenya/contributions/2_0_X/modules/atom/test/canoo/results/resources/images/favicon.ico   (with props)
    lenya/contributions/2_0_X/modules/atom/test/canoo/results/resources/images/less.gif   (with props)
    lenya/contributions/2_0_X/modules/atom/test/canoo/results/resources/images/more.gif   (with props)
    lenya/contributions/2_0_X/modules/atom/test/canoo/results/resources/images/ok.gif   (with props)
    lenya/contributions/2_0_X/modules/atom/test/canoo/results/resources/images/optional.gif   (with props)
    lenya/contributions/2_0_X/modules/atom/test/canoo/results/resources/images/todo.gif   (with props)
    lenya/contributions/2_0_X/modules/atom/test/canoo/results/resources/images/webtest.jpg   (with props)
    lenya/contributions/2_0_X/modules/atom/test/canoo/results/resources/report.css
    lenya/contributions/2_0_X/modules/atom/test/canoo/results/resources/responseBrowser.html
    lenya/contributions/2_0_X/modules/atom/test/canoo/results/resources/responseBrowser.js
    lenya/contributions/2_0_X/modules/atom/test/canoo/results/resources/responseBrowserCommands.html
    lenya/contributions/2_0_X/modules/atom/test/canoo/results/resources/responseBrowserPreviews.html
    lenya/contributions/2_0_X/modules/atom/test/canoo/results/resources/showHide.js
    lenya/contributions/2_0_X/modules/atom/test/canoo/results/resources/sorttable.js
    lenya/contributions/2_0_X/modules/atom/test/canoo/test.xml
    lenya/contributions/2_0_X/modules/atom/xslt/
    lenya/contributions/2_0_X/modules/atom/xslt/entryMetaData.xsl
    lenya/contributions/2_0_X/modules/atom/xslt/prettyPrintEntry.xsl
    lenya/contributions/2_0_X/modules/rest/
    lenya/contributions/2_0_X/modules/rest/config/
    lenya/contributions/2_0_X/modules/rest/config/module.xml
    lenya/contributions/2_0_X/modules/rest/java/
    lenya/contributions/2_0_X/modules/rest/java/src/
    lenya/contributions/2_0_X/modules/rest/java/src/org/
    lenya/contributions/2_0_X/modules/rest/java/src/org/apache/
    lenya/contributions/2_0_X/modules/rest/java/src/org/apache/lenya/
    lenya/contributions/2_0_X/modules/rest/java/src/org/apache/lenya/modules/
    lenya/contributions/2_0_X/modules/rest/java/src/org/apache/lenya/modules/resst/
    lenya/contributions/2_0_X/modules/rest/java/src/org/apache/lenya/modules/rest/
    lenya/contributions/2_0_X/modules/rest/java/src/org/apache/lenya/modules/rest/RestHandler.java
    lenya/contributions/2_0_X/modules/rest/java/src/org/apache/lenya/modules/rest/RestView.java
    lenya/contributions/2_0_X/modules/rest/java/src/org/apache/lenya/modules/rest/SimpleRestView.java
    lenya/contributions/2_0_X/modules/rest/rest.js

Added: lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Assets.xconf
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Assets.xconf?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Assets.xconf (added)
+++ lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Assets.xconf Thu Mar 19 13:05:10 2009
@@ -0,0 +1,24 @@
+<?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.
+-->
+
+<xconf xpath="/cocoon" unless="/cocoon/component[@role = 'org.apache.lenya.modules.atom.Assets']">
+  <component
+    role="org.apache.lenya.modules.atom.Assets" 
+    logger="lenya.modules.atom" 
+    class="org.apache.lenya.modules.atom.Assets"/>
+</xconf>

Added: lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Children.xconf
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Children.xconf?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Children.xconf (added)
+++ lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Children.xconf Thu Mar 19 13:05:10 2009
@@ -0,0 +1,24 @@
+<?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.
+-->
+
+<xconf xpath="/cocoon" unless="/cocoon/component[@role = 'org.apache.lenya.modules.atom.Children']">
+  <component
+    role="org.apache.lenya.modules.atom.Children" 
+    logger="lenya.modules.atom" 
+    class="org.apache.lenya.modules.atom.Children"/>
+</xconf>

Added: lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Content.xconf
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Content.xconf?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Content.xconf (added)
+++ lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Content.xconf Thu Mar 19 13:05:10 2009
@@ -0,0 +1,24 @@
+<?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.
+-->
+
+<xconf xpath="/cocoon" unless="/cocoon/component[@role = 'org.apache.lenya.modules.atom.Content']">
+  <component
+    role="org.apache.lenya.modules.atom.Content" 
+    logger="lenya.modules.atom" 
+    class="org.apache.lenya.modules.atom.Content"/>
+</xconf>

Added: lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Entry.xconf
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Entry.xconf?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Entry.xconf (added)
+++ lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Entry.xconf Thu Mar 19 13:05:10 2009
@@ -0,0 +1,24 @@
+<?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.
+-->
+
+<xconf xpath="/cocoon" unless="/cocoon/component[@role = 'org.apache.lenya.modules.atom.Entry']">
+  <component
+    role="org.apache.lenya.modules.atom.Entry" 
+    logger="lenya.modules.atom" 
+    class="org.apache.lenya.modules.atom.Entry"/>
+</xconf>

Added: lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Lock.xconf
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Lock.xconf?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Lock.xconf (added)
+++ lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Lock.xconf Thu Mar 19 13:05:10 2009
@@ -0,0 +1,24 @@
+<?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.
+-->
+
+<xconf xpath="/cocoon" unless="/cocoon/component[@role = 'org.apache.lenya.modules.atom.Lock']">
+  <component
+    role="org.apache.lenya.modules.atom.Lock" 
+    logger="lenya.modules.atom" 
+    class="org.apache.lenya.modules.atom.Lock"/>
+</xconf>

Added: lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Locks.xconf
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Locks.xconf?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Locks.xconf (added)
+++ lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Locks.xconf Thu Mar 19 13:05:10 2009
@@ -0,0 +1,24 @@
+<?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.
+-->
+
+<xconf xpath="/cocoon" unless="/cocoon/component[@role = 'org.apache.lenya.modules.atom.Locks']">
+  <component
+    role="org.apache.lenya.modules.atom.Locks" 
+    logger="lenya.modules.atom" 
+    class="org.apache.lenya.modules.atom.Locks"/>
+</xconf>

Added: lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Workspace.xconf
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Workspace.xconf?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Workspace.xconf (added)
+++ lenya/contributions/2_0_X/modules/atom/config/cocoon-xconf/Workspace.xconf Thu Mar 19 13:05:10 2009
@@ -0,0 +1,24 @@
+<?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.
+-->
+
+<xconf xpath="/cocoon" unless="/cocoon/component[@role = 'org.apache.lenya.modules.atom.Workspace']">
+  <component
+    role="org.apache.lenya.modules.atom.Workspace" 
+    logger="lenya.modules.atom" 
+    class="org.apache.lenya.modules.atom.Workspace"/>
+</xconf>

Added: lenya/contributions/2_0_X/modules/atom/config/module.xml
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/config/module.xml?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/config/module.xml (added)
+++ lenya/contributions/2_0_X/modules/atom/config/module.xml Thu Mar 19 13:05:10 2009
@@ -0,0 +1,26 @@
+<?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.
+-->
+
+<module xmlns="http://apache.org/lenya/module/1.0">
+  <id>org.apache.lenya.modules.atom</id>
+  <depends module="org.apache.lenya.modules.rest"/>
+  <package>org.apache.lenya.modules</package>
+  <version>1.0-alpha1</version>
+  <name>Atom Syndication Format and Publishing Protocol</name>
+  <lenya-version>@lenya.version@</lenya-version>
+  <description>Support for the Atom Syndication Format and Publishing Protocol</description>
+</module>

Added: lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Assets.java
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Assets.java?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Assets.java (added)
+++ lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Assets.java Thu Mar 19 13:05:10 2009
@@ -0,0 +1,157 @@
+package org.apache.lenya.modules.atom;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.StringTokenizer;
+
+import org.apache.avalon.framework.service.ServiceSelector;
+import org.apache.cocoon.environment.ObjectModelHelper;
+import org.apache.cocoon.environment.Response;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.io.IOUtils;
+import org.apache.lenya.cms.metadata.MetaData;
+import org.apache.lenya.cms.metadata.dublincore.DublinCore;
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.publication.DocumentFactory;
+import org.apache.lenya.cms.publication.DocumentLocator;
+import org.apache.lenya.cms.publication.DocumentManager;
+import org.apache.lenya.cms.publication.Proxy;
+import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.cms.publication.ResourceType;
+import org.apache.lenya.cms.publication.ResourceType.Sample;
+import org.apache.lenya.cms.site.SiteUtil;
+import org.apache.lenya.modules.rest.RestView;
+import org.apache.lenya.util.Assert;
+
+public class Assets extends AtomHandler {
+
+    protected static final String HEADER_SLUG = "Slug";
+    protected static final String HEADER_LOCATION = "Location";
+    protected static final String ASSET_RESOURCE_TYPE = "resource";
+    protected static final String HEADER_CONTENT_LANGUAGE = "Content-Language";
+    protected static final String CONTENT_TYPE_URLENCODED = "application/x-www-form-urlencoded";
+
+    public RestView delete() throws Exception {
+        throw new UnsupportedOperationException();
+    }
+
+    public RestView get() throws Exception {
+        DocumentWrapper wrapper = getDocumentWrapper();
+        if (wrapper == null) {
+            return new AssetsView(this.manager, getArea());
+        } else {
+            return new AssetsView(this.manager, wrapper.getDocument());
+        }
+    }
+
+    public RestView post() throws Exception {
+        DocumentManager documentManager = null;
+        ServiceSelector selector = null;
+        ResourceType resourceType = null;
+        try {
+            Document parent = getModifiableDocument();
+            Publication pub = parent.getPublication();
+            DocumentFactory factory = pub.getFactory();
+
+            documentManager = (DocumentManager) this.manager.lookup(DocumentManager.ROLE);
+            selector = (ServiceSelector) this.manager.lookup(ResourceType.ROLE + "Selector");
+            resourceType = (ResourceType) selector.select(ASSET_RESOURCE_TYPE);
+
+            String slug = getHeader(HEADER_SLUG);
+            String language = getHeader(HEADER_CONTENT_LANGUAGE, parent.getLanguage());
+            String mimeType = getRequest().getContentType();
+            // FIXME: Canoo WebTest doesn't allow to set the Content-Type
+            // header
+            if (mimeType.equals(CONTENT_TYPE_URLENCODED)) {
+                mimeType = "image/png";
+            }
+
+            StringTokenizer tokens = new StringTokenizer(slug, ".");
+            String name = getValidDocumentName(tokens.nextToken());
+
+            String extension = tokens.nextToken();
+            Assert.isTrue("Slug contains only one dot", !tokens.hasMoreTokens());
+
+            String path = getAvailablePath(name, language);
+            String title = name.substring(0, 1).toUpperCase() + name.substring(1);
+
+            boolean visibleInNav = false;
+
+            Sample sample = resourceType.getSample(resourceType.getSampleNames()[0]);
+            Document document = documentManager.add(factory, resourceType, sample.getUri(), pub,
+                    parent.getArea(), path, language, extension, title, visibleInNav);
+
+            InputStream in = getInputStream();
+            OutputStream out = document.getOutputStream();
+            try {
+                IOUtils.copy(in, out);
+            } finally {
+                if (in != null) {
+                    in.close();
+                }
+                if (out != null) {
+                    out.flush();
+                    out.close();
+                }
+            }
+
+            document.setMimeType(mimeType);
+
+            MetaData dublinCore = document.getMetaData(DublinCore.DC_NAMESPACE);
+            dublinCore.setValue(DublinCore.ELEMENT_TITLE, title);
+
+            document.getSession().commit();
+            setLocationHeader(document);
+            return new MessageView("Asset successfully added.", HttpStatus.SC_CREATED);
+        } catch (Exception e) {
+            getLogger().error("Could not add asset: ", e);
+            return new MessageView("Asset could not be added.", HttpStatus.SC_INTERNAL_SERVER_ERROR);
+        } finally {
+            if (documentManager != null) {
+                this.manager.release(documentManager);
+            }
+            if (selector != null) {
+                if (resourceType != null) {
+                    selector.release(resourceType);
+                }
+                this.manager.release(selector);
+            }
+        }
+    }
+
+    protected void setLocationHeader(Document document) {
+        Response response = ObjectModelHelper.getResponse(getObjectModel());
+        Proxy proxy = document.getPublication().getProxy(document, getRequest().isSecure());
+        response.setHeader(HEADER_LOCATION, proxy.getURL(document) + "?lenya.usecase=atom.entry");
+    }
+
+    public RestView put() throws Exception {
+        throw new UnsupportedOperationException();
+    }
+
+    protected String getHeader(String name) {
+        String value = getRequest().getHeader(name);
+        Assert.notNull(name + " header", value);
+        return value;
+    }
+
+    protected String getHeader(String name, String defaultValue) {
+        Assert.notNull("default value for header " + name, defaultValue);
+        String value = getRequest().getHeader(name);
+        return value != null ? value : defaultValue;
+    }
+
+    protected String getValidDocumentName(String name) {
+        return name.replaceAll("[^A-Za-z0-9]", "");
+    }
+
+    protected String getAvailablePath(String name, String language) throws Exception {
+        Document doc = getDocumentWrapper().getDocument();
+        DocumentLocator requestedLocator = doc.getLocator().getChild(name).getLanguageVersion(
+                language);
+        DocumentLocator availableLocator = SiteUtil.getAvailableLocator(this.manager, doc
+                .getFactory(), requestedLocator);
+        return availableLocator.getPath();
+    }
+
+}

Added: lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/AssetsView.java
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/AssetsView.java?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/AssetsView.java (added)
+++ lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/AssetsView.java Thu Mar 19 13:05:10 2009
@@ -0,0 +1,54 @@
+package org.apache.lenya.modules.atom;
+
+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.DocumentException;
+import org.apache.lenya.cms.publication.ResourceType;
+import org.apache.lenya.modules.atom.AtomUtil.DocumentFilter;
+
+public class AssetsView extends ChildrenView {
+
+    public AssetsView(ServiceManager manager, Document doc) {
+        super(manager, doc);
+    }
+
+    public AssetsView(ServiceManager manager, Area area) {
+        super(manager, area);
+    }
+
+    protected DocumentFilter getFilter() {
+        return new DocumentFilter() {
+            public boolean matches(Document doc) {
+                try {
+                    return doc.getResourceType().getName().equals(Assets.ASSET_RESOURCE_TYPE);
+                } catch (DocumentException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        };
+    }
+
+    public String[] getAssetMimeTypes() throws Exception {
+        ServiceSelector selector = null;
+        ResourceType resourceType = null;
+        try {
+            selector = (ServiceSelector) this.manager.lookup(ResourceType.ROLE + "Selector");
+            resourceType = (ResourceType) selector.select(Assets.ASSET_RESOURCE_TYPE);
+            return resourceType.getMimeTypes();
+        } finally {
+            if (selector != null) {
+                if (resourceType != null) {
+                    selector.release(resourceType);
+                }
+                this.manager.release(selector);
+            }
+        }
+    }
+    
+    public String getUri() {
+        return "assets.xml";
+    }
+
+}

Added: lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/AtomHandler.java
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/AtomHandler.java?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/AtomHandler.java (added)
+++ lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/AtomHandler.java Thu Mar 19 13:05:10 2009
@@ -0,0 +1,138 @@
+/*
+ * 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.atom;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.avalon.framework.activity.Initializable;
+import org.apache.avalon.framework.component.Component;
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.avalon.framework.service.Serviceable;
+import org.apache.cocoon.environment.Request;
+import org.apache.cocoon.environment.http.HttpEnvironment;
+import org.apache.cocoon.util.PostInputStream;
+import org.apache.lenya.ac.Identity;
+import org.apache.lenya.cms.cocoon.components.context.ContextUtility;
+import org.apache.lenya.cms.publication.Area;
+import org.apache.lenya.cms.publication.Document;
+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.modules.rest.RestHandler;
+import org.apache.lenya.util.ServletHelper;
+
+public abstract class AtomHandler extends AbstractLogEnabled implements Initializable, Serviceable,
+        Component, RestHandler {
+
+    protected static final String WORKFLOW_EVENT = "edit";
+
+    private DocumentWrapper documentWrapper;
+    protected ServiceManager manager;
+
+    private Request request;
+
+    private Map objectModel;
+
+    private Identity identity;
+
+    private Area area;
+
+    public void initialize() throws Exception {
+        ContextUtility context = null;
+        try {
+            context = (ContextUtility) this.manager.lookup(ContextUtility.ROLE);
+            this.request = context.getRequest();
+            this.objectModel = context.getObjectModel();
+            DocumentFactory factory = DocumentUtil.getDocumentFactory(this.manager, this.request);
+            this.identity = factory.getSession().getIdentity();
+            final String url = ServletHelper.getWebappURI(this.request);
+            URLInformation info = new URLInformation(url);
+            Publication pub = factory.getPublication(info.getPublicationId());
+            this.area = pub.getArea(info.getArea());
+            if (factory.isDocument(url)) {
+                Document document = factory.getFromURL(url);
+                this.documentWrapper = new DocumentWrapper(document);
+            }
+        } finally {
+            if (context != null) {
+                this.manager.release(context);
+            }
+        }
+    }
+    
+    public void service(ServiceManager manager) throws ServiceException {
+        this.manager = manager;
+    }
+
+    protected Document getModifiableDocument() throws Exception {
+        Identity identity = getIdentity();
+        if (identity == null) {
+            String msg = "Can't obtain modifiable document without being logged in.";
+            throw new RuntimeException(msg);
+        }
+        Session session = RepositoryUtil.createSession(this.manager, identity, true);
+        DocumentFactory factory = DocumentUtil.createDocumentFactory(this.manager, session);
+        return factory.get(getDocumentWrapper().getDocument().getIdentifier());
+    }
+
+    protected DocumentWrapper getDocumentWrapper() {
+        return this.documentWrapper;
+    }
+
+    protected Identity getIdentity() {
+        return this.identity;
+    }
+
+    /**
+     * @return The input stream of the current request.
+     * @throws IOException
+     *             if the request content is empty.
+     */
+    protected InputStream getInputStream() throws IOException {
+        HttpServletRequest httpRequest = (HttpServletRequest) this.objectModel
+                .get(HttpEnvironment.HTTP_REQUEST_OBJECT);
+        int len = this.request.getContentLength();
+        if (len > 0) {
+            return new PostInputStream(httpRequest.getInputStream(), len);
+        } else {
+            throw new IOException("content length is 0");
+        }
+    }
+
+    protected Request getRequest() {
+        return this.request;
+    }
+    
+    protected Area getArea() {
+        return this.area;
+    }
+    
+    protected Map getObjectModel() {
+        return this.objectModel;
+    }
+
+}

Added: lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/AtomUtil.java
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/AtomUtil.java?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/AtomUtil.java (added)
+++ lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/AtomUtil.java Thu Mar 19 13:05:10 2009
@@ -0,0 +1,42 @@
+package org.apache.lenya.modules.atom;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.site.SiteException;
+import org.apache.lenya.cms.site.SiteNode;
+
+public class AtomUtil {
+
+    /**
+     * @param nodes The site nodes to include.
+     * @param filter The document filter to apply.
+     * @param recursive If the tree should be traversed recursively.
+     * @return A list of {@link Document}s.
+     * @throws SiteException if an error occurs.
+     */
+    protected static List getChildList(SiteNode[] nodes, DocumentFilter filter, boolean recursive)
+            throws SiteException {
+        List children = new ArrayList();
+        for (int i = 0; i < nodes.length; i++) {
+            String[] languages = nodes[i].getLanguages();
+            for (int l = 0; l < languages.length; l++) {
+                Document document = nodes[i].getLink(languages[l]).getDocument();
+                if (filter.matches(document)) {
+                    children.add(document);
+                }
+            }
+            if (recursive) {
+                SiteNode[] subNodes = nodes[i].getChildren();
+                children.addAll(getChildList(subNodes, filter, true));
+            }
+        }
+        return children;
+    }
+    
+    public static interface DocumentFilter {
+        boolean matches(Document doc);
+    }
+
+}

Added: lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Children.java
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Children.java?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Children.java (added)
+++ lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Children.java Thu Mar 19 13:05:10 2009
@@ -0,0 +1,28 @@
+package org.apache.lenya.modules.atom;
+
+import org.apache.lenya.modules.rest.RestView;
+
+public class Children extends AtomHandler {
+
+    public RestView delete() throws Exception {
+        throw new UnsupportedOperationException();
+    }
+
+    public RestView get() throws Exception {
+        DocumentWrapper wrapper = getDocumentWrapper();
+        if (wrapper == null) {
+            return new ChildrenView(this.manager, getArea());
+        } else {
+            return new ChildrenView(this.manager, wrapper.getDocument());
+        }
+    }
+
+    public RestView post() throws Exception {
+        throw new UnsupportedOperationException();
+    }
+
+    public RestView put() throws Exception {
+        throw new UnsupportedOperationException();
+    }
+
+}

Added: lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/ChildrenView.java
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/ChildrenView.java?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/ChildrenView.java (added)
+++ lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/ChildrenView.java Thu Mar 19 13:05:10 2009
@@ -0,0 +1,66 @@
+package org.apache.lenya.modules.atom;
+
+import java.util.List;
+
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.lenya.cms.publication.Area;
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.site.SiteNode;
+import org.apache.lenya.modules.atom.AtomUtil.DocumentFilter;
+import org.apache.lenya.modules.rest.RestView;
+import org.apache.lenya.util.Assert;
+
+public class ChildrenView implements RestView {
+
+    protected ServiceManager manager;
+    private Document document;
+    private Area area;
+    
+    public ChildrenView(ServiceManager manager, Document doc) {
+        this(manager);
+        Assert.notNull("document", doc);
+        this.document = doc;
+    }
+
+    public ChildrenView(ServiceManager manager, Area area) {
+        this(manager);
+        Assert.notNull("area", area);
+        this.area = area;
+    }
+
+    private ChildrenView(ServiceManager manager) {
+        Assert.notNull("manager", manager);
+        this.manager = manager;
+    }
+    
+    public Document[] getDocuments() throws Exception {
+        List children;
+        if (this.document == null) {
+            SiteNode[] nodes = this.area.getSite().getTopLevelNodes();
+            children = AtomUtil.getChildList(nodes, getFilter(), true);
+        } else {
+            SiteNode node = this.document.getLink().getNode();
+            SiteNode[] nodes = node.getChildren();
+            children = AtomUtil.getChildList(nodes, getFilter(), false);
+        }
+        return (Document[]) children.toArray(new Document[children.size()]);
+    }
+
+    protected DocumentFilter getFilter() {
+        return new DocumentFilter() {
+            public boolean matches(Document doc) {
+                return true;
+            }
+        };
+    }
+
+    public int getStatusCode() {
+        return HttpStatus.SC_OK;
+    }
+
+    public String getUri() {
+        return "children.xml";
+    }
+
+}

Added: lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Content.java
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Content.java?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Content.java (added)
+++ lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Content.java Thu Mar 19 13:05:10 2009
@@ -0,0 +1,97 @@
+package org.apache.lenya.modules.atom;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.lenya.cms.cocoon.source.SourceUtil;
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.publication.ResourceType;
+import org.apache.lenya.cms.repository.Session;
+import org.apache.lenya.cms.workflow.WorkflowUtil;
+import org.apache.lenya.modules.rest.RestView;
+import org.apache.lenya.modules.rest.SimpleRestView;
+import org.apache.lenya.xml.DocumentHelper;
+import org.apache.lenya.xml.Schema;
+import org.apache.lenya.xml.ValidationUtil;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+public class Content extends AtomHandler {
+
+    public RestView put() throws Exception {
+        Document doc = getModifiableDocument();
+        DocumentWrapper wrapper = getDocumentWrapper();
+        if (!wrapper.canCheckOut()) {
+            String msg = "Can't save document " + wrapper
+            + " since it is already checked out by a different user.";
+            return new MessageView(msg, HttpStatus.SC_PRECONDITION_FAILED);
+        }
+
+        org.w3c.dom.Document xmlDoc = DocumentHelper.readDocument(getInputStream());
+
+        ResourceType resourceType = doc.getResourceType();
+        Schema schema = resourceType.getSchema();
+        List errors = new ArrayList();
+        ValidationErrorHandler validationHandler = new ValidationErrorHandler(errors);
+        ValidationUtil.validate(this.manager, xmlDoc, schema, validationHandler);
+
+        if (validationHandler.success()) {
+            SourceUtil.writeDOM(xmlDoc, doc.getOutputStream());
+            Session session = doc.getSession();
+            WorkflowUtil.invoke(this.manager, session, getLogger(), doc, WORKFLOW_EVENT);
+            session.commit();
+            wrapper.checkout();
+            return new MessageView("Document successfully saved.", HttpStatus.SC_OK);
+        } else {
+            String msg = "Validation failed:\n";
+            for (Iterator i = errors.iterator(); i.hasNext(); ) {
+                msg = msg + "\n" + i.next();
+            }
+            return new MessageView(msg, HttpStatus.SC_PRECONDITION_FAILED);
+        }
+    }
+
+    protected static class ValidationErrorHandler implements org.xml.sax.ErrorHandler {
+
+        private boolean success = true;
+        private List errors;
+
+        public ValidationErrorHandler(List errors) {
+            this.errors = errors;
+        }
+
+        public boolean success() {
+            return this.success;
+        }
+
+        public void error(SAXParseException exception) throws SAXException {
+            this.success = false;
+            errors.add(exception.getMessage());
+        }
+
+        public void fatalError(SAXParseException exception) throws SAXException {
+            this.success = false;
+            errors.add(exception.getMessage());
+        }
+
+        public void warning(SAXParseException exception) throws SAXException {
+            errors.add(exception.getMessage());
+        }
+
+    }
+
+    public RestView delete() throws Exception {
+        throw new UnsupportedOperationException();
+    }
+
+    public RestView get() throws Exception {
+        return new SimpleRestView("content.xml", HttpStatus.SC_OK);
+    }
+
+    public RestView post() throws Exception {
+        throw new UnsupportedOperationException();
+    }
+
+}

Added: lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/DocumentWrapper.java
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/DocumentWrapper.java?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/DocumentWrapper.java (added)
+++ lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/DocumentWrapper.java Thu Mar 19 13:05:10 2009
@@ -0,0 +1,48 @@
+package org.apache.lenya.modules.atom;
+
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.repository.Node;
+import org.apache.lenya.util.Assert;
+
+public class DocumentWrapper {
+    
+    private Document document;
+    
+    public DocumentWrapper(Document doc) {
+        Assert.notNull("document", doc);
+        this.document = doc;
+    }
+    
+    public Document getDocument() {
+        return this.document;
+    }
+
+    public boolean canCheckIn() throws Exception {
+        return getDocument().getRepositoryNode().isCheckedOut();
+    }
+
+    public void checkin() throws Exception {
+        Node node = getDocument().getRepositoryNode();
+        if (node.isCheckedOutBySession(node.getSession())) {
+            node.checkin();
+        } else {
+            node.forceCheckIn();
+        }
+    }
+
+    public boolean canCheckOut() throws Exception {
+        Document doc = getDocument();
+        String userId = doc.getSession().getIdentity().getUser().getId();
+        Node node = doc.getRepositoryNode();
+        return !node.isCheckedOut() || node.getCheckoutUserId().equals(userId);
+    }
+
+    public void checkout() throws Exception {
+        getDocument().getRepositoryNode().checkout(false);
+    }
+
+    public String toString() {
+        return getDocument().getCanonicalWebappURL();
+    }
+
+}

Added: lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Entry.java
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Entry.java?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Entry.java (added)
+++ lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Entry.java Thu Mar 19 13:05:10 2009
@@ -0,0 +1,107 @@
+package org.apache.lenya.modules.atom;
+
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.lenya.cms.metadata.Element;
+import org.apache.lenya.cms.metadata.ElementSet;
+import org.apache.lenya.cms.metadata.MetaData;
+import org.apache.lenya.cms.metadata.MetaDataRegistry;
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.repository.Session;
+import org.apache.lenya.cms.workflow.WorkflowUtil;
+import org.apache.lenya.modules.rest.RestView;
+import org.apache.lenya.xml.DocumentHelper;
+
+public class Entry extends AtomHandler {
+
+    public RestView delete() throws Exception {
+        try {
+            Document doc = getModifiableDocument();
+            Session session = doc.getSession();
+            doc.getLink().delete();
+            doc.delete();
+            session.commit();
+        } catch (Exception e) {
+            getLogger().error("Could not delete document: ", e);
+            String msg = "Could not delete document: " + e.getMessage();
+            return new MessageView(msg, HttpStatus.SC_INTERNAL_SERVER_ERROR);
+        }
+        return new MessageView("Document successfully deleted.", HttpStatus.SC_OK);
+    }
+
+    public RestView get() throws Exception {
+        return new EntryView(getDocumentWrapper().getDocument());
+    }
+
+    public RestView post() throws Exception {
+        throw new UnsupportedOperationException();
+    }
+
+    public RestView put() throws Exception {
+        try {
+            Document doc = getModifiableDocument();
+            DocumentWrapper wrapper = getDocumentWrapper();
+            if (!wrapper.canCheckOut()) {
+                String msg = "Can't save document " + wrapper
+                        + " since it is already checked out by a different user.";
+                return new MessageView(msg, HttpStatus.SC_PRECONDITION_FAILED);
+            }
+
+            org.w3c.dom.Document xmlDoc = DocumentHelper.readDocument(getInputStream());
+            org.w3c.dom.Element docElem = xmlDoc.getDocumentElement();
+
+            Session session = doc.getSession();
+            MetaDataRegistry registry = null;
+
+            try {
+                registry = (MetaDataRegistry) this.manager.lookup(MetaDataRegistry.ROLE);
+                String[] namespaces = registry.getNamespaceUris();
+                for (int ns = 0; ns < namespaces.length; ns++) {
+                    String namespace = namespaces[ns];
+                    MetaData metaData = doc.getMetaData(namespace);
+                    ElementSet elementSet = registry.getElementSet(namespace);
+                    Element[] elements = elementSet.getElements();
+                    for (int e = 0; e < elements.length; e++) {
+                        Element element = elements[e];
+                        if (element.isEditable()) {
+                            String name = element.getName();
+                            org.w3c.dom.Element xmlElems[] = DocumentHelper.getChildren(docElem,
+                                    namespace, name);
+                            if (xmlElems.length == 1) {
+                                metaData.setValue(name, getTrimmedValue(xmlElems[0]));
+                            } else if (xmlElems.length > 1) {
+                                if (element.isMultiple()) {
+                                    metaData.removeAllValues(name);
+                                    for (int v = 0; v < xmlElems.length; v++) {
+                                        metaData.addValue(name, getTrimmedValue(xmlElems[v]));
+                                    }
+                                } else {
+                                    metaData.setValue(name, getTrimmedValue(xmlElems[0]));
+                                    getLogger().warn(
+                                            "Ignoring some values for non-multiple element ["
+                                                    + element.getName() + "]");
+                                }
+                            }
+                        }
+                    }
+                }
+            } finally {
+                if (registry != null) {
+                    this.manager.release(registry);
+                }
+            }
+
+            WorkflowUtil.invoke(this.manager, session, getLogger(), doc, WORKFLOW_EVENT);
+            session.commit();
+            return new MessageView("Meta data successfully saved.", HttpStatus.SC_OK);
+        } catch (Exception e) {
+            getLogger().error("Could not save meta data: ", e);
+            String msg = "Could not save meta data: " + e.getMessage();
+            return new MessageView(msg, HttpStatus.SC_INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    protected String getTrimmedValue(org.w3c.dom.Element element) {
+        return DocumentHelper.getSimpleElementText(element).trim();
+    }
+
+}

Added: lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/EntryView.java
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/EntryView.java?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/EntryView.java (added)
+++ lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/EntryView.java Thu Mar 19 13:05:10 2009
@@ -0,0 +1,54 @@
+package org.apache.lenya.modules.atom;
+
+import java.net.MalformedURLException;
+
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.lang.StringUtils;
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.publication.ResourceType;
+import org.apache.lenya.modules.rest.RestView;
+import org.apache.lenya.util.Assert;
+import org.apache.lenya.xml.Schema;
+
+public class EntryView implements RestView {
+    
+    private Document document;
+
+    public EntryView(Document doc) {
+        Assert.notNull("document", doc);
+        this.document = doc;
+    }
+
+    public int getStatusCode() {
+        return HttpStatus.SC_OK;
+    }
+
+    public String getUri() {
+        return "entry.xml";
+    }
+    
+    public Document getDocument() throws Exception {
+        return this.document;
+    }
+    
+    public String getSchemaUri() throws Exception {
+        Document doc = getDocument();
+        ResourceType type = doc.getResourceType();
+        Schema schema = type.getSchema();
+        if (schema == null) {
+            throw new RuntimeException("The resource type '" + type.getName() + "' has no schema.");
+        }
+        else {
+            String uri = schema.getURI();
+            if (uri.startsWith("fallback://lenya/modules/")) {
+                String path = StringUtils.substringAfter(uri, "fallback://lenya/modules/");
+                String module = StringUtils.substringBefore(path, "/");
+                path = StringUtils.substringAfter(path, module + "/resources");
+                return "/" + doc.getPublication().getId() + "/modules/" + module + path;
+            } else {
+                throw new MalformedURLException("Don't know how to create HTTP URL from : " + uri);
+            }
+        }
+    }
+    
+}

Added: lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Lock.java
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Lock.java?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Lock.java (added)
+++ lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Lock.java Thu Mar 19 13:05:10 2009
@@ -0,0 +1,37 @@
+package org.apache.lenya.modules.atom;
+
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.lenya.modules.rest.RestView;
+
+public class Lock extends AtomHandler {
+
+    public RestView delete() throws Exception {
+        DocumentWrapper wrapper = getDocumentWrapper();
+        if (wrapper.canCheckIn()) {
+            wrapper.checkin();
+            return new MessageView("Document successfully unlocked.", HttpStatus.SC_OK);
+        }
+        else {
+            return new MessageView("Could not unlock document.", HttpStatus.SC_PRECONDITION_FAILED);
+        }
+    }
+
+    public RestView get() throws Exception {
+        DocumentWrapper wrapper = getDocumentWrapper();
+        if (wrapper.getDocument().getRepositoryNode().isCheckedOut()) {
+            return new LockView(getDocumentWrapper().getDocument());
+        }
+        else {
+            return new MessageView("Document is not locked.", HttpStatus.SC_NOT_FOUND);
+        }
+    }
+
+    public RestView post() throws Exception {
+        throw new UnsupportedOperationException();
+    }
+
+    public RestView put() throws Exception {
+        throw new UnsupportedOperationException();
+    }
+
+}

Added: lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/LockView.java
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/LockView.java?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/LockView.java (added)
+++ lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/LockView.java Thu Mar 19 13:05:10 2009
@@ -0,0 +1,22 @@
+package org.apache.lenya.modules.atom;
+
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.modules.rest.SimpleRestView;
+import org.apache.lenya.util.Assert;
+
+public class LockView extends SimpleRestView {
+
+    private Document document;
+
+    public LockView(Document doc) {
+        super("lock.xml", HttpStatus.SC_OK);
+        Assert.notNull("document", doc);
+        this.document = doc;
+    }
+    
+    public Document getDocument() {
+        return this.document;
+    }
+
+}

Added: lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Locks.java
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Locks.java?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Locks.java (added)
+++ lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Locks.java Thu Mar 19 13:05:10 2009
@@ -0,0 +1,41 @@
+package org.apache.lenya.modules.atom;
+
+import org.apache.cocoon.environment.ObjectModelHelper;
+import org.apache.cocoon.environment.Response;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.publication.Proxy;
+import org.apache.lenya.modules.rest.RestView;
+
+public class Locks extends AtomHandler {
+
+    protected static final String HEADER_LOCATION = "Location";
+
+    public RestView delete() throws Exception {
+        throw new UnsupportedOperationException();
+    }
+
+    public RestView get() throws Exception {
+        return new LocksView(getDocumentWrapper().getDocument());
+    }
+
+    public RestView post() throws Exception {
+        DocumentWrapper wrapper = getDocumentWrapper();
+        if (wrapper.canCheckOut()) {
+            wrapper.checkout();
+            Response response = ObjectModelHelper.getResponse(getObjectModel());
+            Document document = wrapper.getDocument();
+            Proxy proxy = document.getPublication().getProxy(document, getRequest().isSecure());
+            response.setHeader(HEADER_LOCATION, proxy.getURL(document) + "?lenya.usecase=atom.lock");
+            return new MessageView("Document successfully locked.", HttpStatus.SC_CREATED);
+        }
+        else {
+            return new MessageView("Document can't be locked.", HttpStatus.SC_PRECONDITION_FAILED);
+        }
+    }
+
+    public RestView put() throws Exception {
+        throw new UnsupportedOperationException();
+    }
+
+}

Added: lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/LocksView.java
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/LocksView.java?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/LocksView.java (added)
+++ lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/LocksView.java Thu Mar 19 13:05:10 2009
@@ -0,0 +1,22 @@
+package org.apache.lenya.modules.atom;
+
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.modules.rest.SimpleRestView;
+import org.apache.lenya.util.Assert;
+
+public class LocksView extends SimpleRestView {
+
+    private Document document;
+
+    public LocksView(Document doc) {
+        super("locks.xml", HttpStatus.SC_OK);
+        Assert.notNull("document", doc);
+        this.document = doc;
+    }
+    
+    public Document getDocument() {
+        return this.document;
+    }
+
+}

Added: lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/MessageView.java
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/MessageView.java?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/MessageView.java (added)
+++ lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/MessageView.java Thu Mar 19 13:05:10 2009
@@ -0,0 +1,20 @@
+package org.apache.lenya.modules.atom;
+
+import org.apache.lenya.modules.rest.SimpleRestView;
+import org.apache.lenya.util.Assert;
+
+public class MessageView extends SimpleRestView {
+
+    private String message;
+
+    public MessageView(String message, int statusCode) {
+        super("message.txt", statusCode);
+        Assert.notNull("message", message);
+        this.message = message;
+    }
+    
+    public String getMessage() {
+        return this.message;
+    }
+
+}

Added: lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Workspace.java
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Workspace.java?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Workspace.java (added)
+++ lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/Workspace.java Thu Mar 19 13:05:10 2009
@@ -0,0 +1,24 @@
+package org.apache.lenya.modules.atom;
+
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.lenya.modules.rest.RestView;
+
+public class Workspace extends AtomHandler {
+
+    public RestView delete() throws Exception {
+        throw new UnsupportedOperationException();
+    }
+
+    public RestView get() throws Exception {
+        return new WorkspaceView(getArea(), "workspace.xml", HttpStatus.SC_OK);
+    }
+
+    public RestView post() throws Exception {
+        throw new UnsupportedOperationException();
+    }
+
+    public RestView put() throws Exception {
+        throw new UnsupportedOperationException();
+    }
+
+}

Added: lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/WorkspaceView.java
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/WorkspaceView.java?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/WorkspaceView.java (added)
+++ lenya/contributions/2_0_X/modules/atom/java/src/org/apache/lenya/modules/atom/WorkspaceView.java Thu Mar 19 13:05:10 2009
@@ -0,0 +1,21 @@
+package org.apache.lenya.modules.atom;
+
+import org.apache.lenya.cms.publication.Area;
+import org.apache.lenya.modules.rest.SimpleRestView;
+import org.apache.lenya.util.Assert;
+
+public class WorkspaceView extends SimpleRestView {
+
+    private Area area;
+
+    public WorkspaceView(Area area, String uri, int statusCode) {
+        super(uri, statusCode);
+        Assert.notNull("area", area);
+        this.area = area;
+    }
+    
+    public Area getArea() {
+        return this.area;
+    }
+
+}

Added: lenya/contributions/2_0_X/modules/atom/jx/assets.jx
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/jx/assets.jx?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/jx/assets.jx (added)
+++ lenya/contributions/2_0_X/modules/atom/jx/assets.jx Thu Mar 19 13:05:10 2009
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<collection xmlns="http://www.w3.org/2007/app"
+  xmlns:jx="http://apache.org/cocoon/templates/jx/1.0">
+  <jx:forEach var="mimeType" items="${view.getAssetMimeTypes()}">
+    <accept>${mimeType}</accept>
+  </jx:forEach>
+  <jx:forEach var="doc" items="${view.getDocuments()}">
+    <member href="${doc.getCanonicalWebappURL()}?lenya.usecase=atom.entry"
+      title="${doc.getMetaData('http://purl.org/dc/elements/1.1/').getFirstValue('title')}"/>
+  </jx:forEach>
+</collection>

Added: lenya/contributions/2_0_X/modules/atom/jx/children.jx
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/jx/children.jx?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/jx/children.jx (added)
+++ lenya/contributions/2_0_X/modules/atom/jx/children.jx Thu Mar 19 13:05:10 2009
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<collection xmlns="http://www.w3.org/2007/app"
+  xmlns:jx="http://apache.org/cocoon/templates/jx/1.0">
+  <jx:forEach var="doc" items="${view.getDocuments()}">
+    <member href="${doc.getCanonicalWebappURL()}?lenya.usecase=atom.entry"
+      title="${doc.getMetaData('http://purl.org/dc/elements/1.1/').getFirstValue('title')}"/>
+  </jx:forEach>
+</collection>

Added: lenya/contributions/2_0_X/modules/atom/jx/entry.jx
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/jx/entry.jx?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/jx/entry.jx (added)
+++ lenya/contributions/2_0_X/modules/atom/jx/entry.jx Thu Mar 19 13:05:10 2009
@@ -0,0 +1,53 @@
+<?xml version="1.0"?>
+<entry xmlns:jx="http://apache.org/cocoon/templates/jx/1.0"
+  xmlns="http://www.w3.org/2005/Atom"
+  xmlns:meta="http://apache.org/lenya/metadata/1.0">
+  
+  <jx:set var="document" value="${view.getDocument()}"/>
+  <jx:set var="docUrl" value="${document.getCanonicalWebappURL()}"/>
+  <jx:set var="dcElements" value="${document.getMetaData('http://purl.org/dc/elements/1.1/')}"/>
+  
+  <id>${document.getUUID()}:${document.getLanguage()}</id>
+  <title type="text">${document.getLink().getLabel()}</title>
+  <summary>${dcElements.getFirstValue('title')}</summary>
+  <author>${dcElements.getFirstValue('creator')}</author>
+  <category scheme="http://apache.org/lenya/atom/categories/language">${document.getLanguage()}</category>
+  <updated>${document.getLastModified()}</updated>
+  <content type="${document.getMimeType()}" src="lenya-document:${document.getUUID()},lang=${document.getLanguage()}"/>
+  
+  <jx:forEach var="namespace" items="${document.getMetaDataNamespaceUris()}">
+    <jx:set var="metadata" value="${document.getMetaData(namespace)}"/>
+    <jx:forEach var="element" items="${metadata.getElementSet().getElements()}">
+      <jx:if test="${element.isEditable()}">
+        <jx:set var="name" value="${element.getName()}"/>
+        <jx:forEach var="value" items="${metadata.getValues(name)}">
+          <meta:element namespace="${namespace}" name="${name}">${value}</meta:element>
+        </jx:forEach>
+      </jx:if>
+    </jx:forEach>
+  </jx:forEach>
+  
+  <link rel="edit" type="application/atom+xml" href="${docUrl}?lenya.usecase=atom.entry"/>
+  <link rel="lock" type="application/atomcoll+xml" href="${docUrl}?lenya.usecase=atom.locks"/>
+  <link rel="assets" type="application/atomcoll+xml" href="${docUrl}?lenya.usecase=atom.assets"/>
+  <link rel="children" type="application/atomcoll+xml" href="${docUrl}?lenya.usecase=atom.children"/>
+  <link rel="edit-media" type="${document.getMimeType()}" href="${docUrl}?lenya.usecase=atom.content"/>
+  
+  <jx:set var="formats" value="${Packages.java.util.Arrays.asList(document.getResourceType().getFormats())}"/>
+  <jx:if test="${formats.contains('xhtml.xsl')}">
+    <edit:edit xmlns:edit="http://apache.org/lenya/editing">
+      <edit:styles>
+        <edit:style transformPageContext="false"
+          href="/modules/atom${document.getResourceType().getFormatURI('xhtml.xsl')}">
+          <edit:parameter name="editor" value="firedocs"/>
+        </edit:style>
+      </edit:styles>
+      <edit:page-context href="${docUrl}#content"/>
+      <edit:inserts href="${docUrl}?lenya.usecase=atom.inserts"/>
+      <edit:schema type="relaxNG" href="${view.getSchemaUri()}"/>
+      <edit:uri-resolver protocol="lenya-document"
+        href="${docUrl}?lenya.usecase=atom.uuid2url&amp;url="/>
+    </edit:edit>
+  </jx:if>
+</entry>
+

Added: lenya/contributions/2_0_X/modules/atom/jx/lock.jx
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/jx/lock.jx?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/jx/lock.jx (added)
+++ lenya/contributions/2_0_X/modules/atom/jx/lock.jx Thu Mar 19 13:05:10 2009
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<entry xmlns="http://www.w3.org/2005/Atom"
+  xmlns:jx="http://apache.org/cocoon/templates/jx/1.0">
+  <jx:set var="document" value="${view.getDocument()}"/>
+  <title>
+    Lock for resource '${document.getMetaData('http://purl.org/dc/elements/1.1/').getFirstValue('title')}'
+  </title>
+  <link rel="self" type="application/atom+xml"
+    href="${document.getCanonicalWebappURL()}?lenya.usecase=atom.lock"/>
+  <id>lock:${document.getUUID()}:${document.getLanguage()}</id>
+  <author><name>${document.getRepositoryNode().getCheckoutUserId()}</name></author>
+</entry>

Added: lenya/contributions/2_0_X/modules/atom/jx/locks.jx
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/jx/locks.jx?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/jx/locks.jx (added)
+++ lenya/contributions/2_0_X/modules/atom/jx/locks.jx Thu Mar 19 13:05:10 2009
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<collection xmlns="http://www.w3.org/2007/app"
+  xmlns:jx="http://apache.org/cocoon/templates/jx/1.0">
+  <jx:set var="document" value="${view.getDocument()}"/>
+  <jx:set var="node" value="${document.getRepositoryNode()}"/>
+  <jx:if test="${node.isCheckedOut()}">
+    <member href="${document.getCanonicalWebappURL()}?lenya.usecase=atom.lock"
+      title="Lock for resource '${document.getMetaData('http://purl.org/dc/elements/1.1/').getFirstValue('title')}' by user '${node.getCheckoutUserId()}'"/>
+  </jx:if>
+</collection>

Added: lenya/contributions/2_0_X/modules/atom/jx/message.jx
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/jx/message.jx?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/jx/message.jx (added)
+++ lenya/contributions/2_0_X/modules/atom/jx/message.jx Thu Mar 19 13:05:10 2009
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<jx:template xmlns:jx="http://apache.org/cocoon/templates/jx/1.0"
+  xmlns="http://www.w3.org/2005/Atom">${view.getMessage()}</jx:template>

Added: lenya/contributions/2_0_X/modules/atom/jx/serviceLinks.jx
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/jx/serviceLinks.jx?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/jx/serviceLinks.jx (added)
+++ lenya/contributions/2_0_X/modules/atom/jx/serviceLinks.jx Thu Mar 19 13:05:10 2009
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<head xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:jx="http://apache.org/cocoon/templates/jx/1.0">
+  <jx:set var="pub" value="${parameters.getParameter('pub')}"/>
+  <jx:set var="area" value="${parameters.getParameter('area')}"/>
+  <jx:set var="documentUrl" value="${parameters.getParameter('documentUrl')}"/>
+  <link rel="service" type="application/atomserv+xml"
+    href="/${pub}/${area}/?lenya.usecase=atom.workspace"
+    title="Atom Publishing Protocol Service Document"/>
+  <link rel="service.edit" type="application/x.atom+xml"
+    href="/${pub}/${area}${documentUrl}?lenya.usecase=atom.entry"
+    title="Edit with atompub"/>
+</head>

Added: lenya/contributions/2_0_X/modules/atom/jx/uuid2url.jx
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/jx/uuid2url.jx?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/jx/uuid2url.jx (added)
+++ lenya/contributions/2_0_X/modules/atom/jx/uuid2url.jx Thu Mar 19 13:05:10 2009
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<jx:template xmlns:jx="http://apache.org/cocoon/templates/jx/1.0">${parameters.getParameter('url')}</jx:template>
\ No newline at end of file

Added: lenya/contributions/2_0_X/modules/atom/jx/workspace.jx
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/jx/workspace.jx?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/jx/workspace.jx (added)
+++ lenya/contributions/2_0_X/modules/atom/jx/workspace.jx Thu Mar 19 13:05:10 2009
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<service xmlns="http://www.w3.org/2007/app"
+  xmlns:atom="http://www.w3.org/2005/Atom"
+  xmlns:jx="http://apache.org/cocoon/templates/jx/1.0"
+  >
+  <jx:set var="area" value="${view.getArea()}"/>
+  <jx:set var="url" value="${'/' + area.getPublication().getId() + '/' + area.getName() + '/'}"/>
+  <workspace>
+    <atom:title>Documents</atom:title>
+    <collection href="${url}?lenya.usecase=atom.children">
+      <atom:title>Top Level Documents</atom:title>
+      <accept>application/atom+xml;type=entry</accept>
+      <categories fixed="yes">
+        <jx:forEach var="lang" items="${area.getPublication().getLanguages()}">
+          <atom:category scheme="http://apache.org/lenya/atom/categories/language" term="${lang}" />
+        </jx:forEach>
+      </categories>
+    </collection>
+  </workspace>
+  <workspace>
+    <atom:title>Assets</atom:title>
+    <collection href="${url}?lenya.usecase=atom.assets">
+      <atom:title>Global Assets</atom:title>
+      <accept>image/png</accept>
+      <accept>image/jpeg</accept>
+      <accept>image/gif</accept>
+    </collection>
+  </workspace>
+  <firedocs:metadata xmlns:firedocs="www.firedocs.org/metadata/1.0">
+    <firedocs:schema type="relaxNG" href="/modules/firedocs/metadata.rng"/>
+  </firedocs:metadata>
+</service>

Added: lenya/contributions/2_0_X/modules/atom/sitemap.xmap
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/sitemap.xmap?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/sitemap.xmap (added)
+++ lenya/contributions/2_0_X/modules/atom/sitemap.xmap Thu Mar 19 13:05:10 2009
@@ -0,0 +1,103 @@
+<?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.
+-->
+
+<map:sitemap xmlns:map="http://apache.org/cocoon/sitemap/1.0">
+  
+  <map:components>
+    <map:transformers default="xslt">
+      <map:transformer name="proxy-xsl" logger="lenya.sitemap.transformer.proxy"
+        src="org.apache.lenya.cms.cocoon.transformation.ProxyTransformer">
+        <urls type="relative"/>
+        <transform namespace="http://www.w3.org/1999/XSL/Transform" element="include" attribute="href"/>
+        <transform namespace="http://www.w3.org/1999/XSL/Transform" element="import" attribute="href"/>
+      </map:transformer>
+    </map:transformers>
+  </map:components>
+  
+  <map:flow language="javascript">
+    <map:script src="fallback://lenya/modules/rest/rest.js"/>
+  </map:flow>
+  
+  <map:pipelines>
+      
+    <map:pipeline type="noncaching">
+      
+      <map:match pattern="view/content.xml">
+        <map:read mime-type="application/xml" src="lenya-document:"/>
+      </map:match>
+      
+      <!--
+        Generic REST usecase views.
+      -->
+      <map:match pattern="view/*.*">
+        <map:generate type="jx" src="jx/{1}.jx"/>
+        <map:match pattern="view/*.txt">
+          <map:serialize type="text" status-code="{flow-attr:view/statusCode}"/>
+        </map:match>
+        <map:match pattern="view/*.xml">
+          <map:match pattern="view/entry.xml">
+            <map:transform src="xslt/entryMetaData.xsl"/>
+          </map:match>
+          <map:serialize type="xml" status-code="{flow-attr:view/statusCode}"/>
+        </map:match>
+      </map:match>
+      
+      <map:match type="usecase" pattern="atom.inserts">
+        <map:read mime-type="application/xml" src="lenya-document:?format=editingInserts"/>
+      </map:match>
+      
+      <map:match type="usecase" pattern="atom.uuid2url">
+        <map:generate type="jx" src="jx/uuid2url.jx">
+          <map:parameter name="url" value="{proxy:{uuid2url:{request-param:url}}}"/>
+        </map:generate>
+        <map:act type="set-header">
+          <map:parameter name="Location" value="{proxy:{uuid2url:{request-param:url}}}"/>
+        </map:act>
+        <map:serialize type="text"/>
+      </map:match>
+      
+      <!--
+        Generic REST usecase pipeline.
+        -->
+      <map:match type="usecase" pattern="atom.*">
+        <map:call function="handleRequest">
+          <map:parameter name="handler" value="org.apache.lenya.modules.atom.{1}"/>
+        </map:call>
+      </map:match>
+      
+      <map:match pattern="serviceLinks">
+        <map:generate type="jx" src="jx/serviceLinks.jx">
+          <map:parameter name="pub" value="{page-envelope:publication-id}"/>
+          <map:parameter name="area" value="{page-envelope:area}"/>
+          <map:parameter name="documentUrl" value="{page-envelope:document-url}"/>
+        </map:generate>
+        <map:serialize type="xml"/>
+      </map:match>
+      
+      <map:match pattern="**.xsl">
+        <map:generate src="fallback://lenya/{1}.xsl" mime-type="application/xslt+xml"/>
+        <map:transform src="fallback://lenya/modules/firedocs/xslt/translate-xsl-includes.xsl"/>
+        <map:transform type="proxy-xsl"/>
+        <map:serialize type="xml"/>
+      </map:match>
+      
+    </map:pipeline>
+    
+  </map:pipelines>
+
+</map:sitemap>

Added: lenya/contributions/2_0_X/modules/atom/test/canoo/dtd/Project.dtd
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/test/canoo/dtd/Project.dtd?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/test/canoo/dtd/Project.dtd (added)
+++ lenya/contributions/2_0_X/modules/atom/test/canoo/dtd/Project.dtd Thu Mar 19 13:05:10 2009
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+
+<!--
+This file is generated automatically from the information contained in the folder includes.
+Do not edit it else you risk to lose your changes.
+-->
+
+

Added: lenya/contributions/2_0_X/modules/atom/test/canoo/resources/concepts.html
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/test/canoo/resources/concepts.html?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/test/canoo/resources/concepts.html (added)
+++ lenya/contributions/2_0_X/modules/atom/test/canoo/resources/concepts.html Thu Mar 19 13:05:10 2009
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:lenya="http://apache.org/cocoon/lenya/page-envelope/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: index_en 528434 2007-04-13 10:42:52Z andreas $ -->
+  <head>
+    <title>Concepts</title>
+  </head>
+  <body>
+    <h1>Concepts</h1>
+    
+    <h2>Publications</h2>
+    
+    <p>In Apache Lenya, a website is called a
+    <strong>publication</strong>.</p>
+    
+    <h2>Areas: Authoring, Live, ...</h2>
+
+    <p>Apache Lenya separates between different areas:</p>
+    <ul>
+      <li>The authoring area is for creating and editing of
+      content. All CMS functions are available here.</li>
+
+      <li>Once the content has been published it is moved to the live
+      area. The live area can be served by a web server directly or
+      you can add another intermediate step where the content is
+      replicated from the live area to the actual web server. In any
+      case the live area simply serves as a preview to the content
+      that will be served by the web server.</li>
+      <li>
+        Other standard areas are and archive. If necessary, further
+        areas can be declared.
+      </li>
+    </ul>
+    
+    <h2>Resource Types</h2>
+
+    <p>As Apache Lenya is based on Apache Cocoon, it has strong XML and
+    XSLT foundations. It is possible to ensure that a document
+    conforms to an XML schema. Typically you define different types of
+    documents, like an news article or an opinion piece, conforming to
+    different XML schemas. These different types are referred to as
+    document types. They are used to ensure the XML schema conformance
+    when editing and typically also when preparing a presentation of
+    the document, where an opinion piece has a different layout than a
+    news article.</p>
+
+  </body>
+</html>
\ No newline at end of file

Added: lenya/contributions/2_0_X/modules/atom/test/canoo/resources/conceptsEdited.html
URL: http://svn.apache.org/viewvc/lenya/contributions/2_0_X/modules/atom/test/canoo/resources/conceptsEdited.html?rev=755981&view=auto
==============================================================================
--- lenya/contributions/2_0_X/modules/atom/test/canoo/resources/conceptsEdited.html (added)
+++ lenya/contributions/2_0_X/modules/atom/test/canoo/resources/conceptsEdited.html Thu Mar 19 13:05:10 2009
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:lenya="http://apache.org/cocoon/lenya/page-envelope/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: index_en 528434 2007-04-13 10:42:52Z andreas $ -->
+  <head>
+    <title>Concepts</title>
+  </head>
+  <body>
+    <h1>Concepts</h1>
+
+    <p>atomTest</p>
+    
+    <h2>Publications</h2>
+    
+    <p>In Apache Lenya, a website is called a
+    <strong>publication</strong>.</p>
+    
+    <h2>Areas: Authoring, Live, ...</h2>
+
+    <p>Apache Lenya separates between different areas:</p>
+    <ul>
+      <li>The authoring area is for creating and editing of
+      content. All CMS functions are available here.</li>
+
+      <li>Once the content has been published it is moved to the live
+      area. The live area can be served by a web server directly or
+      you can add another intermediate step where the content is
+      replicated from the live area to the actual web server. In any
+      case the live area simply serves as a preview to the content
+      that will be served by the web server.</li>
+      <li>
+        Other standard areas are and archive. If necessary, further
+        areas can be declared.
+      </li>
+    </ul>
+    
+    <h2>Resource Types</h2>
+
+    <p>As Apache Lenya is based on Apache Cocoon, it has strong XML and
+    XSLT foundations. It is possible to ensure that a document
+    conforms to an XML schema. Typically you define different types of
+    documents, like an news article or an opinion piece, conforming to
+    different XML schemas. These different types are referred to as
+    document types. They are used to ensure the XML schema conformance
+    when editing and typically also when preparing a presentation of
+    the document, where an opinion piece has a different layout than a
+    news article.</p>
+
+  </body>
+</html>
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.