diff --git a/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java b/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java
index ddde7a05f46..2c8d56449b5 100644
--- a/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java
+++ b/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java
@@ -1573,7 +1573,7 @@ private void processTypeDeclarations(final PackageDescr packageDescr) {
// Go on with the build
TypeDeclaration type = new TypeDeclaration( typeDescr.getTypeName() );
- if ( resource != null && ((InternalResource) resource).hasURL() ) {
+ if ( resource != null ) {
type.setResource( this.resource );
}
@@ -1974,7 +1974,7 @@ private void addRule(final RuleDescr ruleDescr) {
this.results.addAll( context.getErrors() );
- if ( resource != null && ((InternalResource) resource).hasURL() ) {
+ if ( resource != null ) {
context.getRule().setResource( resource );
}
diff --git a/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentIncrementalChangeSetTest.java b/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentIncrementalChangeSetTest.java
index 2bae6fbf7dd..a0395b0c6c0 100644
--- a/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentIncrementalChangeSetTest.java
+++ b/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentIncrementalChangeSetTest.java
@@ -1,13 +1,17 @@
package org.drools.agent;
import java.io.File;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
+import java.util.*;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
+import org.drools.agent.impl.KnowledgeAgentImpl;
+import org.drools.definition.KnowledgeDefinition;
+import org.drools.io.Resource;
+import org.drools.io.impl.ByteArrayResource;
+import org.drools.io.impl.ChangeSetImpl;
+import org.drools.io.impl.UrlResource;
import org.drools.runtime.rule.QueryResults;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
@@ -23,6 +27,7 @@
import org.junit.Test;
import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
public class KnowledgeAgentIncrementalChangeSetTest extends BaseKnowledgeAgentTest {
@@ -1108,6 +1113,7 @@ public void testCompilationFailndFixIncremental() throws Exception {
fail("The compilation should fail!");
}catch (RuntimeException ex){
//expected expcetion
+ System.err.println(ex);
}
@@ -1316,4 +1322,107 @@ public void testMultiplePackages() throws Exception {
kagent.dispose();
}
+
+
+
+
+
+ @Test
+ public void testResourceMappingWithIncrementalBuild() throws Exception {
+ String rule1 = this.createDefaultRule( "rule1" );
+ String rule2 = this.createDefaultRule( "rule2" );
+
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ kbuilder.add( ResourceFactory.newByteArrayResource( rule1.getBytes() ),
+ ResourceType.DRL );
+ kbuilder.add( ResourceFactory.newByteArrayResource( rule2.getBytes() ),
+ ResourceType.DRL );
+ if ( kbuilder.hasErrors() ) {
+ fail( kbuilder.getErrors().toString() );
+ }
+ KnowledgePackage pkg = (KnowledgePackage) kbuilder.getKnowledgePackages().iterator().next();
+ writePackage( pkg,
+ fileManager.newFile( "pkg1.pkg" ) );
+
+ String xml = "";
+ xml += "";
+ xml += " ";
+ xml += " ";
+ xml += " ";
+ xml += "";
+ File fxml = fileManager.write( "changeset.xml",
+ xml );
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+
+ KnowledgeAgent kagent = this.createKAgent( kbase, false );
+
+ applyChangeSet( kagent, ResourceFactory.newUrlResource( fxml.toURI().toURL() ) );
+
+ StatefulKnowledgeSession ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
+
+ org.drools.rule.Rule r1 = (org.drools.rule.Rule) ksession.getKnowledgeBase().getRule("org.drools.test","rule1");
+ assertEquals(((UrlResource) r1.getResource()).getURL().toString(),"http://localhost:"+getPort()+"/pkg1.pkg");
+ org.drools.rule.Rule r2 = (org.drools.rule.Rule) ksession.getKnowledgeBase().getRule("org.drools.test","rule2");
+ assertEquals(((UrlResource) r2.getResource()).getURL().toString(),"http://localhost:"+getPort()+"/pkg1.pkg");
+ Map> defMap = ((KnowledgeAgentImpl) kagent).getRegisteredResources();
+ assertTrue(defMap.containsKey(r1.getResource()));
+ assertTrue(defMap.containsKey(r2.getResource()));
+ Set defs = defMap.get(r1.getResource());
+ assertTrue(defs.contains(r1));
+ assertTrue(defs.contains(r2));
+ assertEquals(2,defs.size());
+
+
+ String rule3 = this.createDefaultRule( "rule3", "org.drools.test3" );
+
+ kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ kbuilder.add( ResourceFactory.newByteArrayResource( rule3.getBytes() ),
+ ResourceType.DRL );
+ pkg = (KnowledgePackage) kbuilder.getKnowledgePackages().iterator().next();
+ writePackage( pkg,
+ fileManager.newFile( "pkg1.pkg" ) );
+ scan( kagent );
+
+
+ assertEquals(0,ksession.getKnowledgeBase().getKnowledgePackage("org.drools.test").getRules().size());
+ assertEquals(1,ksession.getKnowledgeBase().getKnowledgePackage("org.drools.test3").getRules().size());
+ org.drools.rule.Rule r3 = (org.drools.rule.Rule) ksession.getKnowledgeBase().getRule("org.drools.test3","rule3");
+ assertEquals(((UrlResource) r3.getResource()).getURL().toString(),"http://localhost:"+getPort()+"/pkg1.pkg");
+ defMap = ((KnowledgeAgentImpl) kagent).getRegisteredResources();
+ assertTrue(defMap.containsKey(r3.getResource()));
+ defs = defMap.get(r3.getResource());
+ assertTrue(defs.contains(r3));
+ assertFalse(defs.contains(r1));
+ assertFalse(defs.contains(r2));
+ assertEquals(1,defs.size());
+
+
+
+ String rule4 = this.createDefaultRule( "rule4", "org.drools.test4" );
+ ChangeSetImpl cs = new ChangeSetImpl();
+ ByteArrayResource res = new ByteArrayResource( rule4.getBytes( ));
+ res.setResourceType(ResourceType.DRL);
+ cs.setResourcesAdded(Arrays.asList(new Resource[] {res}));
+ kagent.applyChangeSet(cs);
+
+
+ assertEquals(1,ksession.getKnowledgeBase().getKnowledgePackage("org.drools.test3").getRules().size());
+ assertEquals(1,ksession.getKnowledgeBase().getKnowledgePackage("org.drools.test4").getRules().size());
+ org.drools.rule.Rule r4 = (org.drools.rule.Rule) ksession.getKnowledgeBase().getRule("org.drools.test4","rule4");
+ defMap = ((KnowledgeAgentImpl) kagent).getRegisteredResources();
+ assertEquals(2,defMap.size());
+ assertTrue(defMap.containsKey(r4.getResource()));
+ defs = defMap.get(r4.getResource());
+ assertTrue(defs.contains(r4));
+ assertFalse(defs.contains(r3));
+ assertFalse(defs.contains(r2));
+ assertEquals(1,defs.size());
+
+ ksession.dispose();
+ kagent.dispose();
+ }
+
}
diff --git a/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentTest.java b/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentTest.java
index 89e1c170f3e..2edcf60ea10 100644
--- a/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentTest.java
+++ b/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentTest.java
@@ -2,20 +2,32 @@
import java.io.File;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.net.URL;
+import java.util.*;
+import org.codehaus.janino.Java;
import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseConfiguration;
import org.drools.KnowledgeBaseFactory;
+import org.drools.agent.impl.KnowledgeAgentImpl;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.builder.impl.KnowledgeBuilderImpl;
import org.drools.command.runtime.rule.InsertObjectCommand;
+import org.drools.conf.EventProcessingOption;
+import org.drools.definition.KnowledgeDefinition;
import org.drools.definition.KnowledgePackage;
+import org.drools.definitions.impl.KnowledgePackageImp;
+import org.drools.io.Resource;
+import org.drools.io.ResourceChangeScannerConfiguration;
import org.drools.io.ResourceFactory;
+import org.drools.io.impl.ByteArrayResource;
+import org.drools.io.impl.ChangeSetImpl;
+import org.drools.io.impl.UrlResource;
+import org.drools.io.internal.InternalResource;
+import org.drools.rule.Rule;
+import org.drools.rule.TypeDeclaration;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.StatelessKnowledgeSession;
@@ -70,7 +82,7 @@ public void testModifyFileUrl() throws Exception {
this.fileManager.write( "rule1.drl", createDefaultRule( "rule3" ) );
- scan(kagent);
+ scan(kagent);
ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
list = new ArrayList();
@@ -668,4 +680,237 @@ public void testStatelessWithCommands() throws Exception {
assertTrue( list.contains( "rule2" ) );
}
+
+
+
+
+
+
+
+
+
+
+
+ @Test
+ public void testResourceMapping() throws Exception {
+ String rule1 = this.createDefaultRule( "rule1" );
+ String rule2 = this.createDefaultRule( "rule2" );
+
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ kbuilder.add( ResourceFactory.newByteArrayResource( rule1.getBytes() ),
+ ResourceType.DRL );
+ kbuilder.add( ResourceFactory.newByteArrayResource( rule2.getBytes() ),
+ ResourceType.DRL );
+ if ( kbuilder.hasErrors() ) {
+ fail( kbuilder.getErrors().toString() );
+ }
+ KnowledgePackage pkg = (KnowledgePackage) kbuilder.getKnowledgePackages().iterator().next();
+ writePackage( pkg,
+ fileManager.newFile( "pkg1.pkg" ) );
+
+ String xml = "";
+ xml += "";
+ xml += " ";
+ xml += " ";
+ xml += " ";
+ xml += "";
+ File fxml = fileManager.write( "changeset.xml",
+ xml );
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+
+ KnowledgeAgent kagent = this.createKAgent( kbase, true );
+
+ applyChangeSet( kagent, ResourceFactory.newUrlResource( fxml.toURI().toURL() ) );
+
+ Rule r1 = (Rule) kagent.getKnowledgeBase().getRule("org.drools.test","rule1");
+ assertEquals(((UrlResource) r1.getResource()).getURL().toString(),"http://localhost:"+getPort()+"/pkg1.pkg");
+ Rule r2 = (Rule) kagent.getKnowledgeBase().getRule("org.drools.test","rule2");
+ assertEquals(((UrlResource) r2.getResource()).getURL().toString(),"http://localhost:"+getPort()+"/pkg1.pkg");
+ Map> defMap = ((KnowledgeAgentImpl) kagent).getRegisteredResources();
+ assertTrue(defMap.containsKey(r1.getResource()));
+ assertTrue(defMap.containsKey(r2.getResource()));
+ Set defs = defMap.get(r1.getResource());
+ assertTrue(defs.contains(r1));
+ assertTrue(defs.contains(r2));
+ assertEquals(2,defs.size());
+
+
+ String rule3 = this.createDefaultRule( "rule3", "org.drools.test3" );
+
+ kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ kbuilder.add( ResourceFactory.newByteArrayResource( rule3.getBytes() ),
+ ResourceType.DRL );
+ pkg = (KnowledgePackage) kbuilder.getKnowledgePackages().iterator().next();
+ writePackage( pkg,
+ fileManager.newFile( "pkg1.pkg" ) );
+ scan( kagent );
+
+
+ assertNotSame(kbase, kagent.getKnowledgeBase());
+ kbase = kagent.getKnowledgeBase();
+
+ assertNull(kbase.getKnowledgePackage("org.drools.test"));
+ assertEquals(1,kbase.getKnowledgePackage("org.drools.test3").getRules().size());
+ Rule r3 = (Rule) kbase.getRule("org.drools.test3","rule3");
+ assertEquals(((UrlResource) r3.getResource()).getURL().toString(),"http://localhost:"+getPort()+"/pkg1.pkg");
+ defMap = ((KnowledgeAgentImpl) kagent).getRegisteredResources();
+ assertTrue(defMap.containsKey(r3.getResource()));
+ defs = defMap.get(r3.getResource());
+ assertTrue(defs.contains(r3));
+ assertFalse(defs.contains(r1));
+ assertFalse(defs.contains(r2));
+ assertEquals(1,defs.size());
+
+
+ String rule4 = this.createDefaultRule( "rule4", "org.drools.test4" );
+ ChangeSetImpl cs = new ChangeSetImpl();
+ ByteArrayResource res = new ByteArrayResource( rule4.getBytes( ));
+ res.setResourceType(ResourceType.DRL);
+ cs.setResourcesAdded(Arrays.asList(new Resource[] {res}));
+ kagent.applyChangeSet(cs);
+
+
+ assertNotSame(kbase, kagent.getKnowledgeBase());
+ kbase = kagent.getKnowledgeBase();
+
+
+ assertEquals(1,kbase.getKnowledgePackage("org.drools.test3").getRules().size());
+ assertEquals(1,kbase.getKnowledgePackage("org.drools.test4").getRules().size());
+ Rule r4 = (Rule) kbase.getRule("org.drools.test4","rule4");
+ assertSame(r4.getResource(),res);
+ defMap = ((KnowledgeAgentImpl) kagent).getRegisteredResources();
+ assertEquals(2,defMap.size());
+ assertTrue(defMap.containsKey(r4.getResource()));
+ defs = defMap.get(r4.getResource());
+ assertTrue(defs.contains(r4));
+ assertFalse(defs.contains(r3));
+ assertFalse(defs.contains(r2));
+ assertEquals(1,defs.size());
+ defs = defMap.get(r3.getResource());
+ assertTrue(defs.contains(r3));
+ assertFalse(defs.contains(r4));
+ assertFalse(defs.contains(r2));
+ assertEquals(1,defs.size());
+
+ kagent.dispose();
+ }
+
+
+
+
+
+
+ @Test
+ public void testMultipleResourcesAndPackages() {
+
+ String drl = "package org.test.myPack;\n" +
+ "\n" +
+ "import java.util.List;\n" +
+ "\n" +
+ "declare org.anotherPack.MyType\n" +
+ " field : String\n" +
+ "end\n" +
+ "\n" +
+ "rule \"init\"\n" +
+ "when \n" +
+ "then \n" +
+ " System.out.println(\"X\");\n" +
+ "end";
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ KnowledgeAgent kagent = createKAgent( kbase, false );
+
+ ByteArrayResource bres = (ByteArrayResource) ResourceFactory.newByteArrayResource( drl.getBytes() );
+ bres.setResourceType(ResourceType.DRL);
+
+ ChangeSetImpl cs = new ChangeSetImpl();
+ cs.setResourcesAdded( Arrays.asList(bres) );
+ kagent.applyChangeSet( cs );
+
+ KnowledgePackage pack = kagent.getKnowledgeBase().getKnowledgePackage("org.test.myPack");
+ assertNotNull(pack);
+ assertEquals(1,pack.getRules().size());
+ KnowledgePackage pack2 = kagent.getKnowledgeBase().getKnowledgePackage("org.anotherPack");
+ assertNotNull(pack2);
+ assertEquals(0,pack2.getRules().size());
+
+
+ String drl2 = "package org.test.myPack;\n" +
+ "function void foo() { \n" +
+ "} \n" +
+ "\n" +
+ "\n" +
+ "declare org.anotherPack.MyType2\n" +
+ " field : String\n" +
+ "end\n" +
+ "" +
+ "rule \"rool\" \n" +
+ "when\n" +
+ "then\n" +
+ "end\n";
+
+ ByteArrayResource bres2 = (ByteArrayResource) ResourceFactory.newByteArrayResource( drl2.getBytes() );
+ bres2.setResourceType(ResourceType.DRL);
+ ChangeSetImpl cs2 = new ChangeSetImpl();
+ cs2.setResourcesAdded( Arrays.asList(bres2) );
+ kagent.applyChangeSet( cs2 );
+
+ pack = kagent.getKnowledgeBase().getKnowledgePackage("org.test.myPack");
+ assertNotNull(pack);
+ assertEquals(2,pack.getRules().size());
+ pack2 = kagent.getKnowledgeBase().getKnowledgePackage("org.anotherPack");
+ assertNotNull(pack2);
+ assertEquals(0,pack2.getRules().size());
+
+
+
+ Collection def1 = ((KnowledgeAgentImpl) kagent).getRegisteredResources().get(bres);
+ assertEquals(2,def1.size());
+ checkAllDefinitionsBelongToResource(def1, bres);
+
+
+ Collection def2 = ((KnowledgeAgentImpl) kagent).getRegisteredResources().get(bres2);
+ assertEquals(2,def2.size());
+ checkAllDefinitionsBelongToResource(def2, bres2);
+ }
+
+ private void checkAllDefinitionsBelongToResource(Collection def, ByteArrayResource res) {
+ for ( KnowledgeDefinition kd : def) {
+ if ( kd instanceof Java.TypeDeclaration ) {
+ assertEquals( res, ((TypeDeclaration) kd).getResource());
+ } else if ( kd instanceof Rule) {
+ assertEquals( res, ((Rule) kd).getResource());
+ }
+ }
+ }
+
+
+
+ @Test
+ /**
+ * JBRULES-3139
+ */
+ public void testMissingChangeset() throws Exception {
+ KnowledgeAgent kAgent = createKAgent( KnowledgeBaseFactory.newKnowledgeBase() );
+
+ String urlString = "file://tmp/MissingChangeSet.xml";
+ try {
+ URL url = new URL(urlString);
+ Resource urlResource = ResourceFactory.newUrlResource(url);
+
+ assertNotNull(urlResource);
+
+ kAgent.applyChangeSet( urlResource );
+
+ assertEquals(0,kAgent.getKnowledgeBase().getKnowledgePackages().size());
+
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+
}
diff --git a/drools-core/src/main/java/org/drools/agent/impl/KnowledgeAgentImpl.java b/drools-core/src/main/java/org/drools/agent/impl/KnowledgeAgentImpl.java
index 93968d7edd0..63212f595c7 100644
--- a/drools-core/src/main/java/org/drools/agent/impl/KnowledgeAgentImpl.java
+++ b/drools-core/src/main/java/org/drools/agent/impl/KnowledgeAgentImpl.java
@@ -19,14 +19,7 @@
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
import java.util.concurrent.LinkedBlockingQueue;
import org.drools.ChangeSet;
@@ -171,7 +164,12 @@ public boolean isUseKBaseClassLoaderForCompiling() {
}
public void applyChangeSet(Resource resource) {
- applyChangeSet( getChangeSet( resource ) );
+ ChangeSet cs = getChangeSet( resource );
+ if ( cs != null ) {
+ applyChangeSet( cs );
+ } else {
+ this.listener.warning(" Warning : KnowledgeAgent was requested to apply a Changeset, but no Changeset could be determined", resource);
+ }
}
public void applyChangeSet(ChangeSet changeSet) {
@@ -207,7 +205,7 @@ public void processChangeSet(Resource resource,
* Processes a changeSet.
* If {@link ChangeSetState#incrementalBuild} is set to true, this method
* fill the lists and Maps of changeSetState
.
- *
+ *
* @param changeSet
* @param changeSetState
*/
@@ -345,7 +343,7 @@ public void processChangeSet(ChangeSet changeSet,
continue;
} else if ( ((InternalResource) resource).isDirectory() ) {
if ( this.resourceDirectories.add( resource ) ) {
- this.listener.warning( "KnowledgeAgent is subscribing to a modified directory=" + resource+
+ this.listener.warning( "KnowledgeAgent is subscribing to a modified directory=" + resource+
" when it should have already been subscribed" );
this.notifier.subscribeResourceChangeListener( this,
resource );
@@ -380,8 +378,6 @@ public void processChangeSet(ChangeSet changeSet,
changeSetState.addedResources.add( resource );
}
} else {
- if ( changeSetState.incrementalBuild ) {
-
Set definitions = this.removeResourceMapping( resource,
false );
@@ -391,7 +387,6 @@ public void processChangeSet(ChangeSet changeSet,
//adds a new empty mapping that will be filled in buildKnowledgeBase()
this.addResourceMapping( resource,
false );
- }
}
}
this.eventSupport.fireAfterResourceProcessed( changeSet,
@@ -466,7 +461,7 @@ public static class ChangeSetState {
*Map of created Packages. The agent will create this packages when
* processing added and modified resources
*/
- Map createdPackages = new LinkedHashMap();
+ Map> createdPackages = new LinkedHashMap>();
boolean scanDirectories;
boolean incrementalBuild;
}
@@ -496,7 +491,7 @@ private void buildResourceMapping(Package pkg,
* resource is not used and should be null. This is useful for packages
* that contains definitions from more than one resource.
* If autoDiscoverResource
is false and resource
- * is null, this method does nothig.
+ * is null, this method does nothig.
* @param pkg the definitions present in this package will be iterated and
* mapped to resource
* @param resource The resouce where the pkg's definition will be mapped. If
@@ -673,9 +668,9 @@ public void buildKnowledgeBase(ChangeSetState changeSetState) {
*
* @param resource
* @return
- * @see #createPackageFromResource(org.drools.io.Resource, org.drools.builder.KnowledgeBuilder)
+ * @see #createPackageFromResource(org.drools.io.Resource, org.drools.builder.KnowledgeBuilder)
*/
- private KnowledgePackageImp createPackageFromResource(Resource resource) {
+ private Collection createPackageFromResource(Resource resource) {
return this.createPackageFromResource( resource,
null );
}
@@ -689,7 +684,7 @@ private KnowledgePackageImp createPackageFromResource(Resource resource) {
* is already a package, this builder is not used.
* @return the package resulting of the compilation of resource.
*/
- private KnowledgePackageImp createPackageFromResource(Resource resource,
+ private Collection createPackageFromResource(Resource resource,
KnowledgeBuilder kbuilder) {
if ( ((InternalResource) resource).getResourceType() != ResourceType.PKG ) {
@@ -709,9 +704,9 @@ private KnowledgePackageImp createPackageFromResource(Resource resource,
kbuilder.getErrors() );
}
if ( kbuilder.getKnowledgePackages().iterator().hasNext() ) {
- return (KnowledgePackageImp) kbuilder.getKnowledgePackages().iterator().next();
+ return kbuilder.getKnowledgePackages();
}
- return null;
+ return Collections.emptyList();
} else {
// .pks are handled as a special case.
InputStream is = null;
@@ -741,7 +736,7 @@ private KnowledgePackageImp createPackageFromResource(Resource resource,
e ) );
}
}
- return kpkg;
+ return Arrays.asList(kpkg);
}
}
@@ -836,11 +831,11 @@ private void incrementalBuildResources(ChangeSetState changeSetState) {
for ( Map.Entry> entry : changeSetState.modifiedResourceMappings.entrySet() ) {
- KnowledgePackageImp newPackage = createPackageFromResource( entry.getKey() );
+ Collection newPackages = createPackageFromResource( entry.getKey() );
- if ( newPackage == null ) {
+ if ( newPackages == null || newPackages.size() == 0 ) {
this.listener.warning( "KnowledgeAgent: The resource didn't create any package: " + entry.getKey()+". Removing any existing knowledge definition of "+entry.getKey() );
-
+
for ( KnowledgeDefinition kd : entry.getValue() ) {
this.listener.debug( "KnowledgeAgent: Removing: " + kd );
removeKnowledgeDefinitionFromBase( kd );
@@ -848,15 +843,20 @@ private void incrementalBuildResources(ChangeSetState changeSetState) {
continue;
}
+
+ for ( KnowledgePackage pkage : newPackages ) {
+
+ KnowledgePackageImp newPackage = (KnowledgePackageImp) pkage;
+
KnowledgePackageImp oldPackage = (KnowledgePackageImp) this.kbase.getKnowledgePackage( newPackage.getName() );
AbstractRuleBase abstractRuleBase = (AbstractRuleBase)((KnowledgeBaseImpl)this.kbase).ruleBase;
- CompositeClassLoader rootClassLoader = abstractRuleBase.getRootClassLoader();
-
+ CompositeClassLoader rootClassLoader = abstractRuleBase.getRootClassLoader();
+
newPackage.pkg.getDialectRuntimeRegistry().onAdd( rootClassLoader );
newPackage.pkg.getDialectRuntimeRegistry().onBeforeExecute();
newPackage.pkg.getClassFieldAccessorStore().setClassFieldAccessorCache( abstractRuleBase.getClassFieldAccessorCache());
newPackage.pkg.getClassFieldAccessorStore().wire();
-
+
this.listener.debug( "KnowledgeAgent: Diffing: " + entry.getKey() );
ResourceDiffProducer rdp = new BinaryResourceDiffProducerImpl();
@@ -882,26 +882,32 @@ private void incrementalBuildResources(ChangeSetState changeSetState) {
false );
}
+ Set set = new HashSet();
+ set.add(diff.getPkg());
changeSetState.createdPackages.put( entry.getKey(),
- diff.getPkg() );
+ set );
+ }
}
/*
* Compile the newly added resources
*/
+ KnowledgeBuilder kBuilder = createKBuilder();
for ( Resource resource : changeSetState.addedResources ) {
///compile the new resource
- KnowledgePackageImp kpkg = createPackageFromResource( resource );
- if ( kpkg == null ) {
+ Collection kpkgs = createPackageFromResource( resource, kBuilder );
+ if ( kpkgs == null || kpkgs.size() == 0 ) {
this.listener.warning( "KnowledgeAgent: The resource didn't create any package: " + resource );
continue;
}
+
changeSetState.createdPackages.put( resource,
- kpkg );
+ new HashSet(kpkgs) );
+
}
- //the added and modified resources were already processed and
+ //the added and modified resources were already processed and
//converted to createdPackages. We must clear the lists.
changeSetState.addedResources.clear();
changeSetState.modifiedResourceMappings.clear();
@@ -972,64 +978,25 @@ private void removeKnowledgeDefinitionFromBase(KnowledgeDefinition kd) {
*/
private void addResourcesToKnowledgeBase(ChangeSetState changeSetState) {
- //KnowledgeBuilder kbuilder = this.createKBuilder();
- List packages = new ArrayList();
-
- for ( Resource resource : changeSetState.addedResources ) {
- KnowledgePackageImp createdPackage = this.createPackageFromResource( resource);
- //KnowledgePackageImp createdPackage = this.createPackageFromResource( resource,
- // kbuilder );
- changeSetState.createdPackages.put( resource,
- createdPackage );
- }
-
- //createPackageFromResource already log this
- // if (kbuilder.hasErrors()) {
- // this.listener.warning(
- // "KnowledgeAgent has KnowledgeBuilder errors ", kbuilder.getErrors());
- // }
-
- for ( Map.Entry entry : changeSetState.createdPackages.entrySet() ) {
- // For PKG (.pks) just add them
- Resource resource = entry.getKey();
- this.listener.debug( "KnowledgeAgent obtaining pkg resource="
- + resource );
-
- try {
- Package pkg = ((KnowledgePackageImp) entry.getValue()).pkg;
- for ( Rule rule : pkg.getRules() ) {
- rule.setResource( resource );
+ if (changeSetState.addedResources.size() > 0) {
+ KnowledgeBuilder builder = createKBuilder();
+ for ( Resource resource : changeSetState.addedResources ) {
+ Collection createdPackages = this.createPackageFromResource( resource, builder );
+ Set packs = changeSetState.createdPackages.get(resource);
+ if ( packs == null ) {
+ packs = new HashSet();
+ changeSetState.createdPackages.put( resource, packs );
}
- packages.add( pkg );
-
- this.buildResourceMapping( pkg,
- resource );
- } catch ( Exception e ) {
- this.listener.exception( new RuntimeException(
- "KnowledgeAgent exception while trying to deserialize KnowledgeDefinitionsPackage ",
- e ) );
+ packs.addAll(createdPackages);
}
}
- // if (kbuilder
- // != null) {
- // // Log any errors we come across
- // if (kbuilder.hasErrors()) {
- // this.listener.warning(
- // "KnowledgeAgent has KnowledgeBuilder errors ", kbuilder.getErrors());
- // }
- // this.listener.debug("KnowledgeAgent adding KnowledgePackages from KnowledgeBuilder");
- // this.kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
- // }
- /*
- * Add all the packages we found, but did not build, from the resources
- * now
- */
- for ( Package pkg : packages ) {
- this.listener.debug( "KnowledgeAgent adding KnowledgeDefinitionsPackage "
- + pkg.getName() );
- ((KnowledgeBaseImpl) this.kbase).ruleBase.addPackage( pkg );
+ for ( Resource resource : changeSetState.createdPackages.keySet() ) {
+ this.kbase.addKnowledgePackages(changeSetState.createdPackages.get(resource));
}
+
+ autoBuildResourceMapping();
+
}
/*
@@ -1106,6 +1073,14 @@ public boolean addResourceMapping(Resource resource,
return false;
}
+ /**
+ * Returns the Resource -> KnowledgeItem mapping
+ * @return
+ */
+ public Map> getRegisteredResources() {
+ return registeredResources.map;
+ }
+
/**
* Add an resource/definition entry to registeredResources. Optionaly it
* adds a listener to the resource added.
@@ -1321,7 +1296,7 @@ private KnowledgeBuilder createKBuilder() {
ResourceType.DSL );
}
}
-
+
return kbuilder;
}
@@ -1341,7 +1316,7 @@ private void retrieveDSLResource(Resource resource) throws IOException {
public void addEventListener(KnowledgeAgentEventListener listener) {
this.eventSupport.addEventListener( listener );
}
-
+
public void removeEventListener(KnowledgeAgentEventListener listener) {
this.eventSupport.removeEventListener( listener );
}
diff --git a/drools-core/src/main/java/org/drools/io/impl/InputStreamResource.java b/drools-core/src/main/java/org/drools/io/impl/InputStreamResource.java
index e4b4ed749d6..f74af9a2845 100644
--- a/drools-core/src/main/java/org/drools/io/impl/InputStreamResource.java
+++ b/drools-core/src/main/java/org/drools/io/impl/InputStreamResource.java
@@ -28,7 +28,7 @@
import org.drools.io.internal.InternalResource;
public class InputStreamResource extends BaseResource implements InternalResource {
- private InputStream stream;
+ private transient InputStream stream;
public InputStreamResource(InputStream stream) {
if ( stream == null ) {
diff --git a/drools-core/src/main/java/org/drools/io/impl/ReaderResource.java b/drools-core/src/main/java/org/drools/io/impl/ReaderResource.java
index 01f08ff7a5b..2640b30f194 100644
--- a/drools-core/src/main/java/org/drools/io/impl/ReaderResource.java
+++ b/drools-core/src/main/java/org/drools/io/impl/ReaderResource.java
@@ -29,7 +29,7 @@
import org.drools.io.internal.InternalResource;
public class ReaderResource extends BaseResource implements InternalResource {
- private Reader reader;
+ private transient Reader reader;
private String encoding;
public ReaderResource(Reader reader) {