国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

osworkflow descriptor 解析片斷

2019-11-18 11:33:27
字體:
供稿:網(wǎng)友

Osworkflow定義工作流是通過一個(gè)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>
    ...
  </initial-actions>
  <steps>
    ...
  </steps>
</workflow>

都是按照標(biāo)準(zhǔn)xml指定。通過指定的dtd來校驗(yàn)xml文件。一般需要輔助工具如xmlspy來自動(dòng)校驗(yàn)xml文件里的錯(cuò)誤,這樣會(huì)方便大家檢測(cè)xml文件中的錯(cuò)誤。

Step和actions

理解這個(gè)xml文件的第一個(gè)重點(diǎn)在于理解step和actions的在工作流系統(tǒng)中的概念。一個(gè)step就是這樣的一個(gè)概念:一個(gè)工作流中所處的不同位置。如在一個(gè)文檔治理系統(tǒng)中。可以是起草、編輯階段、發(fā)布等等。

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

Initial actions 是一個(gè)action的非凡類型。在工作流開始時(shí)候,是沒有狀態(tài)的,也沒有任何step。用戶必須利用某個(gè)action來開始流程,這個(gè)用來開始工作流的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用來描述特定step中的一個(gè)工作流的狀態(tài)。如在文檔治理系統(tǒng)當(dāng)中,我們的“第一次起草”step可以有兩個(gè)statuses,“underway”和“queued”

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

 

Step實(shí)例:在這個(gè)例子中有兩個(gè)actions。第一個(gè)action(開始第一個(gè)起草)是在一個(gè)step中進(jìn)行。但是,更改狀態(tài)為underway,第二個(gè)action是工作流流轉(zhuǎn)到下一個(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è)屬性用來指示對(duì)于當(dāng)前state(結(jié)束)將要進(jìn)入哪個(gè)history table。在絕大多數(shù)情況下,被寫為“finished”。

Conditions

Osworkflow有一些內(nèi)建的conditon。請(qǐng)參看javadocs,假如需要一個(gè)特定的condition。Condition可以接收參數(shù)。如本例就接收了一個(gè)參數(shù)“status”用來指定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被調(diào)用后才可以正確執(zhí)行。因?yàn)樗枰_信當(dāng)前status是“queued”。

 

Functions

接下來,假如我們希望指定一個(gè)用戶開始first draft,他們變?yōu)?ldquo;owner”為了達(dá)到這樣的目的,我們需要這樣做:

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

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

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

Functions能夠給當(dāng)前context添加變量。可以在其他functions或者scripts中使用。

Osworkflow 有自己內(nèi)建function。其中一個(gè)比較有用的就是“caller”。這個(gè)function的作用就是通過查找當(dāng)前的能夠調(diào)用工作流的用戶,把該用戶以字符串形式命名為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>

 

 

整合后的結(jié)果:

 

<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>

 

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 东明县| 高邑县| 府谷县| 屯留县| 邮箱| 灵武市| 湖北省| 桦南县| 昌图县| 九龙县| 和静县| 青岛市| 定边县| 兴海县| 全椒县| 黔南| 茌平县| 宜宾市| 黎平县| 镇原县| 双鸭山市| 白玉县| 阳新县| 金乡县| 荆州市| 洛隆县| 赞皇县| 鲜城| 平遥县| 沅江市| 九江市| 太谷县| 项城市| 古蔺县| 兰州市| 珠海市| 交城县| 呼伦贝尔市| 孟州市| 桂林市| 孟津县|