You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lenya.apache.org by an...@apache.org on 2005/11/11 18:00:21 UTC

svn commit: r332599 - in /lenya/trunk/src: java/org/apache/lenya/cms/migration/ java/org/apache/lenya/cms/repo/ modules/jackrabbit/repository/repository/nodetypes/ modules/jcr/java/src/org/apache/lenya/cms/jcr/

Author: andreas
Date: Fri Nov 11 09:00:00 2005
New Revision: 332599

URL: http://svn.apache.org/viewcvs?rev=332599&view=rev
Log:
JCR integration: implemented writing and reading document content

Modified:
    lenya/trunk/src/java/org/apache/lenya/cms/migration/Migrate14.java
    lenya/trunk/src/java/org/apache/lenya/cms/repo/ContentNode.java
    lenya/trunk/src/java/org/apache/lenya/cms/repo/Document.java
    lenya/trunk/src/modules/jackrabbit/repository/repository/nodetypes/custom_nodetypes.xml
    lenya/trunk/src/modules/jcr/java/src/org/apache/lenya/cms/jcr/JCRContentNode.java
    lenya/trunk/src/modules/jcr/java/src/org/apache/lenya/cms/jcr/JCRDocument.java
    lenya/trunk/src/modules/jcr/java/src/org/apache/lenya/cms/jcr/JCRDocumentBuilder.java
    lenya/trunk/src/modules/jcr/java/src/org/apache/lenya/cms/jcr/JCRSiteNodeBuilder.java

Modified: lenya/trunk/src/java/org/apache/lenya/cms/migration/Migrate14.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/migration/Migrate14.java?rev=332599&r1=332598&r2=332599&view=diff
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/migration/Migrate14.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/migration/Migrate14.java Fri Nov 11 09:00:00 2005
@@ -19,21 +19,39 @@
 import java.io.File;
 import java.io.FileFilter;
 
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
 import org.apache.lenya.cms.repo.Area;
 import org.apache.lenya.cms.repo.ContentNode;
+import org.apache.lenya.cms.repo.Document;
 import org.apache.lenya.cms.repo.Publication;
 import org.apache.lenya.cms.repo.Repository;
 import org.apache.lenya.cms.repo.RepositoryException;
 import org.apache.lenya.cms.repo.RepositoryManager;
 import org.apache.lenya.cms.repo.Session;
 import org.apache.lenya.cms.repo.SiteNode;
+import org.apache.lenya.xml.DocumentHelper;
 import org.apache.tools.ant.BuildException;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.helpers.DefaultHandler;
 
 /**
  * Migrate Lenya 1.4-dev content.
  */
 public class Migrate14 {
 
+    /**
+     * Main method.
+     * @param args The command line arguments: <webapp-directory>
+     *            <repository-factory-class>
+     */
     public static void main(String[] args) {
 
         if (args.length != 2) {
@@ -146,8 +164,7 @@
         importChildren(contentDir, repoArea, null);
     }
 
-    protected void importNode(File docDir, Area area, SiteNode parent)
-            throws RepositoryException {
+    protected void importNode(File docDir, Area area, SiteNode parent) throws RepositoryException {
         String nodeId = docDir.getName();
         String parentPath = "";
         if (parent != null) {
@@ -185,8 +202,21 @@
         String fileName = file.getName();
         String suffix = fileName.substring("index_".length());
         String language = suffix.substring(0, suffix.length() - ".xml".length());
-        contentNode.addDocument(language);
         System.out.println(" language [" + language + "]");
+        
+        Document document = contentNode.addDocument(language);
+
+        try {
+            Transformer transformer = TransformerFactory.newInstance().newTransformer();
+            Source source = new StreamSource(file);
+            Result result = new StreamResult(document.getOutputStream());
+            transformer.transform(source, result);
+        } catch (RepositoryException e) {
+            throw e;
+        } catch (Exception e) {
+            throw new RepositoryException(e);
+        }
+
     }
 
     protected void importChildren(File docDir, Area area, SiteNode parentNode)

Modified: lenya/trunk/src/java/org/apache/lenya/cms/repo/ContentNode.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/repo/ContentNode.java?rev=332599&r1=332598&r2=332599&view=diff
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/repo/ContentNode.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/repo/ContentNode.java Fri Nov 11 09:00:00 2005
@@ -20,7 +20,7 @@
     
     Document[] getDocuments() throws RepositoryException;
     
-    void addDocument(String language) throws RepositoryException;
+    Document addDocument(String language) throws RepositoryException;
     
     void removeDocument(Document document) throws RepositoryException;
     

Modified: lenya/trunk/src/java/org/apache/lenya/cms/repo/Document.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/repo/Document.java?rev=332599&r1=332598&r2=332599&view=diff
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/repo/Document.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/repo/Document.java Fri Nov 11 09:00:00 2005
@@ -16,10 +16,23 @@
  */
 package org.apache.lenya.cms.repo;
 
+import java.io.InputStream;
+import java.io.OutputStream;
+
 public interface Document {
     
     String getLanguage() throws RepositoryException;
     
     void setLanguage(String language) throws RepositoryException;
+    
+    InputStream getInputStream() throws RepositoryException;
+    
+    OutputStream getOutputStream() throws RepositoryException;
+    
+    long getContentLength() throws RepositoryException;
+    
+    String getMimeType() throws RepositoryException;
+    
+    long getLastModified() throws RepositoryException;
 
 }

Modified: lenya/trunk/src/modules/jackrabbit/repository/repository/nodetypes/custom_nodetypes.xml
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/modules/jackrabbit/repository/repository/nodetypes/custom_nodetypes.xml?rev=332599&r1=332598&r2=332599&view=diff
==============================================================================
--- lenya/trunk/src/modules/jackrabbit/repository/repository/nodetypes/custom_nodetypes.xml (original)
+++ lenya/trunk/src/modules/jackrabbit/repository/repository/nodetypes/custom_nodetypes.xml Fri Nov 11 09:00:00 2005
@@ -113,12 +113,23 @@
       onParentVersion="COPY" protected="false" multiple="false"/>
     <propertyDef name="lenya:label" requiredType="String" autoCreate="false" mandatory="true"
       onParentVersion="COPY" protected="false" multiple="false"/>
+    <childNodeDef name="lenya:resource" defaultPrimaryType="lnt:resource" autoCreate="true" mandatory="true">
+      <requiredPrimaryTypes>
+        <requiredPrimaryType>lnt:resource</requiredPrimaryType>
+      </requiredPrimaryTypes>
+    </childNodeDef>
     <childNodeDef name="lenya:meta" defaultPrimaryType="lnt:meta" autoCreate="true" mandatory="true"
       onParentVersion="COPY" protected="false" sameNameSibs="true">
       <requiredPrimaryTypes>
         <requiredPrimaryType>lnt:meta</requiredPrimaryType>
       </requiredPrimaryTypes>
     </childNodeDef>
+  </nodeType>
+  
+  <nodeType name="lnt:resource" isMixin="false" hasOrderableChildNodes="false" primaryItemName="">
+    <supertypes>
+      <supertype>nt:resource</supertype>
+    </supertypes>
   </nodeType>
   
   <!--

Modified: lenya/trunk/src/modules/jcr/java/src/org/apache/lenya/cms/jcr/JCRContentNode.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/modules/jcr/java/src/org/apache/lenya/cms/jcr/JCRContentNode.java?rev=332599&r1=332598&r2=332599&view=diff
==============================================================================
--- lenya/trunk/src/modules/jcr/java/src/org/apache/lenya/cms/jcr/JCRContentNode.java (original)
+++ lenya/trunk/src/modules/jcr/java/src/org/apache/lenya/cms/jcr/JCRContentNode.java Fri Nov 11 09:00:00 2005
@@ -25,7 +25,6 @@
 import org.apache.lenya.cms.repo.ContentNode;
 import org.apache.lenya.cms.repo.Document;
 import org.apache.lenya.cms.repo.RepositoryException;
-import org.apache.lenya.cms.repo.SiteNode;
 
 /**
  * JCR content node.
@@ -34,30 +33,47 @@
 
     private NodeWrapperManager documentManager;
     private JCRContent content;
-    
+
     public JCRContentNode(JCRContent content, Node node) {
         super(node);
         this.content = content;
-        this.documentManager = new NodeWrapperManager(content.getArea().getPublication().getSession());
+        this.documentManager = new NodeWrapperManager(content.getArea()
+                .getPublication()
+                .getSession());
     }
-    
+
     public Document[] getDocuments() throws RepositoryException {
-        return null;
+        try {
+            List documents = new ArrayList();
+            for (NodeIterator i = getNode().getNodes(JCRDocumentBuilder.NODE_NAME); i.hasNext();) {
+                Node node = i.nextNode();
+                documents.add(getDocument(node.getProperty(JCRDocumentBuilder.LANGUAGE_ATTRIBUTE)
+                        .getString()));
+            }
+            return (Document[]) documents.toArray(new Document[documents.size()]);
+        } catch (javax.jcr.RepositoryException e) {
+            throw new RepositoryException(e);
+        }
+
     }
 
-    public void addDocument(String language) throws RepositoryException {
-        // TODO Auto-generated method stub
-        
+    public Document addDocument(String language) throws RepositoryException {
+        NodeWrapperBuilder builder = new JCRDocumentBuilder(this, language);
+        return (Document) builder.buildNode(this.content.getArea().getPublication().getSession(),
+                true);
     }
 
     public void removeDocument(Document document) throws RepositoryException {
-        // TODO Auto-generated method stub
-        
+        try {
+            ((JCRDocument) document).getNode().remove();
+        } catch (javax.jcr.RepositoryException e) {
+            throw new RepositoryException(e);
+        }
     }
 
     public Document getDocument(String language) throws RepositoryException {
-        // TODO Auto-generated method stub
-        return null;
+        NodeWrapperBuilder builder = new JCRDocumentBuilder(this, language);
+        return (Document) builder.buildNode(this.content.getArea().getPublication().getSession(), false);
     }
-    
+
 }

Modified: lenya/trunk/src/modules/jcr/java/src/org/apache/lenya/cms/jcr/JCRDocument.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/modules/jcr/java/src/org/apache/lenya/cms/jcr/JCRDocument.java?rev=332599&r1=332598&r2=332599&view=diff
==============================================================================
--- lenya/trunk/src/modules/jcr/java/src/org/apache/lenya/cms/jcr/JCRDocument.java (original)
+++ lenya/trunk/src/modules/jcr/java/src/org/apache/lenya/cms/jcr/JCRDocument.java Fri Nov 11 09:00:00 2005
@@ -16,6 +16,123 @@
  */
 package org.apache.lenya.cms.jcr;
 
-public class JCRDocument {
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
 
+import javax.jcr.Node;
+
+import org.apache.lenya.cms.repo.Document;
+import org.apache.lenya.cms.repo.RepositoryException;
+
+/**
+ * JCR-based document implementation.
+ */
+public class JCRDocument extends NodeWrapper implements Document {
+
+    /**
+     * Ctor.
+     * @param node The JCR node.
+     */
+    public JCRDocument(Node node) {
+        super(node);
+    }
+
+    public String getLanguage() throws RepositoryException {
+        try {
+            return getNode().getProperty(JCRDocumentBuilder.LANGUAGE_ATTRIBUTE).getString();
+        } catch (Exception e) {
+            throw new RepositoryException(e);
+        }
+    }
+
+    public void setLanguage(String language) throws RepositoryException {
+        try {
+            getNode().getProperty(JCRDocumentBuilder.LANGUAGE_ATTRIBUTE).setValue(language);
+        } catch (Exception e) {
+            throw new RepositoryException(e);
+        }
+    }
+
+    protected Node getResourceNode() throws RepositoryException {
+        try {
+            Node resourceNode = getNode().getNode("lenya:resource");
+            if (resourceNode == null) {
+                throw new RepositoryException("Node [" + getNode().getPath()
+                        + "] doesn't have a resource child node!");
+            }
+            return resourceNode;
+        } catch (javax.jcr.RepositoryException e) {
+            throw new RepositoryException(e);
+        }
+    }
+
+    public InputStream getInputStream() throws RepositoryException {
+        try {
+            return getResourceNode().getProperty("jcr:data").getStream();
+        } catch (javax.jcr.RepositoryException e) {
+            throw new RepositoryException(e);
+        }
+    }
+
+    public OutputStream getOutputStream() throws RepositoryException {
+        return new JCROutputStream(getResourceNode());
+    }
+
+    public long getContentLength() throws RepositoryException {
+        try {
+            return getResourceNode().getProperty("jcr:data").getLength();
+        } catch (javax.jcr.RepositoryException e) {
+            throw new RepositoryException(e);
+        }
+    }
+
+    public String getMimeType() throws RepositoryException {
+        try {
+            return getResourceNode().getProperty("jcr:mimeType").getString();
+        } catch (javax.jcr.RepositoryException e) {
+            throw new RepositoryException(e);
+        }
+    }
+
+    public long getLastModified() throws RepositoryException {
+        try {
+            return getResourceNode().getProperty("jcr:lastModified").getLong();
+        } catch (javax.jcr.RepositoryException e) {
+            throw new RepositoryException(e);
+        }
+    }
+
+    /**
+     * An outputStream that will save the session upon close, and discard it upon cancel.
+     */
+    private class JCROutputStream extends ByteArrayOutputStream {
+        private boolean isClosed = false;
+
+        private final Node contentNode;
+
+        /**
+         * Ctor.
+         * @param contentNode The JCR node.
+         */
+        public JCROutputStream(Node contentNode) {
+            this.contentNode = contentNode;
+        }
+
+        public void close() throws IOException {
+            if (!isClosed) {
+                super.close();
+                this.isClosed = true;
+                try {
+                    contentNode.setProperty("jcr:data",
+                            new ByteArrayInputStream(this.toByteArray()));
+                } catch (javax.jcr.RepositoryException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        }
+
+    }
 }

Modified: lenya/trunk/src/modules/jcr/java/src/org/apache/lenya/cms/jcr/JCRDocumentBuilder.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/modules/jcr/java/src/org/apache/lenya/cms/jcr/JCRDocumentBuilder.java?rev=332599&r1=332598&r2=332599&view=diff
==============================================================================
--- lenya/trunk/src/modules/jcr/java/src/org/apache/lenya/cms/jcr/JCRDocumentBuilder.java (original)
+++ lenya/trunk/src/modules/jcr/java/src/org/apache/lenya/cms/jcr/JCRDocumentBuilder.java Fri Nov 11 09:00:00 2005
@@ -16,6 +16,59 @@
  */
 package org.apache.lenya.cms.jcr;
 
-public class JCRDocumentBuilder {
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+
+import org.apache.lenya.cms.repo.RepositoryException;
+
+/**
+ * JCR document builder.
+ */
+public class JCRDocumentBuilder implements NodeWrapperBuilder {
+
+    protected static final String LANGUAGE_ATTRIBUTE = "xml:lang";
+    protected static final String NODE_NAME = "lenya:document";
+    protected static final String RESOURCE_NODE_NAME = "lenya:resource";
+
+    private String language;
+    private JCRContentNode contentNode;
+
+    /**
+     * Ctor.
+     * @param contentNode The content node.
+     * @param language The language.
+     */
+    public JCRDocumentBuilder(JCRContentNode contentNode, String language) {
+        this.contentNode = contentNode;
+        this.language = language;
+    }
+
+    public NodeWrapper buildNode(JCRSession session, boolean create) throws RepositoryException {
+        try {
+            JCRDocument document = null;
+            Node contentNodeNode = this.contentNode.getNode();
+
+            Node documentNode = null;
+            for (NodeIterator i = contentNodeNode.getNodes(NODE_NAME); i.hasNext();) {
+                Node node = i.nextNode();
+                if (node.getProperty(LANGUAGE_ATTRIBUTE).getString().equals(this.language)) {
+                    documentNode = node;
+                }
+            }
+
+            if (documentNode == null && create) {
+                documentNode = contentNodeNode.addNode(NODE_NAME);
+                documentNode.setProperty(LANGUAGE_ATTRIBUTE, this.language);
+                documentNode.addNode(RESOURCE_NODE_NAME);
+            }
+
+            if (documentNode != null) {
+                document = new JCRDocument(documentNode);
+            }
+            return document;
+        } catch (Exception e) {
+            throw new RepositoryException(e);
+        }
+    }
 
 }

Modified: lenya/trunk/src/modules/jcr/java/src/org/apache/lenya/cms/jcr/JCRSiteNodeBuilder.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/modules/jcr/java/src/org/apache/lenya/cms/jcr/JCRSiteNodeBuilder.java?rev=332599&r1=332598&r2=332599&view=diff
==============================================================================
--- lenya/trunk/src/modules/jcr/java/src/org/apache/lenya/cms/jcr/JCRSiteNodeBuilder.java (original)
+++ lenya/trunk/src/modules/jcr/java/src/org/apache/lenya/cms/jcr/JCRSiteNodeBuilder.java Fri Nov 11 09:00:00 2005
@@ -58,7 +58,6 @@
 
     public NodeWrapper buildNode(JCRSession session, boolean create) throws RepositoryException {
         try {
-
             JCRSiteNode wrapper = null;
             Node siteNode = null;
             if (parent.hasNode(this.name)) {



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