svn commit: r648431 - in /lenya/trunk/src/modules-core/workflow: config/cocoon-xconf/ java/src/org/apache/lenya/cms/workflow/usecases/ resources/i18n/ usecases/

[email protected]
Newsgroups gmane.comp.cms.lenya.cvs
Message-ID <[email protected]>
Author: andreas
Date: Tue Apr 15 15:11:53 2008
New Revision: 648431

URL: http://svn.apache.org/viewvc?rev=648431&view=rev
Log:
Enhanced workflow overview: show variable states, keep usecase order.

Modified:
    lenya/trunk/src/modules-core/workflow/config/cocoon-xconf/usecase-workflow-multiWorkflow.xconf
    lenya/trunk/src/modules-core/workflow/java/src/org/apache/lenya/cms/workflow/usecases/Deactivate.java
    lenya/trunk/src/modules-core/workflow/java/src/org/apache/lenya/cms/workflow/usecases/MultiWorkflow.java
    lenya/trunk/src/modules-core/workflow/java/src/org/apache/lenya/cms/workflow/usecases/WorkflowableWrapper.java
    lenya/trunk/src/modules-core/workflow/resources/i18n/cmsui.xml
    lenya/trunk/src/modules-core/workflow/resources/i18n/cmsui_de.xml
    lenya/trunk/src/modules-core/workflow/usecases/multiWorkflow.jx

Modified: lenya/trunk/src/modules-core/workflow/config/cocoon-xconf/usecase-workflow-multiWorkflow.xconf
URL: http://svn.apache.org/viewvc/lenya/trunk/src/modules-core/workflow/config/cocoon-xconf/usecase-workflow-multiWorkflow.xconf?rev=648431&r1=648430&r2=648431&view=diff
==============================================================================
--- lenya/trunk/src/modules-core/workflow/config/cocoon-xconf/usecase-workflow-multiWorkflow.xconf (original)
+++ lenya/trunk/src/modules-core/workflow/config/cocoon-xconf/usecase-workflow-multiWorkflow.xconf Tue Apr 15 15:11:53 2008
@@ -25,13 +25,14 @@
     <component-instance name="workflow.multiWorkflow" logger="lenya.workflow" class="org.apache.lenya.cms.workflow.usecases.MultiWorkflow">
       <view uri="modules/workflow/usecases/multiWorkflow.jx" menu="true" createContinuation="false"/>
       <exit usecase="workflow.multiWorkflow"/>
+      <variable name="is_live"/>
       <usecase name="workflow.submit" event="submit"/>
-      <usecase name="workflow.publish" event="publish"/>
       <usecase name="workflow.reject" event="reject"/>
+      <usecase name="workflow.publish" event="publish"/>
       <usecase name="workflow.deactivate" event="deactivate"/>
       <usecase name="sitemanagement.delete" event="delete"/>
       <usecase name="sitemanagement.archive" event="archive"/>
-      <usecase name="sitemanagement.restore" event="restore"/>
+      <usecase name="sitemanagement.restore" event="restore"/>
       <parameter name="style" value="text"/>
     </component-instance>
   </xconf>

Modified: lenya/trunk/src/modules-core/workflow/java/src/org/apache/lenya/cms/workflow/usecases/Deactivate.java
URL: http://svn.apache.org/viewvc/lenya/trunk/src/modules-core/workflow/java/src/org/apache/lenya/cms/workflow/usecases/Deactivate.java?rev=648431&r1=648430&r2=648431&view=diff
==============================================================================
--- lenya/trunk/src/modules-core/workflow/java/src/org/apache/lenya/cms/workflow/usecases/Deactivate.java (original)
+++ lenya/trunk/src/modules-core/workflow/java/src/org/apache/lenya/cms/workflow/usecases/Deactivate.java Tue Apr 15 15:11:53 2008
@@ -141,7 +141,7 @@
     }
     
     /**
-     * A list of links pointing to a document. Allows lazy loading rom the usecase view.
+     * A list of links pointing to a document. Allows lazy loading from the usecase view.
      */
     public static class LinkList {
         

Modified: lenya/trunk/src/modules-core/workflow/java/src/org/apache/lenya/cms/workflow/usecases/MultiWorkflow.java
URL: http://svn.apache.org/viewvc/lenya/trunk/src/modules-core/workflow/java/src/org/apache/lenya/cms/workflow/usecases/MultiWorkflow.java?rev=648431&r1=648430&r2=648431&view=diff
==============================================================================
--- lenya/trunk/src/modules-core/workflow/java/src/org/apache/lenya/cms/workflow/usecases/MultiWorkflow.java (original)
+++ lenya/trunk/src/modules-core/workflow/java/src/org/apache/lenya/cms/workflow/usecases/MultiWorkflow.java Tue Apr 15 15:11:53 2008
@@ -46,9 +46,7 @@
  */
 public class MultiWorkflow extends AbstractUsecase {
 
-    protected void initParameters() {
-        super.initParameters();
-
+    protected void prepareView() {
         try {
             List preOrder = getNodes();
             List wrappers = new ArrayList();
@@ -62,6 +60,8 @@
             }
             setParameter("documents", wrappers);
             setParameter("states", states);
+            setParameter("usecases", this.usecases);
+            setParameter("variables", this.variables);
 
         } catch (Exception e) {
             throw new RuntimeException(e);
@@ -105,7 +105,9 @@
         return preOrder;
     }
 
+    private List usecases = new ArrayList();
     private Map usecase2event = new HashMap();
+    private List variables = new ArrayList();
 
     public void configure(Configuration config) throws ConfigurationException {
         super.configure(config);
@@ -114,8 +116,13 @@
         for (int i = 0; i < usecaseConfigs.length; i++) {
             String usecase = usecaseConfigs[i].getAttribute("name");
             String event = usecaseConfigs[i].getAttribute("event");
+            this.usecases.add(usecase);
             this.usecase2event.put(usecase, event);
         }
+        Configuration[] varConfigs = config.getChildren("variable");
+        for (int i = 0; i < varConfigs.length; i++) {
+            this.variables.add(varConfigs[i].getAttribute("name"));
+        }
     }
 
     /**
@@ -131,6 +138,10 @@
             }
         }
         return (String[]) usecases.toArray(new String[usecases.size()]);
+    }
+
+    public String getEvent(String usecase) {
+        return (String) this.usecase2event.get(usecase);
     }
 
 }

Modified: lenya/trunk/src/modules-core/workflow/java/src/org/apache/lenya/cms/workflow/usecases/WorkflowableWrapper.java
URL: http://svn.apache.org/viewvc/lenya/trunk/src/modules-core/workflow/java/src/org/apache/lenya/cms/workflow/usecases/WorkflowableWrapper.java?rev=648431&r1=648430&r2=648431&view=diff
==============================================================================
--- lenya/trunk/src/modules-core/workflow/java/src/org/apache/lenya/cms/workflow/usecases/WorkflowableWrapper.java (original)
+++ lenya/trunk/src/modules-core/workflow/java/src/org/apache/lenya/cms/workflow/usecases/WorkflowableWrapper.java Tue Apr 15 15:11:53 2008
@@ -18,8 +18,6 @@
 package org.apache.lenya.cms.workflow.usecases;
 
 import java.util.Arrays;
-import java.util.SortedSet;
-import java.util.TreeSet;
 
 import org.apache.avalon.framework.container.ContainerUtil;
 import org.apache.avalon.framework.logger.AbstractLogEnabled;
@@ -122,21 +120,31 @@
     }
 
     /**
-     * @return All executable events in alphabetical order.
+     * @param usecaseName The usecase name.
+     * @return if the usecase can be invoked.
      * @throws WorkflowException if an error occurs.
      */
-    public String[] getUsecases() throws WorkflowException {
-        SortedSet usecases = new TreeSet();
-        String[] events = getWorkflowSchema().getEvents();
-        for (int i = 0; i < events.length; i++) {
-            if (WorkflowUtil.canInvoke(this.manager, this.session, getLogger(), this.document,
-                    events[i])) {
-                String[] eventUsecases = this.usecase.getUsecases(events[i]);
-                usecases.addAll(Arrays.asList(eventUsecases));
-            }
+    public boolean canInvoke(String usecaseName) throws WorkflowException {
+        String event = this.usecase.getEvent(usecaseName);
+        return WorkflowUtil.canInvoke(this.manager, this.session, getLogger(), this.document,
+                event);
+    }
+    
+    /**
+     * Returns the current value of a workflow variable.
+     * @param variable The name of the variable.
+     * @return The value.
+     * @throws WorkflowException if an error occurs. 
+     */
+    public boolean getValue(String variable) throws WorkflowException {
+        Workflowable workflowable = WorkflowUtil.getWorkflowable(this.manager, this.session, getLogger(), this.document);
+        if (workflowable.getVersions().length == 0) {
+            Workflow workflow = WorkflowUtil.getWorkflowSchema(this.manager, this.session, getLogger(), this.document);
+            return workflow.getInitialValue(variable);
+        }
+        else {
+            return workflowable.getLatestVersion().getValue(variable);
         }
-
-        return (String[]) usecases.toArray(new String[usecases.size()]);
     }
     
     /**

Modified: lenya/trunk/src/modules-core/workflow/resources/i18n/cmsui.xml
URL: http://svn.apache.org/viewvc/lenya/trunk/src/modules-core/workflow/resources/i18n/cmsui.xml?rev=648431&r1=648430&r2=648431&view=diff
==============================================================================
--- lenya/trunk/src/modules-core/workflow/resources/i18n/cmsui.xml (original)
+++ lenya/trunk/src/modules-core/workflow/resources/i18n/cmsui.xml Tue Apr 15 15:11:53 2008
@@ -23,15 +23,9 @@
 
   <message key="http://apache.org/lenya/metadata/workflow/1.0">Workflow</message>
   <message key="workflowVersion">Workflow versions</message>
-  <message key="workflow.multiWorkflow">Workflow Overview</message>
-  <message key="back-to-document">Back to document</message>
   <message key="workflow.reject">Reject</message>
   <message key="workflow.publish">Publish</message>
   <message key="workflow.deactivate">Deactivate</message>
-  <message key="Path">Path</message>
-  <message key="Actions">Actions</message>
-  <message key="state-as-text">State as text</message>
-  <message key="state-as-columns">State as columns</message>
   <message key="publish-missing-documents">
     The document can't be published unless the following documents are published:
   </message>
@@ -69,5 +63,14 @@
   
   <message key="last-published">This page was last published at {0} by {1}.</message>
   <message key="never-published">This page has not been published yet.</message>
+  
+  <!-- workflow overview -->
+  <message key="back-to-document">Back to document</message>
+  <message key="Path">Path</message>
+  <message key="Actions">Actions</message>
+  <message key="state-as-text">State as text</message>
+  <message key="state-as-columns">State as columns</message>
+  <message key="workflow.multiWorkflow">Workflow Overview</message>
+  <message key="is_live">Live</message>
   
 </catalogue>

Modified: lenya/trunk/src/modules-core/workflow/resources/i18n/cmsui_de.xml
URL: http://svn.apache.org/viewvc/lenya/trunk/src/modules-core/workflow/resources/i18n/cmsui_de.xml?rev=648431&r1=648430&r2=648431&view=diff
==============================================================================
--- lenya/trunk/src/modules-core/workflow/resources/i18n/cmsui_de.xml (original)
+++ lenya/trunk/src/modules-core/workflow/resources/i18n/cmsui_de.xml Tue Apr 15 15:11:53 2008
@@ -23,13 +23,7 @@
 
   <message key="http://apache.org/lenya/metadata/workflow/1.0">Workflow</message>
   <message key="workflowVersion">Workflow-Versionen</message>
-  <message key="workflow.multiWorkflow">Workflow-Übersicht</message>
-  <message key="back-to-document">Zurück zum Dokument</message>
-  <message key="workflow.publish">Publizieren</message>
-  <message key="Path">Pfad</message>
-  <message key="Actions">Aktionen</message>
-  <message key="state-as-text">Zustand als Text</message>
-  <message key="state-as-columns">Zustand als Spalten</message>
+  <message key="workflow.publish">Publizieren</message>
   <message key="publish-missing-documents">
     Das Dokument kann nicht publiziert werden, solange die folgenden Dokumente nicht publiziert sind:
   </message>
@@ -70,6 +64,14 @@
   <message key="last-published">Diese Seite wurde zuletzt publiziert am {0} von {1}.</message>
   <message key="never-published">Diese Seite wurde noch nicht publiziert.</message>
   
+  <!-- workflow overview -->
+  <message key="workflow.multiWorkflow">Workflow-Übersicht</message>
+  <message key="back-to-document">Zurück zum Dokument</message>
+  <message key="Path">Pfad</message>
+  <message key="Actions">Aktionen</message>
+  <message key="state-as-text">Zustand als Text</message>
+  <message key="state-as-columns">Zustand als Spalten</message>
+  <message key="is_live">Live</message>
   
 </catalogue>
 

Modified: lenya/trunk/src/modules-core/workflow/usecases/multiWorkflow.jx
URL: http://svn.apache.org/viewvc/lenya/trunk/src/modules-core/workflow/usecases/multiWorkflow.jx?rev=648431&r1=648430&r2=648431&view=diff
==============================================================================
--- lenya/trunk/src/modules-core/workflow/usecases/multiWorkflow.jx (original)
+++ lenya/trunk/src/modules-core/workflow/usecases/multiWorkflow.jx Tue Apr 15 15:11:53 2008
@@ -24,100 +24,127 @@
   xmlns:i18n="http://apache.org/cocoon/i18n/2.1"    
   >
   
-  <page:title><i18n:text><jx:out value="${usecase.getName()}"/></i18n:text></page:title>
   <page:body>
     <jx:set var="style" value="${usecase.getParameter('style')}"/>
-    
-    <form style="display: inline;">
-      <input type="submit" value="back-to-document" i18n:attr="value"/>
-    </form>
-    
-    <form style="display: inline;">
-      <input type="hidden" name="lenya.usecase" value="${usecase.getName()}"/>
-      <jx:choose>
-        <jx:when test="${style.equals('text')}">
-          <input type="hidden" name="style" value="columns"/>
-          <input type="submit" name="submit" value="state-as-columns" i18n:attr="value"/>
-        </jx:when>
-        <jx:otherwise>
-          <input type="hidden" name="style" value="text"/>
-          <input type="submit" name="submit" value="state-as-text" i18n:attr="value"/>
-        </jx:otherwise>
-      </jx:choose>
-    </form>
-    
-    <br/><br/>
-    
-    <jx:import uri="fallback://lenya/modules/usecase/templates/messages.jx"/>
-    
-    <table class="lenya-table-list">
+    <jx:set var="variables" value="${usecase.getParameter('variables')}"/>
+    <div style="float: left;">
+      <h2>
+        <div style="float: right;">
+          <form style="display: inline;">
+            <input type="submit" value="back-to-document" i18n:attr="value"/>
+          </form>
+          
+          <form style="display: inline;">
+            <input type="hidden" name="lenya.usecase" value="${usecase.getName()}"/>
+            <jx:choose>
+              <jx:when test="${style.equals('text')}">
+                <input type="hidden" name="style" value="columns"/>
+                <input type="submit" name="submit" value="state-as-columns" i18n:attr="value"/>
+              </jx:when>
+              <jx:otherwise>
+                <input type="hidden" name="style" value="text"/>
+                <input type="submit" name="submit" value="state-as-text" i18n:attr="value"/>
+              </jx:otherwise>
+            </jx:choose>
+          </form>
+        </div>
+        <i18n:text><jx:out value="${usecase.getName()}"/></i18n:text>
+      </h2>
       
-      <tr>
-        <th><i18n:text>Path</i18n:text></th>
-        <th><i18n:text>Language</i18n:text></th>
-        <jx:choose>
-          <jx:when test="${style.equals('text')}">
-            <th><i18n:text>State</i18n:text></th>
-          </jx:when>
-          <jx:otherwise>
-            <jx:forEach var="state" items="${usecase.getParameter('states')}">
-              <th><i18n:text><jx:out value="${state}"/></i18n:text></th>
-            </jx:forEach>
-          </jx:otherwise>
-        </jx:choose>
-        <th><i18n:text>Actions</i18n:text></th>
-      </tr>
+      <jx:import uri="fallback://lenya/modules/usecase/templates/messages.jx"/>
       
-      <jx:forEach var="doc" items="${usecase.getParameter('documents')}">
+      <table class="lenya-table-list">
+        
         <tr>
-          <jx:set var="path" value="${doc.getPath()}"/>
-          <jx:set var="depth" value="${path.split('/').size() - 2}"/>
-          <jx:set var="whitespace" value="&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;"/>
-          <jx:set var="indent" value="${whitespace.substring(0, depth.intValue())}"/>
-          <jx:set var="lastSlashIndex" value="${java.lang.Integer.valueOf(path.lastIndexOf('/'))}"/>
-          <jx:set var="nodeName" value="${path.substring(lastSlashIndex.intValue())}"/>
-          <jx:set var="languages" value="${doc.getLanguages()}"/>
-          <jx:if test="${doc.getLanguage().equals(java.util.Arrays.asList(languages).get(0))}">
-            <td rowspan="${doc.getLanguages().size()}" style="vertical-align: top">
-              <jx:out value="${indent}"/><jx:out value="${indent}"/><jx:out value="${indent}"/><jx:out value="${indent}"/><jx:out value="${nodeName}"/>
-            </td>
-          </jx:if>
-          <td>
-            <a href="${doc.getUrl()}"><jx:out value="${doc.getLanguage()}"/></a>
-          </td>
+          <th><i18n:text>Path</i18n:text></th>
+          <th><i18n:text>Language</i18n:text></th>
           <jx:choose>
             <jx:when test="${style.equals('text')}">
-              <td>
-                <i18n:text><jx:out value="${doc.getState()}"/></i18n:text>
-              </td>
+              <th><i18n:text>State</i18n:text></th>
             </jx:when>
             <jx:otherwise>
               <jx:forEach var="state" items="${usecase.getParameter('states')}">
-                <jx:choose>
-                  <jx:when test="${state.equals(doc.getState())}">
-                    <td style="text-align: center">x</td>
-                  </jx:when>
-                  <jx:otherwise>
-                    <td/>
-                  </jx:otherwise>
-                </jx:choose>
+                <th><i18n:text><jx:out value="${state}"/></i18n:text></th>
               </jx:forEach>
             </jx:otherwise>
           </jx:choose>
-          <td>
-            <jx:forEach var="usecaseName" items="${doc.getUsecases()}">
+          <jx:forEach var="variable" items="${variables}">
+            <th><i18n:text>${variable}</i18n:text></th>
+          </jx:forEach>
+          <th colspan="${usecase.getParameter('usecases').size()}"><i18n:text>Actions</i18n:text></th>
+        </tr>
+        
+        <jx:forEach var="doc" items="${usecase.getParameter('documents')}">
+          <tr>
+            <jx:set var="path" value="${doc.getPath()}"/>
+            <jx:set var="depth" value="${path.split('/').size() - 2}"/>
+            <jx:set var="whitespace" value="&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;"/>
+            <jx:set var="indent" value="${whitespace.substring(0, depth.intValue())}"/>
+            <jx:set var="lastSlashIndex" value="${java.lang.Integer.valueOf(path.lastIndexOf('/'))}"/>
+            <jx:set var="nodeName" value="${path.substring(lastSlashIndex.intValue())}"/>
+            <jx:set var="languages" value="${doc.getLanguages()}"/>
+            <jx:if test="${doc.getLanguage().equals(java.util.Arrays.asList(languages).get(0))}">
+              <td rowspan="${doc.getLanguages().size()}" style="vertical-align: top">
+                <jx:out value="${indent}"/><jx:out value="${indent}"/><jx:out value="${indent}"/><jx:out value="${indent}"/><jx:out value="${nodeName}"/>
+              </td>
+            </jx:if>
+            <td>
+              <a href="${doc.getUrl()}"><jx:out value="${doc.getLanguage()}"/></a>
+            </td>
+            <jx:choose>
+              <jx:when test="${style.equals('text')}">
+                <td>
+                  <i18n:text><jx:out value="${doc.getState()}"/></i18n:text>
+                </td>
+              </jx:when>
+              <jx:otherwise>
+                <jx:forEach var="state" items="${usecase.getParameter('states')}">
+                  <jx:choose>
+                    <jx:when test="${state.equals(doc.getState())}">
+                      <td style="text-align: center">x</td>
+                    </jx:when>
+                    <jx:otherwise>
+                      <td/>
+                    </jx:otherwise>
+                  </jx:choose>
+                </jx:forEach>
+              </jx:otherwise>
+            </jx:choose>
+            <jx:forEach var="variable" items="${variables}">
+              <td style="text-align: center">
+                <jx:choose>
+                  <jx:when test="${doc.getValue(variable)}">&#x2713;</jx:when>
+                  <jx:otherwise><span style="color: #999999">-</span></jx:otherwise>
+                </jx:choose>
+              </td>
+            </jx:forEach>
+            <!--
+              <jx:forEach var="usecaseName" items="${doc.getUsecases()}">
               <form action="${usecase.getSourceURL()}" method="POST" id="form-overview" style="display: inline;">
-                <input type="hidden" name="lenya.usecase" value="workflow.multiWorkflowInvoke"/>
-                <input type="hidden" name="usecaseName" value="${usecaseName}"/>
-                <input type="hidden" name="url" value="${doc.getUrl()}"/>
-                <input type="submit" name="submit" value="${usecaseName}" i18n:attr="value"/>
+              <input type="hidden" name="lenya.usecase" value="workflow.multiWorkflowInvoke"/>
+              <input type="hidden" name="usecaseName" value="${usecaseName}"/>
+              <input type="hidden" name="url" value="${doc.getUrl()}"/>
+              <input type="submit" name="submit" value="${usecaseName}" i18n:attr="value"/>
               </form>
+              </jx:forEach>
+            -->
+            <jx:set var="usecases" value="${usecase.getParameter('usecases')}"/>
+            <jx:forEach var="usecaseName" items="${usecases}">
+              <td style="padding-right: 0px; padding-left: 0px;">
+                <jx:if test="${doc.canInvoke(usecaseName)}">
+                  <form action="${usecase.getSourceURL()}" method="POST" id="form-overview" style="display: inline; padding-right: 4px;">
+                    <input type="hidden" name="lenya.usecase" value="workflow.multiWorkflowInvoke"/>
+                    <input type="hidden" name="usecaseName" value="${usecaseName}"/>
+                    <input type="hidden" name="url" value="${doc.getUrl()}"/>
+                    <input type="submit" name="submit" value="${usecaseName}" i18n:attr="value"/>
+                  </form>
+                </jx:if>
+              </td>
             </jx:forEach>
-          </td>
-        </tr>
-      </jx:forEach>
-      
-    </table>
-    
+          </tr>
+        </jx:forEach>
+        
+      </table>
+    </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.