001: /*
002: * JFolder, Copyright 2001-2006 Gary Steinmetz
003: *
004: * Distributable under LGPL license.
005: * See terms of license at gnu.org.
006: */
007:
008: package org.jfolder.engines;
009:
010: //base classes
011:
012: //project specific classes
013: import org.jfolder.common.UnexpectedSystemException;
014: import org.jfolder.common.tagging.ConceptTagPreferences;
015: import org.jfolder.common.tagging.CoreConceptTag;
016: import org.jfolder.common.tagging.DetermineValueAndClassConceptTagContext;
017: import org.jfolder.common.tagging.DetermineValueAndClassConceptTagException;
018: import org.jfolder.common.tagging.RootConceptTagHolder;
019: import org.jfolder.common.tagging.ValueAndClassForConceptTag;
020: import org.jfolder.common.utils.misc.MiscHelper;
021: import org.jfolder.security.audit.SecurityAudit;
022: import org.jfolder.services.workflow.WorkflowServiceCaller;
023: import org.jfolder.workflow.model.attributes.AttributeSet;
024: import org.jfolder.workflow.model.attributes.WaitHelper;
025: import org.jfolder.workflow.model.history.HistoryAudit;
026: import org.jfolder.workflow.model.history.RecordAudit;
027: import org.jfolder.workflow.model.history.TraceAudit;
028: import org.jfolder.workflow.model.instance.WorkflowInstance;
029: import org.jfolder.workflow.model.trigger.WorkflowTrigger;
030:
031: //other classes
032:
033: public class WorkflowEngine {
034:
035: public final static void executeWorkflow(
036: WorkflowInstance inWorkflow, WorkflowServiceCaller inWsc) {
037:
038: WorkflowTrigger trigger = null;
039:
040: throw UnexpectedSystemException.notImplemented();
041:
042: /*
043: try {
044:
045: //WorkflowInstanceUpdates wiu =
046: // WorkflowInstanceUpdatesFactory.newWorkflowInstanceUpdates();
047:
048: trigger = inWorkflow.getTriggerData();
049: AttributeSet as = inWorkflow.getAttributeSet();
050:
051: RootConceptTagHolder rth = inWorkflow.getRootScriptTagHolder();
052: ConceptTagPreferences ctp = rth.getConceptTagPreferences();
053: DetermineValueAndClassConceptTagContext rvacfctc =
054: ctp.getDetermineValueAndClassConceptTagContext();
055: //DetermineValueAndClassConceptTagContext rvacfctc = null;
056: //MiscHelper.println("ABOUT TO EXECUTE STATE");
057: //MiscHelper.println(rth.getXMLRepresentation());
058: CoreConceptTag pmt =
059: rth.getConceptTagCharacteristic().getValueAsCoreConceptTag();
060: WorkflowTemplateScriptTag pm = (WorkflowTemplateScriptTag)pmt;
061:
062: HistoryAudit history = inWorkflow.getHistoryAudit();
063: TraceAudit curTrace =
064: history.getOneTraceByStatus(TraceAudit.STATUS_ACTIVE);
065: RecordAudit record = curTrace.getCurrentRecord();
066: //MiscHelper.println("Trace(status) = " + record.getStatus());
067: //TO DO: add one to workflow count and throw exception if over limit
068:
069: String transName = record.getFutureNode();
070:
071: if (pm.isStatePresent(transName)) {
072:
073: StateScriptTag node = pm.findStateByName(transName);
074: String stateName = node.getName();
075: int traceId = curTrace.getId();
076: ValueAndClassForConceptTag initWaitVac =
077: as.getSysAttr(AttributeSet.WAIT);
078: String waitHandle = (String)(initWaitVac.getValue());
079:
080: //MiscHelper.println("initialWaitHandle = " + waitHandle);
081: //MiscHelper.println("node.isPreWaitPresent() = "
082: // + node.isPreWaitPresent());
083: //TO DO: validate theory of below statement
084: //TO DO: change below to use constants or function
085: //wait is WAITING, RELEASED, REMOVED
086: //MiscHelper.println(
087: //"WorkflowEngine - StateName = " + stateName);
088:
089: if (node.isPreWaitPresent()
090: && (WaitHelper.isTraceNotWaitingAtState(
091: waitHandle, stateName, String.valueOf(traceId)))) {
092:
093: //MiscHelper.println("About to wait, not wait = "
094: // + WaitHelper.isTraceNotAtState(waitHandle, stateName,
095: // String.valueOf(traceId)));
096: SecurityAudit waitWa =
097: SecurityAuditFactory.newSecurityAudit(
098: record.getAuditUser(), record.getAuditId() + 1,
099: "Wait", TraceAudit.STATUS_WAIT,
100: MiscHelper.currentGMT());
101: waitHandle = WaitHelper.establishWaitAtState(waitHandle,
102: stateName, String.valueOf(traceId));
103:
104: //TO DO: change timestamp of record
105: curTrace.addRecord(node.getName(), node.getName(), waitWa);
106:
107: }
108: //TO DO: is below possible?
109: else if (node.isPreWaitPresent()
110: && WaitHelper.isTraceWaitingAtState(
111: waitHandle, stateName, String.valueOf(traceId))) {
112:
113: waitHandle = WaitHelper.releaseWaitAtState(waitHandle,
114: stateName, String.valueOf(traceId));
115:
116: throw new UnexpectedSystemException(
117: "Illegal trace state - trace is waiting,"
118: + " but status is active");
119: }
120: else if (!node.isPreWaitPresent() ||
121: WaitHelper.isTraceWaitingAtStateButReleased(
122: waitHandle, stateName, String.valueOf(traceId))) {
123:
124: waitHandle = WaitHelper.enableWaitAtState(waitHandle,
125: stateName, String.valueOf(traceId));
126:
127: //determineValueAndClassContext rvacc =
128: // ScriptTagHelper.createdetermineValueAndClassContext(
129: // as, trigger,
130: // (String)as.getSysAttr(AttributeSet.APP).getValue());
131: node.execute(rvacfctc);
132:
133: String nextTrans = node.evaluateTransition(rvacfctc);
134: curTrace.addRecord(node.getName(), nextTrans, record);
135:
136: for (int i = 0; i < node.getBranchCount(); i++) {
137:
138: TraceAudit newTrace = history.createTraceAudit();
139: //TO DO: change timestamp of record
140: SecurityAudit branchWa =
141: SecurityAuditFactory.newSecurityAudit(
142: record.getAuditUser(), SecurityAudit.INITIAL_ID,
143: "New Branch", TraceAudit.STATUS_ACTIVE,
144: MiscHelper.currentGMT());
145: newTrace.addRecord(node.getName(),
146: node.evaluateBranch(i, rvacfctc), branchWa);
147: }
148: }
149: else {
150: throw new UnexpectedSystemException(
151: "Unable to reconcile trace and wait");
152: }
153: //MiscHelper.println("afterWaitHandle = " + waitHandle);
154: as.setSysAttr(AttributeSet.WAIT,
155: ValueAndClassForConceptTag.newInstance(
156: waitHandle, String.class));
157: }
158: else if (pm.isStopPresent(transName)) {
159: //MiscHelper.println("Going to exit " + transName);
160: StopScriptTag stop = pm.findStopByName(transName);
161: //create log
162: //TO DO: change timestamp of record
163: SecurityAudit stopWa = SecurityAuditFactory.newSecurityAudit(
164: record.getAuditUser(), record.getAuditId() + 1, "Stop",
165: TraceAudit.STATUS_DONE, MiscHelper.currentGMT());
166: curTrace.addRecord(stop.getName(), stop.getName(), stopWa);
167: }
168: else {
169: throw new UnexpectedSystemException("Cannot go to next state "
170: + transName + ". It is neither a 'node' nor a 'stop'");
171: }
172:
173: //--->updateWorkflow
174: if (history.getOneTraceByStatus(
175: TraceAudit.STATUS_EXCEPTION) != null) {
176: as.setSysAttr(AttributeSet.STATUS,
177: ValueAndClassForConceptTag.newInstance(
178: TraceAudit.STATUS_EXCEPTION,
179: TraceAudit.STATUS_EXCEPTION.getClass()));
180: }
181: else if (history.getOneTraceByStatus(
182: TraceAudit.STATUS_ACTIVE) != null) {
183: as.setSysAttr(AttributeSet.STATUS,
184: ValueAndClassForConceptTag.newInstance(
185: TraceAudit.STATUS_ACTIVE,
186: TraceAudit.STATUS_ACTIVE.getClass()));
187: }
188: else if (history.getOneTraceByStatus(
189: TraceAudit.STATUS_WAIT) != null) {
190: as.setSysAttr(AttributeSet.STATUS,
191: ValueAndClassForConceptTag.newInstance(
192: TraceAudit.STATUS_WAIT,
193: TraceAudit.STATUS_WAIT.getClass()));
194: }
195: else if (history.getOneTraceByStatus(
196: TraceAudit.STATUS_DONE) != null) {
197: as.setSysAttr(AttributeSet.STATUS,
198: ValueAndClassForConceptTag.newInstance(
199: TraceAudit.STATUS_DONE,
200: TraceAudit.STATUS_DONE.getClass()));
201: }
202: else {
203: throw new UnexpectedSystemException(
204: "Workflow does not contain a trace having one of "
205: + "the following statuses - " + TraceAudit.STATUS_EXCEPTION
206: + ", " + TraceAudit.STATUS_ACTIVE
207: + ", " + TraceAudit.STATUS_WAIT
208: + ", " + TraceAudit.STATUS_DONE + "");
209: }
210:
211: //TO DO: remove below
212: //MiscHelper.println("<!-- NEXT SNAPSHOT -->");
213: //try {
214: // String s = VersionHelper.fromWorkflowInstanceToXML(
215: // inWorkflow, inWorkflow.getStateCode());
216: // StringWriter sw = new StringWriter();
217: // XMLHelper.writeDocument(XMLHelper.loadDocument(s), sw);
218: // MiscHelper.println(sw.toString());
219: //}
220: //catch (Exception e) {
221: // e.printStackTrace();
222: //}
223: //MiscHelper.println("<!------------------->");
224: //TO DO: end remove below
225:
226: inWl.updateWorkflowInstance(inWorkflow);
227: }
228: catch (DetermineValueAndClassConceptTagException rste) {
229: MiscHelper.println(rste.getMessage());
230: rste.printStackTrace();
231: //TO DO: MAKE SURE THIS IS HANDLED!
232: }
233: */
234: }
235: }
|