You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by gn...@apache.org on 2010/10/21 15:43:26 UTC

svn commit: r1025997 - in /karaf/trunk/features: core/src/main/java/org/apache/karaf/features/ core/src/main/java/org/apache/karaf/features/internal/ obr/src/main/java/org/apache/karaf/features/obr/internal/ obr/src/test/java/org/apache/karaf/features/...

Author: gnodet
Date: Thu Oct 21 13:43:26 2010
New Revision: 1025997

URL: http://svn.apache.org/viewvc?rev=1025997&view=rev
Log:
[KARAF-252] Add a dependency boolean attribute on features' bundles and allow specifiying an optional resolver

Modified:
    karaf/trunk/features/core/src/main/java/org/apache/karaf/features/BundleInfo.java
    karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/BundleInfoImpl.java
    karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/FeatureImpl.java
    karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
    karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/RepositoryImpl.java
    karaf/trunk/features/obr/src/main/java/org/apache/karaf/features/obr/internal/BundleInfoImpl.java
    karaf/trunk/features/obr/src/main/java/org/apache/karaf/features/obr/internal/ObrResolver.java
    karaf/trunk/features/obr/src/test/java/org/apache/karaf/features/obr/internal/ObrResolverTest.java

Modified: karaf/trunk/features/core/src/main/java/org/apache/karaf/features/BundleInfo.java
URL: http://svn.apache.org/viewvc/karaf/trunk/features/core/src/main/java/org/apache/karaf/features/BundleInfo.java?rev=1025997&r1=1025996&r2=1025997&view=diff
==============================================================================
--- karaf/trunk/features/core/src/main/java/org/apache/karaf/features/BundleInfo.java (original)
+++ karaf/trunk/features/core/src/main/java/org/apache/karaf/features/BundleInfo.java Thu Oct 21 13:43:26 2010
@@ -27,4 +27,6 @@ public interface BundleInfo {
     
     boolean isStart();
 
+    boolean isDependency();
+
 }

Modified: karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/BundleInfoImpl.java
URL: http://svn.apache.org/viewvc/karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/BundleInfoImpl.java?rev=1025997&r1=1025996&r2=1025997&view=diff
==============================================================================
--- karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/BundleInfoImpl.java (original)
+++ karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/BundleInfoImpl.java Thu Oct 21 13:43:26 2010
@@ -26,7 +26,8 @@ public class BundleInfoImpl implements B
     private int startLevel;
     private String location;
     private boolean start;
-    
+    private boolean dependency;
+
 
     public BundleInfoImpl() {
     }
@@ -34,36 +35,43 @@ public class BundleInfoImpl implements B
     public BundleInfoImpl(String location) {
     	this.location = location;
     }
-    
-    
+
+
     public BundleInfoImpl(String location, boolean start) {
     	this.location = location;
         this.start = start;
     }
-    
+
     public BundleInfoImpl(String location, int startLevel) {
     	this.location = location;
         this.startLevel = startLevel;
     }
-    
+
     public BundleInfoImpl(String location, int startLevel, boolean start) {
     	this.location = location;
         this.startLevel = startLevel;
         this.start = start;
     }
-    
+
+    public BundleInfoImpl(String location, int startLevel, boolean start, boolean dependency) {
+        this.location = location;
+        this.startLevel = startLevel;
+        this.start = start;
+        this.dependency = dependency;
+    }
+
     public void setStartLevel(Integer startLevel) {
     	this.startLevel = startLevel;
     }
-	
+
     public int getStartLevel() {
 		return this.startLevel;
 	}
-	
+
 	public void setName(String location) {
 		this.location = location;
 	}
-	
+
 	public String getLocation() {
 		return this.location;
 	}
@@ -75,4 +83,13 @@ public class BundleInfoImpl implements B
 	public boolean isStart() {
 		return start;
 	}
+
+    public void setDependency(boolean dependency) {
+        this.dependency = dependency;
+    }
+
+    public boolean isDependency() {
+        return dependency;
+    }
+
 }

Modified: karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/FeatureImpl.java
URL: http://svn.apache.org/viewvc/karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/FeatureImpl.java?rev=1025997&r1=1025996&r2=1025997&view=diff
==============================================================================
--- karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/FeatureImpl.java (original)
+++ karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/FeatureImpl.java Thu Oct 21 13:43:26 2010
@@ -34,8 +34,6 @@ public class FeatureImpl implements Feat
     private String version;
     private String resolver;
     private List<Feature> dependencies = new ArrayList<Feature>();
-    // TODO 
-    // private List<String> bundles = new ArrayList<String>();
     private List<BundleInfo> bundles = new ArrayList<BundleInfo>();
     private Map<String, Map<String,String>> configs = new HashMap<String, Map<String,String>>();
     public static String SPLIT_FOR_NAME_AND_VERSION = "_split_for_name_and_version_";

Modified: karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
URL: http://svn.apache.org/viewvc/karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java?rev=1025997&r1=1025996&r2=1025997&view=diff
==============================================================================
--- karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java (original)
+++ karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java Thu Oct 21 13:43:26 2010
@@ -440,13 +440,31 @@ public class FeaturesServiceImpl impleme
         if (resolver == null || resolver.length() == 0) {
         	return feature.getBundles();
         }
+        boolean optional = false;
+        if (resolver.startsWith("(") && resolver.endsWith(")")) {
+            resolver = resolver.substring(1, resolver.length() - 1);
+            optional = true;
+        }
         // Else, find the resolver
         String filter = "(&(" + Constants.OBJECTCLASS + "=" + Resolver.class.getName() + ")(name=" + resolver + "))";
         ServiceTracker tracker = new ServiceTracker(bundleContext, FrameworkUtil.createFilter(filter), null);
         tracker.open();
         try {
-            Resolver r = (Resolver) tracker.waitForService(resolverTimeout);
-            return r.resolve(feature);
+            if (optional) {
+                Resolver r = (Resolver) tracker.getService();
+                if (r != null) {
+                    return r.resolve(feature);
+                } else {
+                    LOGGER.debug("Optional resolver '" + resolver + "' not found, using the default resolver");
+                    return feature.getBundles();
+                }
+            } else {
+                Resolver r = (Resolver) tracker.waitForService(resolverTimeout);
+                if (r == null) {
+                    throw new Exception("Unable to find required resolver '" + resolver + "'");
+                }
+                return r.resolve(feature);
+            }
         } finally {
             tracker.close();
         }

Modified: karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/RepositoryImpl.java
URL: http://svn.apache.org/viewvc/karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/RepositoryImpl.java?rev=1025997&r1=1025996&r2=1025997&view=diff
==============================================================================
--- karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/RepositoryImpl.java (original)
+++ karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/RepositoryImpl.java Thu Oct 21 13:43:26 2010
@@ -163,13 +163,19 @@ public class RepositoryImpl implements R
                         Element b = (Element) bundleNodes.item(j);
                         String bStartLevel = b.getAttribute("start-level");
                         String bStart = b.getAttribute("start");
+                        String bDependency = b.getAttribute("dependency");
                         boolean bs = true;
+                        boolean bd = false;
                         int bsl = 0;
                         
                         // Check the value of the "start" attribute
                         if (bStart != null && bStart.length() > 0) {
                             bs = Boolean.parseBoolean(bStart);
                         }
+                        // Check the value of the "dependency" attribute
+                        if (bDependency != null && bDependency.length() > 0) {
+                            bd = Boolean.parseBoolean(bDependency);
+                        }
                         // Check start level
                         if (bStartLevel != null && bStartLevel.length() > 0) {
                         	try {
@@ -178,7 +184,7 @@ public class RepositoryImpl implements R
                         		LOGGER.error("The start-level is not an int value for the bundle : " + b.getTextContent());
                             }
                         }
-                        f.addBundle(new BundleInfoImpl(b.getTextContent(), bsl, bs));
+                        f.addBundle(new BundleInfoImpl(b.getTextContent(), bsl, bs, bd));
                     }
                     features.add(f);
                 }

Modified: karaf/trunk/features/obr/src/main/java/org/apache/karaf/features/obr/internal/BundleInfoImpl.java
URL: http://svn.apache.org/viewvc/karaf/trunk/features/obr/src/main/java/org/apache/karaf/features/obr/internal/BundleInfoImpl.java?rev=1025997&r1=1025996&r2=1025997&view=diff
==============================================================================
--- karaf/trunk/features/obr/src/main/java/org/apache/karaf/features/obr/internal/BundleInfoImpl.java (original)
+++ karaf/trunk/features/obr/src/main/java/org/apache/karaf/features/obr/internal/BundleInfoImpl.java Thu Oct 21 13:43:26 2010
@@ -26,6 +26,7 @@ public class BundleInfoImpl implements B
     private int startLevel;
     private String location;
     private boolean start;
+    private boolean dependency;
 
 
     public BundleInfoImpl() {
@@ -52,6 +53,13 @@ public class BundleInfoImpl implements B
         this.start = start;
     }
 
+    public BundleInfoImpl(String location, int startLevel, boolean start, boolean dependency) {
+        this.location = location;
+        this.startLevel = startLevel;
+        this.start = start;
+        this.dependency = dependency;
+    }
+
     public void setStartLevel(Integer startLevel) {
     	this.startLevel = startLevel;
     }
@@ -75,4 +83,13 @@ public class BundleInfoImpl implements B
 	public boolean isStart() {
 		return start;
 	}
+
+    public void setDependency(boolean dependency) {
+        this.dependency = dependency;
+    }
+
+    public boolean isDependency() {
+        return dependency;
+    }
+
 }

Modified: karaf/trunk/features/obr/src/main/java/org/apache/karaf/features/obr/internal/ObrResolver.java
URL: http://svn.apache.org/viewvc/karaf/trunk/features/obr/src/main/java/org/apache/karaf/features/obr/internal/ObrResolver.java?rev=1025997&r1=1025996&r2=1025997&view=diff
==============================================================================
--- karaf/trunk/features/obr/src/main/java/org/apache/karaf/features/obr/internal/ObrResolver.java (original)
+++ karaf/trunk/features/obr/src/main/java/org/apache/karaf/features/obr/internal/ObrResolver.java Thu Oct 21 13:43:26 2010
@@ -22,6 +22,7 @@ import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -51,6 +52,7 @@ public class ObrResolver implements Reso
     public List<BundleInfo> resolve(Feature feature) throws Exception {
         List<Requirement> reqs = new ArrayList<Requirement>();
         List<Resource> ress = new ArrayList<Resource>();
+        List<Resource> deploy = new ArrayList<Resource>();
         Map<Object, BundleInfo> infos = new HashMap<Object, BundleInfo>();
         for (BundleInfo bundleInfo : feature.getBundles()) {
             try {
@@ -74,7 +76,9 @@ public class ObrResolver implements Reso
         org.apache.felix.bundlerepository.Resolver resolver = repositoryAdmin.resolver(repos.toArray(new Repository[repos.size()]));
 
         for (Resource res : ress) {
-            resolver.add(res);
+            if (!infos.get(res).isDependency()) {
+                resolver.add(res);
+            }
         }
         for (Requirement req : reqs) {
             resolver.add(req);
@@ -99,7 +103,9 @@ public class ObrResolver implements Reso
         }
 
         List<BundleInfo> bundles = new ArrayList<BundleInfo>();
-        for (Resource res : resolver.getRequiredResources()) {
+        Collections.addAll(deploy, resolver.getAddedResources());
+        Collections.addAll(deploy, resolver.getRequiredResources());
+        for (Resource res : deploy) {
             BundleInfo info = infos.get(res);
             if (info == null) {
                 Reason[] reasons = resolver.getReason(res);

Modified: karaf/trunk/features/obr/src/test/java/org/apache/karaf/features/obr/internal/ObrResolverTest.java
URL: http://svn.apache.org/viewvc/karaf/trunk/features/obr/src/test/java/org/apache/karaf/features/obr/internal/ObrResolverTest.java?rev=1025997&r1=1025996&r2=1025997&view=diff
==============================================================================
--- karaf/trunk/features/obr/src/test/java/org/apache/karaf/features/obr/internal/ObrResolverTest.java (original)
+++ karaf/trunk/features/obr/src/test/java/org/apache/karaf/features/obr/internal/ObrResolverTest.java Thu Oct 21 13:43:26 2010
@@ -63,6 +63,7 @@ public class ObrResolverTest {
         expect(admin.resolver(EasyMock.<org.apache.felix.bundlerepository.Repository[]>anyObject())).andReturn(resolver);
         resolver.add(EasyMock.capture(captureReq));
         expect(resolver.resolve(Resolver.NO_OPTIONAL_RESOURCES)).andReturn(true);
+        expect(resolver.getAddedResources()).andReturn(new Resource[] { });
         expect(resolver.getRequiredResources()).andReturn(new Resource[] { resource });
         expect(resolver.getReason(resource)).andAnswer(new IAnswer() {
             public Object answer() throws Throwable {