Skip to content

Commit

Permalink
[DROOLS-2482] recognize a kjar as an executable model project even wh…
Browse files Browse the repository at this point in the history
…en installed directly into the KieRepository
  • Loading branch information
mariofusco committed Apr 17, 2018
1 parent 4f52eec commit c1d5539
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 20 deletions.
Expand Up @@ -72,6 +72,7 @@
import org.drools.compiler.compiler.PackageBuilderResults;
import org.drools.compiler.compiler.PackageRegistry;
import org.drools.compiler.compiler.ParserError;
import org.drools.compiler.compiler.ProcessBuilder;
import org.drools.compiler.compiler.ProcessBuilderFactory;
import org.drools.compiler.compiler.ProcessLoadError;
import org.drools.compiler.compiler.ResourceConversionResult;
Expand Down Expand Up @@ -761,7 +762,11 @@ public void addProcessFromXml(Resource resource) {
this.resource = null;
}

public void addProcessFromXml(Reader processSource) {
public ProcessBuilder getProcessBuilder() {
return processBuilder;
}

public void addProcessFromXml( Reader processSource) {
addProcessFromXml(new ReaderResource(processSource, ResourceType.DRF));
}

Expand Down
Expand Up @@ -18,25 +18,37 @@

import java.io.File;

import org.drools.compiler.compiler.io.memory.MemoryFileSystem;
import org.kie.api.builder.ReleaseId;
import org.kie.api.builder.model.KieModuleModel;
import org.kie.api.internal.utils.ServiceRegistry;

public interface InternalKieModuleProvider {
InternalKieModule createKieModule( ReleaseId releaseId, KieModuleModel kieProject, File file );

InternalKieModule createKieModule( ReleaseId releaseId, KieModuleModel kieProject, MemoryFileSystem mfs );

class DrlBasedKieModuleProvider implements InternalKieModuleProvider {

@Override
public InternalKieModule createKieModule( ReleaseId releaseId, KieModuleModel kieProject, File file ) {
return file.isDirectory() ? new FileKieModule( releaseId, kieProject, file ) : new ZipKieModule( releaseId, kieProject, file );
}

@Override
public InternalKieModule createKieModule( ReleaseId releaseId, KieModuleModel kieProject, MemoryFileSystem mfs ) {
return new MemoryKieModule(releaseId, kieProject, mfs);
}
}

static InternalKieModule get( ReleaseId releaseId, KieModuleModel kieProject, File file ) {
return Factory.get().createKieModule(releaseId, kieProject, file);
}

static InternalKieModule get( ReleaseId releaseId, KieModuleModel kieProject, MemoryFileSystem mfs ) {
return Factory.get().createKieModule(releaseId, kieProject, mfs);
}

class Factory {

private static class LazyHolder {
Expand Down
Expand Up @@ -15,9 +15,6 @@

package org.drools.compiler.kie.builder.impl;

import static org.drools.compiler.kie.builder.impl.KieBuilderImpl.setDefaultsforEmptyKieModule;
import static org.drools.compiler.kproject.ReleaseIdImpl.fromPropertiesStream;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
Expand Down Expand Up @@ -49,6 +46,9 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import static org.drools.compiler.kie.builder.impl.KieBuilderImpl.setDefaultsforEmptyKieModule;
import static org.drools.compiler.kproject.ReleaseIdImpl.fromPropertiesStream;

public class KieRepositoryImpl
implements
KieRepository {
Expand Down Expand Up @@ -291,7 +291,7 @@ public KieModule getKieModule(Resource resource) {

String pomProperties = mfs.findPomProperties();
ReleaseId releaseId = ReleaseIdImpl.fromPropertiesString(pomProperties);
kModule = new MemoryKieModule(releaseId, kieProject, mfs);
kModule = InternalKieModuleProvider.get( releaseId, kieProject, mfs );
}
return kModule;
} catch (Exception e) {
Expand Down
Expand Up @@ -27,11 +27,12 @@
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.appformer.maven.support.DependencyFilter;
import org.appformer.maven.support.PomModel;
import org.drools.compiler.builder.impl.KnowledgeBuilderImpl;
import org.drools.compiler.compiler.ProcessBuilder;
import org.drools.compiler.kie.builder.impl.FileKieModule;
import org.drools.compiler.kie.builder.impl.InternalKieModule;
import org.drools.compiler.kie.builder.impl.KieBaseUpdateContext;
Expand All @@ -44,6 +45,7 @@
import org.drools.core.common.ProjectClassLoader;
import org.drools.core.common.ResourceProvider;
import org.drools.core.definitions.InternalKnowledgePackage;
import org.drools.core.definitions.impl.KnowledgePackageImpl;
import org.drools.core.impl.InternalKnowledgeBase;
import org.drools.core.util.Drools;
import org.drools.core.util.IoUtils;
Expand All @@ -61,15 +63,20 @@
import org.kie.api.definition.process.Process;
import org.kie.api.io.Resource;
import org.kie.api.io.ResourceConfiguration;
import org.kie.api.io.ResourceType;
import org.kie.internal.builder.ChangeType;
import org.kie.internal.builder.CompositeKnowledgeBuilder;
import org.kie.internal.builder.KnowledgeBuilder;
import org.kie.internal.builder.KnowledgeBuilderConfiguration;
import org.kie.internal.builder.KnowledgeBuilderFactory;
import org.kie.internal.builder.ResourceChange;
import org.kie.internal.builder.ResourceChangeSet;

import static java.util.stream.Collectors.toList;

import static org.drools.model.impl.ModelComponent.areEqualInModel;
import static org.drools.modelcompiler.util.StringUtil.fileNameToClass;
import static org.kie.api.io.ResourceType.determineResourceType;

public class CanonicalKieModule implements InternalKieModule {

Expand Down Expand Up @@ -131,18 +138,45 @@ private CanonicalKiePackages createKiePackages( KieBaseModelImpl kBaseModel, Kie
private CanonicalKiePackages mergeProcesses( KieBaseModelImpl kBaseModel, CanonicalKiePackages canonicalKiePkgs ) {
Collection<KiePackage> pkgs = internalKieModule.getKnowledgePackagesForKieBase(kBaseModel.getName());
if (pkgs == null) {
// TODO null if the internalKieModule is a ZipKieModule. Is it necessary to get and build the processes from there in this case?
return canonicalKiePkgs;
}
for ( KiePackage pkg : pkgs ) {
Collection<Process> processes = pkg.getProcesses();
if (!processes.isEmpty()) {
InternalKnowledgePackage canonicalKiePkg = ( InternalKnowledgePackage ) canonicalKiePkgs.getKiePackage( pkg.getName() );
if (canonicalKiePkg == null) {
canonicalKiePkgs.addKiePackage( pkg );
} else {
for (Process process : processes) {
canonicalKiePkg.addProcess( process );
List<Resource> processResources = internalKieModule.getFileNames().stream()
.filter( fileName -> {
ResourceType resourceType = determineResourceType(fileName);
return resourceType == ResourceType.DRF || resourceType == ResourceType.BPMN2;
} )
.map( internalKieModule::getResource )
.collect( toList() );
if (!processResources.isEmpty()) {
KnowledgeBuilderImpl kbuilder = (KnowledgeBuilderImpl) KnowledgeBuilderFactory.newKnowledgeBuilder( getBuilderConfiguration( kBaseModel ) );
ProcessBuilder processBuilder = kbuilder.getProcessBuilder();
if (processBuilder != null) {
for (Resource processResource : processResources) {
try {
List<Process> processes = processBuilder.addProcessFromXml( processResource );
for (Process process : processes) {
InternalKnowledgePackage canonicalKiePkg = ( InternalKnowledgePackage ) canonicalKiePkgs.getKiePackage( process.getPackageName() );
if ( canonicalKiePkg == null ) {
canonicalKiePkg = new KnowledgePackageImpl( process.getPackageName() );
canonicalKiePkgs.addKiePackage( canonicalKiePkg );
}
canonicalKiePkg.addProcess( process );
}
} catch (IOException e) {
throw new RuntimeException( e );
}
}
}
}
} else {
for (KiePackage pkg : pkgs) {
Collection<Process> processes = pkg.getProcesses();
if ( !processes.isEmpty() ) {
InternalKnowledgePackage canonicalKiePkg = ( InternalKnowledgePackage ) canonicalKiePkgs.getKiePackage( pkg.getName() );
if ( canonicalKiePkg == null ) {
canonicalKiePkgs.addKiePackage( pkg );
} else {
for (Process process : processes) {
canonicalKiePkg.addProcess( process );
}
}
}
}
Expand Down Expand Up @@ -221,7 +255,7 @@ private static Collection<String> findRuleClassesNames( ClassLoader kieProjectCL
throw new RuntimeException( "Kjar compiled with version " + version + " is not compatible with current runtime version " + Drools.getFullVersion() );
}

return Stream.of( lines ).skip( 1 ).collect( Collectors.toList() );
return Stream.of( lines ).skip( 1 ).collect( toList() );
}

private static boolean areModelVersionsCompatible( String runtimeVersion, String compileVersion ) {
Expand Down
Expand Up @@ -18,6 +18,7 @@

import java.io.File;

import org.drools.compiler.compiler.io.memory.MemoryFileSystem;
import org.drools.compiler.kie.builder.impl.InternalKieModule;
import org.drools.compiler.kie.builder.impl.InternalKieModuleProvider;
import org.kie.api.builder.ReleaseId;
Expand All @@ -27,7 +28,15 @@ public class CanonicalKieModuleProvider extends InternalKieModuleProvider.DrlBas

@Override
public InternalKieModule createKieModule( ReleaseId releaseId, KieModuleModel kieProject, File file ) {
InternalKieModule internalKieModule = super.createKieModule( releaseId, kieProject, file );
return createCanonicalKieModule( super.createKieModule( releaseId, kieProject, file ) );
}

@Override
public InternalKieModule createKieModule( ReleaseId releaseId, KieModuleModel kieProject, MemoryFileSystem mfs ) {
return createCanonicalKieModule( super.createKieModule(releaseId, kieProject, mfs) );
}

private InternalKieModule createCanonicalKieModule( InternalKieModule internalKieModule ) {
return internalKieModule.hasResource( CanonicalKieModule.MODEL_FILE ) ? new CanonicalKieModule( internalKieModule ) : internalKieModule;
}
}

0 comments on commit c1d5539

Please sign in to comment.