Skip to content

Commit

Permalink
BZ-1187079 - BPM cluster: Unexpected error while deploying unit, Unab…
Browse files Browse the repository at this point in the history
…le to read process definition
  • Loading branch information
mswiderski committed Feb 2, 2015
1 parent 02a06d7 commit 471919f
Show file tree
Hide file tree
Showing 11 changed files with 195 additions and 144 deletions.
Expand Up @@ -23,31 +23,24 @@


public class AbstractTaskGetInformationHandler extends TaskHandler { public class AbstractTaskGetInformationHandler extends TaskHandler {


private ProcessDescRepoHelper repositoryHelper; private BPMN2DataServiceSemanticModule module;
private ProcessDescriptionRepository repository; private ProcessDescriptionRepository repository;




public AbstractTaskGetInformationHandler(ProcessDescRepoHelper repoHelper, ProcessDescriptionRepository repo) { public AbstractTaskGetInformationHandler(BPMN2DataServiceSemanticModule module) {
this.repository = repo; this.module = module;
this.repositoryHelper = repoHelper; this.repository = module.getRepo();
} }


@Override @Override
protected void handleNode(final org.jbpm.workflow.core.Node node, final Element element, final String uri, protected void handleNode(final org.jbpm.workflow.core.Node node, final Element element, final String uri,
final String localName, final ExtensibleXmlParser parser) throws SAXException { final String localName, final ExtensibleXmlParser parser) throws SAXException {
super.handleNode(node, element, uri, localName, parser); super.handleNode(node, element, uri, localName, parser);
String name = super.getTaskName(element); String name = super.getTaskName(element);
String mainProcessId = repositoryHelper.getProcess().getId(); String mainProcessId = module.getRepoHelper().getProcess().getId();
repository.getProcessDesc(mainProcessId).getServiceTasks().put(node.getName(), name); repository.getProcessDesc(mainProcessId).getServiceTasks().put(node.getName(), name);


} }




public void setRepositoryHelper(ProcessDescRepoHelper repositoryHelper) {
this.repositoryHelper = repositoryHelper;
}


public void setRepository(ProcessDescriptionRepository repository) { public void setRepository(ProcessDescriptionRepository repository) {
this.repository = repository; this.repository = repository;
Expand Down
Expand Up @@ -45,6 +45,7 @@
public class BPMN2DataServiceImpl implements DefinitionService { public class BPMN2DataServiceImpl implements DefinitionService {


private static final Logger logger = LoggerFactory.getLogger(BPMN2DataServiceImpl.class); private static final Logger logger = LoggerFactory.getLogger(BPMN2DataServiceImpl.class);
private static final BPMN2DataServiceSemanticModule MODULE = new BPMN2DataServiceSemanticModule();


private ConcurrentHashMap<String, Map<String, ProcessDescRepoHelper>> definitionCache = private ConcurrentHashMap<String, Map<String, ProcessDescRepoHelper>> definitionCache =
new ConcurrentHashMap<String, Map<String, ProcessDescRepoHelper>>(); new ConcurrentHashMap<String, Map<String, ProcessDescRepoHelper>>();
Expand Down Expand Up @@ -75,58 +76,61 @@ public ProcessDefinition buildProcessDefinition(String deploymentId,String bpmn2
if (StringUtils.isEmpty(bpmn2Content)) { if (StringUtils.isEmpty(bpmn2Content)) {
return null; return null;
} }
BPMN2DataServiceSemanticModule module = new BPMN2DataServiceSemanticModule();
BPMN2ProcessProvider provider = getProvider(module); BPMN2ProcessProvider provider = getProvider(MODULE);
BPMN2ProcessProvider originalProvider = BPMN2ProcessFactory.getBPMN2ProcessProvider(); BPMN2ProcessProvider originalProvider = BPMN2ProcessFactory.getBPMN2ProcessProvider();
if (originalProvider != provider) { if (originalProvider != provider) {
BPMN2ProcessFactory.setBPMN2ProcessProvider(provider); BPMN2ProcessFactory.setBPMN2ProcessProvider(provider);
} }
try {
BPMN2DataServiceSemanticModule.setRepoHelper(new ProcessDescRepoHelper());
KnowledgeBuilder kbuilder = null;
if (classLoader != null) {
KnowledgeBuilderConfigurationImpl pconf = new KnowledgeBuilderConfigurationImpl(classLoader);
kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(pconf);
} else {
kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
}
kbuilder.add(new ByteArrayResource(bpmn2Content.getBytes()), ResourceType.BPMN2);
if (kbuilder.hasErrors()) {
for(KnowledgeBuilderError error: kbuilder.getErrors()){
logger.error("Error: {}", error.getMessage());
}
logger.debug("Process Cannot be Parsed! \n {} \n", bpmn2Content);
return null;
}


KnowledgeBuilder kbuilder = null; KnowledgePackage pckg = kbuilder.getKnowledgePackages().iterator().next();
if (classLoader != null) {
KnowledgeBuilderConfigurationImpl pconf = new KnowledgeBuilderConfigurationImpl(classLoader); org.kie.api.definition.process.Process process = pckg.getProcesses().iterator().next();
kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(pconf);
} else { ProcessDescRepoHelper helper = MODULE.getRepo().removeProcessDescription(process.getId());
kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); ProcessAssetDesc definition = helper.getProcess();
}
kbuilder.add(new ByteArrayResource(bpmn2Content.getBytes()), ResourceType.BPMN2); definition.setAssociatedEntities(helper.getTaskAssignments());
if (kbuilder.hasErrors()) { definition.setProcessVariables(helper.getInputs());
for(KnowledgeBuilderError error: kbuilder.getErrors()){ definition.setReusableSubProcesses(helper.getReusableSubProcesses());
logger.error("Error: {}", error.getMessage()); definition.setServiceTasks(helper.getServiceTasks());
}
logger.debug("Process Cannot be Parsed! \n {} \n", bpmn2Content); // cache the data if requested
return null; if (cache) {
} Map<String, ProcessDescRepoHelper> definitions = null;

synchronized (definitionCache) {
BPMN2ProcessFactory.setBPMN2ProcessProvider(originalProvider); definitions = definitionCache.get(deploymentId);

if (definitions == null) {
KnowledgePackage pckg = kbuilder.getKnowledgePackages().iterator().next(); definitions = new ConcurrentHashMap<String, ProcessDescRepoHelper>();

definitionCache.put(deploymentId, definitions);
org.kie.api.definition.process.Process process = pckg.getProcesses().iterator().next(); }

definitions.put(process.getId(), helper);
ProcessDescRepoHelper helper = module.getRepo().removeProcessDescription(process.getId()); }
ProcessAssetDesc definition = helper.getProcess(); }


definition.setAssociatedEntities(helper.getTaskAssignments());
definition.setProcessVariables(helper.getInputs()); return definition;
definition.setReusableSubProcesses(helper.getReusableSubProcesses()); } finally {
definition.setServiceTasks(helper.getServiceTasks()); BPMN2ProcessFactory.setBPMN2ProcessProvider(originalProvider);

BPMN2DataServiceSemanticModule.dispose();
// cache the data if requested
if (cache) {
Map<String, ProcessDescRepoHelper> definitions = null;
synchronized (definitionCache) {
definitions = definitionCache.get(deploymentId);
if (definitions == null) {
definitions = new ConcurrentHashMap<String, ProcessDescRepoHelper>();
definitionCache.put(deploymentId, definitions);
}
definitions.put(process.getId(), helper);
}
} }


return definition;
} }


@Override @Override
Expand Down
Expand Up @@ -19,18 +19,26 @@


public class BPMN2DataServiceSemanticModule extends BPMNSemanticModule { public class BPMN2DataServiceSemanticModule extends BPMNSemanticModule {


private ProcessDescRepoHelper repoHelper = new ProcessDescRepoHelper(); private static ThreadLocal<ProcessDescRepoHelper> helper = new ThreadLocal<ProcessDescRepoHelper>();

// private ProcessDescRepoHelper repoHelper = new ProcessDescRepoHelper();
private ProcessDescriptionRepository repo = new ProcessDescriptionRepository(); private ProcessDescriptionRepository repo = new ProcessDescriptionRepository();


private HumanTaskGetInformationHandler taskHandler = new HumanTaskGetInformationHandler(repoHelper, repo); private HumanTaskGetInformationHandler taskHandler = null;
private ProcessGetInformationHandler processHandler = new ProcessGetInformationHandler(repoHelper, repo); private ProcessGetInformationHandler processHandler = null;
private ProcessGetInputHandler processInputHandler = new ProcessGetInputHandler(repoHelper, repo); private ProcessGetInputHandler processInputHandler = null;
private GetReusableSubProcessesHandler reusableSubprocessHandler = new GetReusableSubProcessesHandler(repoHelper, repo); private GetReusableSubProcessesHandler reusableSubprocessHandler = null;
private DataServiceItemDefinitionHandler itemDefinitionHandler = new DataServiceItemDefinitionHandler(repoHelper, repo); private DataServiceItemDefinitionHandler itemDefinitionHandler = null;
private AbstractTaskGetInformationHandler abstractTaskHandler = new AbstractTaskGetInformationHandler(repoHelper, repo); private AbstractTaskGetInformationHandler abstractTaskHandler = null;


public BPMN2DataServiceSemanticModule() { public BPMN2DataServiceSemanticModule() {
super(); super();
taskHandler = new HumanTaskGetInformationHandler(this);
processHandler = new ProcessGetInformationHandler(this);
processInputHandler = new ProcessGetInputHandler(this);
reusableSubprocessHandler = new GetReusableSubProcessesHandler(this);
itemDefinitionHandler = new DataServiceItemDefinitionHandler(this);
abstractTaskHandler = new AbstractTaskGetInformationHandler(this);
init(); init();
} }


Expand Down Expand Up @@ -68,11 +76,11 @@ public void init(){
} }


public ProcessDescRepoHelper getRepoHelper() { public ProcessDescRepoHelper getRepoHelper() {
return repoHelper; return helper.get();
} }


public void setRepoHelper(ProcessDescRepoHelper repoHelper) { public static void setRepoHelper(ProcessDescRepoHelper repoHelper) {
this.repoHelper = repoHelper; helper.set(repoHelper);
} }


public ProcessDescriptionRepository getRepo() { public ProcessDescriptionRepository getRepo() {
Expand All @@ -81,6 +89,10 @@ public ProcessDescriptionRepository getRepo() {


public void setRepo(ProcessDescriptionRepository repo) { public void setRepo(ProcessDescriptionRepository repo) {
this.repo = repo; this.repo = repo;
} }

public static void dispose() {
helper.set(null);
}


} }
Expand Up @@ -24,13 +24,12 @@


public class DataServiceItemDefinitionHandler extends ItemDefinitionHandler { public class DataServiceItemDefinitionHandler extends ItemDefinitionHandler {


private ProcessDescRepoHelper repositoryHelper; private BPMN2DataServiceSemanticModule module;
private ProcessDescriptionRepository repository; private ProcessDescriptionRepository repository;


public DataServiceItemDefinitionHandler(ProcessDescRepoHelper repositoryHelper, public DataServiceItemDefinitionHandler(BPMN2DataServiceSemanticModule module) {
ProcessDescriptionRepository repository) { this.module = module;
this.repositoryHelper = repositoryHelper; this.repository = module.getRepo();
this.repository = repository;
} }


@Override @Override
Expand All @@ -40,24 +39,17 @@ public Object start(final String uri, final String localName,
ItemDefinition item = (ItemDefinition) super.start(uri, localName, attrs, parser); ItemDefinition item = (ItemDefinition) super.start(uri, localName, attrs, parser);
String id = item.getId(); String id = item.getId();
String structureRef = item.getStructureRef(); String structureRef = item.getStructureRef();
String itemDefinitionId = repository.getGlobalItemDefinitions().get(id); String itemDefinitionId = module.getRepoHelper().getGlobalItemDefinitions().get(id);
if(itemDefinitionId == null){ if(itemDefinitionId == null){
repository.getGlobalItemDefinitions().put(id, structureRef); module.getRepoHelper().getGlobalItemDefinitions().put(id, structureRef);
} }


return item; return item;


} }


public void setRepositoryHelper(ProcessDescRepoHelper repositoryHelper) {
this.repositoryHelper = repositoryHelper;
}

public void setRepository(ProcessDescriptionRepository repository) { public void setRepository(ProcessDescriptionRepository repository) {
this.repository = repository; this.repository = repository;
} }





} }
Expand Up @@ -28,27 +28,22 @@ public class GetReusableSubProcessesHandler extends CallActivityHandler {


private ProcessDescriptionRepository repository; private ProcessDescriptionRepository repository;


private ProcessDescRepoHelper repositoryHelper; private BPMN2DataServiceSemanticModule module;


public GetReusableSubProcessesHandler(ProcessDescRepoHelper repoHelper, ProcessDescriptionRepository repo) { public GetReusableSubProcessesHandler(BPMN2DataServiceSemanticModule module) {
this.repository = repo; this.module = module;
this.repositoryHelper = repoHelper; this.repository = module.getRepo();
} }


@Override @Override
protected void handleNode(Node node, Element element, String uri, protected void handleNode(Node node, Element element, String uri,
String localName, ExtensibleXmlParser parser) throws SAXException { String localName, ExtensibleXmlParser parser) throws SAXException {
super.handleNode(node, element, uri, localName, parser); super.handleNode(node, element, uri, localName, parser);
String mainProcessId = repositoryHelper.getProcess().getId(); String mainProcessId = module.getRepoHelper().getProcess().getId();
SubProcessNode subProcess = (SubProcessNode) node; SubProcessNode subProcess = (SubProcessNode) node;
repository.getProcessDesc(mainProcessId).getReusableSubProcesses().add(subProcess.getProcessId()); repository.getProcessDesc(mainProcessId).getReusableSubProcesses().add(subProcess.getProcessId());
} }



public void setRepositoryHelper(ProcessDescRepoHelper repositoryHelper) {
this.repositoryHelper = repositoryHelper;
}

public void setRepository(ProcessDescriptionRepository repository) { public void setRepository(ProcessDescriptionRepository repository) {
this.repository = repository; this.repository = repository;
} }
Expand Down
Expand Up @@ -32,8 +32,9 @@


public class HumanTaskGetInformationHandler extends UserTaskHandler { public class HumanTaskGetInformationHandler extends UserTaskHandler {


private ProcessDescRepoHelper repositoryHelper;
private ProcessDescriptionRepository repository; private ProcessDescriptionRepository repository;

private BPMN2DataServiceSemanticModule module;


/** /**
* Creates a new {@link HumanTaskGetInformationHandler} instance. * Creates a new {@link HumanTaskGetInformationHandler} instance.
Expand All @@ -43,9 +44,10 @@ public class HumanTaskGetInformationHandler extends UserTaskHandler {
public HumanTaskGetInformationHandler() { public HumanTaskGetInformationHandler() {
} }


public HumanTaskGetInformationHandler(ProcessDescRepoHelper repoHelper, ProcessDescriptionRepository repo) { public HumanTaskGetInformationHandler(BPMN2DataServiceSemanticModule module) {
this.repository = repo; this.module = module;
this.repositoryHelper = repoHelper; this.repository = module.getRepo();

} }


/** /**
Expand Down Expand Up @@ -76,8 +78,8 @@ protected void readIoSpecification(org.w3c.dom.Node xmlNode,
NamedNodeMap map = xmlNode.getParentNode().getAttributes(); NamedNodeMap map = xmlNode.getParentNode().getAttributes();
Node nodeName = map.getNamedItem("name"); Node nodeName = map.getNamedItem("name");
String name = nodeName.getNodeValue(); String name = nodeName.getNodeValue();

String mainProcessId = repositoryHelper.getProcess().getId(); String mainProcessId = module.getRepoHelper().getProcess().getId();
UserTaskDefinitionImpl task = (UserTaskDefinitionImpl)repository.getProcessDesc(mainProcessId).getTasks().get(name); UserTaskDefinitionImpl task = (UserTaskDefinitionImpl)repository.getProcessDesc(mainProcessId).getTasks().get(name);
if (task == null) { if (task == null) {
task = new UserTaskDefinitionImpl(); task = new UserTaskDefinitionImpl();
Expand Down Expand Up @@ -112,7 +114,7 @@ protected void handleNode(final org.jbpm.workflow.core.Node node, final Element
super.handleNode(node, element, uri, localName, parser); super.handleNode(node, element, uri, localName, parser);
WorkItemNode humanTaskNode = (WorkItemNode) node; WorkItemNode humanTaskNode = (WorkItemNode) node;
Map<String, Object> parameters = humanTaskNode.getWork().getParameters(); Map<String, Object> parameters = humanTaskNode.getWork().getParameters();
String mainProcessId = repositoryHelper.getProcess().getId(); String mainProcessId = module.getRepoHelper().getProcess().getId();


String name = humanTaskNode.getName(); String name = humanTaskNode.getName();
UserTaskDefinitionImpl task = (UserTaskDefinitionImpl)repository.getProcessDesc(mainProcessId).getTasks().get(name); UserTaskDefinitionImpl task = (UserTaskDefinitionImpl)repository.getProcessDesc(mainProcessId).getTasks().get(name);
Expand Down Expand Up @@ -140,7 +142,7 @@ protected void handleNode(final org.jbpm.workflow.core.Node node, final Element
@Override @Override
protected String readPotentialOwner(org.w3c.dom.Node xmlNode, HumanTaskNode humanTaskNode) { protected String readPotentialOwner(org.w3c.dom.Node xmlNode, HumanTaskNode humanTaskNode) {
String user = xmlNode.getFirstChild().getFirstChild().getFirstChild().getTextContent(); String user = xmlNode.getFirstChild().getFirstChild().getFirstChild().getTextContent();
String mainProcessId = repositoryHelper.getProcess().getId(); String mainProcessId = module.getRepoHelper().getProcess().getId();


String name = humanTaskNode.getName(); String name = humanTaskNode.getName();
UserTaskDefinitionImpl task = (UserTaskDefinitionImpl)repository.getProcessDesc(mainProcessId).getTasks().get(name); UserTaskDefinitionImpl task = (UserTaskDefinitionImpl)repository.getProcessDesc(mainProcessId).getTasks().get(name);
Expand All @@ -160,11 +162,6 @@ protected String readPotentialOwner(org.w3c.dom.Node xmlNode, HumanTaskNode huma
} }





public void setRepositoryHelper(ProcessDescRepoHelper repositoryHelper) {
this.repositoryHelper = repositoryHelper;
}

public void setRepository(ProcessDescriptionRepository repository) { public void setRepository(ProcessDescriptionRepository repository) {
this.repository = repository; this.repository = repository;
} }
Expand Down

0 comments on commit 471919f

Please sign in to comment.