[jbpm-commits] JBoss JBPM SVN: r2553 - in jbpm3/trunk/modules/gwt-console: server/src/main/java/org/jboss/bpm/console/server and 6 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Thu Oct 16 06:53:32 EDT 2008


Author: heiko.braun at jboss.com
Date: 2008-10-16 06:53:31 -0400 (Thu, 16 Oct 2008)
New Revision: 2553

Modified:
   jbpm3/trunk/modules/gwt-console/rpc/src/main/java/org/jboss/bpm/console/client/model/ProcessInstance.java
   jbpm3/trunk/modules/gwt-console/server/src/main/java/org/jboss/bpm/console/server/ProcessManagement.java
   jbpm3/trunk/modules/gwt-console/server/src/main/java/org/jboss/bpm/console/server/dao/ProcessDAO.java
   jbpm3/trunk/modules/gwt-console/server/src/main/java/org/jboss/bpm/console/server/dao/internal/JBPM3ProcessDAO.java
   jbpm3/trunk/modules/gwt-console/server/src/main/java/org/jboss/bpm/console/server/dao/internal/MockProcessDAO.java
   jbpm3/trunk/modules/gwt-console/server/src/main/java/org/jboss/bpm/console/server/dao/internal/Transform.java
   jbpm3/trunk/modules/gwt-console/server/src/main/webapp/index.html
   jbpm3/trunk/modules/gwt-console/war/src/main/java/org/jboss/bpm/console/client/RestURL.java
   jbpm3/trunk/modules/gwt-console/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceList.java
   jbpm3/trunk/modules/gwt-console/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceListEditor.java
   jbpm3/trunk/modules/gwt-console/war/src/main/java/org/jboss/bpm/console/client/widgets/RemoteListView.java
Log:
Added suspend/resume capabilties to both the UI and the console server

Modified: jbpm3/trunk/modules/gwt-console/rpc/src/main/java/org/jboss/bpm/console/client/model/ProcessInstance.java
===================================================================
--- jbpm3/trunk/modules/gwt-console/rpc/src/main/java/org/jboss/bpm/console/client/model/ProcessInstance.java	2008-10-16 09:53:22 UTC (rev 2552)
+++ jbpm3/trunk/modules/gwt-console/rpc/src/main/java/org/jboss/bpm/console/client/model/ProcessInstance.java	2008-10-16 10:53:31 UTC (rev 2553)
@@ -36,7 +36,7 @@
    private long parentId;
 
    private String key;
-   private enum STATE {CREATED, STARTED, SUSPENDED, ENDED};
+   public enum STATE {RUNNING, SUSPENDED, ENDED};
 
    private Date startDate;
    private Date endDate;
@@ -54,6 +54,13 @@
 
    public ProcessInstance(long id, long parentId, Date startDate, Date endDate, boolean suspended)
    {
+
+      if(null==startDate)
+         throw new IllegalArgumentException("An instance requires a start date");
+      
+      if(endDate!=null && suspended)
+         throw new IllegalArgumentException("An instance cannot be ended and suspended at the same time");
+
       this.instanceId = id;
       this.parentId = parentId;
       this.startDate = startDate;
@@ -62,16 +69,17 @@
       initLifecycle();
    }
 
+   /**
+    * If not ENDED or SUSPENDED the instance is RUNNING
+    */
    private void initLifecycle()
    {
       if(hasEnded())
-         this.lifecycle = new Lifecycle(STATE.ENDED);
+         this.lifecycle = new Lifecycle(this, STATE.ENDED);
       else if(isSuspended())
-         this.lifecycle = new Lifecycle(STATE.SUSPENDED);
-      else if (isStarted())
-         this.lifecycle = new Lifecycle(STATE.STARTED);
+         this.lifecycle = new Lifecycle(this, STATE.SUSPENDED);
       else
-         this.lifecycle = new Lifecycle(STATE.CREATED);
+         this.lifecycle = new Lifecycle(this, STATE.RUNNING);
 
       this.state = lifecycle.getState();
    }
@@ -115,6 +123,11 @@
       return this.state;
    }
 
+   public void setState(String nextState)
+   {
+      setState(STATE.valueOf(nextState));
+   }
+
    public void setState(STATE nextState)
    {
       this.lifecycle = this.lifecycle.transitionTo(nextState);
@@ -143,32 +156,30 @@
       this.endDate = endDate;
    }
 
-   public boolean isStarted()
+   public boolean isRunning()
    {
-      return this.startDate!=null;
+      return this.startDate!=null && !isSuspended();
    }
 
    public boolean hasEnded()
    {
-      return isStarted() && this.endDate!=null;
+      return this.startDate!=null
+        && this.endDate!=null;
    }
 
    public boolean isSuspended()
    {
-      return isStarted() && suspended;
+      return null==this.endDate && suspended;
    }
-
-   public void setSuspended(boolean suspended)
-   {
-      this.suspended = suspended;
-   }
-
+   
    private class Lifecycle
    {
       private STATE current;
+      private ProcessInstance instance;
 
-      public Lifecycle(STATE current)
+      public Lifecycle(ProcessInstance instance, STATE current)
       {
+         this.instance = instance;
          this.current = current;
       }
 
@@ -177,27 +188,35 @@
          Lifecycle nextLifecycle = null;
 
          switch(next)
-         {
-            case STARTED:
-               if(!STATE.ENDED.equals(current))
+         {            
+            case SUSPENDED: // only RUNNING instances can be SUSPENDED
+               if(STATE.RUNNING.equals(current))
                {
-                  nextLifecycle = new Lifecycle(next);
+                  nextLifecycle = new Lifecycle(instance, next);
+                  instance.suspended = true;
+                  break;
                }
-               break;
-            case SUSPENDED:
-               if(STATE.STARTED.equals(current))
+               else
                {
-                  nextLifecycle = new Lifecycle(next);
+                  throw new IllegalTransitionException(current, next);
+               }
+            case ENDED: // both RUNNING and SUSPENDED instances can be ENDED
+               if(STATE.RUNNING.equals(current) || STATE.SUSPENDED.equals(current))
+               {
+                  nextLifecycle =  new Lifecycle(instance, next);
+                  instance.suspended = false;
+                  instance.endDate = new Date();
                   break;
                }
                else
                {
                   throw new IllegalTransitionException(current, next);
                }
-            case ENDED:
-               if(STATE.STARTED.equals(current) || STATE.SUSPENDED.equals(current))
+            case RUNNING: // only SUSPENDED instances can become RUNNING
+               if(STATE.SUSPENDED.equals(current))
                {
-                  nextLifecycle =  new Lifecycle(next);
+                  nextLifecycle =  new Lifecycle(instance, next);
+                  instance.suspended = false;                  
                   break;
                }
                else

Modified: jbpm3/trunk/modules/gwt-console/server/src/main/java/org/jboss/bpm/console/server/ProcessManagement.java
===================================================================
--- jbpm3/trunk/modules/gwt-console/server/src/main/java/org/jboss/bpm/console/server/ProcessManagement.java	2008-10-16 09:53:22 UTC (rev 2552)
+++ jbpm3/trunk/modules/gwt-console/server/src/main/java/org/jboss/bpm/console/server/ProcessManagement.java	2008-10-16 10:53:31 UTC (rev 2553)
@@ -102,19 +102,21 @@
    }
 
    @POST
-   @Path("instances/{id}/remove")
+   @Path("instances/{id}/state/{next}")
    @Produces("application/json")
-   public Response removeInstancesJSON(
+   public Response changeState(
      @PathParam("id")
      long instanceId,
+     @PathParam("next")
+     String next,
      @Context
      HttpServletRequest request)
    {
-      ProcessInstanceWrapper wrapper =
-        new ProcessInstanceWrapper(getProcessDAO(request).removeInstance(instanceId));
-      return createJsonResponse(wrapper);
+      getProcessDAO(request).changeState(instanceId, next);
+      return Response.ok().build();
    }
 
+
    private Response createJsonResponse(Object wrapper)
    {
       Gson gson = GsonFactory.createInstance();

Modified: jbpm3/trunk/modules/gwt-console/server/src/main/java/org/jboss/bpm/console/server/dao/ProcessDAO.java
===================================================================
--- jbpm3/trunk/modules/gwt-console/server/src/main/java/org/jboss/bpm/console/server/dao/ProcessDAO.java	2008-10-16 09:53:22 UTC (rev 2552)
+++ jbpm3/trunk/modules/gwt-console/server/src/main/java/org/jboss/bpm/console/server/dao/ProcessDAO.java	2008-10-16 10:53:31 UTC (rev 2553)
@@ -43,5 +43,5 @@
 
    ProcessInstance getInstanceById(long instanceId);
    
-   List<ProcessInstance> removeInstance(long instanceId);
+   void changeState(long instanceId, String nextState);
 }

Modified: jbpm3/trunk/modules/gwt-console/server/src/main/java/org/jboss/bpm/console/server/dao/internal/JBPM3ProcessDAO.java
===================================================================
--- jbpm3/trunk/modules/gwt-console/server/src/main/java/org/jboss/bpm/console/server/dao/internal/JBPM3ProcessDAO.java	2008-10-16 09:53:22 UTC (rev 2552)
+++ jbpm3/trunk/modules/gwt-console/server/src/main/java/org/jboss/bpm/console/server/dao/internal/JBPM3ProcessDAO.java	2008-10-16 10:53:31 UTC (rev 2553)
@@ -80,8 +80,13 @@
       return Transform.processInstance(instance);
    }
 
-   public List<ProcessInstance> removeInstance(long instanceId)
+
+   public void changeState(long instanceId, String nextState)
    {
-      throw new RuntimeException("Not implemented");
+      org.jbpm.graph.exe.ProcessInstance p0 = delegate.getActualInstance(instanceId);
+      Transform.doTransition(p0, nextState);
+
+      // persist
+      
    }
 }

Modified: jbpm3/trunk/modules/gwt-console/server/src/main/java/org/jboss/bpm/console/server/dao/internal/MockProcessDAO.java
===================================================================
--- jbpm3/trunk/modules/gwt-console/server/src/main/java/org/jboss/bpm/console/server/dao/internal/MockProcessDAO.java	2008-10-16 09:53:22 UTC (rev 2552)
+++ jbpm3/trunk/modules/gwt-console/server/src/main/java/org/jboss/bpm/console/server/dao/internal/MockProcessDAO.java	2008-10-16 10:53:31 UTC (rev 2553)
@@ -103,27 +103,25 @@
       return instances;
    }
 
-   public List<ProcessInstance> removeInstance(long instanceId)
+
+   public void changeState(long instanceId, String nextState)
    {
 
-      System.out.println("Remove instance " + instanceId);
+      System.out.println("Change instance state" + instanceId + " to " + nextState);
 
-      ProcessInstance toBeRemoved = null;
+      ProcessInstance toBeChanged = null;
       for(ProcessInstance instance : instances)
       {
          if(instanceId == instance.getInstanceId())
-            toBeRemoved = instance;
+            toBeChanged = instance;
       }
 
-      if(null==toBeRemoved)
+      if(null==toBeChanged)
          throw new IllegalArgumentException("No process with id " + instanceId);
-      else
-         instances.remove(toBeRemoved);
-
-      return instances;
+      
+      toBeChanged.setState(nextState);
    }
 
-
    public ProcessInstance getInstanceById(long instanceId)
    {
       ProcessInstance match = null;

Modified: jbpm3/trunk/modules/gwt-console/server/src/main/java/org/jboss/bpm/console/server/dao/internal/Transform.java
===================================================================
--- jbpm3/trunk/modules/gwt-console/server/src/main/java/org/jboss/bpm/console/server/dao/internal/Transform.java	2008-10-16 09:53:22 UTC (rev 2552)
+++ jbpm3/trunk/modules/gwt-console/server/src/main/java/org/jboss/bpm/console/server/dao/internal/Transform.java	2008-10-16 10:53:31 UTC (rev 2553)
@@ -45,4 +45,26 @@
       long instanceId = i0.getId();
       return new ProcessInstance(instanceId, processId, start, end, suspended);
    }
+
+   public static void doTransition(org.jbpm.graph.exe.ProcessInstance p0, String nextState)
+   {
+      ProcessInstance instance = Transform.processInstance(p0);
+      instance.setState(nextState);  // has lifecycle build in, hence the extra round
+
+      switch(instance.getState())
+      {
+         case ENDED:
+            p0.setEnd(instance.getEndDate());
+            p0.end();
+            break;
+         case SUSPENDED:
+            p0.suspend();
+            break;
+         case RUNNING:
+            if(p0.isSuspended())
+               p0.resume();            
+      }
+            
+   }
+
 }

Modified: jbpm3/trunk/modules/gwt-console/server/src/main/webapp/index.html
===================================================================
--- jbpm3/trunk/modules/gwt-console/server/src/main/webapp/index.html	2008-10-16 09:53:22 UTC (rev 2552)
+++ jbpm3/trunk/modules/gwt-console/server/src/main/webapp/index.html	2008-10-16 10:53:31 UTC (rev 2553)
@@ -40,9 +40,9 @@
 
    <tr>
       <td>POST</td>
-      <td>/rs/process/instances/{instanceId}/remove</td>
-      <td>Removes a particular process instance</td>
-      <td>application/json</td>
+      <td>/rs/process/instances/{id}/state/{next}</td>
+      <td>Change instance state (RUNNING, SUSPENDED, ENDED)</td>
+      <td>*/*</td>
    </tr>
 
    <tr>

Modified: jbpm3/trunk/modules/gwt-console/war/src/main/java/org/jboss/bpm/console/client/RestURL.java
===================================================================
--- jbpm3/trunk/modules/gwt-console/war/src/main/java/org/jboss/bpm/console/client/RestURL.java	2008-10-16 09:53:22 UTC (rev 2552)
+++ jbpm3/trunk/modules/gwt-console/war/src/main/java/org/jboss/bpm/console/client/RestURL.java	2008-10-16 10:53:31 UTC (rev 2553)
@@ -21,6 +21,8 @@
  */
 package org.jboss.bpm.console.client;
 
+import org.jboss.bpm.console.client.model.ProcessInstance;
+
 /**
  * @author Heiko.Braun <heiko.braun at jboss.com>
  */
@@ -72,16 +74,12 @@
       return getBaseUrl() + "/rs/user/roles?roleCheck="+sb.toString();
    }
 
+   @Deprecated
    public String getRemoveDefinitionURL(long processId)
    {
       return getBaseUrl() + "/rs/process/definitions/" + processId + "/remove";
    }
 
-   public String getRemoveInstanceURL(long instanceId)
-   {
-      return getBaseUrl() + "/rs/process/instances/" + instanceId + "/remove";
-   }
-
    public String getProcessImageURL(long processId)
    {
       return getBaseUrl() + "/rs/jbpm3/definitions/" + processId + "/image";
@@ -96,4 +94,9 @@
    {
       return getBaseUrl() + "/rs/jbpm3/instances/" + instanceId + "/activeNodeInfo";
    }
+
+   public String getStateChangeURL(long instanceId, ProcessInstance.STATE state)
+   {
+      return getBaseUrl() + "/rs/process/instances/" + instanceId + "/state/"+state;
+   }
 }

Modified: jbpm3/trunk/modules/gwt-console/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceList.java
===================================================================
--- jbpm3/trunk/modules/gwt-console/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceList.java	2008-10-16 09:53:22 UTC (rev 2552)
+++ jbpm3/trunk/modules/gwt-console/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceList.java	2008-10-16 10:53:31 UTC (rev 2553)
@@ -80,7 +80,8 @@
                   if("yes".equals( btnID) )
                   {
                      ProcessInstance instance = row2InstanceMap.get(row);
-                     String url = view.getRestURL().getRemoveInstanceURL(instance.getInstanceId());
+                     instance.setState(ProcessInstance.STATE.ENDED);
+                     String url = view.getRestURL().getStateChangeURL(instance.getInstanceId(), instance.getState());
                      RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, url);
 
                      try

Modified: jbpm3/trunk/modules/gwt-console/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceListEditor.java
===================================================================
--- jbpm3/trunk/modules/gwt-console/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceListEditor.java	2008-10-16 09:53:22 UTC (rev 2552)
+++ jbpm3/trunk/modules/gwt-console/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceListEditor.java	2008-10-16 10:53:31 UTC (rev 2553)
@@ -21,23 +21,26 @@
  */
 package org.jboss.bpm.console.client.process;
 
+import com.google.gwt.http.client.*;
+import com.gwtext.client.core.EventObject;
+import com.gwtext.client.core.Function;
+import com.gwtext.client.core.Position;
+import com.gwtext.client.data.Record;
+import com.gwtext.client.widgets.Button;
+import com.gwtext.client.widgets.PaddedPanel;
+import com.gwtext.client.widgets.Panel;
+import com.gwtext.client.widgets.event.ButtonListenerAdapter;
+import com.gwtext.client.widgets.form.DateField;
+import com.gwtext.client.widgets.form.FieldSet;
+import com.gwtext.client.widgets.form.FormPanel;
+import com.gwtext.client.widgets.form.TextField;
+import com.gwtext.client.widgets.grid.RowSelectionModel;
+import com.gwtext.client.widgets.grid.event.RowSelectionListenerAdapter;
 import org.jboss.bpm.console.client.ConsoleView;
 import org.jboss.bpm.console.client.model.ProcessDefinition;
 import org.jboss.bpm.console.client.model.ProcessInstance;
 import org.jboss.bpm.console.client.widgets.EditorView;
 import org.jboss.bpm.console.client.widgets.UIConstants;
-import com.gwtext.client.widgets.form.FieldSet;
-import com.gwtext.client.widgets.form.TextField;
-import com.gwtext.client.widgets.form.DateField;
-import com.gwtext.client.widgets.form.FormPanel;
-import com.gwtext.client.widgets.PaddedPanel;
-import com.gwtext.client.widgets.Panel;
-import com.gwtext.client.widgets.Button;
-import com.gwtext.client.widgets.grid.RowSelectionModel;
-import com.gwtext.client.widgets.grid.event.RowSelectionListenerAdapter;
-import com.gwtext.client.core.Position;
-import com.gwtext.client.core.Function;
-import com.gwtext.client.data.Record;
 
 /**
  * @author Heiko.Braun <heiko.braun at jboss.com>
@@ -48,21 +51,25 @@
 {
 
    private ProcessDefinition parent;
+   private ProcessInstance selectedInstance;
+   private ConsoleView view;
+   private ProcessInstanceList instanceList;
 
    public ProcessInstanceListEditor(ProcessDefinition proc, ConsoleView view)
    {
       super();
+      this.view = view;
       this.setId(ProcessInstanceEditor.ID+"."+proc.getName());
 
       parent = proc;
 
       // ---------------
 
-      ProcessInstanceList list = new ProcessInstanceList(
+      instanceList = new ProcessInstanceList(
         proc, "Process Instances", view
       );
 
-      this.add(list);
+      this.add(instanceList);
 
       // ---------------
 
@@ -100,9 +107,29 @@
 
       formPanel.add(inner);
 
-      final Button suspendButton = new Button("Suspend");
-      final Button resumeButton = new Button("Resume");
+      final Button suspendButton = new Button("Suspend",
+        new ButtonListenerAdapter()
+        {
 
+           public void onClick(Button button, EventObject eventObject)
+           {
+              selectedInstance.setState(ProcessInstance.STATE.SUSPENDED);
+              persistStateChange();
+           }
+        }
+      );
+      final Button resumeButton = new Button("Resume",
+        new ButtonListenerAdapter()
+        {
+
+           public void onClick(Button button, EventObject eventObject)
+           {
+              selectedInstance.setState(ProcessInstance.STATE.RUNNING);
+              persistStateChange();
+           }
+        }
+      );
+
       formPanel.addButton(suspendButton);
       formPanel.addButton(resumeButton);
 
@@ -114,8 +141,8 @@
         {
            public void onRowSelect(RowSelectionModel sm, int rowIndex, Record record)
            {
-              ProcessInstance pi = ProcessInstanceList.transform(record);
-              if(pi.isSuspended())
+              selectedInstance = ProcessInstanceList.transform(record);
+              if(selectedInstance.isSuspended())
               {
                  suspendButton.disable();
                  resumeButton.enable();
@@ -131,10 +158,10 @@
            }
         }
       );
-      list.getGrid().setSelectionModel(sm);
+      instanceList.getGrid().setSelectionModel(sm);
 
       //select the first row after a little delay so that the rows are rendered
-      list.getGrid().doOnRender(
+      instanceList.getGrid().doOnRender(
         new Function()
         {
            public void execute() {
@@ -148,7 +175,40 @@
 
    }
 
+   private void persistStateChange()
+   {
+      RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, view.getRestURL().getStateChangeURL(
+        selectedInstance.getInstanceId(), selectedInstance.getState())
+      );
 
+      try
+      {
+         rb.sendRequest(null,
+           new RequestCallback() {
+
+              public void onResponseReceived(Request request, Response response)
+              {
+                 // success
+                 instanceList.reloadStore();
+                 selectedInstance = null;
+              }
+
+              public void onError(Request request, Throwable t)
+              {
+                 // Unknown error
+                 view.setError(t.getMessage());
+                 t.printStackTrace(System.out);
+              }
+           });
+      }
+      catch (RequestException e1)
+      {
+         view.setError(e1.getMessage());
+         e1.printStackTrace();
+      }
+   }
+
+
    public String getEditorId()
    {
       return getId();

Modified: jbpm3/trunk/modules/gwt-console/war/src/main/java/org/jboss/bpm/console/client/widgets/RemoteListView.java
===================================================================
--- jbpm3/trunk/modules/gwt-console/war/src/main/java/org/jboss/bpm/console/client/widgets/RemoteListView.java	2008-10-16 09:53:22 UTC (rev 2552)
+++ jbpm3/trunk/modules/gwt-console/war/src/main/java/org/jboss/bpm/console/client/widgets/RemoteListView.java	2008-10-16 10:53:31 UTC (rev 2553)
@@ -236,7 +236,7 @@
       return grid;
    }
 
-   protected void reloadStore()
+   public void reloadStore()
    {
       store.load(0,PAGE_SIZE);      
    }




More information about the jbpm-commits mailing list