Wstęp

Celem projektu jest stworzenie parsera BPMN oraz YAWL. Na podstawie dostarczonego pliku wsadowego dokonywane jest rozpoznanie jego rozszerzenia. Dla odpowiedniego typu pliku wykonane zostaje rozpoznanie typów bloków oraz odwzorowanie wszystkich połączeń. Następnie wykonywane jest zliczanie każdego rodzaju bloku i wyświetlanie wyników jak również zapisanie ich do pliku tekstowego.

Opis programu

Cały program składa się z klas Parser, BpmnParser, YawlParser oraz Panel.

W klasie Parser zaimplementowane są metody do przeszukiwania oraz wypisania macierzy, w których zapisywane są dane z plików wejściowych. Wykorzystywany jest tutaj parser DOM, który przekształca dokument XML w drzewo DOM.

Parser: http://www.w3schools.com/Dom/dom_parser.asp

Klasy BpmnParser oraz YawlParser dziedziczą z klasy Parser. W klasach tych zaimplementowane są metody odpowiedzialne za wyszukiwanie odpowiednich bloczków, połączeń w plikach wejściowych.

Klasa Panel odpowiada za wyświetlanie wyników działania parsera oraz do wczytywania pliku wsadowego. Wyświetlanie tabelka jest generowana dynamicznie w zależności od zawartych danych w pliku wejściowym.

Dane wejściowe

Plikiem wejściowym do programu jest plik XPDL lub YAWL. Pierwszy z nich jest formatem XMLa (XML Process Definition Language). Jest on generowany na podstawie graficznego modelu BPMN (w naszym przypadku używaliśmy do tego programu BizAgi).

Przykładowy proces BPMN:

Proces zapisany w formacie XPDL:

<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://www.wfmc.org/2008/XPDL2.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Id="02234077-b83f-4b70-ba07-87b717e7feb8" Name="Diagram 1" OnlyOneProcess="false">
        (...)
  <Pools>
 
    <Pool Id="7c707c1e-a7f9-4e00-95dd-1a99204e842c" Name="Main Process" Process="bc6e5f63-2eeb-4887-a849-13a800d03167" BoundaryVisible="false">
        (...)
    </Pool>
 
    <Pool Id="827ae085-428d-46ee-8ebf-a7a7a133223e" Name="Process 1" Process="9463b0f9-5914-4327-8042-1f68bb18dfc0" BoundaryVisible="true">
        (...)
    </Pool>
  </Pools>
 
  <MessageFlows />
  <Associations />
  <Artifacts />
  <WorkflowProcesses>
 
    <WorkflowProcess Id="9463b0f9-5914-4327-8042-1f68bb18dfc0" Name="Process 1">
            (...)
      <ActivitySets />
 
  <!-- bloki -->
 
      <Activities>
 
        <Activity Id="77db6b36-04ca-4919-b314-c5bc46b54162" Name="">
          <Description />
          <Event>
            <StartEvent Trigger="None" />
          </Event>
            (...)
        </Activity>
 
        <Activity Id="c4c4dad5-c2e3-443e-977c-89dc240805f6" Name="">
          <Description />
          <Event>
            <EndEvent />
          </Event>
            (...)
        </Activity>
 
        <Activity Id="7d2dfa13-9624-4678-95ad-6406296515d2" Name="Zadanie 2">
          <Description />
          <Implementation>
            <Task />
          </Implementation>
            (...)
        </Activity>
 
        <Activity Id="5cd1c6ea-8fb8-4b65-a315-953652dc6dda" Name="">
          <Description />
          <Route GatewayType="AND" />
            (...)
        </Activity>
 
        <Activity Id="1dff3714-8e43-404a-b0d1-46600a6d8042" Name="Zadanie 1">
          <Description />
          <Implementation>
            <Task>
              <TaskScript>
                <Script />
              </TaskScript>
            </Task>
          </Implementation>
            (...)
        </Activity>
      </Activities>
 
 <!-- połączenia -->
 
      <Transitions>
 
        <Transition Id="d2405abb-6a1d-421e-b895-e36ea96d7f62" From="77db6b36-04ca-4919-b314-c5bc46b54162" To="1dff3714-8e43-404a-b0d1-46600a6d8042" Name="">
            (...)
        </Transition>
 
        <Transition Id="3376cde0-3bf5-428a-8eab-f587b4d8f2d0" From="1dff3714-8e43-404a-b0d1-46600a6d8042" To="5cd1c6ea-8fb8-4b65-a315-953652dc6dda" Name="">
            (...)
        </Transition>
 
        <Transition Id="f087539e-457c-4713-9c2b-74858ee30679" From="5cd1c6ea-8fb8-4b65-a315-953652dc6dda" To="c4c4dad5-c2e3-443e-977c-89dc240805f6" Name="">
            (...)
        </Transition>
 
        <Transition Id="c02b03e9-3d4a-486f-b9ce-4d488026ad87" From="77db6b36-04ca-4919-b314-c5bc46b54162" To="7d2dfa13-9624-4678-95ad-6406296515d2" Name="">
            (...)
        </Transition>
 
        <Transition Id="6c24c831-ccec-4081-a3cd-12ff60ad4e22" From="7d2dfa13-9624-4678-95ad-6406296515d2" To="5cd1c6ea-8fb8-4b65-a315-953652dc6dda" Name="">
            (...)
        </Transition>
      </Transitions>
 
      <ExtendedAttributes />
    </WorkflowProcess>
  </WorkflowProcesses>
  <ExtendedAttributes />
</Package>

Drugi format jest tworzony na podstawie modelu BPM. Skrót można rozwinąć jako Yet Another Workflow Language (YAWL).

Przykładowy proces BPM:

Proces zapisany w formacie YAWL:

<?xml version="1.0" encoding="UTF-8"?>
<specificationSet xmlns="http://www.yawlfoundation.org/yawlschema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.2" xsi:schemaLocation="http://www.yawlfoundation.org/yawlschema http://www.yawlfoundation.org/yawlschema/YAWL_Schema2.2.xsd">
  <specification uri="wzor">
    (...)
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" />
    <decomposition id="New_Net_1" isRootNet="true" xsi:type="NetFactsType">
 
      <processControlElements>
 
        <!-- bloczek -->
 
        <inputCondition id="InputCondition_1">
 
          <!-- połączenia -->
 
          <flowsInto>
            <nextElementRef id="zadanie_2_4" />
          </flowsInto>
 
          <flowsInto>
            <nextElementRef id="zadanie_1_3" />
          </flowsInto>
 
        </inputCondition>
 
        <!-- bloczek -->
 
        <task id="zadanie_1_3">
          <name>zadanie 1</name>
 
          <!-- połączenie -->
 
          <flowsInto>
            <nextElementRef id="zadanie_3_6" />
          </flowsInto>
 
          <join code="xor" />
          <split code="and" />
        </task>
 
        <!-- bloczek -->
 
        <task id="zadanie_2_4">
          <name>zadanie 2</name>
 
          <!-- połączenie -->
 
          <flowsInto>
            <nextElementRef id="zadanie_3_6" />
          </flowsInto>
 
          <join code="xor" />
          <split code="and" />
        </task>
 
        <!-- bloczek -->
 
        <task id="zadanie_3_6">
          <name>zadanie 3</name>
 
          <!-- połączenie -->
 
          <flowsInto>
            <nextElementRef id="OutputCondition_2" />
          </flowsInto>
 
          <join code="or" />
          <split code="and" />
        </task>
 
        <!-- bloczek -->
 
        <outputCondition id="OutputCondition_2" />
 
      </processControlElements>
    </decomposition>
  </specification>
  <layout>
    (...)
  </layout>
</specificationSet>

Działanie programu

Klikając przycisk Wybierz Plik wybieramy plik wsadowy typu XPDL lub YAWL. Następnie klikając Przetwórz program wyszukuje wszystkie rodzaje bloków i zlicza ich ilości. Podliczone bloki występujące w pliku wsadowym wyświetlane są w postaci tabelki widocznej w głównym panelu. Ponadto zapisywane jest to również do pliku tekstowego. Oprócz zliczonych bloczków, znajdują się tam również informacje o połączeniach pomiędzy nimi.

Dla XPDL wyszukuje wśród Activities. Można tu wyróżnić typy Task (np. Task Send, Task User, Task Service), Gate(np. OR, AND, Complex) oraz Event (np. Start Event, End Event, Message, Timer). Informacje o połączeniach między blokami wyszukiwane są pośród Transitions.

Dla YAWL wyszukuje wśród processControlElements. Można wyróżnić typy Task, gdzie join (wejście) oraz split (wyjście) może być AND, OR lub XOR. Możliwe są jeszcze typy Normal/Input/Output Condition. Informacje o połączeniach między blokami znajdują się pomiędzy flowsInto.

Program nie przyjmuje innych typów pliku. W przypadku podania innego pliku, zwracany zostaje komunikat Niepoprawne rozszerzenie pliku. W przypadku zgodności rozszerzenia lecz wyłapania nieprawidołowości program zgłasza komunikat Plik uszkodzony.

Przykład

Na wejście programu wczytywany jest plik XPDL, będący odwzorowaniem poniższego procesu BPMN.

Na wyjściu otrzymujemy:

oraz plik tekstowy z odwzorowaniem wszystkich połączeń oraz zestawieniem typów bloków:km_out.txt

Równoważnie dla pliku YAWL, będącego odwzorowaniem poniższego procesu BPM.

Na wyjściu otrzymujemy:

oraz plik tekstowy z odwzorowaniem wszystkich połączeń oraz zestawieniem typów bloków:km_out2.txt

Kompilacja

Program został napisany w Javie. Użyto do tego środowiska NetBeans. Aby skompilować program należy otworzyć projekt, a następnie klikając na ten projekt prawym przyciskiem, wybrać opcję Build, a po zakończeniu Run.

Źródło oraz plik wykonywalny programu:bpmn_tool_v2.rar

Przykładowy plik wsadowy: km_in.rar

Wykorzystane środowisko programowania: http://www.oracle.com/us/technologies/java

pl/dydaktyka/miw/2011/bpmnparsepro.txt · ostatnio zmienione: 2017/07/17 08:08 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0