Author: thomas.diesler(a)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(a)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