欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
osworkflow descriptor 解析片斷

Osworkflow定義工作流是通過(guò)一個(gè)xml文件來(lái)完成的,你可以把它取成任何你想要的名字。大致框架如下:

<?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>
    ...
  </initial-actions>
  <steps>
    ...
  </steps>
</workflow>

都是按照標準xml指定。通過(guò)指定的dtd來(lái)校驗xml文件。一般需要輔助工具如xmlspy來(lái)自動(dòng)校驗xml文件里的錯誤,這樣會(huì )方便大家檢測xml文件中的錯誤。

Stepactions

理解這個(gè)xml文件的第一個(gè)重點(diǎn)在于理解stepactions的在工作流系統中的概念。一個(gè)step就是這樣的一個(gè)概念:一個(gè)工作流中所處的不同位置。如在一個(gè)文檔管理系統中??梢允瞧鸩?、編輯階段、發(fā)布等等。

Actions指定不同step中的變遷。還是用例子來(lái)理解更為形象一些。在一個(gè)文檔管理系統當中如在“第一個(gè)起草”中的“開(kāi)始第一個(gè)起草”和“結束第一個(gè)起草”就是actions。

Initial actions 是一個(gè)action的特殊類(lèi)型。在工作流開(kāi)始時(shí)候,是沒(méi)有狀態(tài)的,也沒(méi)有任何step。用戶(hù)必須利用某個(gè)action來(lái)開(kāi)始流程,這個(gè)用來(lái)開(kāi)始工作流的action就被指定為initial-actions。

例如,我們假定我們只有一個(gè)initial-action,非常簡(jiǎn)單,如下面:

<action id="1" name="Start Workflow">
  <results>
    <unconditional-result old-status="Finished" status="Queued" step="1"/>
  </results>
</action>

這個(gè)action是個(gè)action的最簡(jiǎn)單的例子。他只是簡(jiǎn)單定義我們需要走想的step。

工作流status

Status用來(lái)描述特定step中的一個(gè)工作流的狀態(tài)。如在文檔管理系統當中,我們的“第一次起草”step可以有兩個(gè)statuses,“underway”和“queued

用“queued”來(lái)指示此條已經(jīng)在“first draft”中排隊。沒(méi)有安排誰(shuí)來(lái)處理此文檔,但是已經(jīng)發(fā)出請求。而“underway”是指示一個(gè)作者已經(jīng)從隊列中取出此文檔并且或許已經(jīng)上鎖。表明正在first draft上工作。

Step實(shí)例:在這個(gè)例子中有兩個(gè)actions。第一個(gè)action(開(kāi)始第一個(gè)起草)是在一個(gè)step中進(jìn)行。但是,更改狀態(tài)為underway,第二個(gè)action是工作流流轉到下一個(gè)step,我們假定下一個(gè)工作流step為“finish”。

<step id="1" name="First Draft">
  <actions>
    <action id="1" name="Start First Draft">
      <results>
        <unconditional-result old-status="Finished" status="Underway" step="1"/>
      </results>
    </action>
    <action id="2" name="Finish First Draft">
      <results>
        <unconditional-result old-status="Finished" status="Queued" step="2"/>
      </results>
    </action>
  </actions>
</step>
<step id="2" name="finished" />

Old-status這個(gè)屬性用來(lái)指示對于當前state(結束)將要進(jìn)入哪個(gè)history table。在絕大多數情況下,被寫(xiě)為“finished”。

Conditions

Osworkflow有一些內建的conditon。請參看javadocs,如果需要一個(gè)特定的condition。Condition可以接收參數。如本例就接收了一個(gè)參數“status”用來(lái)指定status

<action id="1" name="Start First Draft">

  <restrict-to>

    <conditions>

      <condition type="class">

        <arg name="class.name">

          com.opensymphony.workflow.util.StatusCondition

        </arg>

        <arg name="status">Queued</arg>

      </condition>

    </conditions>

  </restrict-to>

  <results>

    <unconditional-result old-status="Finished" status="Underway" step="1"/>

  </results>

</action>

這樣就能保證在initial action被調用后才可以正確執行。因為它需要確信當前status是“queued”。

Functions

接下來(lái),如果我們希望指定一個(gè)用戶(hù)開(kāi)始first draft,他們變?yōu)?#8220;owner”為了達到這樣的目的,我們需要這樣做:

1、在當前context中防止一個(gè)“caller”變量

2、  設置result的“owner”屬性為call變量。

function是osworkflow的一個(gè)非常強大的特征,一個(gè)function基本上是一個(gè)系列在工作流變遷之間執行的工作,并不影響工作流本身。例如,你能夠有個(gè)sendmail功能,它的職責就是當一個(gè)特定的變遷發(fā)生后發(fā)送郵件通知。

Functions能夠給當前context添加變量??梢栽谄渌鹒unctions或者scripts中使用。

Osworkflow 有自己內建function。其中一個(gè)比較有用的就是“caller”。這個(gè)function的作用就是通過(guò)查找當前的能夠調用工作流的用戶(hù),把該用戶(hù)以字符串形式命名為caller變量的值。

<action id="1" name="Start First Draft">

  <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="Underway"

                                       step="1" owner="${caller}"/>

  </results>

</action>

整合后的結果:

<action id="1" name="Start First Draft">

  <restrict-to>

    <conditions>

      <condition type="class">

        <arg name="class.name">

                com.opensymphony.workflow.util.StatusCondition

        </arg>

        <arg name="status">Queued</arg>

      </condition>

    </conditions>

  </restrict-to>

  <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="Underway"

                                       step="1"  owner="${caller}"/>

  </results>

</action>

<action id="2" name="Finish First Draft">

  <restrict-to>

    <conditions type="AND">

      <condition type="class">

        <arg

        name="class.name">com.opensymphony.workflow.util.StatusCondition

        </arg>

        <arg name="status">Underway</arg>

      </condition>

      <condition type="class">

        <arg name="class.name">

              com.opensymphony.workflow.util.AllowOwnerOnlyCondition

       </arg>

      </condition>

    </conditions>

  </restrict-to>

  <results>

    <unconditional-result old-status="Finished" status="Queued" step="2"/>

  </results>

</action>

如果我們想要確保僅僅當用戶(hù)開(kāi)始first draft才能完成它(我們在以前的result的owner屬性中指定)。Status condition同樣確保“finish first draft” action只能在狀態(tài)為“underway”的情況下才可以被執行。這就確保必須得有一個(gè)用戶(hù)已經(jīng)開(kāi)始第一個(gè)起草工作。

<?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="1" name="Start Workflow">
      <results>
        <unconditional-result old-status="Finished" status="Queued" step="1"/>
      </results>
    </action>
  </initial-actions>
  <steps>
    <step id="1" name="First Draft">
      <actions>
        <action id="1" name="Start First Draft">
          <restrict-to>
            <conditions>
              <condition type="class">
                <arg name="class.name">
                   com.opensymphony.workflow.util.StatusCondition
                </arg>
                <arg name="status">Queued</arg>
              </condition>
            </conditions>
          </restrict-to>
          <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="Underway" 
                                           step="1"  owner="${caller}"/>
          </results>
        </action>
        <action id="2" name="Finish First Draft">
          <restrict-to>
            <conditions type="AND">
              <condition type="class">
                <arg name="class.name">
                    com.opensymphony.workflow.util.StatusCondition
                </arg>
                <arg name="status">Underway</arg>
              </condition>
              <condition type="class">
                <arg name="class.name">
                  com.opensymphony.workflow.util.AllowOwnerOnlyCondition
                </arg>
              </condition>
            </conditions>
          </restrict-to>
          <results>
            <unconditional-result old-status="Finished" status="Queued" step="2"/>
          </results>
        </action>
      </actions>
    </step>
    <step id="2" name="finished" />
  </steps>
</workflow>

創(chuàng )建osworkflow.xml,例子如下:

<osworkflow>

  <persistence class="com.opensymphony.workflow.spi.memory.MemoryWorkflowStore"/>

  <factory class="com.opensymphony.workflow.loader.XMLWorkflowFactory">

    <property name="resource" value="workflows.xml" />

  </factory>

</osworkflow>

指定使用內存數據庫。即非永久保存性質(zhì)。用做測試目的,這樣做足夠了。

Factory概念

上面的xml文件同時(shí)指定了xml workflowfactory。Workflow factory是用來(lái)管理workflowworkflow描述符。Xml workflow factory有一個(gè)特定屬性叫做“resource”它用來(lái)指定在哪里可以找到xml文件,這個(gè)resource必須從classpath中加載,所以對于上面的例子,你將要創(chuàng )建一個(gè)文件名為workflows.xml的文件追加到classpath中。文件樣本如下;

<workflows>

  <workflow name="mytest" type="resource" location="myworkflow.xml"/>

</workflows>

所以,你還需要一個(gè)myworkflow.xml,

到此,我們完成了配置,首先初始化然后調用我們的workflow。

Initializing osworkflow

Osworkflow有一個(gè)相對簡(jiǎn)單的的調用模式,有一個(gè)main入口,這個(gè)main入口點(diǎn)是workflow的接口,經(jīng)常是作為實(shí)現AbstractWorkflow的子類(lèi)。

首先,我們創(chuàng )建我們自己的工作流。這個(gè)對象應該存儲在一個(gè)通用區域,并且能夠被重復使用。這樣做的一個(gè)辦法就是做一個(gè)static。BasicWorkflow的構造器參數是一個(gè)當前調用者的。

需要初始化和配置工作流的session,

Workflow workflow = new BasicWorkflow("testuser");

DefaultConfiguration config = new DefaultConfiguration();

workflow.setConfiguration(config);

調用初始化方法:

long workflowId = workflow.initialize("mytest", 1, null);

參數含義:工作流名字,actionid,action。

校驗工作流:

現在我們完成初始化工作流實(shí)例,我們期待著(zhù)他的表現是我們所期待那樣的。

Collection currentSteps = workflow.getCurrentSteps(workflowId);

//verify we only have one current step

assertEquals("Unexpected number of current steps", 1, currentSteps.size());

//verify it‘s step 1

Step currentStep = (Step)currentSteps.iterator().next();

assertEquals("Unexpected current step", 1, currentStep.getStepId());

int[] availableActions = workflow.getAvailableActions(workflowId);

//verify we only have one available action

assertEquals("Unexpected number of available actions", 1, availableActions.length);

//verify it‘s action 1

assertEquals("Unexpected available action", 1, availableActions[0]);

調用action

workflow.doAction(workflowId, 1, null);


本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
工作流(OSWorkFLOW)的例子改造
JR - 精品文章 - OSWorkFlow分析
OSWorkflow使用問(wèn)答
WebWork Interceptor
SAP與外部WebService接口的鏈接
過(guò)濾器和攔截器的比較及未登錄用戶(hù)權限限制的實(shí)現
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久