View Javadoc

1   package org.weda.workflow.impl;
2   
3   import java.io.Serializable;
4   import java.util.List;
5   import java.util.Map;
6   import java.util.Stack;
7   import org.weda.action.ActionRegistry;
8   import org.weda.cache.CacheEntity;
9   import org.weda.cache.CacheManager;
10  import org.weda.cache.CacheService;
11  import org.weda.action.ExecutedActionInfo;
12  import org.weda.workflow.EntryException;
13  import org.weda.workflow.Path;
14  import org.weda.workflow.PathAdapter;
15  import org.weda.workflow.Workflow;
16  import org.weda.workflow.WorkflowException;
17  
18  /**
19   *
20   * @author tim
21   */
22  public class WorkflowImpl 
23          extends BasicEntryContainer<PageEntry>
24          implements Workflow
25  {
26      private final static String ID=PathStackEntity.class.getName();
27      private CacheManager cacheManager;
28      private ActionRegistry actionRegistry;
29      private PathAdapter pathAdapter;
30      private List<PageEntry> pageEntries;
31      private boolean usePathAdapter = true;
32      
33      public void init() throws EntryException {
34          try{
35              if (pageEntries!=null)
36                  for (PageEntry entry: pageEntries){
37                      PageEntry selfEntry = getEntryByName(entry.getName());
38                      if (selfEntry==null)
39                          getEntries().add(entry);
40                      else
41                          selfEntry.merge(entry);
42                  }
43              setName("workflow");
44              setWorkflow(this);
45              super.init();
46          }catch(EntryException e){
47              throw new WorkflowException(
48                      "Can't initialize workflow engine"
49                      , e);
50          }
51      }
52      
53      public Object getNextPage(String currentPageName, Map pathAdapterParams) 
54          throws WorkflowException 
55      {
56          try{
57              Stack<String> expressions = new Stack<String>();
58              ExecutedActionInfo actionInfo = 
59                      actionRegistry.getLastExecutedActionInfo();
60              Object actionResult = actionInfo.getActionResult();
61              expressions.push(
62                      actionResult == null ? null : actionResult.toString());
63              expressions.push(
64                      actionInfo.isSuccessExecution()?
65                            ResultTypeEntry.SUCCESS_RESULT 
66                          : ResultTypeEntry.ERROR_RESULT);
67              expressions.push(actionInfo.getTargetName());
68              expressions.push(actionInfo.getTargetClass().getName());
69              expressions.push(actionInfo.getActionClass().getName());
70              expressions.push(currentPageName);
71              operate(expressions);
72              Path path = getPathStack().pop();
73              Object adaptedPath = path;
74              if (isUsePathAdapter())
75                  adaptedPath = pathAdapter.adaptPath(path, pathAdapterParams);
76              return adaptedPath;
77          }catch(EntryException e){
78              throw new WorkflowException(
79                      "Can't determine next page in workflow"
80                      , e);
81          }
82      }
83  
84      public void setCacheManager(CacheManager cacheManager) {
85          this.cacheManager = cacheManager;
86      }
87      
88      public void pushPath(Path path){
89          getPathStack().push(path);
90      }
91      
92      private Stack<Path> getPathStack(){
93          PathStackEntity entity = 
94                  (PathStackEntity)cacheManager.getCacheService().get(ID);
95          if (entity==null){
96              entity = new PathStackEntity();
97              cacheManager.getCacheService().setCacheEntity(ID, entity);
98          }
99          return entity.getStack();
100     }
101     
102     public void setPageEntries(List<PageEntry> pageEntries) {
103         this.pageEntries = pageEntries;
104     }    
105     
106     private class PathStackEntity implements CacheEntity, Serializable{
107         private Stack<Path> stack = new Stack<Path>();
108         
109         public void release() {
110             stack.clear();
111         }
112 
113         public Object getValue() {
114             return stack;
115         }
116         
117         public Stack<Path> getStack(){
118             return stack;
119         }
120     }
121 
122     public void setActionRegistry(ActionRegistry actionRegistry) {
123         this.actionRegistry = actionRegistry;
124     }
125 
126     public void setPathAdapter(PathAdapter pathAdapter) {
127         this.pathAdapter = pathAdapter;
128     }
129 
130     public boolean isUsePathAdapter() {
131         return usePathAdapter;
132     }
133 
134     public void setUsePathAdapter(boolean usePathAdapter) {
135         this.usePathAdapter = usePathAdapter;
136     }
137 
138     public String getCurrentPage() {
139         return pathAdapter.getCurrentPage();
140     }
141 
142 }