Repository: karaf
Updated Branches:
  refs/heads/master 84d9a16b5 -> f38a1e20c


[KARAF-3629] Use the resolver service from the system bundle


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/773c6c47
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/773c6c47
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/773c6c47

Branch: refs/heads/master
Commit: 773c6c471b4d9d0f24ecadc26fb5a42941635148
Parents: 84d9a16
Author: Guillaume Nodet <[email protected]>
Authored: Tue Mar 24 11:13:12 2015 +0100
Committer: Guillaume Nodet <[email protected]>
Committed: Wed Mar 25 08:46:28 2015 +0100

----------------------------------------------------------------------
 .../resources/etc/config.properties             |   2 +
 features/core/pom.xml                           |   3 -
 .../karaf/features/internal/osgi/Activator.java |  12 +-
 .../internal/region/CandidateComparator.java    |   6 +-
 .../features/internal/region/Subsystem.java     |   4 +-
 .../region/SubsystemResolveContext.java         |   4 +-
 .../internal/region/SubsystemResolver.java      |  11 +-
 .../internal/resolver/ResolverUtil.java         | 111 +++++++++++++++++++
 .../internal/resolver/Slf4jResolverLog.java     |  49 --------
 .../features/internal/service/Deployer.java     |  17 +--
 .../internal/service/FeaturesServiceImpl.java   |   6 +-
 .../features/internal/service/Overrides.java    |   4 +-
 .../internal/service/ResourceComparator.java    |  10 +-
 .../karaf/features/FeaturesServiceTest.java     |  32 +++---
 .../apache/karaf/features/Slf4jResolverLog.java |  49 ++++++++
 .../features/internal/region/SubsystemTest.java |  26 +++--
 .../features/internal/service/DeployerTest.java |  17 ++-
 .../service/FeaturesServiceImplTest.java        |  27 +++--
 .../features/internal/support/TestBundle.java   |   6 +-
 .../apache/karaf/profile/assembly/Builder.java  |   8 +-
 .../profile/assembly/Slf4jResolverLog.java      |  49 ++++++++
 .../features/VerifyFeatureResolutionMojo.java   |  28 ++++-
 22 files changed, 349 insertions(+), 132 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/773c6c47/assemblies/features/base/src/main/filtered-resources/resources/etc/config.properties
----------------------------------------------------------------------
diff --git 
a/assemblies/features/base/src/main/filtered-resources/resources/etc/config.properties
 
b/assemblies/features/base/src/main/filtered-resources/resources/etc/config.properties
index 12933b1..ff712b0 100644
--- 
a/assemblies/features/base/src/main/filtered-resources/resources/etc/config.properties
+++ 
b/assemblies/features/base/src/main/filtered-resources/resources/etc/config.properties
@@ -74,6 +74,7 @@ org.osgi.framework.system.packages= \
  
org.osgi.framework.wiring.dto;version="1.2";uses:="org.osgi.dto,org.osgi.resource.dto",\
  
org.osgi.service.condpermadmin;version="1.1.1";uses:="org.osgi.framework,org.osgi.service.permissionadmin",\
  
org.osgi.service.packageadmin;version="1.2";uses:="org.osgi.framework",org.osgi.service.permissionadmin;version="1.2",\
+ org.osgi.service.resolver;version="1.0";uses:="org.osgi.resource",\
  org.osgi.service.startlevel;version="1.1";uses:="org.osgi.framework",\
  org.osgi.service.url;version="1.0",\
  org.osgi.util.tracker;version="1.5.1";uses:="org.osgi.framework",\
@@ -90,6 +91,7 @@ org.osgi.framework.system.packages.extra= \
 org.osgi.framework.system.capabilities= \
  ${eecap-${java.specification.version}}, \
  
osgi.service;effective:=active;objectClass=org.osgi.service.packageadmin.PackageAdmin,
 \
+ 
osgi.service;effective:=active;objectClass=org.osgi.service.resolver.Resolver, \
  
osgi.service;effective:=active;objectClass=org.osgi.service.startlevel.StartLevel,
 \
  osgi.service;effective:=active;objectClass=org.osgi.service.url.URLHandlers
 

http://git-wip-us.apache.org/repos/asf/karaf/blob/773c6c47/features/core/pom.xml
----------------------------------------------------------------------
diff --git a/features/core/pom.xml b/features/core/pom.xml
index e55eef4..afa8bf5 100644
--- a/features/core/pom.xml
+++ b/features/core/pom.xml
@@ -131,7 +131,6 @@
                             org.apache.karaf.features.management;
                             org.apache.karaf.features.management.codec;
                                 -noimport:=true,
-                            
org.osgi.service.resolver;-split-package:=merge-first,
                             org.osgi.service.repository,
                             org.eclipse.equinox.region.*
                         </Export-Package>
@@ -141,8 +140,6 @@
                         </Import-Package>
                         <Private-Package>
                             org.apache.karaf.features.internal.*,
-                            org.apache.felix.resolver,
-                            org.apache.felix.resolver.util,
                             org.apache.felix.utils.collections,
                             org.apache.felix.utils.version,
                             org.apache.felix.utils.properties,

http://git-wip-us.apache.org/repos/asf/karaf/blob/773c6c47/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java
 
b/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java
index c904722..a039aa0 100644
--- 
a/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java
+++ 
b/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java
@@ -29,7 +29,6 @@ import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.felix.resolver.ResolverImpl;
 import org.apache.felix.utils.properties.Properties;
 import org.apache.karaf.features.FeaturesListener;
 import org.apache.karaf.features.FeaturesService;
@@ -37,10 +36,8 @@ import 
org.apache.karaf.features.internal.management.FeaturesServiceMBeanImpl;
 import org.apache.karaf.features.internal.repository.AggregateRepository;
 import org.apache.karaf.features.internal.repository.JsonRepository;
 import org.apache.karaf.features.internal.repository.XmlRepository;
-import org.apache.karaf.features.internal.resolver.Slf4jResolverLog;
 import org.apache.karaf.features.internal.service.BootFeaturesInstaller;
 import org.apache.karaf.features.internal.service.EventAdminListener;
-import org.apache.karaf.features.internal.service.FeatureConfigInstaller;
 import org.apache.karaf.features.internal.service.FeatureFinder;
 import org.apache.karaf.features.internal.service.FeaturesServiceImpl;
 import org.apache.karaf.features.internal.service.StateStorage;
@@ -63,17 +60,16 @@ import org.osgi.service.resolver.Resolver;
 import org.osgi.service.url.URLStreamHandlerService;
 import org.osgi.util.tracker.ServiceTracker;
 import org.osgi.util.tracker.ServiceTrackerCustomizer;
-import org.slf4j.LoggerFactory;
 
 @Services(
     requires = {
             @RequireService(ConfigurationAdmin.class),
+            @RequireService(Resolver.class),
             @RequireService(value = URLStreamHandlerService.class, filter = 
"(url.handler.protocol=mvn)")
     },
     provides = {
             @ProvideService(FeaturesService.class),
-            @ProvideService(RegionDigraph.class),
-            @ProvideService(Resolver.class)
+            @ProvideService(RegionDigraph.class)
     }
 )
 public class Activator extends BaseActivator {
@@ -116,6 +112,7 @@ public class Activator extends BaseActivator {
 
     protected void doStart() throws Exception {
         ConfigurationAdmin configurationAdmin = 
getTrackedService(ConfigurationAdmin.class);
+        Resolver resolver = getTrackedService(Resolver.class);
         URLStreamHandlerService mvnUrlHandler = 
getTrackedService(URLStreamHandlerService.class);
 
         if (configurationAdmin == null || mvnUrlHandler == null) {
@@ -123,7 +120,7 @@ public class Activator extends BaseActivator {
         }
 
         // Resolver
-        register(Resolver.class, new ResolverImpl(new 
Slf4jResolverLog(LoggerFactory.getLogger(ResolverImpl.class))));
+//        register(Resolver.class, new ResolverImpl(new 
Slf4jResolverLog(LoggerFactory.getLogger(ResolverImpl.class))));
 
         // RegionDigraph
         digraph = DigraphHelper.loadDigraph(bundleContext);
@@ -207,6 +204,7 @@ public class Activator extends BaseActivator {
                 featureFinder,
                 eventAdminListener,
                 configurationAdmin,
+                resolver,
                 digraph,
                 overrides,
                 featureResolutionRange,

http://git-wip-us.apache.org/repos/asf/karaf/blob/773c6c47/features/core/src/main/java/org/apache/karaf/features/internal/region/CandidateComparator.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/main/java/org/apache/karaf/features/internal/region/CandidateComparator.java
 
b/features/core/src/main/java/org/apache/karaf/features/internal/region/CandidateComparator.java
index 0bf271c..d8bffb2 100644
--- 
a/features/core/src/main/java/org/apache/karaf/features/internal/region/CandidateComparator.java
+++ 
b/features/core/src/main/java/org/apache/karaf/features/internal/region/CandidateComparator.java
@@ -19,7 +19,7 @@ package org.apache.karaf.features.internal.region;
 import java.util.Comparator;
 import java.util.Set;
 
-import org.apache.felix.resolver.Util;
+import org.apache.karaf.features.internal.resolver.ResolverUtil;
 import org.osgi.framework.Version;
 import org.osgi.framework.namespace.BundleNamespace;
 import org.osgi.framework.namespace.IdentityNamespace;
@@ -112,8 +112,8 @@ public class CandidateComparator implements 
Comparator<Capability> {
         }
         if (c == 0) {
             // We just want to have a deterministic heuristic
-            String n1 = Util.getSymbolicName(cap1.getResource());
-            String n2 = Util.getSymbolicName(cap2.getResource());
+            String n1 = ResolverUtil.getSymbolicName(cap1.getResource());
+            String n2 = ResolverUtil.getSymbolicName(cap2.getResource());
             c = n1.compareTo(n2);
         }
         return c;

http://git-wip-us.apache.org/repos/asf/karaf/blob/773c6c47/features/core/src/main/java/org/apache/karaf/features/internal/region/Subsystem.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/main/java/org/apache/karaf/features/internal/region/Subsystem.java
 
b/features/core/src/main/java/org/apache/karaf/features/internal/region/Subsystem.java
index 06d04ac..18a8f14 100644
--- 
a/features/core/src/main/java/org/apache/karaf/features/internal/region/Subsystem.java
+++ 
b/features/core/src/main/java/org/apache/karaf/features/internal/region/Subsystem.java
@@ -32,7 +32,6 @@ import java.util.jar.Manifest;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 
-import org.apache.felix.resolver.Util;
 import org.apache.felix.utils.manifest.Clause;
 import org.apache.felix.utils.manifest.Parser;
 import org.apache.felix.utils.version.VersionRange;
@@ -48,6 +47,7 @@ import 
org.apache.karaf.features.internal.download.DownloadManager;
 import org.apache.karaf.features.internal.download.Downloader;
 import org.apache.karaf.features.internal.download.StreamProvider;
 import org.apache.karaf.features.internal.resolver.FeatureResource;
+import org.apache.karaf.features.internal.resolver.ResolverUtil;
 import org.apache.karaf.features.internal.resolver.ResourceBuilder;
 import org.apache.karaf.features.internal.resolver.ResourceImpl;
 import org.apache.karaf.features.internal.resolver.ResourceUtils;
@@ -496,7 +496,7 @@ public class Subsystem extends ResourceImpl {
     }
 
     private void doAddDependency(ResourceImpl resource, boolean mandatory, 
boolean start, int startLevel) {
-        String id = Util.getSymbolicName(resource) + "|" + 
Util.getVersion(resource);
+        String id = ResolverUtil.getSymbolicName(resource) + "|" + 
ResolverUtil.getVersion(resource);
         DependencyInfo info = dependencies.get(id);
         if (info == null) {
             info = new DependencyInfo();

http://git-wip-us.apache.org/repos/asf/karaf/blob/773c6c47/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolveContext.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolveContext.java
 
b/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolveContext.java
index 2ffa85f..fdf9016 100644
--- 
a/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolveContext.java
+++ 
b/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolveContext.java
@@ -27,11 +27,11 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.felix.resolver.Util;
 import org.apache.karaf.features.internal.download.Downloader;
 import org.apache.karaf.features.internal.repository.BaseRepository;
 import org.apache.karaf.features.internal.resolver.CapabilityImpl;
 import org.apache.karaf.features.internal.resolver.RequirementImpl;
+import org.apache.karaf.features.internal.resolver.ResolverUtil;
 import org.apache.karaf.features.internal.resolver.ResourceImpl;
 import org.eclipse.equinox.region.Region;
 import org.eclipse.equinox.region.RegionDigraph;
@@ -150,7 +150,7 @@ public class SubsystemResolveContext extends ResolveContext 
{
                 Map<String, Resource> providers = new HashMap<String, 
Resource>();
                 for (Capability cap : caps) {
                     Resource resource = cap.getResource();
-                    String id = Util.getSymbolicName(resource) + "|" + 
Util.getVersion(resource);
+                    String id = ResolverUtil.getSymbolicName(resource) + "|" + 
ResolverUtil.getVersion(resource);
                     Resource prev = providers.get(id);
                     if (prev != null && prev != resource) {
                         String r1 = getRegion(prev).getName();

http://git-wip-us.apache.org/repos/asf/karaf/blob/773c6c47/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
 
b/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
index 5a92494..78b1833 100644
--- 
a/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
+++ 
b/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
@@ -24,8 +24,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.felix.resolver.ResolverImpl;
-import org.apache.felix.resolver.Util;
 import org.apache.felix.utils.collections.DictionaryAsMap;
 import org.apache.karaf.features.BundleInfo;
 import org.apache.karaf.features.Feature;
@@ -34,10 +32,10 @@ import 
org.apache.karaf.features.internal.download.Downloader;
 import org.apache.karaf.features.internal.download.StreamProvider;
 import org.apache.karaf.features.internal.resolver.CapabilityImpl;
 import org.apache.karaf.features.internal.resolver.CapabilitySet;
+import org.apache.karaf.features.internal.resolver.ResolverUtil;
 import org.apache.karaf.features.internal.resolver.ResourceBuilder;
 import org.apache.karaf.features.internal.resolver.ResourceImpl;
 import org.apache.karaf.features.internal.resolver.SimpleFilter;
-import org.apache.karaf.features.internal.resolver.Slf4jResolverLog;
 import org.eclipse.equinox.internal.region.StandardRegionDigraph;
 import org.eclipse.equinox.region.Region;
 import org.eclipse.equinox.region.RegionDigraph;
@@ -70,6 +68,7 @@ public class SubsystemResolver {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(SubsystemResolver.class);
 
     private DownloadManager manager;
+    private Resolver resolver;
     private RegionDigraph digraph;
     private Subsystem root;
     private Map<Resource, List<Wire>> wiring;
@@ -84,7 +83,8 @@ public class SubsystemResolver {
     private RegionDigraph flatDigraph;
     private Map<String, Map<String, BundleInfo>> bundleInfos;
 
-    public SubsystemResolver(DownloadManager manager) {
+    public SubsystemResolver(Resolver resolver, DownloadManager manager) {
+        this.resolver = resolver;
         this.manager = manager;
     }
 
@@ -181,7 +181,6 @@ public class SubsystemResolver {
         digraph = new StandardRegionDigraph(null, null);
         populateDigraph(digraph, root);
 
-        Resolver resolver = new ResolverImpl(new Slf4jResolverLog(LOGGER));
         Downloader downloader = manager.createDownloader();
         wiring = resolver.resolve(new SubsystemResolveContext(root, digraph, 
globalRepository, downloader));
         downloader.await();
@@ -334,7 +333,7 @@ public class SubsystemResolver {
         for (Map.Entry<Resource, List<Wire>> entry : wiring.entrySet()) {
             final Resource resource = entry.getKey();
             final Requirement requirement = getSubsystemRequirement(resource);
-            if (Util.isFragment(resource)) {
+            if (ResolverUtil.isFragment(resource)) {
                 List<Wire> wires = entry.getValue();
                 final Resource host = wires.get(0).getProvider();
                 final Wire wire = findMatchingWire(sf, wiring.get(host));

http://git-wip-us.apache.org/repos/asf/karaf/blob/773c6c47/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResolverUtil.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResolverUtil.java
 
b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResolverUtil.java
new file mode 100644
index 0000000..2f4c5b4
--- /dev/null
+++ 
b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResolverUtil.java
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.karaf.features.internal.resolver;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.osgi.framework.Version;
+import org.osgi.framework.namespace.IdentityNamespace;
+import org.osgi.framework.namespace.PackageNamespace;
+import org.osgi.resource.Capability;
+import org.osgi.resource.Namespace;
+import org.osgi.resource.Requirement;
+import org.osgi.resource.Resource;
+
+public class ResolverUtil
+{
+    public static String getSymbolicName(Resource resource)
+    {
+        List<Capability> caps = resource.getCapabilities(null);
+        for (Capability cap : caps)
+        {
+            if 
(cap.getNamespace().equals(IdentityNamespace.IDENTITY_NAMESPACE))
+            {
+                return 
cap.getAttributes().get(IdentityNamespace.IDENTITY_NAMESPACE).toString();
+            }
+        }
+        return null;
+    }
+
+    public static Version getVersion(Resource resource)
+    {
+        List<Capability> caps = resource.getCapabilities(null);
+        for (Capability cap : caps)
+        {
+            if 
(cap.getNamespace().equals(IdentityNamespace.IDENTITY_NAMESPACE))
+            {
+                return (Version)
+                        
cap.getAttributes().get(IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE);
+            }
+        }
+        return null;
+    }
+
+    public static boolean isFragment(Resource resource)
+    {
+        List<Capability> caps = resource.getCapabilities(null);
+        for (Capability cap : caps)
+        {
+            if 
(cap.getNamespace().equals(IdentityNamespace.IDENTITY_NAMESPACE))
+            {
+                String type = (String)
+                        
cap.getAttributes().get(IdentityNamespace.CAPABILITY_TYPE_ATTRIBUTE);
+                return (type != null) && 
type.equals(IdentityNamespace.TYPE_FRAGMENT);
+            }
+        }
+        return false;
+    }
+
+    public static boolean isOptional(Requirement req)
+    {
+        String resolution = 
req.getDirectives().get(Namespace.REQUIREMENT_RESOLUTION_DIRECTIVE);
+        return Namespace.RESOLUTION_OPTIONAL.equalsIgnoreCase(resolution);
+    }
+
+    public static boolean isMultiple(Requirement req)
+    {
+        return Namespace.CARDINALITY_MULTIPLE.equals(req.getDirectives()
+                .get(Namespace.REQUIREMENT_CARDINALITY_DIRECTIVE)) && 
!isDynamic(req);
+    }
+
+    public static boolean isDynamic(Requirement req)
+    {
+        return PackageNamespace.RESOLUTION_DYNAMIC.equals(req.getDirectives()
+                .get(Namespace.REQUIREMENT_RESOLUTION_DIRECTIVE));
+    }
+
+    public static List<Requirement> getDynamicRequirements(List<Requirement> 
reqs)
+    {
+        List<Requirement> result = new ArrayList<Requirement>();
+        if (reqs != null)
+        {
+            for (Requirement req : reqs)
+            {
+                String resolution = req.getDirectives()
+                        
.get(PackageNamespace.REQUIREMENT_RESOLUTION_DIRECTIVE);
+                if ((resolution != null)
+                        && 
resolution.equals(PackageNamespace.RESOLUTION_DYNAMIC))
+                {
+                    result.add(req);
+                }
+            }
+        }
+        return result;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/karaf/blob/773c6c47/features/core/src/main/java/org/apache/karaf/features/internal/resolver/Slf4jResolverLog.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/Slf4jResolverLog.java
 
b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/Slf4jResolverLog.java
deleted file mode 100644
index e83268a..0000000
--- 
a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/Slf4jResolverLog.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.features.internal.resolver;
-
-import org.slf4j.Logger;
-
-/**
- */
-public class Slf4jResolverLog extends org.apache.felix.resolver.Logger {
-
-    private final Logger logger;
-
-    public Slf4jResolverLog(Logger logger) {
-        super(LOG_DEBUG);
-        this.logger = logger;
-    }
-
-    @Override
-    protected void doLog(int level, String msg, Throwable throwable) {
-        switch (level) {
-        case LOG_ERROR:
-            logger.error(msg, throwable);
-            break;
-        case LOG_WARNING:
-            logger.warn(msg, throwable);
-            break;
-        case LOG_INFO:
-            logger.info(msg, throwable);
-            break;
-        default:
-            logger.debug(msg, throwable);
-            break;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/karaf/blob/773c6c47/features/core/src/main/java/org/apache/karaf/features/internal/service/Deployer.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/main/java/org/apache/karaf/features/internal/service/Deployer.java
 
b/features/core/src/main/java/org/apache/karaf/features/internal/service/Deployer.java
index 69e8edd..f852fe6 100644
--- 
a/features/core/src/main/java/org/apache/karaf/features/internal/service/Deployer.java
+++ 
b/features/core/src/main/java/org/apache/karaf/features/internal/service/Deployer.java
@@ -72,19 +72,20 @@ import org.osgi.resource.Requirement;
 import org.osgi.resource.Resource;
 import org.osgi.resource.Wire;
 import org.osgi.service.repository.Repository;
+import org.osgi.service.resolver.Resolver;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static org.apache.felix.resolver.Util.getSymbolicName;
-import static org.apache.felix.resolver.Util.getVersion;
 import static org.apache.karaf.features.FeaturesService.ROOT_REGION;
+import static org.apache.karaf.features.FeaturesService.UPDATEABLE_URIS;
+import static 
org.apache.karaf.features.FeaturesService.UPDATE_SNAPSHOTS_ALWAYS;
+import static org.apache.karaf.features.FeaturesService.UPDATE_SNAPSHOTS_CRC;
+import static 
org.apache.karaf.features.internal.resolver.ResolverUtil.getSymbolicName;
+import static 
org.apache.karaf.features.internal.resolver.ResolverUtil.getVersion;
 import static 
org.apache.karaf.features.internal.resolver.ResourceUtils.TYPE_SUBSYSTEM;
 import static 
org.apache.karaf.features.internal.resolver.ResourceUtils.getFeatureId;
 import static 
org.apache.karaf.features.internal.resolver.ResourceUtils.getType;
 import static org.apache.karaf.features.internal.resolver.ResourceUtils.getUri;
-import static org.apache.karaf.features.FeaturesService.UPDATEABLE_URIS;
-import static 
org.apache.karaf.features.FeaturesService.UPDATE_SNAPSHOTS_ALWAYS;
-import static org.apache.karaf.features.FeaturesService.UPDATE_SNAPSHOTS_CRC;
 import static org.apache.karaf.features.internal.util.MapUtils.add;
 import static org.apache.karaf.features.internal.util.MapUtils.addToMapSet;
 import static org.apache.karaf.features.internal.util.MapUtils.apply;
@@ -179,10 +180,12 @@ public class Deployer {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(Deployer.class);
 
     private final DownloadManager manager;
+    private final Resolver resolver;
     private final DeployCallback callback;
 
-    public Deployer(DownloadManager manager, DeployCallback callback) {
+    public Deployer(DownloadManager manager, Resolver resolver, DeployCallback 
callback) {
         this.manager = manager;
+        this.resolver = resolver;
         this.callback = callback;
     }
 
@@ -210,7 +213,7 @@ public class Deployer {
                 map(dstate.bundles));
 
         // Resolve
-        SubsystemResolver resolver = new SubsystemResolver(manager);
+        SubsystemResolver resolver = new SubsystemResolver(this.resolver, 
manager);
         resolver.prepare(
                 dstate.features.values(),
                 request.requirements,

http://git-wip-us.apache.org/repos/asf/karaf/blob/773c6c47/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java
 
b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java
index 7079b1b..e60e40b 100644
--- 
a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java
+++ 
b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java
@@ -89,6 +89,7 @@ import org.osgi.resource.Resource;
 import org.osgi.resource.Wire;
 import org.osgi.service.cm.Configuration;
 import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.resolver.Resolver;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -125,6 +126,7 @@ public class FeaturesServiceImpl implements 
FeaturesService, Deployer.DeployCall
     private final FeatureFinder featureFinder;
     private final EventAdminListener eventAdminListener;
     private final ConfigurationAdmin configurationAdmin;
+    private final Resolver resolver;
     private final FeatureConfigInstaller configInstaller;
     private final RegionDigraph digraph;
     private final String overrides;
@@ -174,6 +176,7 @@ public class FeaturesServiceImpl implements 
FeaturesService, Deployer.DeployCall
                                FeatureFinder featureFinder,
                                EventAdminListener eventAdminListener,
                                ConfigurationAdmin configurationAdmin,
+                               Resolver resolver,
                                RegionDigraph digraph,
                                String overrides,
                                String featureResolutionRange,
@@ -189,6 +192,7 @@ public class FeaturesServiceImpl implements 
FeaturesService, Deployer.DeployCall
         this.featureFinder = featureFinder;
         this.eventAdminListener = eventAdminListener;
         this.configurationAdmin = configurationAdmin;
+        this.resolver = resolver;
         this.configInstaller = configurationAdmin != null ? new 
FeatureConfigInstaller(configurationAdmin) : null;
         this.digraph = digraph;
         this.overrides = overrides;
@@ -1052,7 +1056,7 @@ public class FeaturesServiceImpl implements 
FeaturesService, Deployer.DeployCall
                 try {
                     Deployer.DeploymentState dstate = 
getDeploymentState(state);
                     Deployer.DeploymentRequest request = 
getDeploymentRequest(requirements, stateChanges, options);
-                    new Deployer(manager, this).deploy(dstate, request);
+                    new Deployer(manager, this.resolver, this).deploy(dstate, 
request);
                     break;
                 } catch (Deployer.PartialDeploymentException e) {
                     if (!prereqs.containsAll(e.getMissing())) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/773c6c47/features/core/src/main/java/org/apache/karaf/features/internal/service/Overrides.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/main/java/org/apache/karaf/features/internal/service/Overrides.java
 
b/features/core/src/main/java/org/apache/karaf/features/internal/service/Overrides.java
index 69fea30..f78870c 100644
--- 
a/features/core/src/main/java/org/apache/karaf/features/internal/service/Overrides.java
+++ 
b/features/core/src/main/java/org/apache/karaf/features/internal/service/Overrides.java
@@ -34,8 +34,8 @@ import org.osgi.resource.Resource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static org.apache.felix.resolver.Util.getSymbolicName;
-import static org.apache.felix.resolver.Util.getVersion;
+import static 
org.apache.karaf.features.internal.resolver.ResolverUtil.getSymbolicName;
+import static 
org.apache.karaf.features.internal.resolver.ResolverUtil.getVersion;
 
 /**
  * Helper class to deal with overriden bundles at feature installation time.

http://git-wip-us.apache.org/repos/asf/karaf/blob/773c6c47/features/core/src/main/java/org/apache/karaf/features/internal/service/ResourceComparator.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/main/java/org/apache/karaf/features/internal/service/ResourceComparator.java
 
b/features/core/src/main/java/org/apache/karaf/features/internal/service/ResourceComparator.java
index bdf3458..a09aee0 100644
--- 
a/features/core/src/main/java/org/apache/karaf/features/internal/service/ResourceComparator.java
+++ 
b/features/core/src/main/java/org/apache/karaf/features/internal/service/ResourceComparator.java
@@ -18,7 +18,7 @@ package org.apache.karaf.features.internal.service;
 
 import java.util.Comparator;
 
-import org.apache.felix.resolver.Util;
+import org.apache.karaf.features.internal.resolver.ResolverUtil;
 import org.osgi.framework.Version;
 import org.osgi.resource.Resource;
 
@@ -26,12 +26,12 @@ public class ResourceComparator implements 
Comparator<Resource> {
 
     @Override
     public int compare(Resource o1, Resource o2) {
-        String bsn1 = Util.getSymbolicName(o1);
-        String bsn2 = Util.getSymbolicName(o2);
+        String bsn1 = ResolverUtil.getSymbolicName(o1);
+        String bsn2 = ResolverUtil.getSymbolicName(o2);
         int c = bsn1.compareTo(bsn2);
         if (c == 0) {
-            Version v1 = Util.getVersion(o1);
-            Version v2 = Util.getVersion(o2);
+            Version v1 = ResolverUtil.getVersion(o1);
+            Version v2 = ResolverUtil.getVersion(o2);
             c = v1.compareTo(v2);
             if (c == 0) {
                 c = o1.hashCode() - o2.hashCode();

http://git-wip-us.apache.org/repos/asf/karaf/blob/773c6c47/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java
 
b/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java
index 6de10d5..918ac84 100644
--- 
a/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java
+++ 
b/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java
@@ -16,16 +16,6 @@
  */
 package org.apache.karaf.features;
 
-import static org.easymock.EasyMock.eq;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.easymock.EasyMock.verify;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
 import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
@@ -39,6 +29,7 @@ import java.util.EnumSet;
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArraySet;
 
+import org.apache.felix.resolver.ResolverImpl;
 import org.apache.karaf.features.internal.service.FeaturesServiceImpl;
 import org.apache.karaf.features.internal.service.StateStorage;
 import org.easymock.EasyMock;
@@ -48,6 +39,17 @@ import org.junit.Test;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.startlevel.FrameworkStartLevel;
+import org.osgi.service.resolver.Resolver;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 public class FeaturesServiceTest extends TestBase {
     private static final String FEATURE_WITH_INVALID_BUNDLE = "<features 
name='test' xmlns='http://karaf.apache.org/xmlns/features/v1.0.0'>"
@@ -56,6 +58,8 @@ public class FeaturesServiceTest extends TestBase {
             + "</features>";
 
     File dataFile;
+    Logger logger = LoggerFactory.getLogger(FeaturesServiceTest.class);;
+    Resolver resolver = new ResolverImpl(new Slf4jResolverLog(logger));
 
     @Before
     public void setUp() throws IOException {
@@ -344,7 +348,7 @@ public class FeaturesServiceTest extends TestBase {
                 + "  <feature name='f2' 
version='0.2'><bundle>bundle2</bundle></feature>"
                 + "</features>");
 
-        FeaturesServiceImpl svc = new FeaturesServiceImpl(null, null, new 
Storage(), null, null, null, null, null, null, null, null, null, 0, 0, 0);
+        FeaturesServiceImpl svc = new FeaturesServiceImpl(null, null, new 
Storage(), null, null, null, resolver, null, null, null, null, null, null, 0, 
0, 0);
         svc.addRepository(uri);
 
         assertEquals(feature("f2", "0.2"), svc.getFeatures("f2", 
"[0.1,0.3)")[0]);
@@ -370,7 +374,7 @@ public class FeaturesServiceTest extends TestBase {
         expect(fsl.getStartLevel()).andReturn(100);
         replay(bundleContext, bundle, fsl);
 
-        FeaturesServiceImpl svc = new FeaturesServiceImpl(null, bundleContext, 
new Storage(), null, null, null, null, null, null, null, null, null, 0, 0, 0);
+        FeaturesServiceImpl svc = new FeaturesServiceImpl(null, bundleContext, 
new Storage(), null, null, null, resolver, null, null, null, null, null, null, 
0, 0, 0);
         svc.addRepository(uri);
         try {
             List<String> features = new ArrayList<String>();
@@ -395,7 +399,7 @@ public class FeaturesServiceTest extends TestBase {
         URI uri = createTempRepo("<features name='test' 
xmlns='http://karaf.apache.org/xmlns/features/v1.0.0'>"
                 + "  <featur><bundle>somebundle</bundle></featur></features>");
 
-        FeaturesServiceImpl svc = new FeaturesServiceImpl(null, null, new 
Storage(), null, null, null, null, null, null, null, null, null, 0, 0, 0);
+        FeaturesServiceImpl svc = new FeaturesServiceImpl(null, null, new 
Storage(), null, null, null, resolver, null, null, null, null, null, null, 0, 
0, 0);
         try {
             svc.addRepository(uri);
             fail("exception expected");
@@ -413,7 +417,7 @@ public class FeaturesServiceTest extends TestBase {
                 + "  <feature 
name='f1'><bundle>file:bundle1</bundle><bundle>file:bundle2</bundle></feature>"
                 + "</features>");
 
-        FeaturesServiceImpl svc = new FeaturesServiceImpl(null, null, new 
Storage(), null, null, null, null, null, null, null, null, null, 0, 0, 0);
+        FeaturesServiceImpl svc = new FeaturesServiceImpl(null, null, new 
Storage(), null, null, null, resolver, null, null, null, null, null, null, 0, 
0, 0);
         svc.addRepository(uri);
         Feature[] features = svc.getFeatures("f1");
         Assert.assertEquals(1, features.length);

http://git-wip-us.apache.org/repos/asf/karaf/blob/773c6c47/features/core/src/test/java/org/apache/karaf/features/Slf4jResolverLog.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/test/java/org/apache/karaf/features/Slf4jResolverLog.java 
b/features/core/src/test/java/org/apache/karaf/features/Slf4jResolverLog.java
new file mode 100644
index 0000000..1b6d4bd
--- /dev/null
+++ 
b/features/core/src/test/java/org/apache/karaf/features/Slf4jResolverLog.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.features;
+
+import org.slf4j.Logger;
+
+/**
+ */
+public class Slf4jResolverLog extends org.apache.felix.resolver.Logger {
+
+    private final Logger logger;
+
+    public Slf4jResolverLog(Logger logger) {
+        super(LOG_DEBUG);
+        this.logger = logger;
+    }
+
+    @Override
+    protected void doLog(int level, String msg, Throwable throwable) {
+        switch (level) {
+        case LOG_ERROR:
+            logger.error(msg, throwable);
+            break;
+        case LOG_WARNING:
+            logger.warn(msg, throwable);
+            break;
+        case LOG_INFO:
+            logger.info(msg, throwable);
+            break;
+        default:
+            logger.debug(msg, throwable);
+            break;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/773c6c47/features/core/src/test/java/org/apache/karaf/features/internal/region/SubsystemTest.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/test/java/org/apache/karaf/features/internal/region/SubsystemTest.java
 
b/features/core/src/test/java/org/apache/karaf/features/internal/region/SubsystemTest.java
index 89adfae..965b5f6 100644
--- 
a/features/core/src/test/java/org/apache/karaf/features/internal/region/SubsystemTest.java
+++ 
b/features/core/src/test/java/org/apache/karaf/features/internal/region/SubsystemTest.java
@@ -25,7 +25,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.felix.resolver.ResolverImpl;
 import org.apache.karaf.features.FeaturesService;
+import org.apache.karaf.features.Slf4jResolverLog;
 import org.apache.karaf.features.internal.service.RepositoryImpl;
 import org.apache.karaf.features.internal.support.TestDownloadManager;
 import org.junit.Test;
@@ -34,14 +36,18 @@ import org.osgi.framework.wiring.BundleRevision;
 import org.osgi.resource.Capability;
 import org.osgi.resource.Resource;
 import org.osgi.resource.Wire;
+import org.osgi.service.resolver.Resolver;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
-import static 
org.apache.karaf.features.internal.resolver.ResourceUtils.toFeatureCapability;
-import static 
org.apache.karaf.features.internal.resolver.ResourceUtils.toFeatureRequirement;
 import static org.apache.karaf.features.internal.util.MapUtils.addToMapSet;
 import static org.junit.Assert.assertEquals;
 
 public class SubsystemTest {
 
+    Logger logger = LoggerFactory.getLogger(SubsystemTest.class);;
+    Resolver resolver = new ResolverImpl(new Slf4jResolverLog(logger));
+
     @Test
     public void test1() throws Exception {
         RepositoryImpl repo = new 
RepositoryImpl(getClass().getResource("data1/features.xml").toURI());
@@ -55,7 +61,7 @@ public class SubsystemTest {
         addToMapSet(expected, "root", "c/1.0.0");
         addToMapSet(expected, "root/apps1", "b/1.0.0");
 
-        SubsystemResolver resolver = new SubsystemResolver(new 
TestDownloadManager(getClass(), "data1"));
+        SubsystemResolver resolver = new SubsystemResolver(this.resolver, new 
TestDownloadManager(getClass(), "data1"));
         resolver.prepare(Arrays.asList(repo.getFeatures()),
                          features,
                          Collections.<String, Set<BundleRevision>>emptyMap());
@@ -86,7 +92,7 @@ public class SubsystemTest {
         addToMapSet(expected, "root/apps2", "c/1.0.0");
         addToMapSet(expected, "root/apps2#f1", "a/1.0.0");
 
-        SubsystemResolver resolver = new SubsystemResolver(new 
TestDownloadManager(getClass(), "data2"));
+        SubsystemResolver resolver = new SubsystemResolver(this.resolver, new 
TestDownloadManager(getClass(), "data2"));
         resolver.prepare(Arrays.asList(repo.getFeatures()),
                          features,
                          Collections.<String, Set<BundleRevision>>emptyMap());
@@ -107,7 +113,7 @@ public class SubsystemTest {
         Map<String, Set<String>> expected = new HashMap<String, Set<String>>();
         addToMapSet(expected, "root/apps1", "a/1.0.1");
 
-        SubsystemResolver resolver = new SubsystemResolver(new 
TestDownloadManager(getClass(), "data3"));
+        SubsystemResolver resolver = new SubsystemResolver(this.resolver, new 
TestDownloadManager(getClass(), "data3"));
         resolver.prepare(Arrays.asList(repo.getFeatures()),
                          features,
                          Collections.<String, Set<BundleRevision>>emptyMap());
@@ -127,7 +133,7 @@ public class SubsystemTest {
         Map<String, Set<String>> expected = new HashMap<String, Set<String>>();
         addToMapSet(expected, "root/apps1", "a/1.0.0");
 
-        SubsystemResolver resolver = new SubsystemResolver(new 
TestDownloadManager(getClass(), "data4"));
+        SubsystemResolver resolver = new SubsystemResolver(this.resolver, new 
TestDownloadManager(getClass(), "data4"));
         resolver.prepare(Arrays.asList(repo.getFeatures()),
                          features,
                          Collections.<String, Set<BundleRevision>>emptyMap());
@@ -149,7 +155,7 @@ public class SubsystemTest {
         addToMapSet(expected, "root/apps1", "a/1.0.0");
         addToMapSet(expected, "root/apps1", "b/1.0.0");
 
-        SubsystemResolver resolver = new SubsystemResolver(new 
TestDownloadManager(getClass(), "data4"));
+        SubsystemResolver resolver = new SubsystemResolver(this.resolver, new 
TestDownloadManager(getClass(), "data4"));
         resolver.prepare(Arrays.asList(repo.getFeatures()),
                          features,
                          Collections.<String, Set<BundleRevision>>emptyMap());
@@ -171,7 +177,7 @@ public class SubsystemTest {
         addToMapSet(expected, "root/apps1", "a/1.0.0");
         addToMapSet(expected, "root/apps1", "c/1.0.0");
 
-        SubsystemResolver resolver = new SubsystemResolver(new 
TestDownloadManager(getClass(), "data1"));
+        SubsystemResolver resolver = new SubsystemResolver(this.resolver, new 
TestDownloadManager(getClass(), "data1"));
         resolver.prepare(Arrays.asList(repo.getFeatures()),
                 features,
                 Collections.<String, Set<BundleRevision>>emptyMap());
@@ -192,7 +198,7 @@ public class SubsystemTest {
         addToMapSet(expected, "root", "a/1.0.0");
         addToMapSet(expected, "root", "b/1.0.0");
 
-        SubsystemResolver resolver = new SubsystemResolver(new 
TestDownloadManager(getClass(), "data5"));
+        SubsystemResolver resolver = new SubsystemResolver(this.resolver, new 
TestDownloadManager(getClass(), "data5"));
         resolver.prepare(Arrays.asList(repo.getFeatures()),
                 features,
                 Collections.<String, Set<BundleRevision>>emptyMap());
@@ -214,7 +220,7 @@ public class SubsystemTest {
         addToMapSet(expected, "root", "a/1.0.0");
         addToMapSet(expected, "root", "c/1.0.0");
 
-        SubsystemResolver resolver = new SubsystemResolver(new 
TestDownloadManager(getClass(), "data5"));
+        SubsystemResolver resolver = new SubsystemResolver(this.resolver, new 
TestDownloadManager(getClass(), "data5"));
         resolver.prepare(Arrays.asList(repo.getFeatures()),
                 features,
                 Collections.<String, Set<BundleRevision>>emptyMap());

http://git-wip-us.apache.org/repos/asf/karaf/blob/773c6c47/features/core/src/test/java/org/apache/karaf/features/internal/service/DeployerTest.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/test/java/org/apache/karaf/features/internal/service/DeployerTest.java
 
b/features/core/src/test/java/org/apache/karaf/features/internal/service/DeployerTest.java
index 1b451ae..3bbed89 100644
--- 
a/features/core/src/test/java/org/apache/karaf/features/internal/service/DeployerTest.java
+++ 
b/features/core/src/test/java/org/apache/karaf/features/internal/service/DeployerTest.java
@@ -28,10 +28,12 @@ import java.util.Map;
 import java.util.Set;
 import java.util.jar.Manifest;
 
+import org.apache.felix.resolver.ResolverImpl;
 import org.apache.felix.utils.version.VersionRange;
 import org.apache.karaf.features.Feature;
 import org.apache.karaf.features.FeatureEvent;
 import org.apache.karaf.features.FeaturesService;
+import org.apache.karaf.features.Slf4jResolverLog;
 import org.apache.karaf.features.internal.support.TestBundle;
 import org.apache.karaf.features.internal.support.TestDownloadManager;
 import org.easymock.EasyMock;
@@ -42,15 +44,20 @@ import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleException;
 import org.osgi.resource.Resource;
 import org.osgi.resource.Wire;
+import org.osgi.service.resolver.Resolver;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import static org.apache.karaf.features.FeaturesService.*;
 import static org.apache.karaf.features.internal.util.MapUtils.addToMapSet;
 import static org.easymock.EasyMock.anyInt;
-import static org.easymock.EasyMock.anyObject;
 import static org.junit.Assert.fail;
 
 public class DeployerTest {
 
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(DeployerTest.class);
+    private Resolver resolver = new ResolverImpl(new Slf4jResolverLog(LOGGER));
+
     @Test
     public void testInstallSimpleFeature() throws Exception {
 
@@ -64,7 +71,7 @@ public class DeployerTest {
         Feature f101 = repo.getFeatures()[1];
 
         Deployer.DeployCallback callback = 
EasyMock.createMock(Deployer.DeployCallback.class);
-        Deployer deployer = new Deployer(manager, callback);
+        Deployer deployer = new Deployer(manager, resolver, callback);
 
         callback.print(EasyMock.anyString(), EasyMock.anyBoolean());
         EasyMock.expectLastCall().anyTimes();
@@ -127,7 +134,7 @@ public class DeployerTest {
         Feature f101 = repo.getFeatures()[1];
 
         Deployer.DeployCallback callback = 
EasyMock.createMock(Deployer.DeployCallback.class);
-        Deployer deployer = new Deployer(manager, callback);
+        Deployer deployer = new Deployer(manager, resolver, callback);
 
         final TestBundle bundleA = createTestBundle(1L, Bundle.ACTIVE, 
dataDir, "a100");
 
@@ -223,7 +230,7 @@ public class DeployerTest {
         Bundle serviceBundle = createTestBundle(1, Bundle.ACTIVE, dataDir, 
"a100");
 
         Deployer.DeployCallback callback = 
EasyMock.createMock(Deployer.DeployCallback.class);
-        Deployer deployer = new Deployer(manager, callback);
+        Deployer deployer = new Deployer(manager, resolver, callback);
 
         callback.print(EasyMock.anyString(), EasyMock.anyBoolean());
         EasyMock.expectLastCall().anyTimes();
@@ -285,7 +292,7 @@ public class DeployerTest {
         Bundle serviceBundle2 = createTestBundle(2, Bundle.ACTIVE, dataDir, 
"b100");
 
         Deployer.DeployCallback callback = 
EasyMock.createMock(Deployer.DeployCallback.class);
-        Deployer deployer = new Deployer(manager, callback);
+        Deployer deployer = new Deployer(manager, resolver, callback);
 
         callback.print(EasyMock.anyString(), EasyMock.anyBoolean());
         EasyMock.expectLastCall().anyTimes();

http://git-wip-us.apache.org/repos/asf/karaf/blob/773c6c47/features/core/src/test/java/org/apache/karaf/features/internal/service/FeaturesServiceImplTest.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/test/java/org/apache/karaf/features/internal/service/FeaturesServiceImplTest.java
 
b/features/core/src/test/java/org/apache/karaf/features/internal/service/FeaturesServiceImplTest.java
index b0a56e6..eeb742a 100644
--- 
a/features/core/src/test/java/org/apache/karaf/features/internal/service/FeaturesServiceImplTest.java
+++ 
b/features/core/src/test/java/org/apache/karaf/features/internal/service/FeaturesServiceImplTest.java
@@ -16,28 +16,33 @@
  */
 package org.apache.karaf.features.internal.service;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.fail;
-
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.Map;
 
+import org.apache.felix.resolver.ResolverImpl;
 import org.apache.karaf.features.Feature;
 import org.apache.karaf.features.TestBase;
+import org.apache.karaf.features.Slf4jResolverLog;
 import org.junit.Before;
 import org.junit.Test;
+import org.osgi.service.resolver.Resolver;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertSame;
 
 /**
  * Test cases for {@link 
org.apache.karaf.features.internal.service.FeaturesServiceImpl}
  */
 public class FeaturesServiceImplTest extends TestBase {
-    
+
+    Logger logger = LoggerFactory.getLogger(FeaturesServiceImplTest.class);;
+    Resolver resolver = new ResolverImpl(new Slf4jResolverLog(logger));
     File dataFile;
 
     @Before
@@ -49,7 +54,7 @@ public class FeaturesServiceImplTest extends TestBase {
     public void testGetFeature() throws Exception {
         Feature transactionFeature = feature("transaction", "1.0.0");
         final Map<String, Map<String, Feature>> features = 
features(transactionFeature);
-        final FeaturesServiceImpl impl = new FeaturesServiceImpl(null, null, 
new Storage(), null, null, null, null, "", null, null, null, null, 0, 0, 0) {
+        final FeaturesServiceImpl impl = new FeaturesServiceImpl(null, null, 
new Storage(), null, null, null, this.resolver, null, "", null, null, null, 
null, 0, 0, 0) {
             protected Map<String,Map<String,Feature>> getFeatures() throws 
Exception {
                 return features;
             }
@@ -60,7 +65,7 @@ public class FeaturesServiceImplTest extends TestBase {
     
     @Test
     public void testGetFeatureStripVersion() throws Exception {
-        final FeaturesServiceImpl impl = new FeaturesServiceImpl(null, null, 
new Storage(), null, null, null, null, "", null, null, null, null, 0, 0, 0) {
+        final FeaturesServiceImpl impl = new FeaturesServiceImpl(null, null, 
new Storage(), null, null, null, this.resolver, null, "", null, null, null, 
null, 0, 0, 0) {
             protected Map<String,Map<String,Feature>> getFeatures() throws 
Exception {
                 return features(feature("transaction", "1.0.0"));
             }
@@ -74,7 +79,7 @@ public class FeaturesServiceImplTest extends TestBase {
     
     @Test
     public void testGetFeatureNotAvailable() throws Exception {
-        final FeaturesServiceImpl impl = new FeaturesServiceImpl(null, null, 
new Storage(), null, null, null, null, "", null, null, null, null, 0, 0, 0) {
+        final FeaturesServiceImpl impl = new FeaturesServiceImpl(null, null, 
new Storage(), null, null, null, this.resolver, null, "", null, null, null, 
null, 0, 0, 0) {
             protected Map<String,Map<String,Feature>> getFeatures() throws 
Exception {
                 return features(feature("transaction", "1.0.0"));
             }
@@ -88,7 +93,7 @@ public class FeaturesServiceImplTest extends TestBase {
                 feature("transaction", "1.0.0"),
                 feature("transaction", "2.0.0")
         );
-        final FeaturesServiceImpl impl = new FeaturesServiceImpl(null, null, 
new Storage(), null, null, null, null, "", null, null, null, null, 0, 0, 0) {
+        final FeaturesServiceImpl impl = new FeaturesServiceImpl(null, null, 
new Storage(), null, null, null, this.resolver, null, "", null, null, null, 
null, 0, 0, 0) {
             protected Map<String,Map<String,Feature>> getFeatures() throws 
Exception {
                 return features;
             }

http://git-wip-us.apache.org/repos/asf/karaf/blob/773c6c47/features/core/src/test/java/org/apache/karaf/features/internal/support/TestBundle.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/test/java/org/apache/karaf/features/internal/support/TestBundle.java
 
b/features/core/src/test/java/org/apache/karaf/features/internal/support/TestBundle.java
index 6f71731..2e58285 100644
--- 
a/features/core/src/test/java/org/apache/karaf/features/internal/support/TestBundle.java
+++ 
b/features/core/src/test/java/org/apache/karaf/features/internal/support/TestBundle.java
@@ -27,7 +27,7 @@ import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.felix.resolver.Util;
+import org.apache.karaf.features.internal.resolver.ResolverUtil;
 import org.apache.karaf.features.internal.resolver.ResourceBuilder;
 import org.apache.karaf.features.internal.resolver.ResourceImpl;
 import org.osgi.framework.Bundle;
@@ -200,12 +200,12 @@ public class TestBundle extends ResourceImpl implements 
BundleRevision, Bundle,
 
     @Override
     public String getSymbolicName() {
-        return Util.getSymbolicName(this);
+        return ResolverUtil.getSymbolicName(this);
     }
 
     @Override
     public Version getVersion() {
-        return Util.getVersion(this);
+        return ResolverUtil.getVersion(this);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/karaf/blob/773c6c47/profile/src/main/java/org/apache/karaf/profile/assembly/Builder.java
----------------------------------------------------------------------
diff --git 
a/profile/src/main/java/org/apache/karaf/profile/assembly/Builder.java 
b/profile/src/main/java/org/apache/karaf/profile/assembly/Builder.java
index 70a4e85..fc6d4a3 100644
--- a/profile/src/main/java/org/apache/karaf/profile/assembly/Builder.java
+++ b/profile/src/main/java/org/apache/karaf/profile/assembly/Builder.java
@@ -53,6 +53,7 @@ import java.util.jar.Manifest;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 
+import org.apache.felix.resolver.ResolverImpl;
 import org.apache.felix.utils.manifest.Clause;
 import org.apache.felix.utils.properties.InterpolationHelper;
 import org.apache.felix.utils.properties.Properties;
@@ -85,6 +86,7 @@ import org.ops4j.pax.url.mvn.MavenResolvers;
 import org.osgi.framework.Constants;
 import org.osgi.framework.wiring.BundleRevision;
 import org.osgi.resource.Resource;
+import org.osgi.service.resolver.Resolver;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -140,6 +142,7 @@ public class Builder {
 
     private ScheduledExecutorService executor;
     private DownloadManager manager;
+    private Resolver resolver;
     private Path etcDirectory;
     private Path systemDirectory;
     private Map<String, Profile> allProfiles;
@@ -325,6 +328,7 @@ public class Builder {
         MavenResolver resolver = MavenResolvers.createMavenResolver(props, 
"org.ops4j.pax.url.mvn");
         executor = Executors.newScheduledThreadPool(8);
         manager = new CustomDownloadManager(resolver, executor);
+        this.resolver = new ResolverImpl(new Slf4jResolverLog(LOGGER));
 
         //
         // Unzip kars
@@ -810,6 +814,7 @@ public class Builder {
         LOGGER.info("Resolving features");
         Map<String, Integer> bundles =
                 resolve(manager,
+                        resolver,
                         startupRepositories.values(),
                         startupEffective.getFeatures(),
                         startupEffective.getBundles(),
@@ -968,6 +973,7 @@ public class Builder {
 
     private Map<String, Integer> resolve(
                     DownloadManager manager,
+                    Resolver resolver,
                     Collection<Features> repositories,
                     Collection<String> features,
                     Collection<String> bundles,
@@ -975,7 +981,7 @@ public class Builder {
                     Collection<String> optionals) throws Exception {
         BundleRevision systemBundle = getSystemBundle();
         AssemblyDeployCallback callback = new AssemblyDeployCallback(manager, 
this, systemBundle, repositories);
-        Deployer deployer = new Deployer(manager, callback);
+        Deployer deployer = new Deployer(manager, resolver, callback);
 
         // Install framework
         Deployer.DeploymentRequest request = createDeploymentRequest();

http://git-wip-us.apache.org/repos/asf/karaf/blob/773c6c47/profile/src/main/java/org/apache/karaf/profile/assembly/Slf4jResolverLog.java
----------------------------------------------------------------------
diff --git 
a/profile/src/main/java/org/apache/karaf/profile/assembly/Slf4jResolverLog.java 
b/profile/src/main/java/org/apache/karaf/profile/assembly/Slf4jResolverLog.java
new file mode 100644
index 0000000..bf64100
--- /dev/null
+++ 
b/profile/src/main/java/org/apache/karaf/profile/assembly/Slf4jResolverLog.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.profile.assembly;
+
+import org.slf4j.Logger;
+
+/**
+ */
+public class Slf4jResolverLog extends org.apache.felix.resolver.Logger {
+
+    private final Logger logger;
+
+    public Slf4jResolverLog(Logger logger) {
+        super(LOG_DEBUG);
+        this.logger = logger;
+    }
+
+    @Override
+    protected void doLog(int level, String msg, Throwable throwable) {
+        switch (level) {
+        case LOG_ERROR:
+            logger.error(msg, throwable);
+            break;
+        case LOG_WARNING:
+            logger.warn(msg, throwable);
+            break;
+        case LOG_INFO:
+            logger.info(msg, throwable);
+            break;
+        default:
+            logger.debug(msg, throwable);
+            break;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/773c6c47/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/VerifyFeatureResolutionMojo.java
----------------------------------------------------------------------
diff --git 
a/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/VerifyFeatureResolutionMojo.java
 
b/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/VerifyFeatureResolutionMojo.java
index 0aef4cc..558bd3b 100644
--- 
a/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/VerifyFeatureResolutionMojo.java
+++ 
b/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/features/VerifyFeatureResolutionMojo.java
@@ -54,6 +54,8 @@ import java.util.zip.ZipInputStream;
 
 import aQute.bnd.osgi.Macro;
 import aQute.bnd.osgi.Processor;
+import org.apache.felix.resolver.Logger;
+import org.apache.felix.resolver.ResolverImpl;
 import org.apache.felix.utils.version.VersionRange;
 import org.apache.felix.utils.version.VersionTable;
 import org.apache.karaf.features.FeatureEvent;
@@ -320,7 +322,7 @@ public class VerifyFeatureResolutionMojo extends 
MojoSupport {
         try {
             Bundle systemBundle = getSystemBundle(getMetadata(properties, 
"metadata#"));
             DummyDeployCallback callback = new 
DummyDeployCallback(systemBundle, repositories.values());
-            Deployer deployer = new Deployer(manager, callback);
+            Deployer deployer = new Deployer(manager, new ResolverImpl(new 
MavenResolverLog()), callback);
 
 
             // Install framework
@@ -757,4 +759,28 @@ public class VerifyFeatureResolutionMojo extends 
MojoSupport {
         }
     }
 
+    public class MavenResolverLog extends org.apache.felix.resolver.Logger {
+
+        public MavenResolverLog() {
+            super(Logger.LOG_DEBUG);
+        }
+
+        @Override
+        protected void doLog(int level, String msg, Throwable throwable) {
+            switch (level) {
+            case LOG_DEBUG:
+                getLog().debug(msg, throwable);
+                break;
+            case LOG_INFO:
+                getLog().info(msg, throwable);
+                break;
+            case LOG_WARNING:
+                getLog().warn(msg, throwable);
+                break;
+            case LOG_ERROR:
+                getLog().error(msg, throwable);
+                break;
+            }
+        }
+    }
 }

Reply via email to