Skip to content

Commit

Permalink
DROOLS-3355: Improve Assembler/Weaver API (#1393)
Browse files Browse the repository at this point in the history
* assemblers

* move jbpm to assemblers

* moved to assembler

* wip

* wip

* revert

* fix style issues

* whitespace

* moved assemblers, weavers to jbm-flow

* use create API to create package in weaver

* do not parse resource twice

* minimal change: report dialect-related errors

* style issues
  • Loading branch information
evacchi authored and mariofusco committed Jan 7, 2019
1 parent 2909e8d commit 1cc1cbd
Show file tree
Hide file tree
Showing 12 changed files with 336 additions and 57 deletions.
@@ -0,0 +1,35 @@
/*
* Copyright 2018 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.jbpm.casemgmt.cmmn.assembler;

import org.drools.compiler.builder.impl.KnowledgeBuilderImpl;
import org.drools.compiler.compiler.CMMNCaseFactory;
import org.jbpm.assembler.AbstractProcessAssembler;
import org.kie.api.io.ResourceType;

public class CMMNAssemblerService extends AbstractProcessAssembler {

@Override
public ResourceType getResourceType() {
return ResourceType.CMMN;
}

@Override
protected void configurePackageBuilder(KnowledgeBuilderImpl kb) {
CMMNCaseFactory.configurePackageBuilder(kb);
}
}
@@ -1,2 +1,2 @@
org.drools.compiler.compiler.CMMNCaseProvider=org.jbpm.casemgmt.cmmn.CMMNCaseProviderImpl

org.kie.api.internal.assembler.KieAssemblers = +org.jbpm.casemgmt.cmmn.assembler.CMMNAssemblerService
@@ -0,0 +1,77 @@
/*
* Copyright 2018 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.jbpm.assembler;

import java.util.List;

import org.drools.compiler.builder.impl.KnowledgeBuilderImpl;
import org.drools.compiler.compiler.BaseKnowledgeBuilderResultImpl;
import org.drools.compiler.compiler.PackageRegistry;
import org.drools.compiler.compiler.ProcessLoadError;
import org.drools.core.impl.InternalKnowledgeBase;
import org.jbpm.compiler.ProcessBuilderImpl;
import org.kie.api.definition.process.Process;
import org.kie.api.internal.assembler.KieAssemblerService;
import org.kie.api.io.Resource;
import org.kie.api.io.ResourceConfiguration;
import org.kie.api.io.ResourceType;
import org.kie.internal.builder.KnowledgeBuilderResult;

public abstract class AbstractProcessAssembler implements KieAssemblerService {

public void addResource(
Object kbuilder,
Resource resource,
ResourceType type,
ResourceConfiguration configuration) {

KnowledgeBuilderImpl kb = (KnowledgeBuilderImpl) kbuilder;
ProcessBuilderImpl processBuilder = (ProcessBuilderImpl) kb.getProcessBuilder();
configurePackageBuilder(kb);

try {
List<Process> processes = processBuilder.addProcessFromXml(resource);
List<BaseKnowledgeBuilderResultImpl> errors = processBuilder.getErrors();
if (errors.isEmpty()) {
InternalKnowledgeBase kBase = kb.getKnowledgeBase();
if (kBase != null && processes != null) {
for (Process process : processes) {
kBase.addProcess(process);
}
}
} else {
errors.forEach(kb::addBuilderResult);
errors.clear();
}
} catch (Exception e) {
if (e instanceof RuntimeException) {
throw (RuntimeException) e;
}
kb.addBuilderResult(new ProcessLoadError(resource, "Unable to load process.", e));
}

// propagate dialect errors to process building errors
for (PackageRegistry pkg : kb.getPackageRegistry().values()) {
// addResults() method, contrary to what could be expectations,
// *adds* the result to the *given* list
List<KnowledgeBuilderResult> es = pkg.getDialectCompiletimeRegistry().addResults(null);
es.forEach(kb::addBuilderResult);
}
}

protected abstract void configurePackageBuilder(KnowledgeBuilderImpl kb);
}
@@ -0,0 +1,34 @@
/*
* Copyright 2018 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.jbpm.assembler;

import org.drools.compiler.builder.impl.KnowledgeBuilderImpl;
import org.drools.compiler.compiler.BPMN2ProcessFactory;
import org.kie.api.io.ResourceType;

public class BPMN2AssemblerService extends AbstractProcessAssembler {

@Override
public ResourceType getResourceType() {
return ResourceType.BPMN2;
}

@Override
protected void configurePackageBuilder(KnowledgeBuilderImpl kb) {
BPMN2ProcessFactory.configurePackageBuilder(kb);
}
}
@@ -0,0 +1,32 @@
/*
* Copyright 2018 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.jbpm.assembler;

import org.drools.compiler.builder.impl.KnowledgeBuilderImpl;
import org.kie.api.io.ResourceType;

public class DRFAssemblerService extends AbstractProcessAssembler {

@Override
public ResourceType getResourceType() {
return ResourceType.DRF;
}

@Override
protected void configurePackageBuilder(KnowledgeBuilderImpl kb) {
}
}
Expand Up @@ -36,9 +36,12 @@
import org.drools.compiler.compiler.ParserError;
import org.drools.compiler.compiler.ProcessLoadError;
import org.drools.compiler.lang.descr.ActionDescr;
import org.drools.compiler.lang.descr.PackageDescr;
import org.drools.compiler.lang.descr.ProcessDescr;
import org.drools.compiler.rule.builder.dialect.java.JavaDialect;
import org.drools.core.definitions.InternalKnowledgePackage;
import org.drools.core.definitions.ProcessPackage;
import org.drools.core.definitions.ResourceTypePackageRegistry;
import org.jbpm.compiler.xml.ProcessSemanticModule;
import org.jbpm.compiler.xml.XmlProcessReader;
import org.jbpm.compiler.xml.processes.RuleFlowMigrator;
Expand Down Expand Up @@ -147,57 +150,57 @@ public void buildProcess(final Process process, Resource resource) {
logger.error("DroolsParserException during addPackageFromDRL", e);
}

PackageRegistry pkgRegistry = this.knowledgeBuilder.getPackageRegistry(process.getPackageName());
PackageRegistry pkgRegistry = this.knowledgeBuilder.getOrCreatePackageRegistry(new PackageDescr(process.getPackageName()));
if (pkgRegistry != null) {
InternalKnowledgePackage p = pkgRegistry.getPackage();

if (p != null) {
if( validator != null ) {
// NPE for validator
if (validator.compilationSupported()) {
ProcessDescr processDescr = new ProcessDescr();
processDescr.setName(process.getPackageName() + "." + process.getName());
processDescr.setResource( resource );
processDescr.setProcessId( process.getId() );
DialectCompiletimeRegistry dialectRegistry = pkgRegistry.getDialectCompiletimeRegistry();
Dialect dialect = dialectRegistry.getDialect( "java" );
dialect.init(processDescr);

ProcessBuildContext buildContext = new ProcessBuildContext(
this.knowledgeBuilder,
p,
process,
processDescr,
dialectRegistry,
dialect);

buildContexts( ( ContextContainer ) process, buildContext );
if (process instanceof WorkflowProcess) {
buildNodes( (WorkflowProcess) process, buildContext );
}
}
Process duplicateProcess = p.getRuleFlows().get(process.getId());
if (duplicateProcess != null) {
Resource duplicatedResource = duplicateProcess.getResource();
if (resource == null || duplicatedResource == null || duplicatedResource.getSourcePath() == null ||
duplicatedResource.getSourcePath().equals(resource.getSourcePath())) {
this.errors.add(new DuplicateProcess(process,
this.knowledgeBuilder.getBuilderConfiguration()));
} else {
this.errors.add( new ParserError( resource,
"Process with same id already exists: " + process.getId(),
-1,
-1 ) );
}
}
p.addProcess( process );
// NPE for validator
if (validator.compilationSupported()) {
pkgRegistry.compileAll();
pkgRegistry.getDialectRuntimeRegistry().onBeforeExecute();
}
}
}
InternalKnowledgePackage p = pkgRegistry.getPackage();
ResourceTypePackageRegistry resourceTypePackages = p.getResourceTypePackages();
ProcessPackage rpkg = ProcessPackage.getOrCreate(resourceTypePackages);

if( validator != null ) {
// NPE for validator
if (validator.compilationSupported()) {
ProcessDescr processDescr = new ProcessDescr();
processDescr.setName(process.getPackageName() + "." + process.getName());
processDescr.setResource( resource );
processDescr.setProcessId( process.getId() );
DialectCompiletimeRegistry dialectRegistry = pkgRegistry.getDialectCompiletimeRegistry();
Dialect dialect = dialectRegistry.getDialect( "java" );
dialect.init(processDescr);

ProcessBuildContext buildContext = new ProcessBuildContext(
this.knowledgeBuilder,
p,
process,
processDescr,
dialectRegistry,
dialect);

buildContexts( ( ContextContainer ) process, buildContext );
if (process instanceof WorkflowProcess) {
buildNodes( (WorkflowProcess) process, buildContext );
}
}
Process duplicateProcess = rpkg.getRuleFlows().get(process.getId());
if (duplicateProcess != null) {
Resource duplicatedResource = duplicateProcess.getResource();
if (resource == null || duplicatedResource == null || duplicatedResource.getSourcePath() == null ||
duplicatedResource.getSourcePath().equals(resource.getSourcePath())) {
this.errors.add(new DuplicateProcess(process,
this.knowledgeBuilder.getBuilderConfiguration()));
} else {
this.errors.add( new ParserError( resource,
"Process with same id already exists: " + process.getId(),
-1,
-1 ) );
}
}
rpkg.add( process );
// NPE for validator
if (validator.compilationSupported()) {
pkgRegistry.compileAll();
pkgRegistry.getDialectRuntimeRegistry().onBeforeExecute();
}
}
} else {
// invalid package registry..there is an issue with the package
// name of the process
Expand Down Expand Up @@ -308,7 +311,6 @@ public List<Process> addProcessFromXml(final Resource resource) throws IOExcepti
return processes;
}


/*************************************************************************
* Converts a drools version 4 .rf or .rfm ruleflow to a version 5 .rf.
* Version 5 .rf ruleflows are allowed, but are not migrated.
Expand Down
Expand Up @@ -16,7 +16,7 @@

package org.jbpm.process.builder;

import org.drools.compiler.builder.impl.KnowledgeBuilderImpl;
import org.drools.compiler.builder.DroolsAssemblerContext;
import org.drools.compiler.compiler.Dialect;
import org.drools.compiler.compiler.DialectCompiletimeRegistry;
import org.drools.compiler.lang.descr.BaseDescr;
Expand All @@ -31,7 +31,7 @@ public class ProcessBuildContext extends PackageBuildContext {
private ProcessDescr processDescr;
private DialectCompiletimeRegistry dialectRegistry;

public ProcessBuildContext(final KnowledgeBuilderImpl pkgBuilder,
public ProcessBuildContext(final DroolsAssemblerContext assemblerContext,
final InternalKnowledgePackage pkg,
final Process process,
final BaseDescr processDescr,
Expand All @@ -40,7 +40,7 @@ public ProcessBuildContext(final KnowledgeBuilderImpl pkgBuilder,
this.process = process;
this.processDescr = (ProcessDescr) processDescr;
this.dialectRegistry = dialectRegistry;
init( pkgBuilder,
init( assemblerContext,
pkg,
processDescr,
dialectRegistry,
Expand Down
@@ -0,0 +1,39 @@
/*
* Copyright 2018 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.jbpm.weaver;

import org.drools.core.definitions.InternalKnowledgePackage;
import org.drools.core.definitions.ProcessPackage;
import org.kie.api.KieBase;
import org.kie.api.definition.KiePackage;
import org.kie.api.internal.weaver.KieWeaverService;

public abstract class AbstractWeaverService implements KieWeaverService<ProcessPackage> {

@Override
public void merge(KieBase kieBase, KiePackage kiePkg, ProcessPackage processPkg) {
ProcessPackage existing =
ProcessPackage.getOrCreate(((InternalKnowledgePackage) kiePkg).getResourceTypePackages());
existing.getRuleFlows().putAll(processPkg.getRuleFlows());
}

@Override
public void weave(KieBase kieBase, KiePackage kiePackage, ProcessPackage processPackage) {

}

}

0 comments on commit 1cc1cbd

Please sign in to comment.