public BpmnModel convertToBpmnModel(XMLStreamReader xtr) { BpmnModel model = new BpmnModel(); try { Process activeProcess = null; List<SubProcess> activeSubProcessList = new ArrayList<SubProcess>(); while (xtr.hasNext()) { try { xtr.next(); } catch (Exception e) { LOGGER.error("Error reading XML document", e); throw new XMLException("Error reading XML", e); } if (xtr.isEndElement() && ELEMENT_SUBPROCESS.equals(xtr.getLocalName())) { activeSubProcessList.remove(activeSubProcessList.size() - 1); } if (xtr.isEndElement() && ELEMENT_TRANSACTION.equals(xtr.getLocalName())) { activeSubProcessList.remove(activeSubProcessList.size() - 1); } if (xtr.isStartElement() == false) continue; if (ELEMENT_DEFINITIONS.equals(xtr.getLocalName())) { model.setTargetNamespace(xtr.getAttributeValue(null, TARGET_NAMESPACE_ATTRIBUTE)); for (int i = 0; i < xtr.getNamespaceCount(); i++) { String prefix = xtr.getNamespacePrefix(i); if (prefix != null) { model.addNamespace(prefix, xtr.getNamespaceURI(i)); } } } else if (ELEMENT_SIGNAL.equals(xtr.getLocalName())) { new SignalParser().parse(xtr, model); } else if (ELEMENT_MESSAGE.equals(xtr.getLocalName())) { new MessageParser().parse(xtr, model); } else if (ELEMENT_ERROR.equals(xtr.getLocalName())) { if (StringUtils.isNotEmpty(xtr.getAttributeValue(null, ATTRIBUTE_ID))) { model.addError( xtr.getAttributeValue(null, ATTRIBUTE_ID), xtr.getAttributeValue(null, ATTRIBUTE_ERROR_CODE)); } } else if (ELEMENT_IMPORT.equals(xtr.getLocalName())) { new ImportParser().parse(xtr, model); } else if (ELEMENT_ITEM_DEFINITION.equals(xtr.getLocalName())) { new ItemDefinitionParser().parse(xtr, model); } else if (ELEMENT_INTERFACE.equals(xtr.getLocalName())) { new InterfaceParser().parse(xtr, model); } else if (ELEMENT_IOSPECIFICATION.equals(xtr.getLocalName())) { new IOSpecificationParser().parseChildElement(xtr, activeProcess, model); } else if (ELEMENT_PARTICIPANT.equals(xtr.getLocalName())) { if (StringUtils.isNotEmpty(xtr.getAttributeValue(null, ATTRIBUTE_ID))) { Pool pool = new Pool(); pool.setId(xtr.getAttributeValue(null, ATTRIBUTE_ID)); pool.setName(xtr.getAttributeValue(null, ATTRIBUTE_NAME)); pool.setProcessRef(xtr.getAttributeValue(null, ATTRIBUTE_PROCESS_REF)); model.getPools().add(pool); } } else if (ELEMENT_PROCESS.equals(xtr.getLocalName())) { Process process = new ProcessParser().parse(xtr, model); if (process != null) { activeProcess = process; } } else if (ELEMENT_POTENTIAL_STARTER.equals(xtr.getLocalName())) { new PotentialStarterParser().parse(xtr, activeProcess); } else if (ELEMENT_LANE.equals(xtr.getLocalName())) { new LaneParser().parse(xtr, activeProcess); } else if (ELEMENT_DOCUMENTATION.equals(xtr.getLocalName())) { BaseElement parentElement = null; if (activeSubProcessList.size() > 0) { parentElement = activeSubProcessList.get(activeSubProcessList.size() - 1); } else if (activeProcess != null) { parentElement = activeProcess; } new DocumentationParser().parseChildElement(xtr, parentElement, model); } else if (ELEMENT_SUBPROCESS.equals(xtr.getLocalName())) { new SubProcessParser().parse(xtr, activeSubProcessList, activeProcess); } else if (ELEMENT_TRANSACTION.equals(xtr.getLocalName())) { new SubProcessParser().parse(xtr, activeSubProcessList, activeProcess); } else if (ELEMENT_DI_SHAPE.equals(xtr.getLocalName())) { new BpmnShapeParser().parse(xtr, model); } else if (ELEMENT_DI_EDGE.equals(xtr.getLocalName())) { new BpmnEdgeParser().parse(xtr, model); } else if (ELEMENT_EXECUTION_LISTENER.equals(xtr.getLocalName())) { new ExecutionListenerParser().parseChildElement(xtr, activeProcess, model); } else { if (activeSubProcessList.size() > 0 && ELEMENT_EXTENSIONS.equalsIgnoreCase(xtr.getLocalName())) { new ExecutionListenerParser() .parseChildElement( xtr, activeSubProcessList.get(activeSubProcessList.size() - 1), model); } else if (activeSubProcessList.size() > 0 && ELEMENT_MULTIINSTANCE.equalsIgnoreCase(xtr.getLocalName())) { new MultiInstanceParser() .parseChildElement( xtr, activeSubProcessList.get(activeSubProcessList.size() - 1), model); } else if (convertersToBpmnMap.containsKey(xtr.getLocalName())) { if (activeProcess.isExecutable()) { Class<? extends BaseBpmnXMLConverter> converterClass = convertersToBpmnMap.get(xtr.getLocalName()); BaseBpmnXMLConverter converter = converterClass.newInstance(); if (userTaskFormTypes != null && ELEMENT_TASK_USER.equals(xtr.getLocalName())) { UserTaskXMLConverter userTaskConverter = (UserTaskXMLConverter) converter; for (String formType : userTaskFormTypes) { userTaskConverter.addFormType(formType); } } else if (startEventFormTypes != null && ELEMENT_EVENT_START.equals(xtr.getLocalName())) { StartEventXMLConverter startEventConverter = (StartEventXMLConverter) converter; for (String formType : startEventFormTypes) { startEventConverter.addFormType(formType); } } converter.convertToBpmnModel(xtr, model, activeProcess, activeSubProcessList); } } } } for (Process process : model.getProcesses()) { processFlowElements(process.getFlowElements(), process); } } catch (Exception e) { LOGGER.error("Error processing BPMN document", e); throw new XMLException("Error processing BPMN document", e); } return model; }