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 += ""; + 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 += ""; + 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) {