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/04/12 11:28:25 UTC

svn commit: r161036 - in lenya/trunk/src: java/org/apache/lenya/cms/cocoon/source/ java/org/apache/lenya/cms/editors/ java/org/apache/lenya/cms/editors/forms/ java/org/apache/lenya/cms/metadata/usecases/ java/org/apache/lenya/cms/publication/ java/org/apache/lenya/cms/publication/util/ java/org/apache/lenya/cms/repository/ java/org/apache/lenya/cms/site/ java/org/apache/lenya/cms/site/tree/ java/org/apache/lenya/cms/site/usecases/ java/org/apache/lenya/cms/usecase/ java/org/apache/lenya/cms/workflow/usecases/ webapp/WEB-INF/ webapp/lenya/pubs/default/java/src/org/apache/lenya/defaultpub/cms/usecases/

Author: andreas
Date: Tue Apr 12 02:28:20 2005
New Revision: 161036

URL: http://svn.apache.org/viewcvs?view=rev&rev=161036
Log:
added functionality to support pessimistic offline lock, fixed RCML path resolving for SourceNodes

Modified:
    lenya/trunk/src/java/org/apache/lenya/cms/cocoon/source/RepositorySource.java
    lenya/trunk/src/java/org/apache/lenya/cms/editors/EditDocument.java
    lenya/trunk/src/java/org/apache/lenya/cms/editors/forms/FormsEditor.java
    lenya/trunk/src/java/org/apache/lenya/cms/metadata/usecases/Metadata.java
    lenya/trunk/src/java/org/apache/lenya/cms/publication/DefaultDocument.java
    lenya/trunk/src/java/org/apache/lenya/cms/publication/Document.java
    lenya/trunk/src/java/org/apache/lenya/cms/publication/util/DocumentSet.java
    lenya/trunk/src/java/org/apache/lenya/cms/repository/SourceNode.java
    lenya/trunk/src/java/org/apache/lenya/cms/site/SiteStructure.java
    lenya/trunk/src/java/org/apache/lenya/cms/site/SiteUtil.java
    lenya/trunk/src/java/org/apache/lenya/cms/site/tree/DefaultSiteTree.java
    lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/ChangeLabel.java
    lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/ChangeNodeID.java
    lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/Create.java
    lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/CreateDocument.java
    lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/CreateLanguage.java
    lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/Delete.java
    lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/LinkRewriterImpl.java
    lenya/trunk/src/java/org/apache/lenya/cms/usecase/AbstractUsecase.java
    lenya/trunk/src/java/org/apache/lenya/cms/workflow/usecases/InvokeWorkflow.java
    lenya/trunk/src/webapp/WEB-INF/cocoon-xconf.xsl
    lenya/trunk/src/webapp/lenya/pubs/default/java/src/org/apache/lenya/defaultpub/cms/usecases/Deactivate.java
    lenya/trunk/src/webapp/lenya/pubs/default/java/src/org/apache/lenya/defaultpub/cms/usecases/Publish.java

Modified: lenya/trunk/src/java/org/apache/lenya/cms/cocoon/source/RepositorySource.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/cocoon/source/RepositorySource.java?view=diff&r1=161035&r2=161036
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/cocoon/source/RepositorySource.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/cocoon/source/RepositorySource.java Tue Apr 12 02:28:20 2005
@@ -86,7 +86,13 @@
         }
 
         this.node = (Node) map.get(Node.IDENTIFIABLE_TYPE, uri);
-
+    }
+    
+    /**
+     * @return The repository node which is accessed by this source.
+     */
+    public Node getNode() {
+        return this.node;
     }
 
     protected Logger getLogger() {

Modified: lenya/trunk/src/java/org/apache/lenya/cms/editors/EditDocument.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/editors/EditDocument.java?view=diff&r1=161035&r2=161036
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/editors/EditDocument.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/editors/EditDocument.java Tue Apr 12 02:28:20 2005
@@ -21,7 +21,7 @@
 import org.apache.lenya.cms.usecase.DocumentUsecase;
 import org.apache.lenya.cms.usecase.UsecaseException;
 import org.apache.lenya.cms.workflow.WorkflowManager;
-import org.apache.lenya.transaction.TransactionException;
+import org.apache.lenya.transaction.Transactionable;
 
 /**
  * Usecase to edit documents.
@@ -62,15 +62,7 @@
         }
     }
 
-    /**
-     * @see org.apache.lenya.cms.usecase.Usecase#lockInvolvedObjects()
-     */
-    public void lockInvolvedObjects() throws UsecaseException {
-        super.lockInvolvedObjects();
-        try {
-            getSourceDocument().lock();
-        } catch (TransactionException e) {
-            throw new UsecaseException(e);
-        }
+    protected Transactionable[] getObjectsToLock() throws UsecaseException {
+        return getSourceDocument().getRepositoryNodes();
     }
 }

Modified: lenya/trunk/src/java/org/apache/lenya/cms/editors/forms/FormsEditor.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/editors/forms/FormsEditor.java?view=diff&r1=161035&r2=161036
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/editors/forms/FormsEditor.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/editors/forms/FormsEditor.java Tue Apr 12 02:28:20 2005
@@ -45,7 +45,7 @@
 import org.apache.excalibur.source.SourceResolver;
 import org.apache.lenya.cms.usecase.DocumentUsecase;
 import org.apache.lenya.cms.usecase.UsecaseException;
-import org.apache.lenya.transaction.TransactionException;
+import org.apache.lenya.transaction.Transactionable;
 import org.apache.lenya.xml.DocumentHelper;
 import org.apache.lenya.xml.RelaxNG;
 import org.apache.lenya.xml.XPath;
@@ -93,15 +93,10 @@
     }
 
     /**
-     * @see org.apache.lenya.cms.usecase.Usecase#lockInvolvedObjects()
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#getObjectsToLock()
      */
-    public void lockInvolvedObjects() throws UsecaseException {
-        super.lockInvolvedObjects();
-        try {
-            getSourceDocument().lock();
-        } catch (TransactionException e) {
-            throw new UsecaseException(e);
-        }
+    protected Transactionable[] getObjectsToLock() throws UsecaseException {
+        return getSourceDocument().getRepositoryNodes();
     }
 
     /**
@@ -259,14 +254,12 @@
         for (int paramIndex = 0; paramIndex < paramNames.length; paramIndex++) {
             String pname = paramNames[paramIndex];
             getLogger().debug("Parameter: " + pname + " = " + getParameterAsString(pname));
-            System.out.println("Parameter: " + pname + " = " + getParameterAsString(pname));
 
             // Extract the xpath to edit
             if (pname.indexOf("edit[") >= 0) {
                 if (pname.endsWith("].x")) {
                     editSelect = pname.substring(5, pname.length() - 3);
                     getLogger().debug("Edit: " + editSelect);
-                    System.out.println("Edit: " + editSelect);
                 }
                 deleteParameter(pname);
             }
@@ -277,7 +270,6 @@
                 String select = pname.substring(pname.indexOf("select") + 8);
                 select = select.substring(0, select.indexOf("\""));
                 getLogger().debug("Select Node: " + select);
-                System.out.println("Select Node: " + select);
 
                 // Check if node exists
                 PrefixResolver resolver = new FormPrefixResolver(document.getDocumentElement());

Modified: lenya/trunk/src/java/org/apache/lenya/cms/metadata/usecases/Metadata.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/metadata/usecases/Metadata.java?view=diff&r1=161035&r2=161036
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/metadata/usecases/Metadata.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/metadata/usecases/Metadata.java Tue Apr 12 02:28:20 2005
@@ -19,7 +19,7 @@
 import org.apache.lenya.cms.metadata.dublincore.DublinCore;
 import org.apache.lenya.cms.site.usecases.SiteUsecase;
 import org.apache.lenya.cms.usecase.UsecaseException;
-import org.apache.lenya.transaction.TransactionException;
+import org.apache.lenya.transaction.Transactionable;
 
 /**
  * Usecase to edit metadata for a resource.
@@ -28,8 +28,9 @@
  */
 public class Metadata extends SiteUsecase {
 
-	private DublinCore dc;
-	/**
+    private DublinCore dc;
+
+    /**
      * Ctor.
      */
     public Metadata() {
@@ -37,17 +38,12 @@
     }
 
     /**
-     * @see org.apache.lenya.cms.usecase.Usecase#lockInvolvedObjects()
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#getObjectsToLock()
      */
-    public void lockInvolvedObjects() throws UsecaseException {
-        super.lockInvolvedObjects();
-        try {
-            getSourceDocument().lock();
-        } catch (TransactionException e) {
-            throw new UsecaseException(e);
-        }
+    protected Transactionable[] getObjectsToLock() throws UsecaseException {
+        return getSourceDocument().getRepositoryNodes();
     }
-    
+
     /**
      * @see org.apache.lenya.cms.usecase.AbstractUsecase#initParameters()
      */
@@ -55,33 +51,42 @@
         super.initParameters();
 
         try {
-        	this.dc = getSourceDocument().getDublinCore();
-            setParameter(DublinCore.ELEMENT_CREATOR, this.dc.getFirstValue(DublinCore.ELEMENT_CREATOR));
+            this.dc = getSourceDocument().getDublinCore();
+            setParameter(DublinCore.ELEMENT_CREATOR, this.dc
+                    .getFirstValue(DublinCore.ELEMENT_CREATOR));
             setParameter(DublinCore.ELEMENT_TITLE, this.dc.getFirstValue(DublinCore.ELEMENT_TITLE));
-            setParameter(DublinCore.ELEMENT_DESCRIPTION, this.dc.getFirstValue(DublinCore.ELEMENT_CREATOR));
-            setParameter(DublinCore.ELEMENT_SUBJECT, this.dc.getFirstValue(DublinCore.ELEMENT_SUBJECT));
-            setParameter(DublinCore.ELEMENT_PUBLISHER, this.dc.getFirstValue(DublinCore.ELEMENT_PUBLISHER));
-            setParameter(DublinCore.ELEMENT_RIGHTS, this.dc.getFirstValue(DublinCore.ELEMENT_RIGHTS));
+            setParameter(DublinCore.ELEMENT_DESCRIPTION, this.dc
+                    .getFirstValue(DublinCore.ELEMENT_CREATOR));
+            setParameter(DublinCore.ELEMENT_SUBJECT, this.dc
+                    .getFirstValue(DublinCore.ELEMENT_SUBJECT));
+            setParameter(DublinCore.ELEMENT_PUBLISHER, this.dc
+                    .getFirstValue(DublinCore.ELEMENT_PUBLISHER));
+            setParameter(DublinCore.ELEMENT_RIGHTS, this.dc
+                    .getFirstValue(DublinCore.ELEMENT_RIGHTS));
             setParameter(DublinCore.ELEMENT_TYPE, this.dc.getFirstValue(DublinCore.ELEMENT_TYPE));
             setParameter(DublinCore.ELEMENT_DATE, this.dc.getFirstValue(DublinCore.ELEMENT_DATE));
-            setParameter(DublinCore.ELEMENT_FORMAT, this.dc.getFirstValue(DublinCore.ELEMENT_FORMAT));
-            setParameter(DublinCore.ELEMENT_SOURCE, this.dc.getFirstValue(DublinCore.ELEMENT_SOURCE));
-            setParameter(DublinCore.ELEMENT_LANGUAGE, this.dc.getFirstValue(DublinCore.ELEMENT_LANGUAGE));
-            setParameter(DublinCore.ELEMENT_RELATION, this.dc.getFirstValue(DublinCore.ELEMENT_RELATION));
-            setParameter(DublinCore.ELEMENT_COVERAGE, this.dc.getFirstValue(DublinCore.ELEMENT_COVERAGE));
-        }
-        catch (Exception e) {
-        	getLogger().error("Unable to load Dublin Core metadata.", e);
-        	addErrorMessage("Unable to load Dublin Core metadata.");
+            setParameter(DublinCore.ELEMENT_FORMAT, this.dc
+                    .getFirstValue(DublinCore.ELEMENT_FORMAT));
+            setParameter(DublinCore.ELEMENT_SOURCE, this.dc
+                    .getFirstValue(DublinCore.ELEMENT_SOURCE));
+            setParameter(DublinCore.ELEMENT_LANGUAGE, this.dc
+                    .getFirstValue(DublinCore.ELEMENT_LANGUAGE));
+            setParameter(DublinCore.ELEMENT_RELATION, this.dc
+                    .getFirstValue(DublinCore.ELEMENT_RELATION));
+            setParameter(DublinCore.ELEMENT_COVERAGE, this.dc
+                    .getFirstValue(DublinCore.ELEMENT_COVERAGE));
+        } catch (Exception e) {
+            getLogger().error("Unable to load Dublin Core metadata.", e);
+            addErrorMessage("Unable to load Dublin Core metadata.");
         }
     }
-            
-     /**
+
+    /**
      * Validates the request parameters.
      * @throws UsecaseException if an error occurs.
      */
     void validate() throws UsecaseException {
-	    // do nothing
+        // do nothing
     }
 
     /**
@@ -98,7 +103,7 @@
         super.doExecute();
 
         String creator = getParameterAsString(DublinCore.ELEMENT_CREATOR);
-        String title  = getParameterAsString(DublinCore.ELEMENT_TITLE);
+        String title = getParameterAsString(DublinCore.ELEMENT_TITLE);
         String description = getParameterAsString(DublinCore.ELEMENT_DESCRIPTION);
         String subject = getParameterAsString(DublinCore.ELEMENT_SUBJECT);
         String publisher = getParameterAsString(DublinCore.ELEMENT_PUBLISHER);
@@ -118,6 +123,6 @@
      */
     public void setParameter(String name, Object value) {
         super.setParameter(name, value);
-        
+
     }
 }

Modified: lenya/trunk/src/java/org/apache/lenya/cms/publication/DefaultDocument.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/publication/DefaultDocument.java?view=diff&r1=161035&r2=161036
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/publication/DefaultDocument.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/publication/DefaultDocument.java Tue Apr 12 02:28:20 2005
@@ -28,15 +28,16 @@
 import org.apache.avalon.framework.logger.AbstractLogEnabled;
 import org.apache.avalon.framework.service.ServiceManager;
 import org.apache.avalon.framework.service.ServiceSelector;
+import org.apache.excalibur.source.SourceResolver;
+import org.apache.lenya.cms.cocoon.source.RepositorySource;
 import org.apache.lenya.cms.cocoon.source.SourceUtil;
 import org.apache.lenya.cms.metadata.dublincore.DublinCore;
 import org.apache.lenya.cms.metadata.dublincore.DublinCoreProxy;
 import org.apache.lenya.cms.publication.util.DocumentVisitor;
+import org.apache.lenya.cms.repository.Node;
 import org.apache.lenya.cms.site.SiteManager;
 import org.apache.lenya.cms.workflow.CMSHistory;
 import org.apache.lenya.cms.workflow.History;
-import org.apache.lenya.transaction.Lock;
-import org.apache.lenya.transaction.TransactionException;
 import org.apache.lenya.workflow.Situation;
 import org.apache.lenya.workflow.Version;
 import org.apache.lenya.workflow.Workflow;
@@ -467,32 +468,34 @@
     }
 
     /**
-     * @see org.apache.lenya.transaction.Lockable#lock()
+     * @see org.apache.lenya.cms.publication.Document#getRepositoryNodes()
      */
-    public void lock() throws TransactionException {
-        SourceUtil.lock(getSourceURI(), this.manager);
-        SourceUtil.lock(getHistory().getSourceURI(), this.manager);
-    }
-
-    /**
-     * @see org.apache.lenya.transaction.Lockable#getLock()
-     */
-    public Lock getLock() {
-        return null;
-    }
-
-    /**
-     * @see org.apache.lenya.transaction.Lockable#unlock()
-     */
-    public void unlock() throws TransactionException {
-        SourceUtil.unlock(getSourceURI(), this.manager);
-    }
-
-    /**
-     * @see org.apache.lenya.transaction.Lockable#isLocked()
-     */
-    public boolean isLocked() throws TransactionException {
-        return false;
+    public Node[] getRepositoryNodes() {
+        Node[] nodes = new Node[2];
+        SourceResolver resolver = null;
+        RepositorySource documentSource = null;
+        RepositorySource historySource = null;
+        try {
+            resolver = (SourceResolver) this.manager.lookup(SourceResolver.ROLE);
+            documentSource = (RepositorySource) resolver.resolveURI(getSourceURI());
+            historySource = (RepositorySource) resolver.resolveURI(getHistory().getSourceURI());
+            nodes[0] = documentSource.getNode();
+            nodes[1] = historySource.getNode();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        finally {
+            if (resolver != null) {
+                if (documentSource != null) {
+                    resolver.release(documentSource);
+                }
+                if (historySource != null) {
+                    resolver.release(historySource);
+                }
+                this.manager.release(resolver);
+            }
+        }
+        return nodes;
     }
 
 }

Modified: lenya/trunk/src/java/org/apache/lenya/cms/publication/Document.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/publication/Document.java?view=diff&r1=161035&r2=161036
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/publication/Document.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/publication/Document.java Tue Apr 12 02:28:20 2005
@@ -24,14 +24,14 @@
 
 import org.apache.lenya.cms.metadata.dublincore.DublinCore;
 import org.apache.lenya.cms.publication.util.DocumentVisitor;
+import org.apache.lenya.cms.repository.Node;
 import org.apache.lenya.transaction.Identifiable;
-import org.apache.lenya.transaction.Lockable;
 import org.apache.lenya.workflow.Workflowable;
 
 /**
  * A CMS document.
  */
-public interface Document extends Workflowable, Identifiable, Lockable {
+public interface Document extends Workflowable, Identifiable {
     
     /**
      * The document namespace URI.
@@ -195,4 +195,9 @@
      * @throws DocumentException if an error occurs.
      */
     void delete() throws DocumentException;
+    
+    /**
+     * @return The repository nodes that represent this document.
+     */
+    Node[] getRepositoryNodes();
 }

Modified: lenya/trunk/src/java/org/apache/lenya/cms/publication/util/DocumentSet.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/publication/util/DocumentSet.java?view=diff&r1=161035&r2=161036
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/publication/util/DocumentSet.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/publication/util/DocumentSet.java Tue Apr 12 02:28:20 2005
@@ -25,7 +25,6 @@
 
 import org.apache.lenya.cms.publication.Document;
 import org.apache.lenya.cms.publication.PublicationException;
-import org.apache.lenya.transaction.TransactionException;
 
 /**
  * An ordered set of documents without duplicates.
@@ -123,15 +122,4 @@
         Collections.reverse(getList());
     }
     
-    /**
-     * Locks all contained documents.
-     * @throws TransactionException if an error occurs.
-     */
-    public void lock() throws TransactionException  {
-        Document[] docs = getDocuments();
-        for (int i = 0; i < docs.length; i++) {
-            docs[i].lock();
-        }
-    }
-
 }

Modified: lenya/trunk/src/java/org/apache/lenya/cms/repository/SourceNode.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/repository/SourceNode.java?view=diff&r1=161035&r2=161036
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/repository/SourceNode.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/repository/SourceNode.java Tue Apr 12 02:28:20 2005
@@ -141,7 +141,7 @@
     protected String getRCPath() throws IOException {
         String publicationsPath = this.sourceUri.substring("lenya://lenya/pubs/".length());
         String publicationId = publicationsPath.split("/")[0];
-        String path = publicationsPath + "/" + publicationId + "/content/";
+        String path = "lenya://lenya/pubs/" + publicationId + "/content/";
         return this.sourceUri.substring(path.length());
     }
 
@@ -248,6 +248,9 @@
      * @see org.apache.lenya.transaction.Transactionable#lock()
      */
     public void lock() throws TransactionException {
+        if (isCheckedOut()) {
+            throw new TransactionException("Cannot lock [" + this + "]: node is checked out.");
+        }
         if (getLogger().isDebugEnabled()) {
             getLogger().debug("Locking [" + this + "]");
         }

Modified: lenya/trunk/src/java/org/apache/lenya/cms/site/SiteStructure.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/site/SiteStructure.java?view=diff&r1=161035&r2=161036
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/site/SiteStructure.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/site/SiteStructure.java Tue Apr 12 02:28:20 2005
@@ -16,14 +16,19 @@
  */
 package org.apache.lenya.cms.site;
 
+import org.apache.lenya.cms.repository.Node;
 import org.apache.lenya.transaction.Identifiable;
-import org.apache.lenya.transaction.Lockable;
 
 /**
  * Object to hold a site structure information.
  *
  * @version $Id:$
  */
-public interface SiteStructure extends Identifiable, Lockable {
+public interface SiteStructure extends Identifiable {
+    
+    /**
+     * @return The repository node the site structure is stored in.
+     */
+    Node getRepositoryNode();
 
 }

Modified: lenya/trunk/src/java/org/apache/lenya/cms/site/SiteUtil.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/site/SiteUtil.java?view=diff&r1=161035&r2=161036
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/site/SiteUtil.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/site/SiteUtil.java Tue Apr 12 02:28:20 2005
@@ -199,7 +199,6 @@
             DocumentSet subSite = SiteUtil.getSubSite(manager, source);
             Document[] docs = subSite.getDocuments();
             for (int i = 0; i < docs.length; i++) {
-                docs[i].lock();
                 Document target = SiteUtil.getTarget(siteManager, docs[i], targetArea, mode);
                 if (target != null) {
                     set.add(target);

Modified: lenya/trunk/src/java/org/apache/lenya/cms/site/tree/DefaultSiteTree.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/site/tree/DefaultSiteTree.java?view=diff&r1=161035&r2=161036
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/site/tree/DefaultSiteTree.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/site/tree/DefaultSiteTree.java Tue Apr 12 02:28:20 2005
@@ -27,11 +27,12 @@
 import org.apache.avalon.framework.container.ContainerUtil;
 import org.apache.avalon.framework.logger.AbstractLogEnabled;
 import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.excalibur.source.SourceResolver;
+import org.apache.lenya.cms.cocoon.source.RepositorySource;
 import org.apache.lenya.cms.cocoon.source.SourceUtil;
 import org.apache.lenya.cms.publication.Publication;
 import org.apache.lenya.cms.site.Label;
 import org.apache.lenya.cms.site.SiteException;
-import org.apache.lenya.transaction.Lock;
 import org.apache.lenya.transaction.TransactionException;
 import org.apache.lenya.xml.DocumentHelper;
 import org.apache.lenya.xml.NamespaceHelper;
@@ -523,27 +524,6 @@
     }
 
     /**
-     * @see org.apache.lenya.transaction.Lockable#lock()
-     */
-    public void lock() throws TransactionException {
-        SourceUtil.lock(this.sourceUri, this.manager);
-    }
-
-    /**
-     * @see org.apache.lenya.transaction.Lockable#unlock()
-     */
-    public void unlock() throws TransactionException {
-        SourceUtil.unlock(this.sourceUri, this.manager);
-    }
-
-    /**
-     * @see org.apache.lenya.transaction.Lockable#isLocked()
-     */
-    public boolean isLocked() throws TransactionException {
-        return false;
-    }
-
-    /**
      * @see org.apache.lenya.transaction.Identifiable#getIdentifiableType()
      */
     public String getIdentifiableType() {
@@ -551,16 +531,32 @@
     }
 
     /**
-     * @see org.apache.lenya.transaction.Lockable#getLock()
+     * @see org.apache.lenya.cms.site.tree.SiteTree#save()
      */
-    public Lock getLock() {
-        return null;
+    public void save() throws TransactionException {
     }
 
     /**
-     * @see org.apache.lenya.cms.site.tree.SiteTree#save()
+     * @see org.apache.lenya.cms.site.SiteStructure#getRepositoryNode()
      */
-    public void save() throws TransactionException {
+    public org.apache.lenya.cms.repository.Node getRepositoryNode() {
+        SourceResolver resolver = null;
+        RepositorySource source = null;
+        try {
+            resolver = (SourceResolver) this.manager.lookup(SourceResolver.ROLE);
+            source = (RepositorySource) resolver.resolveURI(this.sourceUri);
+            return source.getNode();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        finally {
+            if (resolver != null) {
+                if (source != null) {
+                    resolver.release(source);
+                }
+                this.manager.release(resolver);
+            }
+        }
     }
 
 }

Modified: lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/ChangeLabel.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/ChangeLabel.java?view=diff&r1=161035&r2=161036
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/ChangeLabel.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/ChangeLabel.java Tue Apr 12 02:28:20 2005
@@ -20,8 +20,10 @@
 import org.apache.lenya.cms.publication.Document;
 import org.apache.lenya.cms.publication.Publication;
 import org.apache.lenya.cms.site.SiteManager;
+import org.apache.lenya.cms.site.SiteStructure;
 import org.apache.lenya.cms.usecase.DocumentUsecase;
 import org.apache.lenya.cms.usecase.UsecaseException;
+import org.apache.lenya.transaction.Transactionable;
 
 /**
  * Change the label of a document.
@@ -50,18 +52,19 @@
     }
 
     /**
-     * @see org.apache.lenya.cms.usecase.Usecase#lockInvolvedObjects()
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#getObjectsToLock()
      */
-    public void lockInvolvedObjects() throws UsecaseException {
-        super.lockInvolvedObjects();
+    protected Transactionable[] getObjectsToLock() throws UsecaseException {
         SiteManager siteManager = null;
         ServiceSelector selector = null;
         try {
             Document doc = getSourceDocument();
             selector = (ServiceSelector) this.manager.lookup(SiteManager.ROLE + "Selector");
             siteManager = (SiteManager) selector.select(doc.getPublication().getSiteManagerHint());
-            siteManager.getSiteStructure(doc.getIdentityMap(), doc.getPublication(), doc.getArea())
-                    .lock();
+            SiteStructure structure = siteManager.getSiteStructure(doc.getIdentityMap(), doc
+                    .getPublication(), doc.getArea());
+            Transactionable[] objects = { structure.getRepositoryNode() };
+            return objects;
         } catch (Exception e) {
             throw new UsecaseException(e);
         } finally {

Modified: lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/ChangeNodeID.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/ChangeNodeID.java?view=diff&r1=161035&r2=161036
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/ChangeNodeID.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/ChangeNodeID.java Tue Apr 12 02:28:20 2005
@@ -16,6 +16,10 @@
  */
 package org.apache.lenya.cms.site.usecases;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
 import org.apache.avalon.framework.service.ServiceException;
 import org.apache.avalon.framework.service.ServiceSelector;
 import org.apache.lenya.cms.publication.Document;
@@ -26,9 +30,11 @@
 import org.apache.lenya.cms.publication.Publication;
 import org.apache.lenya.cms.publication.PublicationException;
 import org.apache.lenya.cms.site.SiteManager;
+import org.apache.lenya.cms.site.SiteStructure;
 import org.apache.lenya.cms.usecase.DocumentUsecase;
 import org.apache.lenya.cms.usecase.UsecaseException;
 import org.apache.lenya.transaction.TransactionException;
+import org.apache.lenya.transaction.Transactionable;
 
 /**
  * Change the node ID of a document.
@@ -51,9 +57,9 @@
     }
 
     /**
-     * @see org.apache.lenya.cms.usecase.Usecase#lockInvolvedObjects()
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#getObjectsToLock()
      */
-    public void lockInvolvedObjects() throws UsecaseException {
+    protected Transactionable[] getObjectsToLock() throws UsecaseException {
         super.lockInvolvedObjects();
 
         SiteManager siteManager = null;
@@ -62,10 +68,13 @@
             Document doc = getSourceDocument();
             selector = (ServiceSelector) this.manager.lookup(SiteManager.ROLE + "Selector");
             siteManager = (SiteManager) selector.select(doc.getPublication().getSiteManagerHint());
-            siteManager.getSiteStructure(doc.getIdentityMap(), doc.getPublication(), doc.getArea())
-                    .lock();
-            
-            lockAllLanguageVersions(doc);
+            SiteStructure structure = siteManager.getSiteStructure(doc.getIdentityMap(), doc
+                    .getPublication(), doc.getArea());
+
+            List objects = new ArrayList();
+            objects.add(structure.getRepositoryNode());
+            objects.addAll(getAllLanguageVersionNodes(doc));
+            return (Transactionable[]) objects.toArray(new Transactionable[objects.size()]);
         } catch (Exception e) {
             throw new UsecaseException(e);
         } finally {
@@ -78,11 +87,15 @@
         }
     }
 
-    protected void lockAllLanguageVersions(Document doc) throws DocumentException, TransactionException, DocumentBuildException {
+    protected List getAllLanguageVersionNodes(Document doc) throws DocumentException,
+            TransactionException, DocumentBuildException {
         String[] languages = doc.getLanguages();
+        List nodes = new ArrayList();
         for (int i = 0; i < languages.length; i++) {
-            doc.getIdentityMap().getLanguageVersion(doc, languages[i]).lock();
+            nodes.addAll(Arrays.asList(doc.getIdentityMap().getLanguageVersion(doc, languages[i])
+                    .getRepositoryNodes()));
         }
+        return nodes;
     }
 
     /**
@@ -182,7 +195,10 @@
                 Document newLanguageVersion = identityMap.get(document.getPublication(), document
                         .getArea(), newDocumentId, availableLanguages[i]);
 
-                newLanguageVersion.lock();
+                Transactionable[] nodes = newLanguageVersion.getRepositoryNodes();
+                for (int j = 0; j < nodes.length; j++) {
+                    nodes[j].lock();
+                }
                 documentManager.move(languageVersion, newLanguageVersion);
 
                 if (availableLanguages[i].equals(document.getLanguage())) {

Modified: lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/Create.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/Create.java?view=diff&r1=161035&r2=161036
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/Create.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/Create.java Tue Apr 12 02:28:20 2005
@@ -35,10 +35,13 @@
 import org.apache.lenya.cms.publication.PublicationException;
 import org.apache.lenya.cms.publication.PublicationFactory;
 import org.apache.lenya.cms.publication.URLInformation;
+import org.apache.lenya.cms.site.SiteException;
 import org.apache.lenya.cms.site.SiteManager;
 import org.apache.lenya.cms.site.SiteStructure;
+import org.apache.lenya.cms.site.SiteUtil;
 import org.apache.lenya.cms.usecase.AbstractUsecase;
 import org.apache.lenya.cms.usecase.UsecaseException;
+import org.apache.lenya.transaction.Transactionable;
 
 /**
  * Abstract superclass for usecases to create a resource.
@@ -70,29 +73,15 @@
     }
 
     /**
-     * @see org.apache.lenya.cms.usecase.Usecase#lockInvolvedObjects()
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#getObjectsToLock()
      */
-    public void lockInvolvedObjects() throws UsecaseException {
-        super.lockInvolvedObjects();
-
-        SiteManager siteManager = null;
-        ServiceSelector selector = null;
+    protected Transactionable[] getObjectsToLock() throws UsecaseException {
         try {
-            selector = (ServiceSelector) this.manager.lookup(SiteManager.ROLE + "Selector");
-            siteManager = (SiteManager) selector.select(getSourceDocument().getPublication()
-                    .getSiteManagerHint());
-            SiteStructure structure = siteManager.getSiteStructure(getSourceDocument().getIdentityMap(), getSourceDocument()
-                    .getPublication(), getSourceDocument().getArea());
-            structure.lock();
-        } catch (Exception e) {
+            SiteStructure structure = SiteUtil.getSiteStructure(this.manager, getSourceDocument());
+            Transactionable[] nodes = { structure.getRepositoryNode() };
+            return nodes;
+        } catch (SiteException e) {
             throw new UsecaseException(e);
-        } finally {
-            if (selector != null) {
-                if (siteManager != null) {
-                    selector.release(siteManager);
-                }
-                this.manager.release(selector);
-            }
         }
     }
 

Modified: lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/CreateDocument.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/CreateDocument.java?view=diff&r1=161035&r2=161036
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/CreateDocument.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/CreateDocument.java Tue Apr 12 02:28:20 2005
@@ -26,6 +26,7 @@
 import org.apache.lenya.cms.publication.DocumentType;
 import org.apache.lenya.cms.publication.DocumentTypeBuilder;
 import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.transaction.Transactionable;
 
 /**
  * Usecase to create a document.
@@ -106,7 +107,10 @@
                 area,
                 documentId,
                 language);
-        document.lock();
+        Transactionable[] nodes = document.getRepositoryNodes();
+        for (int i = 0; i < nodes.length; i++) {
+            nodes[i].lock();
+        }
 
         DocumentType documentType = DocumentTypeBuilder.buildDocumentType(documentTypeName,
                 publication);

Modified: lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/CreateLanguage.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/CreateLanguage.java?view=diff&r1=161035&r2=161036
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/CreateLanguage.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/CreateLanguage.java Tue Apr 12 02:28:20 2005
@@ -31,6 +31,7 @@
 import org.apache.lenya.cms.publication.DocumentTypeBuilder;
 import org.apache.lenya.cms.publication.DocumentTypeResolver;
 import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.transaction.Transactionable;
 
 /**
  * Usecase to create a new language version of a resource.
@@ -74,8 +75,10 @@
         String[] languages = source.getPublication().getLanguages();
         DocumentIdentityMap map = source.getIdentityMap();
         for (int i = 0; i < languages.length; i++) {
-            Document version = map.get(source.getPublication(), source.getArea(), source
-                    .getId(), languages[i]);
+            Document version = map.get(source.getPublication(),
+                    source.getArea(),
+                    source.getId(),
+                    languages[i]);
             if (!version.exists()) {
                 nonExistingLanguages.add(languages[i]);
             }
@@ -132,7 +135,10 @@
         DocumentIdentityMap map = source.getIdentityMap();
         String area = source.getArea();
         Document document = map.get(publication, area, source.getId(), language);
-        document.lock();
+        Transactionable[] nodes = document.getRepositoryNodes();
+        for (int i = 0; i < nodes.length; i++) {
+            nodes[i].lock();
+        }
 
         DocumentType documentType = DocumentTypeBuilder.buildDocumentType(documentTypeName,
                 publication);

Modified: lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/Delete.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/Delete.java?view=diff&r1=161035&r2=161036
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/Delete.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/Delete.java Tue Apr 12 02:28:20 2005
@@ -16,6 +16,10 @@
  */
 package org.apache.lenya.cms.site.usecases;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
 import org.apache.lenya.cms.publication.Document;
 import org.apache.lenya.cms.publication.DocumentIdentityMap;
 import org.apache.lenya.cms.publication.DocumentManager;
@@ -24,6 +28,7 @@
 import org.apache.lenya.cms.site.SiteUtil;
 import org.apache.lenya.cms.usecase.DocumentUsecase;
 import org.apache.lenya.cms.usecase.UsecaseException;
+import org.apache.lenya.transaction.Transactionable;
 
 /**
  * Delete a document and all its descendants, including all language versions. The documents are
@@ -67,27 +72,33 @@
      * <li>the document area's site structure</li>
      * <li>the trash site structure</li>
      * </ul>
-     * @see org.apache.lenya.cms.usecase.Usecase#lockInvolvedObjects()
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#getObjectsToLock()
      */
-    public void lockInvolvedObjects() throws UsecaseException {
-        super.lockInvolvedObjects();
-
+    protected Transactionable[] getObjectsToLock() throws UsecaseException {
+        List nodes = new ArrayList();
         Document doc = getSourceDocument();
         try {
             DocumentSet sources = SiteUtil.getSubSite(this.manager, doc);
-            sources.lock();
+            Document[] docs = sources.getDocuments();
+            for (int i = 0; i < docs.length; i++) {
+                nodes.addAll(Arrays.asList(docs[i].getRepositoryNodes()));
+            }
 
             DocumentSet targets = SiteUtil.getTransferedSubSite(this.manager,
                     doc,
                     Publication.TRASH_AREA,
                     SiteUtil.MODE_CHANGE_ID);
-            targets.lock();
+            docs = targets.getDocuments();
+            for (int i = 0; i < docs.length; i++) {
+                nodes.addAll(Arrays.asList(docs[i].getRepositoryNodes()));
+            }
 
-            SiteUtil.getSiteStructure(this.manager, doc).lock();
-            SiteUtil.getSiteStructure(this.manager, targets.getDocuments()[0]).lock();
+            nodes.add(SiteUtil.getSiteStructure(this.manager, doc).getRepositoryNode());
+            nodes.add(SiteUtil.getSiteStructure(this.manager, targets.getDocuments()[0]).getRepositoryNode());
         } catch (Exception e) {
             throw new UsecaseException(e);
         }
+        return (Transactionable[]) nodes.toArray(new Transactionable[nodes.size()]);
     }
 
     /**

Modified: lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/LinkRewriterImpl.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/LinkRewriterImpl.java?view=diff&r1=161035&r2=161036
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/LinkRewriterImpl.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/site/usecases/LinkRewriterImpl.java Tue Apr 12 02:28:20 2005
@@ -37,6 +37,7 @@
 import org.apache.lenya.cms.publication.DocumentTypeResolver;
 import org.apache.lenya.cms.publication.Publication;
 import org.apache.lenya.cms.site.SiteManager;
+import org.apache.lenya.transaction.Transactionable;
 import org.apache.xpath.XPathAPI;
 import org.w3c.dom.Attr;
 import org.w3c.dom.Node;
@@ -142,7 +143,10 @@
                         }
 
                         if (linksRewritten) {
-                            examinedDocument.lock();
+                            Transactionable nodes[] = examinedDocument.getRepositoryNodes();
+                            for (int i = 0; i < nodes.length; i++) {
+                                nodes[i].lock();
+                            }
                             SourceUtil.writeDOM(xmlDocument, examinedDocument.getSourceURI(), this.manager);
                         }
 

Modified: lenya/trunk/src/java/org/apache/lenya/cms/usecase/AbstractUsecase.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/usecase/AbstractUsecase.java?view=diff&r1=161035&r2=161036
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/usecase/AbstractUsecase.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/usecase/AbstractUsecase.java Tue Apr 12 02:28:20 2005
@@ -36,6 +36,8 @@
 import org.apache.lenya.cms.publication.DocumentIdentityMap;
 import org.apache.lenya.transaction.AbstractOperation;
 import org.apache.lenya.transaction.LockException;
+import org.apache.lenya.transaction.TransactionException;
+import org.apache.lenya.transaction.Transactionable;
 
 /**
  * Abstract usecase implementation.
@@ -479,28 +481,51 @@
     public UsecaseView getView() {
         return this.view;
     }
-    
+
     protected static final String ELEMENT_PARAMETER = "parameter";
     protected static final String ATTRIBUTE_NAME = "name";
     protected static final String ATTRIBUTE_VALUE = "value";
+    protected static final String ELEMENT_VIEW = "view";
+    protected static final String ELEMENT_TRANSACTION = "transaction";
+    protected static final String ATTRIBUTE_POLICY = "policy";
+    protected static final String VALUE_OPTIMISTIC = "optimistic";
+    protected static final String VALUE_PESSIMISTIC = "pessimistic";
+
+    private boolean isOptimistic = true;
+
+    /**
+     * @return <code>true</code> if the transaction policy is optimistic offline lock,
+     *         <code>false</code> if it is pessimistic offline lock.
+     */
+    protected boolean isOptimistic() {
+        return this.isOptimistic;
+    }
 
     /**
      * @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration)
      */
     public void configure(Configuration config) throws ConfigurationException {
-        
+
         Configuration[] parameterConfigs = config.getChildren(ELEMENT_PARAMETER);
         for (int i = 0; i < parameterConfigs.length; i++) {
             String name = parameterConfigs[i].getAttribute(ATTRIBUTE_NAME);
             String value = parameterConfigs[i].getAttribute(ATTRIBUTE_VALUE);
             setParameter(name, value);
         }
-        
-        Configuration viewConfig = config.getChild("view", false);
+
+        Configuration viewConfig = config.getChild(ELEMENT_VIEW, false);
         if (viewConfig != null) {
             this.view = new UsecaseView();
             view.configure(viewConfig);
         }
+
+        Configuration transactionConfig = config.getChild(ELEMENT_TRANSACTION, false);
+        if (transactionConfig != null) {
+            String policy = transactionConfig.getAttribute(ATTRIBUTE_POLICY);
+            if (policy.equals(VALUE_PESSIMISTIC)) {
+                this.isOptimistic = false;
+            }
+        }
     }
 
     /**
@@ -511,9 +536,42 @@
     }
 
     /**
+     * @return The objects that could be changed during the usecase.
+     * @throws UsecaseException if an error occurs.
+     */
+    protected Transactionable[] getObjectsToLock() throws UsecaseException {
+        return new Transactionable[0];
+    }
+
+    /**
      * @see org.apache.lenya.cms.usecase.Usecase#lockInvolvedObjects()
      */
-    public void lockInvolvedObjects() throws UsecaseException {
+    public final void lockInvolvedObjects() throws UsecaseException {
+        try {
+            Transactionable[] objects = getObjectsToLock();
+            boolean canExecute = true;
+
+            for (int i = 0; i < objects.length; i++) {
+                if (objects[i].isCheckedOut()) {
+                    canExecute = false;
+                }
+            }
+
+            if (canExecute) {
+                for (int i = 0; i < objects.length; i++) {
+                    objects[i].lock();
+                    if (!isOptimistic()) {
+                        objects[i].checkout();
+                    }
+                }
+            } else {
+                addErrorMessage("The operation cannot be executed because one ore more of the "
+                        + "involved objects are checked out.");
+            }
+
+        } catch (TransactionException e) {
+            throw new UsecaseException(e);
+        }
     }
 
 }

Modified: lenya/trunk/src/java/org/apache/lenya/cms/workflow/usecases/InvokeWorkflow.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/workflow/usecases/InvokeWorkflow.java?view=diff&r1=161035&r2=161036
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/workflow/usecases/InvokeWorkflow.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/workflow/usecases/InvokeWorkflow.java Tue Apr 12 02:28:20 2005
@@ -22,18 +22,19 @@
 import org.apache.lenya.cms.usecase.DocumentUsecase;
 import org.apache.lenya.cms.usecase.UsecaseException;
 import org.apache.lenya.cms.workflow.WorkflowManager;
-import org.apache.lenya.transaction.TransactionException;
+import org.apache.lenya.transaction.Transactionable;
 
 /**
- * Invoke a workflow event on the current document. The event is obtained from
- * the configuration in <code>cocoon.xconf</code>:
- * <code>
+ * Invoke a workflow event on the current document. The event is obtained from the configuration in
+ * <code>cocoon.xconf</code>:<code>
  * <pre>
- *   &lt;component-instance name="default/workflow.submit"
- *                       logger="lenya.usecases.workflow"
- *                       class="org.apache.lenya.cms.workflow.usecases.InvokeWorkflow"&gt;
- *     &lt;event id="submit"/&gt;
- *   &lt;/component-instance&gt;
+ * 
+ *    &lt;component-instance name=&quot;default/workflow.submit&quot;
+ *                        logger=&quot;lenya.usecases.workflow&quot;
+ *                        class=&quot;org.apache.lenya.cms.workflow.usecases.InvokeWorkflow&quot;&gt;
+ *      &lt;event id=&quot;submit&quot;/&gt;
+ *    &lt;/component-instance&gt;
+ *  
  * </pre>
  * </code>
  * 
@@ -75,17 +76,12 @@
     }
 
     /**
-     * @see org.apache.lenya.cms.usecase.Usecase#lockInvolvedObjects()
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#getObjectsToLock()
      */
-    public void lockInvolvedObjects() throws UsecaseException {
-        super.lockInvolvedObjects();
-        try {
-            getSourceDocument().lock();
-        } catch (TransactionException e) {
-            throw new UsecaseException(e);
-        }
+    protected Transactionable[] getObjectsToLock() throws UsecaseException {
+        return getSourceDocument().getRepositoryNodes();
     }
-    
+
     /**
      * @see org.apache.lenya.cms.usecase.AbstractUsecase#doExecute()
      */
@@ -102,7 +98,7 @@
             }
         }
     }
-    
+
     protected static final String ELEMENT_EVENT = "event";
     protected static final String ATTRIBUTE_ID = "id";
 

Modified: lenya/trunk/src/webapp/WEB-INF/cocoon-xconf.xsl
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/webapp/WEB-INF/cocoon-xconf.xsl?view=diff&r1=161035&r2=161036
==============================================================================
--- lenya/trunk/src/webapp/WEB-INF/cocoon-xconf.xsl (original)
+++ lenya/trunk/src/webapp/WEB-INF/cocoon-xconf.xsl Tue Apr 12 02:28:20 2005
@@ -419,6 +419,7 @@
     </component-instance>
     <component-instance name="edit.forms" logger="lenya.publication"
                         class="org.apache.lenya.cms.editors.forms.FormsEditor">
+      <transaction policy="pessimistic"/>
       <view template="edit/forms" menu="false">
         <parameter name="formUri" value="cocoon://core/edit/form.xml"/>
       </view>

Modified: lenya/trunk/src/webapp/lenya/pubs/default/java/src/org/apache/lenya/defaultpub/cms/usecases/Deactivate.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/webapp/lenya/pubs/default/java/src/org/apache/lenya/defaultpub/cms/usecases/Deactivate.java?view=diff&r1=161035&r2=161036
==============================================================================
--- lenya/trunk/src/webapp/lenya/pubs/default/java/src/org/apache/lenya/defaultpub/cms/usecases/Deactivate.java (original)
+++ lenya/trunk/src/webapp/lenya/pubs/default/java/src/org/apache/lenya/defaultpub/cms/usecases/Deactivate.java Tue Apr 12 02:28:20 2005
@@ -16,6 +16,10 @@
  */
 package org.apache.lenya.defaultpub.cms.usecases;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
 import org.apache.avalon.framework.service.ServiceException;
 import org.apache.avalon.framework.service.ServiceSelector;
 import org.apache.lenya.cms.publication.Document;
@@ -30,6 +34,7 @@
 import org.apache.lenya.cms.usecase.DocumentUsecase;
 import org.apache.lenya.cms.usecase.UsecaseException;
 import org.apache.lenya.cms.workflow.WorkflowManager;
+import org.apache.lenya.transaction.Transactionable;
 import org.apache.lenya.workflow.WorkflowException;
 
 /**
@@ -85,23 +90,24 @@
     }
 
     /**
-     * @see org.apache.lenya.cms.usecase.Usecase#lockInvolvedObjects()
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#getObjectsToLock()
      */
-    public void lockInvolvedObjects() throws UsecaseException {
-        super.lockInvolvedObjects();
-
+    protected Transactionable[] getObjectsToLock() throws UsecaseException {
         try {
+            List nodes = new ArrayList();
             Document doc = getSourceDocument();
             Document liveVersion = doc.getIdentityMap().getAreaVersion(doc, Publication.LIVE_AREA);
             DocumentSet set = getInvolvedDocuments(liveVersion);
             Document[] documents = set.getDocuments();
             for (int i = 0; i < documents.length; i++) {
-                documents[i].lock();
+                nodes.addAll(Arrays.asList(documents[i].getRepositoryNodes()));
             }
 
-            SiteUtil.getSiteStructure(this.manager, doc.getIdentityMap(),
+            nodes.add(SiteUtil.getSiteStructure(this.manager,
+                    doc.getIdentityMap(),
                     doc.getPublication(),
-                    Publication.LIVE_AREA).lock();
+                    Publication.LIVE_AREA).getRepositoryNode());
+            return (Transactionable[]) nodes.toArray(new Transactionable[nodes.size()]);
 
         } catch (Exception e) {
             throw new UsecaseException(e);

Modified: lenya/trunk/src/webapp/lenya/pubs/default/java/src/org/apache/lenya/defaultpub/cms/usecases/Publish.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/webapp/lenya/pubs/default/java/src/org/apache/lenya/defaultpub/cms/usecases/Publish.java?view=diff&r1=161035&r2=161036
==============================================================================
--- lenya/trunk/src/webapp/lenya/pubs/default/java/src/org/apache/lenya/defaultpub/cms/usecases/Publish.java (original)
+++ lenya/trunk/src/webapp/lenya/pubs/default/java/src/org/apache/lenya/defaultpub/cms/usecases/Publish.java Tue Apr 12 02:28:20 2005
@@ -20,6 +20,7 @@
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.GregorianCalendar;
 import java.util.List;
@@ -38,6 +39,7 @@
 import org.apache.lenya.cms.usecase.UsecaseException;
 import org.apache.lenya.cms.usecase.scheduling.UsecaseScheduler;
 import org.apache.lenya.cms.workflow.WorkflowManager;
+import org.apache.lenya.transaction.Transactionable;
 import org.apache.lenya.workflow.WorkflowException;
 
 /**
@@ -65,26 +67,26 @@
     }
 
     /**
-     * @see org.apache.lenya.cms.usecase.Usecase#lockInvolvedObjects()
+     * @see org.apache.lenya.cms.usecase.AbstractUsecase#getObjectsToLock()
      */
-    public void lockInvolvedObjects() throws UsecaseException {
-        super.lockInvolvedObjects();
+    protected Transactionable[] getObjectsToLock() throws UsecaseException {
 
         try {
+            List nodes = new ArrayList();
             Document doc = getSourceDocument();
             DocumentSet set = getInvolvedDocuments(doc);
             Document[] documents = set.getDocuments();
             for (int i = 0; i < documents.length; i++) {
                 Document liveVersion = documents[i].getIdentityMap().getAreaVersion(documents[i],
                         Publication.LIVE_AREA);
-                liveVersion.lock();
+                nodes.addAll(Arrays.asList(liveVersion.getRepositoryNodes()));
             }
 
-            SiteUtil.getSiteStructure(this.manager,
+            nodes.add(SiteUtil.getSiteStructure(this.manager,
                     doc.getIdentityMap(),
                     doc.getPublication(),
-                    Publication.LIVE_AREA).lock();
-
+                    Publication.LIVE_AREA).getRepositoryNode());
+            return (Transactionable[]) nodes.toArray(new Transactionable[nodes.size()]);
         } catch (Exception e) {
             throw new UsecaseException(e);
         }



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