[jboss-svn-commits] JBL Code SVN: r30867 - labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Wed Dec 30 11:56:52 EST 2009
Author: eaa
Date: 2009-12-30 11:56:52 -0500 (Wed, 30 Dec 2009)
New Revision: 30867
Modified:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl/KnowledgeAgentImpl.java
Log:
JBRULES-2082: support for delete/modify in changesets
- Added source code documentation to KnowledgeAgentImpl
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl/KnowledgeAgentImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl/KnowledgeAgentImpl.java 2009-12-30 11:26:58 UTC (rev 30866)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/agent/impl/KnowledgeAgentImpl.java 2009-12-30 16:56:52 UTC (rev 30867)
@@ -153,6 +153,14 @@
processChangeSet(getChangeSet(resource), changeSetState);
}
+ /**
+ * Processes a changeSet.
+ * If {@link ChangeSetState#incrementalBuild} is set to true, this method
+ * fill the lists and Maps of <code>changeSetState</code>.
+ *
+ * @param changeSet
+ * @param changeSetState
+ */
public void processChangeSet(ChangeSet changeSet,
ChangeSetState changeSetState) {
synchronized (this.registeredResources) {
@@ -276,7 +284,7 @@
changeSetState.modifiedResourceMappings.put(resource, definitions);
- //adds a new empty mapping that will be filled in buildResourceMapping()
+ //adds a new empty mapping that will be filled in buildKnowledgeBase()
this.addResourceMapping(resource, false);
}
}
@@ -349,6 +357,13 @@
boolean incrementalBuild;
}
+ /**
+ * Same as {@link #buildResourceMapping(org.drools.rule.Package, org.drools.io.Resource, boolean)
+ * buildResourceMapping(org.drools.rule.Package, org.drools.io.Resource, false)}.
+ * If <code>resource</code> is null, this method does nothing.
+ * @param pkg
+ * @param resource
+ */
private void buildResourceMapping(Package pkg, Resource resource) {
if (resource == null) {
this.listener.warning("KnowledgeAgent: trying to build a resource map for a null resource!");
@@ -357,6 +372,23 @@
this.buildResourceMapping(pkg, resource, false);
}
+ /**
+ * Iterates over the pkg's definitions and maps it to resource.
+ * If autoDiscoverResource is set to true, the resource used in the mapping
+ * will be taken from each definition. In this case, the parameter <code>
+ * resource</code> is not used and should be null. This is useful for packages
+ * that contains definitions from more than one resource.
+ * If <code>autoDiscoverResource</code> is false and <code>resource</code>
+ * is null, this method does nothig.
+ * @param pkg the definitions present in this package will be iterated and
+ * mapped to <code>resource</code>
+ * @param resource The resouce where the pkg's definition will be mapped. If
+ * <code>autoDiscoverResource</code> is true, this parameter should be null;
+ * it will not be used.
+ * @param autoDiscoverResource if set to true, the resource to do the mapping
+ * will be taken from each definition. If that is the case, the parameter
+ * <code>resource</code> is not used.
+ */
private void buildResourceMapping(Package pkg, Resource resource, boolean autoDiscoverResource) {
synchronized (this.registeredResources) {
@@ -497,10 +529,27 @@
this.listener.debug("KnowledgeAgent finished rebuilding KnowledgeBase using ChangeSet");
}
+ /**
+ * Same as {@link #createPackageFromResource(org.drools.io.Resource, org.drools.builder.KnowledgeBuilder)
+ * createPackageFromResource(org.drools.io.Resource, null)}
+ *
+ * @param resource
+ * @return
+ * @see #createPackageFromResource(org.drools.io.Resource, org.drools.builder.KnowledgeBuilder)
+ */
private KnowledgePackageImp createPackageFromResource(Resource resource) {
return this.createPackageFromResource(resource, null);
}
+ /**
+ * Compiles the resource and returns the created package using the passed
+ * kbuilder. If kbuilder is null, a new instance of a Builder is used.
+ * Kbuilder is not used for resources that already are packages.
+ * @param resource the resource to compile.
+ * @param kbuilder the builder used to compile the resource. If the resource
+ * is already a package, this builder is not used.
+ * @return the package resulting of the compilation of resource.
+ */
private KnowledgePackageImp createPackageFromResource(Resource resource,KnowledgeBuilder kbuilder) {
if (kbuilder == null){
@@ -572,20 +621,50 @@
this.kbase = KnowledgeBaseFactory.newKnowledgeBase();
}
+ //puts all the resources as added in the changeSet.
changeSetState.addedResources.clear();
changeSetState.addedResources.addAll(this.registeredResources.getAllResources());
addResourcesToKnowledgeBase(changeSetState);
- //autoBuildResourceMapping();
this.listener.info("KnowledgeAgent new KnowledgeBase now built and in use");
}
/**
- * This method is meant to incrementally build or update the current
- * KnowledgeBase.
- *
- * @param changeSet
- * @param changeSetState
+ * Processes {@link ChangeSetState#removedResourceMappings},
+ * {@link ChangeSetState#addedResources} and
+ * {@link ChangeSetState#modifiedResourceMappings} of <code>changeSetState</code>
+ * and apply them to {@link #kbase}.
+ * The way the lists are processed is:
+ * <ol>
+ * <li>
+ * Each element of {@link ChangeSetState#removedResourceMappings} is removed
+ * from {@link #kbase} using {@link #removeKnowledgeDefinitionFromBase(org.drools.definition.KnowledgeDefinition) }.
+ * </li>
+ * <li>
+ * Each element of {@link ChangeSetState#modifiedResourceMappings} is compiled
+ * using {@link #createPackageFromResource(org.drools.io.Resource) } and
+ * diffed against the previous version of the resource. The diff dictates
+ * wich definitions should be removed and what should be updated. The
+ * ones that should be removed are deleted using
+ * {@link #removeKnowledgeDefinitionFromBase(org.drools.definition.KnowledgeDefinition) },
+ * the ones that should be update/added are put into
+ * {@link ChangeSetState#createdPackages} of <code>changeSetState</code>.
+ * </li>
+ * <li>
+ * Each element of {@link ChangeSetState#addedResources} is compiled
+ * using {@link #createPackageFromResource(org.drools.io.Resource) }
+ * and added to {@link ChangeSetState#createdPackages} of
+ * <code>changeSetState</code>.
+ * </li>
+ * </ol>
+ * Because the elements of {@link ChangeSetState#addedResources} and
+ * {@link ChangeSetState#modifiedResourceMappings} were already processed and
+ * added as elements of {@link ChangeSetState#createdPackages}, these two lists
+ * are emtpied.
+ * The <code>changeSetState</code> is then passed to
+ * {@link #addResourcesToKnowledgeBase(org.drools.agent.impl.KnowledgeAgentImpl.ChangeSetState) }
+ * in order to process {@link ChangeSetState#createdPackages}.
+ * @param changeSetState the ChangeSetState
*/
private void incrementalBuildResources(ChangeSetState changeSetState) {
if (this.newInstance) {
@@ -608,14 +687,12 @@
}
}
-
-
-
for (Map.Entry<Resource, Set<KnowledgeDefinition>> entry : changeSetState.modifiedResourceMappings.entrySet()) {
KnowledgePackageImp kpkg = createPackageFromResource(entry.getKey());
if (kpkg == null){
+ this.listener.warning("KnowledgeAgent: The resource didn't create any package: "+entry.getKey());
continue;
}
@@ -640,12 +717,16 @@
///compile the new resource
KnowledgePackageImp kpkg = createPackageFromResource(resource);
if (kpkg == null){
+ this.listener.warning("KnowledgeAgent: The resource didn't create any package: "+resource);
continue;
}
changeSetState.createdPackages.put(resource, kpkg);
}
- //the added resources were already processed and converted to createdPackages.
+
+ //the added and modified resources were already processed and
+ //converted to createdPackages. We must clear the lists.
changeSetState.addedResources.clear();
+ changeSetState.modifiedResourceMappings.clear();
addResourcesToKnowledgeBase(changeSetState);
@@ -654,8 +735,8 @@
}
/**
- *
- * @param kd
+ * Removes a definition from {@link #kbase}.
+ * @param kd the definition to be removed.
*/
private void removeKnowledgeDefinitionFromBase(KnowledgeDefinition kd) {
try {
@@ -683,19 +764,35 @@
/**
* Adds the resources to the current KnowledgeBase on this KnowledgeAgent.
- * Only uses the KnowledgeBuilder when necessary.
+ * This method processes {@link ChangeSetState#addedResources} and
+ * {@link ChangeSetState#createdPackages} lists in two different ways:
+ * <ul>
+ * <li>
+ * The elments of {@link ChangeSetState#addedResources} are compiled using
+ * {@link #createPackageFromResource(org.drools.io.Resource, org.drools.builder.KnowledgeBuilder)}
+ * and added to {@link ChangeSetState#createdPackages}. The same kbuilder
+ * is used for all the elements.
+ * </li>
+ * <li>
+ * The elments of {@link ChangeSetState#createdPackages} are added to
+ * {@link #kbase}. Each package is mapped to the original resource
+ * using {@link #buildResourceMapping(org.drools.rule.Package, org.drools.io.Resource)}.
+ * </li>
+ * </ul>
*
- * @param resources
+ *
+ * @param changeSetState the object containing the added resources list and
+ * created pacages list.
*/
private void addResourcesToKnowledgeBase(ChangeSetState changeSetState) {
- KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();;
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
List<Package> packages = new ArrayList<Package>();
+
for (Resource resource : changeSetState.addedResources) {
KnowledgePackageImp createdPackage = this.createPackageFromResource(resource, kbuilder);
changeSetState.createdPackages.put(resource, createdPackage);
-
}
@@ -706,7 +803,6 @@
+ resource);
try {
- // .pks are handled as a special case.
Package pkg = ((KnowledgePackageImp) entry.getValue()).pkg;
for (Rule rule : pkg.getRules()) {
rule.setResource(resource);
More information about the jboss-svn-commits
mailing list