在workflow執行的過程中,有時需要做一些條件的檢查,例如,公司員工編號都是四碼,如果有個工作流的員工編號只有三碼,就要能檢查出來,下面我們就來做這樣的檢查,各位可以試著用四碼的員工編號請假,確定可以通過檢查後,再用非四碼的員工編號測試,將會出現最後面顯示的exception。
  • 程式
    leave.xml
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE workflow PUBLIC "-//OpenSymphony Group//DTD OSWorkflow 2.7//EN" 
    "http://www.opensymphony.com/osworkflow/workflow_2_7.dtd">
    <workflow>
      <initial-actions>
       <action id="0" name="開始">
          <pre-functions>
      	<function type="class">
        	  <arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
        	</function>
            <function type="beanshell">
               <arg name="script">
                  propertySet.setString("type", transientVars.get("type"));
                  propertySet.setString("employee", transientVars.get("caller"));
               </arg>
            </function>
          </pre-functions>
          <results>
            <unconditional-result old-status="Finished" status="Queued" 
    step="1" owner="${caller}" />
          </results>
          <post-functions>
                <function type="class">
                  <arg name="class.name">
                  	tw.idv.idealist.OutputPropertySet
                  </arg>
                  <arg name="author">Steven Shi</arg>
                </function>
          </post-functions>
        </action>
      </initial-actions>
    
      <steps>
        <step id="1" name="填假單">
          <actions>
            <action id="1" name="送出">
              <restrict-to>
                <conditions>
                  <condition type="class">
                    <arg name="class.name">
                      com.opensymphony.workflow.util.AllowOwnerOnlyCondition
                    </arg>
                  </condition>
                </conditions>
              </restrict-to>
    		<validators>
    		  <validator type="class">
    		    <arg name="class.name">
    		      tw.idv.idealist.MyValidator
    		    </arg>
    		  </validator>
    		</validators>
              <pre-functions>
    	    <function type="class">
    	      <arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
    	    </function>
              </pre-functions>
              <results>
                <unconditional-result old-status="Finished" status="Queued" 
    step="2"  owner="${caller}" />
              </results>
            </action>
          </actions>
        </step>
    
        <step id="2" name="批假單">
          <actions>
            <action id="2" name="准許">
    	<pre-functions>
    	  <function type="class">
    	    <arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
    	  </function>
    	</pre-functions>
            <results>
                <unconditional-result old-status="Finished" status="Queued" 
    step="3"  owner="${caller}"/>
            </results>
            </action>
    
            <action id="3" name="駁回">
              <pre-functions>
    	    <function type="class">
    	      <arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
    	    </function>
    	  </pre-functions>
              <results>
                <unconditional-result old-status="Finished" status="Queued" 
    step="1"  owner="${caller}"/>
              </results>
            </action>
          </actions>      
        </step>
    
        <step id="3" name="停止" />
      </steps>
    </workflow>
    MyValidator.java
    package tw.idv.idealist;
    
    import java.util.Map;
    import com.opensymphony.module.propertyset.PropertySet;
    import com.opensymphony.workflow.InvalidInputException;
    import com.opensymphony.workflow.Validator;
    import com.opensymphony.workflow.WorkflowException;
    
    /**
     * @author steven
     */
    public class MyValidator implements Validator {
    
    	public void validate(Map transientVars, Map args, PropertySet ps) 
    		throws InvalidInputException, WorkflowException {
    		if (ps.getString("employee").length() != 4) {
    			throw new InvalidInputException("員工編號錯誤");
    		}
    	}
    
    }
    
  • Exception
    當輸入的員工編號非四碼時,會有如下錯誤…
    [InvalidInputException: [Error map: [{}]] [Error list: [[員工編號錯誤]]]
    	at tw.idv.idealist.MyValidator.validate(MyValidator.java:17)
    	at com.opensymphony.workflow.AbstractWorkflow.verifyInputs(AbstractWorkflow.java:1025)
    	at com.opensymphony.workflow.AbstractWorkflow.transitionWorkflow(AbstractWorkflow.java:1248)
    	at com.opensymphony.workflow.AbstractWorkflow.doAction(AbstractWorkflow.java:551)
    	at tw.idv.idealist.Leave.send(Leave.java:55)
    	at tw.idv.idealist.actions.LeaveAction.doPost(LeaveAction.java:26)
    	at tw.idv.idealist.actions.LeaveAction.doGet(LeaveAction.java:17)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:256)
    	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    	at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2422)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
    	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    	at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:171)
    	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:163)
    	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
    	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
    	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    	at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:199)
    	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:828)
    	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:700)
    	at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:584)
    	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
    	at java.lang.Thread.run(Thread.java:534)