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; + } + } + } }
