[jboss-cvs] JBossAS SVN: r96430 - in projects/jboss-osgi/trunk/reactor/framework/src: main/java/org/jboss/osgi/framework/resolver and 4 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Mon Nov 16 06:21:30 EST 2009


Author: thomas.diesler at jboss.com
Date: 2009-11-16 06:21:29 -0500 (Mon, 16 Nov 2009)
New Revision: 96430

Added:
   projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/internal/drools/WireCandidate.java
Modified:
   projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/bundle/OSGiBundleManager.java
   projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/Resolvable.java
   projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/internal/ExportPackageImpl.java
   projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/internal/ImportPackageImpl.java
   projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/internal/NamedPackageImpl.java
   projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/internal/ResolvableImpl.java
   projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/internal/drools/RuleBasedResolverImpl.java
   projects/jboss-osgi/trunk/reactor/framework/src/test/java/org/jboss/test/osgi/resolver/AbstractImportExportTest.java
   projects/jboss-osgi/trunk/reactor/framework/src/test/resources/META-INF/resolver-rules.drl
Log:
Explicit control over which bundles get resolved by the drools resolver

Modified: projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/bundle/OSGiBundleManager.java
===================================================================
--- projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/bundle/OSGiBundleManager.java	2009-11-16 11:09:27 UTC (rev 96429)
+++ projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/bundle/OSGiBundleManager.java	2009-11-16 11:21:29 UTC (rev 96430)
@@ -687,6 +687,8 @@
       bundleState.setBundleManager(this);
       bundles.add(bundleState);
 
+      bundleState.changeState(Bundle.INSTALLED);
+
       // Add the bundle to the resolver
       // [TODO] remove this restriction
       if (bundleState.getBundleId() != 0)
@@ -695,8 +697,6 @@
          bundleResolver.addBundle(bundleState);
       }
 
-      bundleState.changeState(Bundle.INSTALLED);
-
       log.debug("Added: " + bundleState);
    }
 

Modified: projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/Resolvable.java
===================================================================
--- projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/Resolvable.java	2009-11-16 11:09:27 UTC (rev 96429)
+++ projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/Resolvable.java	2009-11-16 11:21:29 UTC (rev 96430)
@@ -56,6 +56,13 @@
    Version getVersion();
    
    /**
+    * Get the bundle's state.
+    * 
+    * @return the state
+    */
+   int getState();
+   
+   /**
     * Get the list of exported packages in the declared order.
     * @return The list of exported packages or an empty list if the bundle does not export any packages.
     */

Modified: projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/internal/ExportPackageImpl.java
===================================================================
--- projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/internal/ExportPackageImpl.java	2009-11-16 11:09:27 UTC (rev 96429)
+++ projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/internal/ExportPackageImpl.java	2009-11-16 11:21:29 UTC (rev 96430)
@@ -26,7 +26,6 @@
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 
 import org.jboss.osgi.framework.metadata.PackageAttribute;
@@ -127,20 +126,8 @@
       importers.remove(importer);
    }
    
-   private String toString;
    public String toString()
    {
-      if (toString == null)
-      {
-         Map<String, Parameter> attributes = getPackageMetaData().getAttributes();
-         Map<String, Parameter> directives = getPackageMetaData().getDirectives();
-         StringBuffer buffer = new StringBuffer("ExportPackage: " + getName());
-         for (Map.Entry<String, Parameter> entry : directives.entrySet())
-            buffer.append(";" + entry.getKey() + ":=" + entry.getValue().getValue());
-         for (Map.Entry<String, Parameter> entry : attributes.entrySet())
-            buffer.append(";" + entry.getKey() + "=" + entry.getValue().getValue());
-         toString = buffer.toString();
-      }
-      return toString;
+      return "ExportPackage" + toShortString();
    }
 }
\ No newline at end of file

Modified: projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/internal/ImportPackageImpl.java
===================================================================
--- projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/internal/ImportPackageImpl.java	2009-11-16 11:09:27 UTC (rev 96429)
+++ projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/internal/ImportPackageImpl.java	2009-11-16 11:21:29 UTC (rev 96430)
@@ -21,8 +21,6 @@
  */
 package org.jboss.osgi.framework.resolver.internal;
 
-import java.util.Map;
-
 import org.jboss.osgi.framework.metadata.PackageAttribute;
 import org.jboss.osgi.framework.metadata.Parameter;
 import org.jboss.osgi.framework.metadata.VersionRange;
@@ -109,20 +107,8 @@
 
    }
 
-   private String toString;
    public String toString()
    {
-      if (toString == null)
-      {
-         Map<String, Parameter> attributes = getPackageMetaData().getAttributes();
-         Map<String, Parameter> directives = getPackageMetaData().getDirectives();
-         StringBuffer buffer = new StringBuffer("ImportPackage: " + getName());
-         for (Map.Entry<String, Parameter> entry : directives.entrySet())
-            buffer.append(";" + entry.getKey() + ":=" + entry.getValue().getValue());
-         for (Map.Entry<String, Parameter> entry : attributes.entrySet())
-            buffer.append(";" + entry.getKey() + "=" + entry.getValue().getValue());
-         toString = buffer.toString();
-      }
-      return toString;
+      return "ImportPackage" + toShortString();
    }
 }
\ No newline at end of file

Modified: projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/internal/NamedPackageImpl.java
===================================================================
--- projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/internal/NamedPackageImpl.java	2009-11-16 11:09:27 UTC (rev 96429)
+++ projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/internal/NamedPackageImpl.java	2009-11-16 11:21:29 UTC (rev 96430)
@@ -21,6 +21,7 @@
  */
 package org.jboss.osgi.framework.resolver.internal;
 
+import java.util.Map;
 import java.util.Set;
 
 import org.jboss.osgi.framework.bundle.OSGiBundleState;
@@ -83,4 +84,22 @@
       Parameter attr = getPackageMetaData().getAttribute(key);
       return (attr != null ? attr.getValue() : null);
    }
+
+   private String packageSpec;
+   public String toShortString()
+   {
+      if (packageSpec == null)
+      {
+         Map<String, Parameter> attributes = getPackageMetaData().getAttributes();
+         Map<String, Parameter> directives = getPackageMetaData().getDirectives();
+         StringBuffer buffer = new StringBuffer("[" + getName());
+         for (Map.Entry<String, Parameter> entry : directives.entrySet())
+            buffer.append(";" + entry.getKey() + ":=" + entry.getValue().getValue());
+         for (Map.Entry<String, Parameter> entry : attributes.entrySet())
+            buffer.append(";" + entry.getKey() + "=" + entry.getValue().getValue());
+         buffer.append("]");
+         packageSpec = buffer.toString();
+      }
+      return packageSpec;
+   }
 }
\ No newline at end of file

Modified: projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/internal/ResolvableImpl.java
===================================================================
--- projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/internal/ResolvableImpl.java	2009-11-16 11:09:27 UTC (rev 96429)
+++ projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/internal/ResolvableImpl.java	2009-11-16 11:21:29 UTC (rev 96430)
@@ -108,6 +108,11 @@
       return bundleState.getVersion();
    }
 
+   public int getState()
+   {
+      return bundleState.getState();
+   }
+
    public ExportPackage getExportPackage(String packageName)
    {
       return exportedPackages.get(packageName);

Modified: projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/internal/drools/RuleBasedResolverImpl.java
===================================================================
--- projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/internal/drools/RuleBasedResolverImpl.java	2009-11-16 11:09:27 UTC (rev 96429)
+++ projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/internal/drools/RuleBasedResolverImpl.java	2009-11-16 11:21:29 UTC (rev 96430)
@@ -51,7 +51,7 @@
 public class RuleBasedResolverImpl extends AbstractResolver
 {
    private StatefulKnowledgeSession ksession;
-   private Map<Object, FactHandle> facts = new ConcurrentHashMap<Object, FactHandle>();
+   private Map<Resolvable, FactHandle> facts = new ConcurrentHashMap<Resolvable, FactHandle>();
 
    public RuleBasedResolverImpl(OSGiBundleManager bundleManager)
    {
@@ -71,14 +71,6 @@
    public Resolvable addBundle(Bundle bundle)
    {
       Resolvable resolvable = super.addBundle(bundle);
-      facts.put(resolvable, ksession.insert(resolvable));
-      
-      for (ImportPackage aux : resolvable.getImportPackages())
-         facts.put(aux, ksession.insert(aux));
-      
-      for (ExportPackage aux : resolvable.getExportPackages())
-         facts.put(aux, ksession.insert(aux));
-      
       return resolvable;
    }
 
@@ -86,30 +78,62 @@
    public Resolvable removeBundle(Bundle bundle)
    {
       Resolvable resolvable = super.removeBundle(bundle);
-      ksession.retract(facts.get(resolvable));
-      
-      for (ImportPackage aux : resolvable.getImportPackages())
-         ksession.retract(facts.get(aux));
-      
-      for (ExportPackage aux : resolvable.getExportPackages())
-         ksession.retract(facts.get(aux));
-      
+      FactHandle factHandle = facts.get(resolvable);
+      if (factHandle != null)
+      {
+         ksession.update(factHandle, resolvable);
+         ksession.fireAllRules();
+         ksession.retract(factHandle);
+      }
       return resolvable;
    }
 
-   public List<Resolvable> resolve(List<Bundle> notused)
+   public List<Resolvable> resolve(List<Bundle> bundles)
    {
+      // Get the list of unresolved resolvables
+      List<Resolvable> unresolved = new ArrayList<Resolvable>();
+      if (bundles == null)
+      {
+         for (Resolvable aux : getBundles())
+         {
+            if (aux.isResolved() == false)
+               unresolved.add(aux);
+         }
+      }
+      else
+      {
+         for (Bundle bundle : bundles)
+         {
+            Resolvable aux = getBundle(bundle);
+            if (aux == null)
+               throw new IllegalStateException("Cannot obtain resolvable for: " + bundle);
+            
+            if (aux.isResolved() == false)
+               unresolved.add(aux);
+         }
+      }
+      
+      // Insert the missing resolvables into the knowledge base
+      for (Resolvable aux : unresolved)
+      {
+         FactHandle factHandle = ksession.getFactHandle(aux);
+         if (factHandle == null)
+            factHandle = ksession.insert(aux);
+         
+         facts.put(aux, factHandle);
+      }
+
+      // Fire all the rules
       ksession.fireAllRules();
-      
-      List<Resolvable> resolvedBundles = new ArrayList<Resolvable>();
+
+      // Return teh list of resolved bundles
+      List<Resolvable> resolved = new ArrayList<Resolvable>();
       for (Resolvable aux : getBundles())
       {
          if (aux.isResolved())
-         {
-            resolvedBundles.add(aux);
-         }
+            resolved.add(aux);
       }
-      return Collections.unmodifiableList(resolvedBundles);
+      return Collections.unmodifiableList(resolved);
    }
 
    public ExportPackage getExporter(Bundle bundle, String packageName)
@@ -117,7 +141,7 @@
       Resolvable resolvable = getBundle(bundle);
       if (resolvable == null)
          throw new IllegalStateException("Cannot find resovable for: " + bundle);
-      
+
       ImportPackage importPackage = resolvable.getImportPackage(packageName);
       if (importPackage == null)
          throw new IllegalStateException("Cannot find import package: " + packageName);

Added: projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/internal/drools/WireCandidate.java
===================================================================
--- projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/internal/drools/WireCandidate.java	                        (rev 0)
+++ projects/jboss-osgi/trunk/reactor/framework/src/main/java/org/jboss/osgi/framework/resolver/internal/drools/WireCandidate.java	2009-11-16 11:21:29 UTC (rev 96430)
@@ -0,0 +1,72 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.osgi.framework.resolver.internal.drools;
+
+import org.jboss.osgi.framework.resolver.ExportPackage;
+import org.jboss.osgi.framework.resolver.ImportPackage;
+import org.jboss.osgi.framework.resolver.Resolvable;
+import org.jboss.osgi.framework.resolver.internal.ExportPackageImpl;
+import org.jboss.osgi.framework.resolver.internal.ImportPackageImpl;
+
+/**
+ * A Resolver that is based on the Drools rule engine.
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 16-Nov-2009
+ */
+public class WireCandidate
+{
+   private ImportPackageImpl importPackage;
+   private ExportPackageImpl exportPackage;
+
+   public ImportPackage getImportPackage()
+   {
+      return importPackage;
+   }
+
+   public void setImportPackage(ImportPackage importPackage)
+   {
+      this.importPackage = (ImportPackageImpl)importPackage;
+   }
+
+   public ExportPackage getExportPackage()
+   {
+      return exportPackage;
+   }
+
+   public void setExportPackage(ExportPackage exportPackage)
+   {
+      this.exportPackage = (ExportPackageImpl)exportPackage;
+   }
+
+   @Override
+   public String toString()
+   {
+      Resolvable impOwner = importPackage.getOwner();
+      String importer = impOwner.getSymbolicName() + "-" + impOwner.getVersion() + importPackage.toShortString();
+      Resolvable expOwner = exportPackage.getOwner();
+      String exporter = expOwner.getSymbolicName() + "-" + expOwner.getVersion() + exportPackage.toShortString();
+      return "WireCandidate[" + importer + "] --> [" + exporter + "]";
+   }
+   
+
+}
\ No newline at end of file

Modified: projects/jboss-osgi/trunk/reactor/framework/src/test/java/org/jboss/test/osgi/resolver/AbstractImportExportTest.java
===================================================================
--- projects/jboss-osgi/trunk/reactor/framework/src/test/java/org/jboss/test/osgi/resolver/AbstractImportExportTest.java	2009-11-16 11:09:27 UTC (rev 96429)
+++ projects/jboss-osgi/trunk/reactor/framework/src/test/java/org/jboss/test/osgi/resolver/AbstractImportExportTest.java	2009-11-16 11:21:29 UTC (rev 96430)
@@ -29,6 +29,9 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
+import java.util.Arrays;
+import java.util.List;
+
 import org.jboss.osgi.framework.resolver.ExportPackage;
 import org.jboss.osgi.framework.resolver.ImportPackage;
 import org.jboss.osgi.framework.resolver.Resolvable;
@@ -127,6 +130,50 @@
    }
 
    @Test
+   public void testExplicitBundleResolve() throws Exception
+   {
+      Resolver resolver = getTestResolver();
+      assertEquals("No bundles in resolver", 0, resolver.getBundles().size());
+
+      // Bundle-SymbolicName: simpleimport
+      // Import-Package: org.jboss.test.osgi.classloader.support.a
+      VirtualFile fileA = assembleBundle("bundleA", "/bundles/resolver/simpleimport");
+      Bundle bundleA = framework.installBundle(fileA);
+      try
+      {
+         // Bundle-SymbolicName: simpleexport
+         // Export-Package: org.jboss.test.osgi.classloader.support.a
+         VirtualFile fileB = assembleBundle("bundleB", "/bundles/resolver/simpleexport", A.class);
+         Bundle bundleB = framework.installBundle(fileB);
+         try
+         {
+            // Only resolve BundleB
+            List<Resolvable> resolved = resolver.resolve(Arrays.asList(new Bundle[] { bundleB }));
+            assertEquals("BundleB resolved", 1, resolved.size());
+            assertEquals(bundleB.getSymbolicName(), resolved.get(0).getSymbolicName());
+
+            // Verify resolvable for bundleA
+            Resolvable resolvableA = resolver.getBundle(bundleA);
+            assertFalse("BundleA not resolved", resolvableA.isResolved());
+
+            // Resolve the installed bundles
+            resolver.resolve(null);
+            
+            // Verify resolvable for bundleA
+            assertTrue("BundleA resolved", resolvableA.isResolved());
+         }
+         finally
+         {
+            bundleB.uninstall();
+         }
+      }
+      finally
+      {
+         bundleA.uninstall();
+      }
+   }
+
+   @Test
    public void testSelfImportPackage() throws Exception
    {
       Resolver resolver = getTestResolver();

Modified: projects/jboss-osgi/trunk/reactor/framework/src/test/resources/META-INF/resolver-rules.drl
===================================================================
--- projects/jboss-osgi/trunk/reactor/framework/src/test/resources/META-INF/resolver-rules.drl	2009-11-16 11:09:27 UTC (rev 96429)
+++ projects/jboss-osgi/trunk/reactor/framework/src/test/resources/META-INF/resolver-rules.drl	2009-11-16 11:21:29 UTC (rev 96430)
@@ -1,23 +1,88 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
 package org.jboss.osgi.framework.resolver
 
+import org.jboss.osgi.framework.resolver.internal.drools.WireCandidate
 import org.jboss.osgi.framework.metadata.VersionRange
+import org.osgi.framework.Bundle
 import org.osgi.framework.Version
 
+# Functions #######################################################################################
+
+/**
+* Returns TRUE is the version is in the given version range
+*/
 function boolean inRange(VersionRange range, Version version) 
 {
    return range.isInRange(version);
 }
 
+/**
+* Logs a message to the logging system 
+*/
 function void log(String message) 
 {
-   # System.out.println(message);
+   // System.out.println(message);
 }
 
-declare WireCandidate
-   importPackage : ImportPackage
-   exportPackage : ExportPackage
+# Types ###########################################################################################
+
+
+# Rules ###########################################################################################
+
+/**************************************************************************************************
+* A rule that inserts the ImportPackage facts for newly inserted 
+* Resolvable objects.
+*/
+rule "Add import packages for new resolvable"
+salience 10000
+when
+	$owner : Resolvable( resolved == false, state == Bundle.INSTALLED )
+	$import : ImportPackage( owner == $owner ) from $owner.importPackages
+	not ImportPackage( owner == $owner, name == $import.name ) 
+then
+    log("Add " + $import);
+    insert( $import );
 end
 
+/**************************************************************************************************
+* A rule that inserts the ExportPackage facts for newly inserted 
+* Resolvable objects.
+*/
+rule "Add export packages for new resolvable"
+salience 10000
+when
+	$owner : Resolvable( resolved == false, state == Bundle.INSTALLED )
+	$export : ExportPackage( owner == $owner ) from $owner.exportPackages
+	not ExportPackage( owner == $owner, name == $export.name ) 
+then
+    log("Add " + $export);
+    insert( $export );
+end
+
+/**************************************************************************************************
+* A rule that inserts the WireCandidate facts for every combination 
+* of matching import/export package names.
+*/
 rule "Add WireCandidate"
 salience 1000
 when
@@ -27,11 +92,14 @@
     WireCandidate wc = new WireCandidate();
     wc.setImportPackage( $import );
     wc.setExportPackage( $export );
-    
-    log("Add WireCandidate " + wc.getImportPackage() + " --> " + wc.getExportPackage());
+    log("Add " + wc);
     insert ( wc );
 end
 
+/**************************************************************************************************
+* A rule that retracts the WireCandidate if there is a package
+* version miss-match.
+*/
 rule "Retract package version miss-match"
 salience 100
 when
@@ -39,20 +107,28 @@
     $wc : WireCandidate( importPackage == $import )
     not( eval( inRange( $import.getVersion(), $wc.getExportPackage().getVersion())))
 then
-    log("Retract package version " + $wc.getExportPackage());
+    log("Package version missmatch - Retract " + $wc);
     retract ( $wc );
 end
 
+/**************************************************************************************************
+* A rule that retracts the WireCandidate if there is a miss-match
+* of the bundle-symbolic-name on the ImportPackage.
+*/
 rule "Retract bundle symbolic name miss-match"
 salience 100
 when
     $import : ImportPackage( exporter == null, bundleSymbolicName != null )
     $wc : WireCandidate( importPackage == $import, exportPackage.owner.symbolicName != $import.bundleSymbolicName )
 then
-    log("Retract bundle symbolic name " + $wc.getExportPackage().getOwner());
+    log("Bundle-SymbolicName missmatch - Retract " + $wc);
     retract ( $wc );
 end
 
+/**************************************************************************************************
+* A rule that retracts the WireCandidate if there is a miss-match
+* of the bundle-version on the ImportPackage.
+*/
 rule "Retract bundle version miss-match"
 salience 100
 when
@@ -60,41 +136,94 @@
     $wc : WireCandidate( importPackage == $import )
     not( eval( inRange( $import.getBundleVersion(), $wc.getExportPackage().getOwner().getVersion())))
 then
-    log("Retract bundle version " + $wc.getExportPackage().getOwner());
+    log("Bundle-Version missmatch - Retract " + $wc);
     retract ( $wc );
 end
 
-rule "Retract optional imports"
-salience 10
-when
-    $import : ImportPackage( exporter == null, optional == true )
-    not( WireCandidate( importPackage == $import ) )
-then
-    log("Retract optional " + $import);
-    retract ( $import );
-end
-
+/**************************************************************************************************
+* A rule that applies the WireCandidate if there is only one 
+* possible WireCandidate left that refers to an ImportPackage.
+*/
 rule "Use WireCandidate"
 when
-    $import : ImportPackage( exporter == null )
+    $owner : Resolvable( resolved == false )
+    $import : ImportPackage( owner == $owner, exporter == null )
     $wc : WireCandidate( importPackage == $import )
     not( WireCandidate( this != $wc, importPackage == $import ) )
 then
-    log("Use WireCandidate " + $wc.getImportPackage() + " --> " + $wc.getExportPackage());
+    log("Use " + $wc);
     modify ( $wc.getImportPackage() ) { setExporter( $wc.getExportPackage() ) };
     retract ( $wc );
 end
 
+/**************************************************************************************************
+* A rule that marls the Resolvable as resolved if there 
+* is no more ImportPackage that is not wired to an ExportPackage.
+*/
 rule "Mark resolved"
 when
     $owner : Resolvable( resolved == false )
-    not( ImportPackage( owner == $owner, exporter == null ))
+    not( ImportPackage( owner == $owner, optional == false, exporter == null ))
 then
     log("Resolved " + $owner);
     modify ( $owner ) { markResolved ( ) };
 end
 
+/**************************************************************************************************
+* A rule that retracts ImportPackage facts for UNINSTALLED bundles
+*/
+rule "Retract uninstalled ImportPackage"
+when
+    $owner : Resolvable( )
+    eval ( $owner.getState() == Bundle.UNINSTALLED )
+    $import : ImportPackage( owner == $owner )
+then
+    log("Uninstall " + $import);
+    retract ( $import );
+end
+
+/**************************************************************************************************
+* A rule that retracts ExportPackage facts for UNINSTALLED bundles
+*/
+rule "Retract uninstalled ExportPackage"
+when
+    $owner : Resolvable( )
+    eval ( $owner.getState() == Bundle.UNINSTALLED )
+    $export : ExportPackage( owner == $owner )
+then
+    log("Uninstall " + $export);
+    retract ( $export );
+end
+
+/**************************************************************************************************
+* A rule that retracts WireCandidate facts for UNINSTALLED ImportPackages
+*/
+rule "Retract uninstalled WireCandidate/ImportPackage"
+when
+    $wc : WireCandidate( )
+    not ( ImportPackage ( this == $wc.importPackage) ) 
+then
+    log("Uninstall " + $wc);
+    retract ( $wc );
+end
+
+/**************************************************************************************************
+* A rule that retracts WireCandidate facts for UNINSTALLED ExportPackages
+*/
+rule "Retract uninstalled WireCandidate/ExportPackage"
+when
+    $wc : WireCandidate( )
+    not ( ExportPackage ( this == $wc.exportPackage) ) 
+then
+    log("Unistall " + $wc);
+    retract ( $wc );
+end
+
+/**************************************************************************************************
+* A rule that reports unresolved ImportPackage objects 
+*/
 rule "Report unresolved import"
+salience -1000
 when
     $import : ImportPackage( exporter == null )
 then




More information about the jboss-cvs-commits mailing list