Skip to content

Commit

Permalink
[DROOLS-6914] remove possibility of using serialized packages as kie … (
Browse files Browse the repository at this point in the history
apache#4330)

* [DROOLS-6914] remove possibility of using serialized packages as kie resources

* wip
  • Loading branch information
mariofusco committed Apr 25, 2022
1 parent 5d65d9f commit 0b37bf0
Show file tree
Hide file tree
Showing 7 changed files with 6 additions and 242 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,6 @@ private void buildProcesses() {
private void buildResources() {
buildResourceType(ResourceBuilder.DSL_RESOURCE_BUILDER, ResourceType.DSL);
buildResourceType(ResourceBuilder.DRF_RESOURCE_BUILDER, ResourceType.DRF);
buildResourceType(ResourceBuilder.PKG_RESOURCE_BUILDER, ResourceType.PKG);
buildResourceType(ResourceBuilder.CHANGE_SET_RESOURCE_BUILDER, ResourceType.CHANGE_SET);
buildResourceType(ResourceBuilder.XSD_RESOURCE_BUILDER, ResourceType.XSD);
buildResourceType(ResourceBuilder.SCD_RESOURCE_BUILDER, ResourceType.SCARD);
Expand Down Expand Up @@ -320,8 +319,6 @@ private interface ResourceBuilder {

ResourceBuilder CHANGE_SET_RESOURCE_BUILDER = ( kBuilder, resourceDescr ) -> kBuilder.addPackageFromChangeSet( resourceDescr.resource);

ResourceBuilder PKG_RESOURCE_BUILDER = ( kBuilder, resourceDescr ) -> kBuilder.addPackageFromInputStream(resourceDescr.resource );

ResourceBuilder BPMN2_RESOURCE_BUILDER = ( kBuilder, resourceDescr ) -> {
kBuilder.addKnowledgeResource( resourceDescr.resource, ResourceType.BPMN2, resourceDescr.configuration );
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.io.StringReader;
import java.io.UncheckedIOException;
Expand Down Expand Up @@ -114,7 +113,6 @@
import org.drools.core.base.ClassFieldAccessorCache;
import org.drools.core.builder.conf.impl.DecisionTableConfigurationImpl;
import org.drools.core.definitions.InternalKnowledgePackage;
import org.drools.core.definitions.impl.KnowledgePackageImpl;
import org.drools.core.definitions.rule.impl.RuleImpl;
import org.drools.core.impl.InternalKnowledgeBase;
import org.drools.core.impl.KnowledgeBaseFactory;
Expand All @@ -129,7 +127,6 @@
import org.drools.core.rule.Pattern;
import org.drools.core.rule.TypeDeclaration;
import org.drools.core.rule.WindowDeclaration;
import org.drools.core.util.DroolsStreamUtils;
import org.drools.core.util.IoUtils;
import org.drools.core.util.StringUtils;
import org.drools.core.xml.XmlChangeSetReader;
Expand Down Expand Up @@ -743,8 +740,6 @@ public void addKnowledgeResource(Resource resource,
addPackageFromXml(resource);
} else if (ResourceType.DTABLE.equals(type)) {
addPackageFromDecisionTable(resource, configuration);
} else if (ResourceType.PKG.equals(type)) {
addPackageFromInputStream(resource);
} else if (ResourceType.CHANGE_SET.equals(type)) {
addPackageFromChangeSet(resource);
} else if (ResourceType.XSD.equals(type)) {
Expand Down Expand Up @@ -831,70 +826,6 @@ void addPackageFromChangeSet(Resource resource) throws SAXException,
}
}

void addPackageFromInputStream(final Resource resource) throws IOException,
ClassNotFoundException {
InputStream is = resource.getInputStream();
Object object = DroolsStreamUtils.streamIn(is, this.configuration.getClassLoader());
is.close();
if (object instanceof Collection) {
// KnowledgeBuilder API
@SuppressWarnings("unchecked")
Collection<KiePackage> pkgs = (Collection<KiePackage>) object;
for (KiePackage kpkg : pkgs) {
overrideReSource((KnowledgePackageImpl) kpkg, resource);
addPackage((KnowledgePackageImpl) kpkg);
}
} else if (object instanceof KnowledgePackageImpl) {
// KnowledgeBuilder API
KnowledgePackageImpl kpkg = (KnowledgePackageImpl) object;
overrideReSource(kpkg, resource);
addPackage(kpkg);
} else {
results.add(new DroolsError(resource) {

@Override
public String getMessage() {
return "Unknown binary format trying to load resource " + resource.toString();
}

@Override
public int[] getLines() {
return new int[0];
}
});
}
}

private void overrideReSource(InternalKnowledgePackage pkg,
Resource res) {
for (org.kie.api.definition.rule.Rule r : pkg.getRules()) {
if (isSwappable(((RuleImpl) r).getResource(), res)) {
((RuleImpl) r).setResource(res);
}
}
for (TypeDeclaration d : pkg.getTypeDeclarations().values()) {
if (isSwappable(d.getResource(), res)) {
d.setResource(res);
}
}
for (Function f : pkg.getFunctions().values()) {
if (isSwappable(f.getResource(), res)) {
f.setResource(res);
}
}
for (org.kie.api.definition.process.Process p : pkg.getRuleFlows().values()) {
if (isSwappable(p.getResource(), res)) {
p.setResource(res);
}
}
}

private boolean isSwappable(Resource original,
Resource source) {
return original == null
|| (original instanceof ReaderResource && ((ReaderResource) original).getReader() == null);
}

/**
* Adds a package from a Descr/AST also triggering its compilation
* and the generation of the corresponding rete/phreak network
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,39 +129,6 @@ public void testIntegregation() {
assertTrue( list.containsAll( Arrays.asList( new String[]{"rule1", "rule2"} ) ) );
}

@Test
public void testBasicAuthentication() throws SAXException,
IOException {

KnowledgeBuilderConfigurationImpl conf = new KnowledgeBuilderConfigurationImpl();
XmlChangeSetReader xmlReader = new XmlChangeSetReader( conf.getSemanticModules() );
xmlReader.setClassLoader( ChangeSetTest.class.getClassLoader(), ChangeSetTest.class );

String str = "";
str += "<change-set ";
str += "xmlns='http://drools.org/drools-5.0/change-set' ";
str += "xmlns:xs='http://www.w3.org/2001/XMLSchema-instance' ";
str += "xs:schemaLocation='http://drools.org/drools-5.0/change-set change-set-1.0.0.xsd' >";
str += " <add> ";
str += " <resource source='http://localhost:8081/jboss-brms/org.kie.guvnor.Guvnor/package/defaultPackage/LATEST' type='PKG' basicAuthentication='enabled' username='admin' password='pwd'/>";
str += " </add> ";
str += "</change-set>";

StringReader reader = new StringReader( str );
ChangeSet changeSet = xmlReader.read( reader );

assertEquals( 1,
changeSet.getResourcesAdded().size() );
UrlResource resource = ( UrlResource ) ((List)changeSet.getResourcesAdded()).get( 0 );
assertEquals( "http://localhost:8081/jboss-brms/org.kie.guvnor.Guvnor/package/defaultPackage/LATEST",
resource.getURL().toString() );
assertEquals( "enabled", resource.getBasicAuthentication() );
assertEquals( "admin", resource.getUsername() );
assertEquals( "pwd", resource.getPassword() );
assertEquals( ResourceType.PKG,
resource.getResourceType() );
}

@Test(timeout = 10000)
public void testCustomClassLoader() throws Exception {
// JBRULES-3630
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
import org.drools.core.impl.InternalKnowledgeBase;
import org.drools.core.impl.KnowledgeBaseFactory;
import org.drools.core.rule.TypeDeclaration;
import org.drools.core.util.DroolsStreamUtils;
import org.drools.core.util.FileManager;
import org.junit.After;
import org.junit.Before;
Expand Down Expand Up @@ -353,63 +352,6 @@ public void testUndoRule() throws Exception {
assertEquals( "OK", list.get( 0 ) );
}

@Test
public void testAddKPackageSingle() throws Exception {
String rule = "package org.drools.mvel.compiler.test\n" +
"import org.drools.mvel.compiler.StockTick\n" +
"rule R1 when\n" +
" StockTick()\n" +
"then\n" +
"end\n";

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( ResourceFactory.newByteArrayResource( rule.getBytes() ), ResourceType.DRL );
assertFalse( kbuilder.getErrors().toString(), kbuilder.hasErrors() );

Collection<KiePackage> kpkgs = kbuilder.getKnowledgePackages();
assertEquals( 2, kpkgs.size() );

KiePackage kpkg = kpkgs.iterator().next();

byte[] skpkg = DroolsStreamUtils.streamOut( kpkg );

kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( ResourceFactory.newByteArrayResource( skpkg ), ResourceType.PKG );
assertFalse( kbuilder.getErrors().toString(), kbuilder.hasErrors() );

kpkgs = kbuilder.getKnowledgePackages();
assertEquals( 1, kpkgs.size() );
kpkg = kpkgs.iterator().next();
assertEquals( 1, kpkg.getRules().size() );
}

@Test
public void testAddKPackageCollection() throws Exception {
String rule = "package org.drools.mvel.compiler.test\n" +
"import org.drools.mvel.compiler.StockTick\n" +
"declare StockTick @role(event) end\n" +
"rule R1 when\n" +
" StockTick()\n" +
"then\n" +
"end\n";

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( ResourceFactory.newByteArrayResource( rule.getBytes() ), ResourceType.DRL );
assertFalse( kbuilder.getErrors().toString(), kbuilder.hasErrors() );

Collection<KiePackage> kpkgs = kbuilder.getKnowledgePackages();
assertEquals( 2, kpkgs.size() );

byte[] skpkg = DroolsStreamUtils.streamOut( kpkgs );

kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( ResourceFactory.newByteArrayResource( skpkg ), ResourceType.PKG );
assertFalse( kbuilder.getErrors().toString(), kbuilder.hasErrors() );

kpkgs = kbuilder.getKnowledgePackages();
assertEquals( 2, kpkgs.size() );
}

@Test
public void testAddPackageSingle() throws Exception {
String rule = "package org.drools.mvel.compiler.test\n" +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
import org.drools.core.impl.KnowledgeBaseFactory;
import org.drools.mvel.compiler.Message;
import org.junit.Test;
import org.kie.api.KieBase;
import org.kie.api.definition.KiePackage;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.KieSession;
Expand Down Expand Up @@ -191,82 +190,4 @@ public void testBuildAndSerializePackagesWithSamePackageName() throws IOExceptio
ksession.dispose();
}
}

@Test
public void testBuildAndSerializePackagesWithGetterInLHS() throws Exception {
// DROOLS-2495
String drl = "package com.sample\n" +
"import org.drools.compiler.Person\n" +
"import org.drools.compiler.Cheese\n" +
"rule R1\n" +
"when\n" +
" $p : Person()\n" +
" $c : Cheese(type == $p.getName())\n" +
"then\n" +
"end\n";

KnowledgeBuilder builder1 = KnowledgeBuilderFactory.newKnowledgeBuilder();
builder1.add(ResourceFactory.newByteArrayResource(drl.getBytes()), ResourceType.DRL);
Collection<KiePackage> knowledgePackages = builder1.getKnowledgePackages();

byte[] pkgBin = null;
try (ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream();
DroolsObjectOutputStream out = new DroolsObjectOutputStream(byteOutStream);) {
out.writeObject(knowledgePackages);
out.flush();
pkgBin = byteOutStream.toByteArray();
}

KnowledgeBuilder builder2 = KnowledgeBuilderFactory.newKnowledgeBuilder();
builder2.add(ResourceFactory.newByteArrayResource(pkgBin), ResourceType.PKG);
KieBase kbase = builder2.newKieBase();

KieSession ksession = kbase.newKieSession();
try {
ksession.insert(new org.drools.mvel.compiler.Person("aaa"));
ksession.insert(new org.drools.mvel.compiler.Cheese("aaa"));
ksession.fireAllRules();
} finally {
ksession.dispose();
}
}

@Test
public void testBuildAndSerializePackagesWithGlobalMethodInLHS() throws Exception {
// DROOLS-2517
String drl = "package com.sample\n" +
"import org.drools.mvel.compiler.Person\n" +
"global org.drools.mvel.compiler.MyUtil myUtil\n" +
"rule R1\n" +
"when\n" +
" Person(myUtil.transform(name) == \"John-san\")\n" + // call global's method
"then\n" +
"end\n";

KnowledgeBuilder builder1 = KnowledgeBuilderFactory.newKnowledgeBuilder();
builder1.add(ResourceFactory.newByteArrayResource(drl.getBytes()), ResourceType.DRL);
Collection<KiePackage> knowledgePackages = builder1.getKnowledgePackages();

byte[] pkgBin = null;
try (ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream();
DroolsObjectOutputStream out = new DroolsObjectOutputStream(byteOutStream);) {
out.writeObject(knowledgePackages);
out.flush();
pkgBin = byteOutStream.toByteArray();
}

KnowledgeBuilder builder2 = KnowledgeBuilderFactory.newKnowledgeBuilder();
builder2.add(ResourceFactory.newByteArrayResource(pkgBin), ResourceType.PKG);
KieBase kbase = builder2.newKieBase();

KieSession ksession = kbase.newKieSession();
try {
ksession.setGlobal("myUtil", new org.drools.mvel.compiler.MyUtil());
ksession.insert(new org.drools.mvel.compiler.Person("John"));
int fired = ksession.fireAllRules();
assertEquals(1, fired);
} finally {
ksession.dispose();
}
}
}
6 changes: 6 additions & 0 deletions drools-traits/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,12 @@
<artifactId>kie-soup-project-datamodel-commons</artifactId>
</dependency>

<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<type>test-jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-serialization-protobuf</artifactId>
Expand Down

0 comments on commit 0b37bf0

Please sign in to comment.