svn commit: r560832 - in /lenya/trunk/src/modules-core/sitemanagement: java/src/org/apache/lenya/cms/site/usecases/Revisions.java resources/i18n/cmsui.xml resources/i18n/cmsui_de.xml usecases/tab/revisions.jx

[email protected]
Newsgroups gmane.comp.cms.lenya.cvs
Message-ID <[email protected]>
Author: nettings
Date: Sun Jul 29 16:13:44 2007
New Revision: 560832

URL: http://svn.apache.org/viewvc?view=rev&rev=560832
Log:
disable rollback buttons when the workflow event cannot be invoked
this fixes http://issues.apache.org/bugzilla/show_bug.cgi?id=42973.

can somebody with insight into our workflowables please review
the java part?

one issue: in order to produce meaningful error messages, the view now
has knowledge about the "review" state... which is a little sad since otherwise
workflow transitions are fully configurable per publication.
solutions welcome.


Modified:
    lenya/trunk/src/modules-core/sitemanagement/java/src/org/apache/lenya/cms/site/usecases/Revisions.java
    lenya/trunk/src/modules-core/sitemanagement/resources/i18n/cmsui.xml
    lenya/trunk/src/modules-core/sitemanagement/resources/i18n/cmsui_de.xml
    lenya/trunk/src/modules-core/sitemanagement/usecases/tab/revisions.jx

Modified: lenya/trunk/src/modules-core/sitemanagement/java/src/org/apache/lenya/cms/site/usecases/Revisions.java
URL: http://svn.apache.org/viewvc/lenya/trunk/src/modules-core/sitemanagement/java/src/org/apache/lenya/cms/site/usecases/Revisions.java?view=diff&rev=560832&r1=560831&r2=560832
==============================================================================
--- lenya/trunk/src/modules-core/sitemanagement/java/src/org/apache/lenya/cms/site/usecases/Revisions.java (original)
+++ lenya/trunk/src/modules-core/sitemanagement/java/src/org/apache/lenya/cms/site/usecases/Revisions.java Sun Jul 29 16:13:44 2007
@@ -19,7 +19,10 @@
 
 import java.util.Vector;
 
+import org.apache.lenya.cms.publication.Document;
 import org.apache.lenya.cms.rc.RCML;
+import org.apache.lenya.cms.workflow.WorkflowUtil;
+import org.apache.lenya.workflow.WorkflowException;
 
 /**
  * Usecase to display revisions of a resource.
@@ -30,16 +33,18 @@
 
     private RCML rcml = null;
 
+    public static final String WORKFLOW_EVENT_EDIT = "edit";
+
     /**
      * @see org.apache.lenya.cms.usecase.AbstractUsecase#initParameters() TODO
      *      filter out checkin entries
      */
     protected void initParameters() {
         super.initParameters();
-        
-        if (getSourceDocument() != null) {
+        Document sourceDoc = getSourceDocument();
+        if (sourceDoc != null) {
             try {
-                this.rcml = getSourceDocument().getRepositoryNode().getRcml();
+                this.rcml = sourceDoc.getRepositoryNode().getRcml();
             } catch (final Exception e) {
                 throw new RuntimeException(e);
             }
@@ -51,7 +56,68 @@
                 throw new RuntimeException(e);
             }
             setParameter("entries", entries);
+           
+            Boolean canRollback;
+            try { 
+                canRollback = new Boolean(WorkflowUtil.canInvoke(
+                    this.manager, 
+                    getDocumentFactory().getSession(),
+                    getLogger(),
+                    sourceDoc,
+                    WORKFLOW_EVENT_EDIT));
+            } catch (final Exception e) {
+                throw new RuntimeException(e);
+            }
+            setParameter("canRollback", canRollback);
+
+            String workflowState;
+            try {
+                // looks like this throws a null pointer exception
+                // when a document has never been edited :(
+                // guess this should be fixed elsewhere. for now
+                // let's abuse the exception handler.
+                workflowState = WorkflowUtil.getWorkflowable(
+                    this.manager, 
+                    getDocumentFactory().getSession(),
+                    getLogger(),
+                    sourceDoc
+                ).getLatestVersion().getState();
+                setParameter("workflowState", workflowState);
+            } catch (final Exception e) {
+                setParameter("workflowState", ""); //FIXME: should return Workflow.getInitialState(). But then again, there should not be an NPÈ anyways...
+                //throw new RuntimeException(e);
+            }
+            
+/*
+            // since we need both state and canInvoke, we could deal with the avalon
+            // component ourselves rather than using WorkflowUtil - saves one
+            // service manager lookup.
+            // problem is that DocumentWorkflowable is not public and Workflowable is abstract :(
+
+            WorkflowManager wfManager = null;
+            String workflowState;
+            Boolean canRollback;
+            try {
+                wfManager = (WorkflowManager) this.manager.lookup(WorkflowManager.ROLE);
+                Workflowable workflowable = new DocumentWorkflowable(
+                    this.manager, 
+                    getDocumentFactory().getSession(),
+                    sourceDoc,
+                    getLogger()
+                );
+                workflowState = workflowable.getLatestVersion().getState();
+                canRollback = new Boolean(wfManager.canInvoke(workflowable, WORKFLOW_EVENT_EDIT));
+            } catch (ServiceException e) {
+                throw new RuntimeException(e);
+            } finally {
+                if (wfManager != null) {
+                    manager.release(wfManager);
+                }
+            }
+            setParameter("workflowState", workflowState);
+            setParameter("canRollback", canRollback);
+*/
+
         }
     }
-
-}
\ No newline at end of file
+}

Modified: lenya/trunk/src/modules-core/sitemanagement/resources/i18n/cmsui.xml
URL: http://svn.apache.org/viewvc/lenya/trunk/src/modules-core/sitemanagement/resources/i18n/cmsui.xml?view=diff&rev=560832&r1=560831&r2=560832
==============================================================================
--- lenya/trunk/src/modules-core/sitemanagement/resources/i18n/cmsui.xml (original)
+++ lenya/trunk/src/modules-core/sitemanagement/resources/i18n/cmsui.xml Sun Jul 29 16:13:44 2007
@@ -59,5 +59,15 @@
   <message key="Resource Type">Resource Type</message>
   <message key="Mime Type">Mime Type</message>
   <message key="Document Size">Document Size</message>
-  
+  <message key="no-rollback">Rollback is disabled.</message>
+  <message key="workflow-state">Workflow state is "{0}".</message>
+  <message key="view-revision-in-new-window">view revision in new window</message>  
+  <message key="view-revision">View revision</message>
+  <message key="is-current-version">(is current)</message>
+  <message key="rollback">Roll back</message>
+  <message key="rollback-ok">roll back to this version</message>
+  <message key="no-rollback-in-review">Rollback disabled. Document is in
+  review state.</message>
+  <message key="no-rollback-no-privileges">Rollback disabled. You do not
+  have sufficient privileges.</message>
 </catalogue>

Modified: lenya/trunk/src/modules-core/sitemanagement/resources/i18n/cmsui_de.xml
URL: http://svn.apache.org/viewvc/lenya/trunk/src/modules-core/sitemanagement/resources/i18n/cmsui_de.xml?view=diff&rev=560832&r1=560831&r2=560832
==============================================================================
--- lenya/trunk/src/modules-core/sitemanagement/resources/i18n/cmsui_de.xml (original)
+++ lenya/trunk/src/modules-core/sitemanagement/resources/i18n/cmsui_de.xml Sun Jul 29 16:13:44 2007
@@ -59,6 +59,16 @@
   <message key="Resource Type">Ressourcen-Typ</message>
   <message key="Mime Type">Mime-Type</message>
   <message key="Document Size">Größe des Dokuments</message>
-  
+  <message key="no-rollback">Rollback ist deaktiviert.</message>
+  <message key="workflow-state">Das Dokument ist im Arbeitsschritt "{0}".</message>
+  <message key="view-revision-in-new-window">Version in neuem Fenster ansehen</message>
+  <message key="view-revision">Version ansehen</message>
+  <message key="is-current-version">(aktuell)</message>
+  <message key="rollback">Wiederherstellen</message>
+  <message key="rollback-ok">diese Version wiederherstellen</message>
+  <message key="no-rollback-in-review">Im Arbeitsschritt "Freigabe" ist
+  keine Wiederherstellung möglich.</message>
+  <message key="no-rollback-no-privileges">Keine ausreichenden Rechte zum Wiederherstellen.</message>
+                   
 </catalogue>
 

Modified: lenya/trunk/src/modules-core/sitemanagement/usecases/tab/revisions.jx
URL: http://svn.apache.org/viewvc/lenya/trunk/src/modules-core/sitemanagement/usecases/tab/revisions.jx?view=diff&rev=560832&r1=560831&r2=560832
==============================================================================
--- lenya/trunk/src/modules-core/sitemanagement/usecases/tab/revisions.jx (original)
+++ lenya/trunk/src/modules-core/sitemanagement/usecases/tab/revisions.jx Sun Jul 29 16:13:44 2007
@@ -24,11 +24,29 @@
            xmlns:i18n="http://apache.org/cocoon/i18n/2.1" >
 
   <jx:import uri="fallback://lenya/modules/sitemanagement/usecases/tab/head.jx"/>
+
+  <jx:choose>
+    <jx:when test="${usecase.getParameter('canRollback') == 'true'}">
+      <jx:set var="rollbackMessage" value="rollback-ok"/>
+    </jx:when>
+    <jx:otherwise>
+      <jx:choose>
+        <jx:when test="${usecase.getParameter('workflowState') == 'review'}">
+          <jx:set var="rollbackMessage" value="no-rollback-in-review"/>
+        </jx:when>
+        <jx:otherwise>
+          <jx:set var="rollbackMessage" value="no-rollback-no-privileges"/>
+        </jx:otherwise>
+      </jx:choose>
+    </jx:otherwise>
+  </jx:choose>
+
   <page:body>
     <jx:import uri="fallback://lenya/modules/sitemanagement/usecases/tab/sitetree.jx"/>
     <jx:import uri="fallback://lenya/modules/usecase/templates/tabs.jx"/>
     <div id="contentblock1" class="lenya-tab-sitetree">
       <h1><i18n:text>Revisions</i18n:text></h1>
+    <form name="revisions">
     <table class="lenya-table-list-noborder">
       <tr>
         <th><i18n:text>No.</i18n:text></th>
@@ -37,29 +55,76 @@
         <th><i18n:text>Actions</i18n:text></th>
       </tr>
       <jx:set var="count" value="${usecase.getParameter('entries').size()}"/>
+<!--
       <jx:forEach var="item" items="${usecase.getParameter('entries')}" end="0">
         <tr>
-          <td><jx:out value="${item.version}"/></td>
+          <td><input type="button" disabled="disabled" value="${item.version}"/></td>
           <td align="right"><jx:formatDate value="${item.time}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
           <td><jx:out value="${item.identity}"/></td>
           <td><i18n:text>Current Version</i18n:text></td>
         </tr>
       </jx:forEach>
-      <jx:forEach var="item" items="${usecase.getParameter('entries')}" begin="1">
+-->
+      <jx:set var="isFirstItem" value="true"/>
+      <jx:forEach var="item" items="${usecase.getParameter('entries')}" begin="0">
         <tr>
           <td align="right">
-            <a href="?lenya.revision=${item.version}" target="_blank"><jx:out value="${item.version}"/></a>
+            <input 
+               type="button" 
+               i18n:attr="title" 
+               onclick="window.open('?lenya.revision=${item.version}','Lenya_ViewRevision','menubar=no,addressbar=no,toolbar=no,statusbar=no');" 
+               title="view-revision-in-new-window"
+               value="${item.version}"
+            />
           </td>
           <td align="right"><jx:formatDate value="${item.time}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
           <td><jx:out value="${item.identity}"/></td>
           <td>
-            <a href="?lenya.usecase=sitemanagement.rollback&amp;rollbackTime=${item.time}">
-              <i18n:text>Rollback to this version</i18n:text>
-            </a>
+            <input 
+               type="button" 
+               i18n:attr="value title" 
+               onclick="window.open('?lenya.revision=${item.version}','Lenya_ViewRevision','menubar=no,addressbar=no,toolbar=no,statusbar=no');" 
+               title="view-revision-in-new-window"
+               value="view-revision"
+            />
+            <jx:choose>
+              <jx:when test="${isFirstItem == 'true'}">
+                <jx:set var="isFirstItem" value="false"/>
+                <i18n:text key="is-current-version"/>
+              </jx:when>
+              <jx:when test="${usecase.getParameter('canRollback') == 'true'}">
+                &#160;
+                <input 
+                  type="button" 
+                  i18n:attr="value title"
+                  title="${rollbackMessage}" 
+                  onclick="?lenya.usecase=sitemanagement.rollback&amp;rollbackTime=${item.time}" 
+                  value="rollback"
+                />
+              </jx:when>
+              <jx:otherwise>
+                <input 
+                  type="button" 
+                  i18n:attr="value title"
+                  title="${rollbackMessage}"
+                  disabled="disabled"
+                  value="rollback"
+                />
+              </jx:otherwise>
+            </jx:choose>
           </td>
         </tr>
       </jx:forEach>
+      <jx:if test="${usecase.getParameter('canRollback') != 'true'}">
+        <tr>
+          <td/>
+          <td colspan="3">
+            <strong><i18n:text key="${rollbackMessage}"/></strong>
+          </td>
+        </tr>
+      </jx:if>
     </table>
+    </form>
     </div>
   </page:body>
 </page:page>
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.