svn commit: r632904 - in /lenya/sandbox/modules/forrest: config/ config/cocoon-xconf/ java/src/org/apache/lenya/modules/forrest/ java/test/org/apache/lenya/modules/forrest/

[email protected]
Newsgroups gmane.comp.cms.lenya.cvs
Message-ID <[email protected]>
Author: andreas
Date: Sun Mar  2 17:05:28 2008
New Revision: 632904

URL: http://svn.apache.org/viewvc?rev=632904&view=rev
Log:
Updated forrest import usecase, added usecase to update the SVN changes.

Added:
    lenya/sandbox/modules/forrest/config/cocoon-xconf/usecase-updateChanges.xconf
    lenya/sandbox/modules/forrest/java/src/org/apache/lenya/modules/forrest/Changes.java
    lenya/sandbox/modules/forrest/java/src/org/apache/lenya/modules/forrest/UpdateChanges.java
Modified:
    lenya/sandbox/modules/forrest/config/cocoon-xconf/resourcetype-forrestDocument20.xconf
    lenya/sandbox/modules/forrest/config/cocoon-xconf/resourcetype-forrestFaq20.xconf
    lenya/sandbox/modules/forrest/config/module.xml
    lenya/sandbox/modules/forrest/java/src/org/apache/lenya/modules/forrest/Importer.java
    lenya/sandbox/modules/forrest/java/test/org/apache/lenya/modules/forrest/ImportTest.java

Modified: lenya/sandbox/modules/forrest/config/cocoon-xconf/resourcetype-forrestDocument20.xconf
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/forrest/config/cocoon-xconf/resourcetype-forrestDocument20.xconf?rev=632904&r1=632903&r2=632904&view=diff
==============================================================================
--- lenya/sandbox/modules/forrest/config/cocoon-xconf/resourcetype-forrestDocument20.xconf (original)
+++ lenya/sandbox/modules/forrest/config/cocoon-xconf/resourcetype-forrestDocument20.xconf Sun Mar  2 17:05:28 2008
@@ -39,7 +39,9 @@
     <link-attribute xpath="//*/@src"/>
     <format name="xhtml" uri="cocoon://modules/forrest/xhtml.xml"/>
     <format name="webdavGET" uri="cocoon://modules/forrest/davget.xml"/>
+    <!--
     <format name="luceneIndex" uri="cocoon://modules/forrest/lucene-index"/>
+    -->
     <!-- "xslt-clean" format is used by webDAV (and other editors?) to "clean" xml content before it is validated/saved --> 
     <format name="xslt-clean" uri="fallback://lenya/modules/forrest/xslt/clean-xhtml.xsl"/>
     <format name="icon" uri="cocoon://modules/forrest/icon"/>

Modified: lenya/sandbox/modules/forrest/config/cocoon-xconf/resourcetype-forrestFaq20.xconf
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/forrest/config/cocoon-xconf/resourcetype-forrestFaq20.xconf?rev=632904&r1=632903&r2=632904&view=diff
==============================================================================
--- lenya/sandbox/modules/forrest/config/cocoon-xconf/resourcetype-forrestFaq20.xconf (original)
+++ lenya/sandbox/modules/forrest/config/cocoon-xconf/resourcetype-forrestFaq20.xconf Sun Mar  2 17:05:28 2008
@@ -42,7 +42,9 @@
     <link-attribute xpath="//*/@src"/>
     <format name="xhtml" uri="cocoon://modules/forrest/xhtml.xml"/>
     <format name="webdavGET" uri="cocoon://modules/forrest/davget.xml"/>
+    <!--
     <format name="luceneIndex" uri="cocoon://modules/forrest/lucene-index"/>
+    -->
     <!-- "xslt-clean" format is used by webDAV (and other editors?) to "clean" xml content before it is validated/saved --> 
     <format name="xslt-clean" uri="fallback://lenya/modules/forrest/xslt/clean-xhtml.xsl"/>
     <format name="icon" uri="cocoon://modules/forrest/icon"/>

Added: lenya/sandbox/modules/forrest/config/cocoon-xconf/usecase-updateChanges.xconf
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/forrest/config/cocoon-xconf/usecase-updateChanges.xconf?rev=632904&view=auto
==============================================================================
--- lenya/sandbox/modules/forrest/config/cocoon-xconf/usecase-updateChanges.xconf (added)
+++ lenya/sandbox/modules/forrest/config/cocoon-xconf/usecase-updateChanges.xconf Sun Mar  2 17:05:28 2008
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<!-- $Id: usecases-workflow-deactivate.xconf 348547 2005-11-23 20:13:01Z chestnut $ -->
+<!--
+    This file defines the publication specific use-cases
+-->
+
+<xconf xpath="/cocoon/usecases" unless="/cocoon/usecases/component-instance[@name = 'forrest.updateChanges']">
+
+  <component-instance name="forrest.updateChanges" logger="lenya.modules.forrest"
+      class="org.apache.lenya.modules.forrest.UpdateChanges">
+    <view template="modules/forrest/usecases/updateChanges.jx"/>
+  </component-instance>
+  
+</xconf>

Modified: lenya/sandbox/modules/forrest/config/module.xml
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/forrest/config/module.xml?rev=632904&r1=632903&r2=632904&view=diff
==============================================================================
--- lenya/sandbox/modules/forrest/config/module.xml (original)
+++ lenya/sandbox/modules/forrest/config/module.xml Sun Mar  2 17:05:28 2008
@@ -21,6 +21,8 @@
 <module xmlns="http://apache.org/lenya/module/1.0">
   <id>org.apache.lenya.modules.forrest</id>
   <depends module="org.apache.lenya.modules.externallinks"/>
+  <depends module="org.apache.lenya.modules.linkdocument"/>
+  <depends module="org.apache.lenya.modules.foldernode"/>
   <package>org.apache.lenya.modules</package>
   <version>0.1-dev</version>
   <name>Forrest</name>

Added: lenya/sandbox/modules/forrest/java/src/org/apache/lenya/modules/forrest/Changes.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/forrest/java/src/org/apache/lenya/modules/forrest/Changes.java?rev=632904&view=auto
==============================================================================
--- lenya/sandbox/modules/forrest/java/src/org/apache/lenya/modules/forrest/Changes.java (added)
+++ lenya/sandbox/modules/forrest/java/src/org/apache/lenya/modules/forrest/Changes.java Sun Mar  2 17:05:28 2008
@@ -0,0 +1,162 @@
+/*
+ * 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.forrest;
+
+import java.io.IOException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.avalon.framework.service.ServiceSelector;
+import org.apache.lenya.cms.metadata.MetaData;
+import org.apache.lenya.cms.metadata.MetaDataException;
+import org.apache.lenya.cms.metadata.dublincore.DublinCore;
+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.DocumentManager;
+import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.cms.publication.ResourceType;
+import org.apache.lenya.cms.site.SiteNode;
+import org.apache.lenya.cms.site.SiteStructure;
+import org.apache.lenya.util.Assert;
+import org.apache.lenya.xml.DocumentHelper;
+import org.apache.lenya.xml.NamespaceHelper;
+import org.tmatesoft.svn.core.ISVNLogEntryHandler;
+import org.tmatesoft.svn.core.SVNLogEntry;
+import org.tmatesoft.svn.core.wc.xml.SVNXMLLogHandler;
+import org.tmatesoft.svn.core.wc.xml.SVNXMLSerializer;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
+
+public class Changes {
+
+    private Document delegate;
+    private int year;
+    private int month;
+    private long lastRevision;
+
+    public Changes(Document doc) {
+        Assert.notNull(doc);
+        this.delegate = doc;
+        try {
+            String name = doc.getLink().getNode().getName();
+            String yearString = name.substring(0, 4);
+            this.year = Integer.parseInt(yearString);
+            String monthString = name.substring(4, 6);
+            this.month = Integer.parseInt(monthString);
+
+        } catch (DocumentException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public Changes(ServiceManager manager, SiteNode parent, int year, int month,
+            long lastRevision) {
+        this.year = year;
+        this.month = month;
+        this.lastRevision = lastRevision;
+
+        try {
+            SiteStructure site = parent.getStructure();
+            Publication pub = site.getPublication();
+            String language = pub.getDefaultLanguage();
+            String name = "" + this.year + this.month;
+            String path = parent.getPath() + "/" + name;
+            if (site.contains(path)) {
+                this.delegate = site.getNode(path).getLink(language).getDocument();
+            } else {
+                DocumentManager docMgr = null;
+                ServiceSelector selector = null;
+                ResourceType type = null;
+                try {
+                    selector = (ServiceSelector) manager.lookup(ResourceType.ROLE + "Selector");
+                    type = (ResourceType) selector.select("svnLog");
+                    String sampleUri = type.getSample(type.getSampleNames()[0]).getUri();
+
+                    String title = this.year + "-" + this.month;
+
+                    docMgr = (DocumentManager) manager.lookup(DocumentManager.ROLE);
+                    this.delegate = docMgr.add(pub.getFactory(), type, sampleUri, pub, site
+                            .getArea(), path, language, "xml", title, true);
+                } finally {
+                    if (docMgr != null) {
+                        manager.release(docMgr);
+                    }
+                    if (selector != null) {
+                        if (type != null) {
+                            selector.release(type);
+                        }
+                        manager.release(selector);
+                    }
+                }
+            }
+            MetaData meta = getDcTerms();
+            meta.setValue(DublinCore.TERM_HASVERSION, Long.toString(this.lastRevision));
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
+    }
+
+    /*
+     * protected void load() { org.w3c.dom.Document xml; try { xml =
+     * DocumentHelper.readDocument(this.delegate.getInputStream()); } catch (Exception e) { throw
+     * new RuntimeException(e); } NamespaceHelper helper = new NamespaceHelper("", "", xml);
+     * Element[] elements = helper.getChildren(xml.getDocumentElement(),
+     * SVNXMLLogHandler.LOGENTRY_TAG); for (int i = 0; i < elements.length; i++) { long revision =
+     * Long.parseLong(elements[i].getAttribute(SVNXMLLogHandler.REVISION_ATTR)); Element dateElement =
+     * helper.getFirstChild(elements[i], SVNXMLLogHandler.DATE_TAG); String dateString =
+     * DocumentHelper.getSimpleElementText(dateElement); Date date =
+     * 
+     * Map paths = new HashMap();
+     * 
+     * SVNLogEntry entry = new SVNLogEntry(paths, revision, author, date, message); } }
+     */
+
+    /**
+     * @return The revisions, starting with the lowest revision number. public long[] getRevisions() { }
+     */
+
+    public long getLastRevision() {
+        try {
+            MetaData meta = getDcTerms();
+            String revisionString = meta.getFirstValue(DublinCore.TERM_HASVERSION);
+            return Long.parseLong(revisionString);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
+    }
+
+    protected MetaData getDcTerms() throws MetaDataException {
+        MetaData meta = this.delegate.getMetaData(DublinCore.DCTERMS_NAMESPACE);
+        return meta;
+    }
+
+    public Document getDocument() {
+        return this.delegate;
+    }
+
+}

Modified: lenya/sandbox/modules/forrest/java/src/org/apache/lenya/modules/forrest/Importer.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/forrest/java/src/org/apache/lenya/modules/forrest/Importer.java?rev=632904&r1=632903&r2=632904&view=diff
==============================================================================
--- lenya/sandbox/modules/forrest/java/src/org/apache/lenya/modules/forrest/Importer.java (original)
+++ lenya/sandbox/modules/forrest/java/src/org/apache/lenya/modules/forrest/Importer.java Sun Mar  2 17:05:28 2008
@@ -22,9 +22,11 @@
 import java.util.Date;
 import java.util.GregorianCalendar;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.avalon.framework.container.ContainerUtil;
 import org.apache.avalon.framework.logger.AbstractLogEnabled;
@@ -46,6 +48,8 @@
 import org.apache.lenya.cms.site.SiteStructure;
 import org.apache.lenya.modules.externallinks.ExternalLinks;
 import org.apache.lenya.modules.externallinks.ExternalLinksRewriter;
+import org.apache.lenya.modules.foldernode.FolderNodeTransformer;
+import org.apache.lenya.modules.linkdocument.LinkDocument;
 import org.apache.lenya.xml.DocumentHelper;
 import org.apache.lenya.xml.NamespaceHelper;
 import org.apache.xpath.XPathAPI;
@@ -66,6 +70,26 @@
         this.manager = manager;
     }
 
+    protected static Set blockedPaths = new HashSet();
+    protected static Map changedPaths = new HashMap();
+    protected static Object pathToRemove = "-";
+
+    static {
+        blockedPaths.add("/index/changes/");
+        
+        changedPaths.put("/project-information", pathToRemove);
+        changedPaths.put("/project-information/indexpm", "/index");
+        changedPaths.put("/project-information/", "/index/");
+        changedPaths.put("/docu", pathToRemove);
+        changedPaths.put("/docu/index", "/docu");
+        changedPaths.put("/docu20", pathToRemove);
+        changedPaths.put("/docu20/index", "/docu20");
+        changedPaths.put("/docu12x", pathToRemove);
+        changedPaths.put("/docu12x/index", "/docu12x");
+        changedPaths.put("/community", pathToRemove);
+        changedPaths.put("/community/indexcom", "/community");
+    }
+
     protected static final String CONTENT_PATH = "src/documentation/content/xdocs";
     protected static final String SITE_FILE = "site.xml";
     protected static final String SITE_NAMESPACE = "http://apache.org/forrest/linkmap/1.0";
@@ -77,6 +101,13 @@
     protected static final String LANGUAGE = "en";
     protected static final String EXTENSION = "xml";
     protected static final String SITE_PROTOCOL = "site:";
+    
+    private static final int DEBUG = 0;
+    private static final int INFO = 1;
+    private static final int WARN = 2;
+    private static final int ERROR = 3;
+    private static final int FATAL = 4;
+    private static final int LOG_LEVEL = INFO;
 
     public void importSite(Area area) throws Exception {
 
@@ -94,23 +125,26 @@
         ResourceType forrestResourceType = null;
         ResourceType mediaResourceType = null;
         ResourceType faqResourceType = null;
+        ResourceType linkResourceType = null;
         DocumentManager docMgr = null;
         try {
             selector = (ServiceSelector) this.manager.lookup(ResourceType.ROLE + "Selector");
             forrestResourceType = (ResourceType) selector.select(RESOURCE_TYPE_NAME_FORREST);
             faqResourceType = (ResourceType) selector.select(RESOURCE_TYPE_NAME_FAQ);
             mediaResourceType = (ResourceType) selector.select(RESOURCE_TYPE_NAME_MEDIA);
+            linkResourceType = (ResourceType) selector.select(LinkDocument.RESOURCE_TYPE);
             docMgr = (DocumentManager) this.manager.lookup(DocumentManager.ROLE);
 
             ImportInfo info = new ImportInfo();
             info.area = area;
             info.forrestResourceType = forrestResourceType;
             info.faqResourceType = faqResourceType;
+            info.linkResourceType = linkResourceType;
             info.mediaResourceType = mediaResourceType;
             info.helper = helper;
             info.docMgr = docMgr;
             info.links = links;
-            
+
             info.externalLinks = new ExternalLinks(this.manager, area, getLogger());
             info.externalLinksRewriter = new ExternalLinksRewriter(this.manager, area, getLogger());
 
@@ -136,9 +170,13 @@
                 if (mediaResourceType != null) {
                     selector.release(mediaResourceType);
                 }
+                if (linkResourceType != null) {
+                    selector.release(linkResourceType);
+                }
                 this.manager.release(selector);
             }
         }
+        log("Done, committing session.", INFO);
     }
 
     protected void importChildren(ImportInfo info, Element element, String baseUri, String basePath)
@@ -160,47 +198,90 @@
         }
 
         String href = element.getAttribute(ATTR_HREF);
-        String title = element.getAttribute(ATTR_LABEL);
-
         String sourceUri = concatPath(baseUri, href);
 
-        if (href.startsWith("http:")) {
-            info.links.put(linkName, href);
-            /*
-             * String path = concatPath(basePath, nodeName); SiteNode node =
-             * info.area.getSite().add(path); node.setHref(href);
-             */
-        }
-        else if (info.externalLinksRewriter.matches(href)) {
-            SiteNode node = getSiteNode(info, basePath, nodeName);
-            String externalUri = info.externalLinksRewriter.rewrite(href);
-            
-            // FIXME: not supported yet
-            // node.setHref(externalUri);
-        } else if (sourceUri.endsWith(".png") || sourceUri.endsWith(".gif")) {
-            createDocument(info, info.mediaResourceType, sourceUri, basePath, nodeName, linkName,
-                    title);
+        String path = concatPath(basePath, nodeName);
+        if (changedPaths.containsKey(path)) {
+            path = (String) changedPaths.get(path);
         } else {
-            if (sourceUri.endsWith(".html")) {
-                sourceUri = sourceUri.substring(0, sourceUri.length() - ".href".length()) + ".xml";
+            String[] steps = path.split("/");
+            final String prefix = "/" + steps[1] + "/";
+            if (changedPaths.containsKey(prefix)) {
+                final String newPrefix = (String) changedPaths.get(prefix);
+                path = newPrefix + path.substring(prefix.length());
             }
-            org.w3c.dom.Document xml = null;
-            try {
-                xml = SourceUtil.readDOM(sourceUri, this.manager);
-            } catch (Exception ignore) {
+        }
+        
+        boolean blocked = false;
+        for (Iterator i = blockedPaths.iterator(); i.hasNext(); ) {
+            String prefix = (String) i.next();
+            if (path.startsWith(prefix)) {
+                log("Blocking path " + path, INFO);
+                blocked = true;
             }
+        }
 
-            if (xml == null) {
-                SiteNode node = getSiteNode(info, basePath, nodeName);
+        if (!blocked && !path.equals(pathToRemove)) {
+
+            String title = element.getAttribute(ATTR_LABEL);
+
+            log("------------------------------------------------------------------", DEBUG);
+            log("basePath: " + basePath, DEBUG);
+            log("href: " + href, DEBUG);
+            log("sourceUri: " + sourceUri, DEBUG);
+            log("baseUri: " + baseUri, DEBUG);
+            log("Target path " + basePath + "/" + linkName, DEBUG);
+
+            if (href.startsWith("http:")) {
+                log("HTTP link: " + href, DEBUG);
+                info.links.put(linkName, href);
+                String[] samples = info.linkResourceType.getSampleNames();
+                sourceUri = info.linkResourceType.getSample(samples[0]).getUri();
+                Document doc = createDocument(info, info.linkResourceType, sourceUri, path,
+                        linkName, title);
+                LinkDocument linkDoc = new LinkDocument(doc);
+                linkDoc.setHref(href);
+            } else if (info.externalLinksRewriter.matches(href)) {
+                log("External link: " + href, DEBUG);
+                String externalUri = info.externalLinksRewriter.rewrite(href);
+                Document doc = createDocument(info, info.linkResourceType, sourceUri, path,
+                        linkName, title);
+                LinkDocument linkDoc = new LinkDocument(doc);
+                linkDoc.setHref(externalUri);
+            } else if (sourceUri.endsWith(".png") || sourceUri.endsWith(".gif")) {
+                log("Image: " + sourceUri, DEBUG);
+                createDocument(info, info.mediaResourceType, sourceUri, path, linkName, title);
             } else {
-                String localName = xml.getDocumentElement().getLocalName();
-                ResourceType type = null;
-                if (localName.equals(ELEMENT_FAQS)) {
-                    type = info.faqResourceType;
-                } else {
+                log("HTML document: " + sourceUri, DEBUG);
+                if (sourceUri.endsWith(".html")) {
+                    sourceUri = sourceUri.substring(0, sourceUri.length() - ".href".length())
+                            + ".xml";
+                }
+                org.w3c.dom.Document xml = null;
+                try {
+                    xml = SourceUtil.readDOM(sourceUri, this.manager);
+                } catch (Exception ignore) {
+                }
+
+                boolean isFolderNode = (xml == null);
+
+                ResourceType type;
+                String contentSourceUri;
+                if (isFolderNode) {
+                    log("Creating folder node.", DEBUG);
                     type = info.forrestResourceType;
+                    String[] samples = type.getSampleNames();
+                    contentSourceUri = type.getSample(samples[0]).getUri();
+                } else {
+                    contentSourceUri = sourceUri;
+                    type = getResourceType(xml, info);
+                    log("Creating " + type.getName() + " document.", DEBUG);
+                }
+                Document doc = createDocument(info, type, contentSourceUri, path, linkName, title);
+                if (isFolderNode) {
+                    doc.getMetaData(FolderNodeTransformer.NAMESPACE).setValue(
+                            FolderNodeTransformer.ELEM_FOLDERNODE, Boolean.toString(true));
                 }
-                createDocument(info, type, sourceUri, basePath, nodeName, linkName, title);
             }
         }
 
@@ -210,20 +291,26 @@
 
     }
 
-    protected SiteNode getSiteNode(ImportInfo info, String basePath, String nodeName)
-            throws SiteException {
-        SiteNode node;
-        String path = concatPath(basePath, nodeName);
-        SiteStructure site = info.area.getSite();
-        if (site.contains(path)) {
-            node = site.getNode(path);
+    protected ResourceType getResourceType(org.w3c.dom.Document xml, ImportInfo info) {
+        String localName = xml.getDocumentElement().getLocalName();
+        ResourceType type;
+        if (localName.equals(ELEMENT_FAQS)) {
+            type = info.faqResourceType;
         } else {
-            node = site.add(path);
-            // TODO: add link (not supported by API yet)
+            type = info.forrestResourceType;
         }
-        return node;
+        return type;
     }
 
+    /*
+     * protected SiteNode getSiteNode(ImportInfo info, String basePath, String
+     * nodeName) throws SiteException { SiteNode node; String path =
+     * concatPath(basePath, nodeName); SiteStructure site = info.area.getSite();
+     * if (site.contains(path)) { node = site.getNode(path); } else { node =
+     * site.add(path); // TODO: add link (not supported by API yet) } return
+     * node; }
+     */
+
     protected String concatPath(String path1, String path2) {
         StringBuffer path = new StringBuffer();
         path.append(path1);
@@ -244,9 +331,8 @@
         return sample.getUri();
     }
 
-    protected void createDocument(ImportInfo info, ResourceType type, String sourceUri,
-            String basePath, String nodeName, String linkName, String title) throws Exception {
-        String path = concatPath(basePath, nodeName);
+    protected Document createDocument(ImportInfo info, ResourceType type, String sourceUri,
+            String path, String linkName, String title) throws Exception {
         DocumentFactory factory = info.area.getPublication().getFactory();
         try {
 
@@ -269,9 +355,9 @@
                         String sourceString = IOUtils.toString(source.getInputStream());
                         String docString = IOUtils.toString(doc.getInputStream());
                         if (sourceString.equals(docString)) {
-                            log(path + " is up to date (" + info.counterToString() + ")");
+                            log(path + " is up to date (" + info.counterToString() + ")", INFO);
                         } else {
-                            log("Updating " + path + " (" + info.counterToString() + ")");
+                            log("Updating " + path + " (" + info.counterToString() + ")", INFO);
                             IOUtils.write(sourceString, doc.getOutputStream());
                         }
                     } finally {
@@ -286,17 +372,20 @@
                 String extension = sourceUri.substring(lastDotIndex + 1);
                 doc = info.docMgr.add(factory, type, sourceUri, info.area.getPublication(),
                         info.area.getName(), path, LANGUAGE, extension, title, true);
-                Link link = new Link();
-                link.setUuid(doc.getUUID());
-                info.links.put(linkName, link.getUri());
                 log("Created " + extension.toUpperCase() + " document (" + info.counterToString()
-                        + ") [" + path + "]");
+                        + ") [" + path + "] from [" + sourceUri + "]", INFO);
             }
+            
+            Link link = new Link();
+            link.setUuid(doc.getUUID());
+            info.links.put(linkName, link.getUri());
+
+            return doc;
 
         } catch (Exception e) {
-            log("A problem occured:");
-            log("Path: '" + path + "'");
-            log("URI:  '" + sourceUri + "'");
+            log("A problem occured:", ERROR);
+            log("Path: '" + path + "'", ERROR);
+            log("URI:  '" + sourceUri + "'", ERROR);
             throw e;
         }
     }
@@ -305,14 +394,17 @@
         return string.replaceAll("[^a-zA-Z0-9\\-]+", "");
     }
 
-    protected void log(String message) {
-        System.out.println(message);
-        getLogger().info(message);
+    protected void log(String message, int level) {
+        if (level >= LOG_LEVEL) {
+            System.out.println(message);
+            getLogger().info(message);
+        }
     }
 
     protected class ImportInfo {
         protected int number = 0;
         protected int counter = 0;
+        protected ResourceType linkResourceType;
         protected ResourceType mediaResourceType;
         protected ResourceType forrestResourceType;
         protected ResourceType faqResourceType;
@@ -372,7 +464,7 @@
         }
         for (Iterator i = docsToConvert.iterator(); i.hasNext();) {
             Document doc = (Document) i.next();
-            log("Converting links (" + info.counterToString() + "): " + doc.getPath());
+            log("Converting links (" + info.counterToString() + "): " + doc.getPath(), INFO);
             org.w3c.dom.Document xml = DocumentHelper.readDocument(doc.getInputStream());
             convertLinks(info, xml.getDocumentElement());
             DocumentHelper.writeDocument(xml, doc.getOutputStream());
@@ -385,13 +477,13 @@
             Attr attr = (Attr) attrs.item(i);
             String value = attr.getNodeValue();
             if (value.startsWith(SITE_PROTOCOL)) {
-                log("Converting link [" + value + "]");
+                log("Converting link [" + value + "]", INFO);
                 String name = value.substring(SITE_PROTOCOL.length());
                 if (info.links.containsKey(name)) {
                     String linkUri = (String) info.links.get(name);
                     attr.setNodeValue(linkUri);
                 } else {
-                    log("No document found for link [" + value + "]");
+                    log("No document found for link [" + value + "]", WARN);
                 }
             }
         }
@@ -412,7 +504,7 @@
         for (int i = 0; i < children.length; i++) {
             String name = children[i].getLocalName();
             String uri = baseUri + children[i].getAttribute("href");
-            log("Adding external link: " + name + " -> " + uri);
+            log("Adding external link: " + name + " -> " + uri, INFO);
             info.externalLinks.setUri(name, uri);
             createExternalLinks(info, children[i], uri);
         }

Added: lenya/sandbox/modules/forrest/java/src/org/apache/lenya/modules/forrest/UpdateChanges.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/forrest/java/src/org/apache/lenya/modules/forrest/UpdateChanges.java?rev=632904&view=auto
==============================================================================
--- lenya/sandbox/modules/forrest/java/src/org/apache/lenya/modules/forrest/UpdateChanges.java (added)
+++ lenya/sandbox/modules/forrest/java/src/org/apache/lenya/modules/forrest/UpdateChanges.java Sun Mar  2 17:05:28 2008
@@ -0,0 +1,256 @@
+/*
+ * 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.forrest;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.avalon.framework.service.ServiceSelector;
+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.DocumentBuildException;
+import org.apache.lenya.cms.publication.DocumentFactory;
+import org.apache.lenya.cms.publication.DocumentManager;
+import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.cms.publication.PublicationException;
+import org.apache.lenya.cms.publication.ResourceType;
+import org.apache.lenya.cms.publication.URLInformation;
+import org.apache.lenya.cms.site.SiteException;
+import org.apache.lenya.cms.site.SiteNode;
+import org.apache.lenya.cms.site.SiteStructure;
+import org.apache.lenya.cms.usecase.AbstractUsecase;
+import org.apache.lenya.modules.foldernode.FolderNodeTransformer;
+import org.apache.lenya.modules.linkdocument.LinkDocument;
+import org.tmatesoft.svn.core.ISVNLogEntryHandler;
+import org.tmatesoft.svn.core.SVNException;
+import org.tmatesoft.svn.core.SVNLogEntry;
+import org.tmatesoft.svn.core.SVNURL;
+import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
+import org.tmatesoft.svn.core.io.SVNRepository;
+import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
+import org.tmatesoft.svn.core.wc.xml.SVNXMLLogHandler;
+import org.tmatesoft.svn.core.wc.xml.SVNXMLSerializer;
+
+/**
+ * Update the changes documents from the SVN repository log. The documents are
+ * stored at the path {@link #CHANGES_PATH}/{year}/{month}.
+ */
+public class UpdateChanges extends AbstractUsecase {
+
+    protected static final String CHANGES_PATH = "/index/changes";
+    protected static final String SVN_URL = "http://svn.apache.org/repos/asf/lenya";
+
+    protected void doExecute() throws Exception {
+        super.doExecute();
+
+        setupLibrary();
+
+        DocumentFactory factory = getDocumentFactory();
+        URLInformation url = new URLInformation(getSourceURL());
+        Publication pub = factory.getPublication(url.getPublicationId());
+
+        SiteStructure site = pub.getArea(Publication.AUTHORING_AREA).getSite();
+        SiteNode changesNode = site.getNode(CHANGES_PATH);
+
+        Document changesDoc = changesNode.getLink(pub.getDefaultLanguage()).getDocument();
+        MetaData meta = changesDoc.getMetaData(DublinCore.DCTERMS_NAMESPACE);
+        String lastRevisionString = meta.getFirstValue(DublinCore.TERM_HASVERSION);
+
+        long lastRevision = 0;
+        if (lastRevisionString != null) {
+            lastRevision = Long.parseLong(lastRevisionString);
+        }
+
+        SVNRepository repo = SVNRepositoryFactory.create(SVNURL.parseURIEncoded(SVN_URL));
+        long endRevision = repo.getLatestRevision();
+
+        LogEntryHandler handler = new LogEntryHandler(this.manager, changesNode);
+        repo.log(new String[] { "" }, lastRevision, endRevision, true, true, handler);
+        handler.stop();
+
+        meta.setValue(DublinCore.TERM_HASVERSION, Long.toString(endRevision));
+    }
+
+    /**
+     * Initializes the library to work with a repository via different
+     * protocols.
+     */
+    protected void setupLibrary() {
+        DAVRepositoryFactory.setup();
+    }
+
+    /**
+     * Log entry handler which creates a new Lenya document for each month.
+     */
+    protected static class LogEntryHandler implements ISVNLogEntryHandler {
+
+        private ServiceManager manager;
+        private SiteNode parent;
+        private Month currentMonth;
+
+        protected static class Month {
+            private int year = 0;
+            private int month = 0;
+            private Document doc;
+            private SVNXMLSerializer serializer;
+            private SVNXMLLogHandler handler;
+            private OutputStream stream;
+
+            public Month(int year, int month, Document doc) {
+                this.year = year;
+                this.month = month;
+                this.doc = doc;
+            }
+
+            public boolean contains(Date date) {
+                return this.year == date.getYear() && this.month == date.getMonth();
+            }
+
+            public void start() {
+                this.stream = this.doc.getOutputStream();
+                this.serializer = new SVNXMLSerializer(stream);
+                this.handler = new SVNXMLLogHandler(serializer);
+                this.handler.startDocument();
+            }
+
+            public void stop() {
+                this.handler.endDocument();
+                try {
+                    this.serializer.flush();
+                    this.stream.close();
+                } catch (IOException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+
+            public void handleLogEntry(SVNLogEntry entry) throws SVNException {
+                this.handler.handleLogEntry(entry);
+            }
+
+        }
+
+        public LogEntryHandler(ServiceManager manager, SiteNode parent) {
+            this.parent = parent;
+            this.manager = manager;
+        }
+
+        public void handleLogEntry(SVNLogEntry entry) throws SVNException {
+            Date date = entry.getDate();
+            try {
+                if (this.currentMonth == null || !this.currentMonth.contains(date)) {
+                    if (this.currentMonth != null) {
+                        this.currentMonth.stop();
+                    }
+                    this.currentMonth = new Month(date.getYear(), date.getMonth(),
+                            getDocument(date));
+                    this.currentMonth.start();
+                }
+                this.currentMonth.handleLogEntry(entry);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        public void stop() {
+            if (this.currentMonth != null) {
+                this.currentMonth.stop();
+            }
+        }
+
+        protected Document getDocument(Date date) throws Exception {
+            int year = date.getYear();
+            int month = date.getMonth();
+
+            String yearString = new SimpleDateFormat("yyyy").format(date);
+            String yearPath = this.parent.getPath() + "/" + yearString;
+            SiteStructure site = this.parent.getStructure();
+            if (!site.contains(yearPath)) {
+                Document doc = getDocument(yearPath, "forrestDocument20", yearString);
+                doc.getMetaData(FolderNodeTransformer.NAMESPACE).setValue(
+                        FolderNodeTransformer.ELEM_FOLDERNODE, Boolean.toString(true));
+                // SiteNode node = createNodeAtBeginning(site, yearPath);
+                // node.addLink(site.getPublication().getDefaultLanguage(),
+                // yearString);
+            }
+
+            String monthString = new SimpleDateFormat("MM").format(date);
+            return getDocument(yearPath + "/" + monthString, "svnLog", monthString);
+        }
+
+        protected Document getDocument(String path, String resourceTypeName, String title)
+                throws SiteException, ServiceException, DocumentBuildException,
+                PublicationException {
+            Document doc;
+            SiteStructure site = this.parent.getStructure();
+            Publication pub = site.getPublication();
+            String language = pub.getDefaultLanguage();
+            if (site.contains(path)) {
+                doc = site.getNode(path).getLink(language).getDocument();
+            } else {
+                DocumentManager docMgr = null;
+                ServiceSelector selector = null;
+                ResourceType type = null;
+                try {
+                    selector = (ServiceSelector) manager.lookup(ResourceType.ROLE + "Selector");
+                    type = (ResourceType) selector.select(resourceTypeName);
+                    String sampleUri = type.getSample(type.getSampleNames()[0]).getUri();
+
+                    createNodeAtBeginning(site, path);
+
+                    docMgr = (DocumentManager) manager.lookup(DocumentManager.ROLE);
+                    doc = docMgr.add(pub.getFactory(), type, sampleUri, pub, site.getArea(), path,
+                            language, "xml", title, true);
+                } finally {
+                    if (docMgr != null) {
+                        manager.release(docMgr);
+                    }
+                    if (selector != null) {
+                        if (type != null) {
+                            selector.release(type);
+                        }
+                        manager.release(selector);
+                    }
+                }
+            }
+            return doc;
+        }
+
+        protected SiteNode createNodeAtBeginning(SiteStructure site, String path)
+                throws SiteException {
+            String parentPath = path.substring(0, path.lastIndexOf("/"));
+            SiteNode parent = site.getNode(parentPath);
+            SiteNode[] children = parent.getChildren();
+            SiteNode node;
+            if (children.length > 0) {
+                String followingSiblingPath = children[0].getPath();
+                node = site.add(path, followingSiblingPath);
+            } else {
+                node = site.add(path);
+            }
+            return node;
+        }
+
+    }
+
+}

Modified: lenya/sandbox/modules/forrest/java/test/org/apache/lenya/modules/forrest/ImportTest.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/forrest/java/test/org/apache/lenya/modules/forrest/ImportTest.java?rev=632904&r1=632903&r2=632904&view=diff
==============================================================================
--- lenya/sandbox/modules/forrest/java/test/org/apache/lenya/modules/forrest/ImportTest.java (original)
+++ lenya/sandbox/modules/forrest/java/test/org/apache/lenya/modules/forrest/ImportTest.java Sun Mar  2 17:05:28 2008
@@ -17,50 +17,62 @@
  */
 package org.apache.lenya.modules.forrest;
 
-import org.apache.avalon.framework.service.ServiceException;
+import java.util.Collections;
+
 import org.apache.avalon.framework.service.ServiceSelector;
+import org.apache.lenya.ac.AccessControlException;
 import org.apache.lenya.ac.impl.AbstractAccessControlTest;
-import org.apache.lenya.cms.linking.Link;
-import org.apache.lenya.cms.linking.LinkManager;
 import org.apache.lenya.cms.metadata.MetaData;
 import org.apache.lenya.cms.metadata.dublincore.DublinCore;
 import org.apache.lenya.cms.publication.Area;
 import org.apache.lenya.cms.publication.Document;
-import org.apache.lenya.cms.publication.DocumentManager;
+import org.apache.lenya.cms.publication.DocumentBuildException;
+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.PublicationException;
 import org.apache.lenya.cms.publication.ResourceType;
+import org.apache.lenya.cms.repository.RepositoryException;
 import org.apache.lenya.cms.repository.Session;
+import org.apache.lenya.cms.site.SiteException;
 import org.apache.lenya.cms.site.SiteNode;
 import org.apache.lenya.cms.site.SiteStructure;
+import org.apache.lenya.cms.usecase.UsecaseException;
+import org.apache.lenya.cms.usecase.UsecaseInvoker;
+import org.apache.lenya.cms.workflow.WorkflowUtil;
+import org.apache.lenya.workflow.Workflowable;
 import org.apache.lenya.xml.DocumentHelper;
-import org.apache.xpath.XPathAPI;
-import org.w3c.dom.Element;
 
 /**
  * Import example content into test publication.
  */
 public class ImportTest extends AbstractAccessControlTest {
 
+    protected static final String SUBMIT_USECASE = "workflow.submit";
+    protected static final String PUBLISH_USECASE = "workflow.publish";
     protected static final String PUB_ID = "docu";
 
     /**
      * @throws Exception if an error occurs.
      */
-    public void disabled_testImport() throws Exception {
-        Session session = login("lenya");
+    public void testImport() throws Exception {
+        Session session = getFreshSession();
         Publication pub = getPublication(session, PUB_ID);
         Area area = pub.getArea("authoring");
-        
+        /*
         Importer importer = new Importer(getManager(), getLogger());
         importer.importSite(area);
         session.commit();
+*/
+        assertTrue(area.getSite().contains("/index"));
         
-        assertTrue(area.getSite().contains("/project-information"));
+        /*
+        updateChanges();
+         */
+        publish();
     }
-    
+
     public void disabled_testUpdateTitles() throws Exception {
-        Session session = login("lenya");
+        Session session = getFreshSession();
         Publication pub = getPublication(session, PUB_ID);
         Area area = pub.getArea("authoring");
         Document[] docs = area.getDocuments();
@@ -71,9 +83,9 @@
         }
         session.commit();
     }
-    
+
     public void disabled_testUpdateResourceType() throws Exception {
-        Session session = login("lenya");
+        Session session = getFreshSession();
         Publication pub = getPublication(session, PUB_ID);
         Area area = pub.getArea("authoring");
         Document[] docs = area.getDocuments();
@@ -84,14 +96,14 @@
             faqResourceType = (ResourceType) selector.select(Importer.RESOURCE_TYPE_NAME_FAQ);
             for (int i = 0; i < docs.length; i++) {
                 if (docs[i].getResourceType().getName().equals(Importer.RESOURCE_TYPE_NAME_FORREST)) {
-                    org.w3c.dom.Document xml = DocumentHelper.readDocument(docs[i].getInputStream());
+                    org.w3c.dom.Document xml = DocumentHelper
+                            .readDocument(docs[i].getInputStream());
                     if (xml.getDocumentElement().getLocalName().equals(Importer.ELEMENT_FAQS)) {
                         docs[i].setResourceType(faqResourceType);
                     }
                 }
             }
-        }
-        finally {
+        } finally {
             if (selector != null) {
                 if (faqResourceType != null) {
                     selector.release(faqResourceType);
@@ -100,70 +112,148 @@
             }
         }
         session.commit();
+        
     }
-    
+
     /**
-     * The method is temporarily disabled because some methods it relies on are not yet committed into the
-     * trunk.
+     * The method is temporarily disabled because some methods it relies on are
+     * not yet committed into the trunk.
      * 
-    public void disabled_testRemoveEmptyDocs() throws Exception {
-        Session session = login("lenya");
-        Publication pub = getPublication(session, PUB_ID);
-        Area area = pub.getArea("authoring");
-        Document[] docs = area.getDocuments();
-        DocumentManager docMgr = null;
+     * public void disabled_testRemoveEmptyDocs() throws Exception { Session
+     * session = login("lenya"); Publication pub = getPublication(session,
+     * PUB_ID); Area area = pub.getArea("authoring"); Document[] docs =
+     * area.getDocuments(); DocumentManager docMgr = null; try { docMgr =
+     * (DocumentManager) getManager().lookup(DocumentManager.ROLE); for (int i =
+     * 0; i < docs.length; i++) { System.out.println("Checking document " + (i +
+     * 1) + " of " + docs.length); SiteNode node = docs[i].getLink().getNode();
+     * if (node.getChildren().length > 0) { org.w3c.dom.Document xml =
+     * DocumentHelper.readDocument(docs[i].getInputStream()); Element p =
+     * (Element) XPathAPI.selectSingleNode(xml.getDocumentElement(), "body/p");
+     * if (p != null) { String text =
+     * DocumentHelper.getSimpleElementText(p).trim(); if (text.equals("This is a
+     * Forrest Document 2.0 sample.")) { System.out.println("Removing document " +
+     * docs[i].getUUID()); node.removeUuid(); docs[i].delete(); } } } } }
+     * finally { if (docMgr != null) { getManager().release(docMgr); } }
+     * session.commit(); }
+     */
+
+    /**
+     * The method is temporarily disabled because some methods it relies on are
+     * not yet committed into the trunk.
+     * 
+     * public void disabled_testRemoveUuids() throws Exception { Session session =
+     * login("lenya"); Publication pub = getPublication(session, PUB_ID); Area
+     * area = pub.getArea("authoring");
+     * 
+     * SiteStructure site = area.getSite(); SiteNode[] nodes = site.getNodes();
+     * for (int i = 0; i < nodes.length; i++) { System.out.println("Checking
+     * node " + i + " of " + nodes.length); String uuid = nodes[i].getUuid(); if
+     * (uuid != null && !area.contains(uuid, Importer.LANGUAGE)) {
+     * System.out.println("Removing node UUID " + uuid); nodes[i].removeUuid(); } }
+     * 
+     * session.commit(); }
+     */
+    
+    public void updateChanges() throws Exception {
+        UsecaseInvoker invoker = null;
         try {
-            docMgr = (DocumentManager) getManager().lookup(DocumentManager.ROLE);
-            for (int i = 0; i < docs.length; i++) {
-                System.out.println("Checking document " + (i + 1) + " of " + docs.length);
-                SiteNode node = docs[i].getLink().getNode();
-                if (node.getChildren().length > 0) {
-                    org.w3c.dom.Document xml = DocumentHelper.readDocument(docs[i].getInputStream());
-                    Element p = (Element) XPathAPI.selectSingleNode(xml.getDocumentElement(), "body/p");
-                    if (p != null) {
-                        String text = DocumentHelper.getSimpleElementText(p).trim();
-                        if (text.equals("This is a Forrest Document 2.0 sample.")) {
-                            System.out.println("Removing document " + docs[i].getUUID());
-                            node.removeUuid();
-                            docs[i].delete();
-                        }
-                    }
-                }
+            invoker = (UsecaseInvoker) getManager().lookup(UsecaseInvoker.ROLE);
+            String url = "/" + PUB_ID + "/authoring/index.html";
+            invoker.invoke(url, "forrest.updateChanges", Collections.EMPTY_MAP);
+        } finally {
+            if (invoker != null) {
+                getManager().release(invoker);
             }
         }
-        finally {
-            if (docMgr != null) {
-                getManager().release(docMgr);
-            }
-        }
-        session.commit();
     }
-    */
-    
-    /**
-     * The method is temporarily disabled because some methods it relies on are not yet committed into the
-     * trunk.
-     * 
-    public void disabled_testRemoveUuids() throws Exception {
-        Session session = login("lenya");
+
+    public void publish() throws Exception {
+        Session session = login("alice");
         Publication pub = getPublication(session, PUB_ID);
         Area area = pub.getArea("authoring");
-        
-        SiteStructure site = area.getSite();
-        SiteNode[] nodes = site.getNodes();
+
+        UsecaseInvoker invoker = null;
+        try {
+            invoker = (UsecaseInvoker) getManager().lookup(UsecaseInvoker.ROLE);
+
+            SiteStructure site = area.getSite();
+            SiteNode[] nodes = site.getTopLevelNodes();
+            publish(nodes, invoker);
+        } finally {
+            if (invoker != null) {
+                getManager().release(invoker);
+            }
+        }
+    }
+
+    protected void publish(SiteNode[] nodes, UsecaseInvoker invoker) throws Exception {
         for (int i = 0; i < nodes.length; i++) {
-            System.out.println("Checking node " + i + " of " + nodes.length);
-            String uuid = nodes[i].getUuid();
-            if (uuid != null && !area.contains(uuid, Importer.LANGUAGE)) {
-                System.out.println("Removing node UUID " + uuid);
-                nodes[i].removeUuid();
+            if (nodes[i].getLanguages().length == 0) {
+                System.out.println("Node " + nodes[i].getPath() + " has no document.");
+                break;
+            }
+            System.out.println("------------------------------------------------------------");
+            String lang = nodes[i].getLanguages()[0];
+            Document doc = nodes[i].getLink(lang).getDocument();
+            String url = doc.getCanonicalWebappURL();
+            
+            forceCheckIn(doc);
+            forceCheckIn(doc.getAreaVersion("live"));
+            
+            Session session = getFreshSession();
+            Document freshDoc = getFreshDocument(doc, session);
+            if (WorkflowUtil.canInvoke(getManager(), session, getLogger(), freshDoc, "edit")) {
+                System.out.println("Editing " + nodes[i].getPath());
+                WorkflowUtil.invoke(getManager(), session, getLogger(), freshDoc, "edit");
+                session.commit();
+            }
+            
+            session = getFreshSession();
+            freshDoc = getFreshDocument(doc, session);
+            if (WorkflowUtil.canInvoke(getManager(), session, getLogger(), freshDoc, "submit")) {
+                System.out.println("Submitting " + nodes[i].getPath());
+                invoker.invoke(url, SUBMIT_USECASE, Collections.EMPTY_MAP);
             }
+            
+            session = getFreshSession();
+            freshDoc = getFreshDocument(doc, session);
+            if (WorkflowUtil.canInvoke(getManager(), session, getLogger(), freshDoc, "publish")) {
+                System.out.println("Publishing " + nodes[i].getPath());
+                invoker.invoke(url, PUBLISH_USECASE, Collections.EMPTY_MAP);
+            }
+            
+            session = getFreshSession();
+            freshDoc = getFreshDocument(doc, session);
+            Workflowable newWf = WorkflowUtil.getWorkflowable(getManager(), session, getLogger(), freshDoc);
+            System.out.println("State:   " + newWf.getLatestVersion().getState());
+            System.out.println("is_live: " + newWf.getLatestVersion().getValue("is_live"));
+            assertEquals(newWf.getLatestVersion().getValue("is_live"), true);
+            
+            publish(nodes[i].getChildren(), invoker);
+        }
+    }
+
+    protected Document getFreshDocument(Document doc, Session session)
+            throws DocumentBuildException {
+        DocumentFactory newFactory = DocumentUtil.createDocumentFactory(getManager(), session);
+        Document newDoc = newFactory.get(doc.getIdentifier());
+        return newDoc;
+    }
+
+    protected Session getFreshSession() throws AccessControlException {
+        return login("lenya");
+    }
+
+    protected void forceCheckIn(Document doc) throws RepositoryException {
+        if (doc.getRepositoryNode().isCheckedOut()) {
+            doc.getRepositoryNode().forceCheckIn();
         }
-        
-        session.commit();
     }
-     */
     
+    /*
+     * protected String getUserId() { return "alice"; }
+     */
+
     public void testNothing() {
     }
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.