All Downloads are FREE. Search and download functionalities are using the official Maven repository.

nablarch.tool.workflow.bpmn.BpmnWorkflowDefinitionReader Maven / Gradle / Ivy

The newest version!
package nablarch.tool.workflow.bpmn;

import java.io.File;
import java.net.URL;

import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.validation.SchemaFactory;

import org.omg.spec.bpmn._20100524.model.TDefinitions;

import nablarch.core.util.FileUtil;
import nablarch.integration.workflow.definition.WorkflowDefinition;
import nablarch.tool.workflow.WorkflowDefinitionException;
import nablarch.tool.workflow.WorkflowDefinitionFile;
import nablarch.tool.workflow.WorkflowDefinitionReader;

/**
 * BPMN2.0に準拠したファイルからワークフロー定義情報を読み込むクラス。
 *
 * @author Satoshi Taromaru
 * @since 1.4.2
 */
public class BpmnWorkflowDefinitionReader implements WorkflowDefinitionReader {

    /**
     * ワークフロー定義ファイルからワークフロー定義情報へ変換するオブジェクト。
     */
    private final Unmarshaller unmarshaller;

    /**
     * コンストラクタ。
     */
    public BpmnWorkflowDefinitionReader() {
        unmarshaller = createUnmarshaller();
    }

    @Override
    @SuppressWarnings("unchecked")
    public WorkflowDefinition load(WorkflowDefinitionFile definitionFile) {
        JAXBElement obj;
        try {
            BpmnWorkflowDefinitionValidationEventHandler eventHandler = new BpmnWorkflowDefinitionValidationEventHandler();
            unmarshaller.setEventHandler(eventHandler);
            obj = (JAXBElement) unmarshaller.unmarshal(new File(definitionFile.getPath()));
            if (eventHandler.hasAnomalyDetection()) {
                throw new WorkflowDefinitionException(eventHandler.getErrorMessages());
            }
        } catch (JAXBException e) {
            throw new RuntimeException(e);
        }
        TDefinitions definition = obj.getValue();
        BpmnWorkflowDefinitionValidator validator = new BpmnWorkflowDefinitionValidator();
        validator.validateWorkflowDefinition(definition);
        return new BpmnWorkflowDefinitionConverter().convertToWorkflowDefinition(definition, definitionFile.getWorkflowId(),
                definitionFile.getWorkflowName(), Integer.parseInt(definitionFile.getVersion()), definitionFile.getEffectiveDate());
    }

    /**
     * ワークフロー定義情報へ変換するためのオブジェクトを生成する。
     *
     * @return 変換用オブジェクト
     */
    private Unmarshaller createUnmarshaller() {
        Unmarshaller unmarshaller;
        try {
            JAXBContext ctx = JAXBContext.newInstance("org.omg.spec.bpmn._20100524.di"
                    + ":org.omg.spec.bpmn._20100524.model"
                    + ":org.omg.spec.dd._20100524.dc"
                    + ":org.omg.spec.dd._20100524.di");
            unmarshaller = ctx.createUnmarshaller();

            SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            URL resource = FileUtil.getClasspathResourceURL("workflow/bpmn/BPMN20.xsd");
            unmarshaller.setSchema(factory.newSchema(resource));
        } catch (Exception e) {
            throw new RuntimeException("Failed to create Unmarshaller.", e);
        }
        return unmarshaller;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy