You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by gn...@apache.org on 2017/10/10 17:21:55 UTC
[1/2] karaf git commit: [KARAF-5395] Various minor improvements
Repository: karaf
Updated Branches:
refs/heads/master 4188ef858 -> 28415d0a2
[KARAF-5395] Various minor improvements
Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/495fbd3c
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/495fbd3c
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/495fbd3c
Branch: refs/heads/master
Commit: 495fbd3cb2d01eba87752cc2ec2a1f51a02d05fb
Parents: 4188ef8
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Tue Oct 10 19:21:03 2017 +0200
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Tue Oct 10 19:21:03 2017 +0200
----------------------------------------------------------------------
.../karaf/features/internal/model/Bundle.java | 5 ++
.../features/internal/region/Subsystem.java | 75 ++++++++++++++++----
.../region/SubsystemResolveContext.java | 2 +-
.../internal/resolver/ResourceImpl.java | 19 ++---
.../features/internal/util/StringArrayMap.java | 47 ++++++++++++
.../org/apache/karaf/tooling/VerifyMojo.java | 2 +-
6 files changed, 126 insertions(+), 24 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/karaf/blob/495fbd3c/features/core/src/main/java/org/apache/karaf/features/internal/model/Bundle.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/model/Bundle.java b/features/core/src/main/java/org/apache/karaf/features/internal/model/Bundle.java
index 9749da1..8afa5ff 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/model/Bundle.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/model/Bundle.java
@@ -178,4 +178,9 @@ public class Bundle implements BundleInfo {
result = 31 * result + (isDependency() ? 1 : 0);
return result;
}
+
+ @Override
+ public String toString() {
+ return value;
+ }
}
http://git-wip-us.apache.org/repos/asf/karaf/blob/495fbd3c/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 33b9dae..e55e60d 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
@@ -56,6 +56,7 @@ import org.apache.karaf.features.internal.resolver.ResourceImpl;
import org.apache.karaf.features.internal.resolver.ResourceUtils;
import org.apache.karaf.features.internal.resolver.SimpleFilter;
import org.apache.karaf.features.internal.service.Overrides;
+import org.apache.karaf.features.internal.util.StringArrayMap;
import org.osgi.framework.BundleException;
import org.osgi.framework.Version;
import org.osgi.resource.Capability;
@@ -445,14 +446,15 @@ public class Subsystem extends ResourceImpl {
final Conditional cond = entry.getValue();
ResourceImpl res = bundles.get(loc);
int sl = bi.getStartLevel() <= 0 ? feature.getStartLevel() : bi.getStartLevel();
- if (bi.isDependency()) {
- addDependency(res, false, bi.isStart(), sl);
- } else {
- doAddDependency(res, cond == null, bi.isStart(), sl);
- }
if (cond != null) {
addIdentityRequirement(res, resConds.get(cond), true);
}
+ boolean mandatory = !bi.isDependency() && cond == null;
+ if (bi.isDependency()) {
+ addDependency(res, mandatory, bi.isStart(), sl);
+ } else {
+ doAddDependency(res, mandatory, bi.isStart(), sl);
+ }
}
for (Library library : feature.getLibraries()) {
if (library.isExport()) {
@@ -497,7 +499,7 @@ public class Subsystem extends ResourceImpl {
ResourceImpl res = new ResourceImpl();
for (Capability cap : resource.getCapabilities(null)) {
res.addCapability(new CapabilityImpl(res, cap.getNamespace(),
- new HashMap<>(cap.getDirectives()), new HashMap<>(cap.getAttributes())));
+ new StringArrayMap<>(cap.getDirectives()), new StringArrayMap<>(cap.getAttributes())));
}
for (Requirement req : resource.getRequirements(null)) {
SimpleFilter sf;
@@ -509,7 +511,7 @@ public class Subsystem extends ResourceImpl {
sf = SimpleFilter.convert(req.getAttributes());
}
res.addRequirement(new RequirementImpl(res, req.getNamespace(),
- new HashMap<>(req.getDirectives()), new HashMap<>(req.getAttributes()), sf));
+ new StringArrayMap<>(req.getDirectives()), new StringArrayMap<>(req.getAttributes()), sf));
}
return res;
}
@@ -543,15 +545,43 @@ public class Subsystem extends ResourceImpl {
private void doAddDependency(ResourceImpl resource, boolean mandatory, boolean start, int startLevel) {
String id = ResolverUtil.getSymbolicName(resource) + "|" + ResolverUtil.getVersion(resource);
- DependencyInfo info = dependencies.computeIfAbsent(id, k -> new DependencyInfo());
- info.resource = resource;
- info.mandatory |= mandatory;
- info.start |= start;
- if (info.startLevel > 0 && startLevel > 0) {
- info.startLevel = Math.min(info.startLevel, startLevel);
+ DependencyInfo info = new DependencyInfo(resource, mandatory, start, startLevel);
+ dependencies.merge(id, info, this::merge);
+ }
+
+ private DependencyInfo merge(DependencyInfo di1, DependencyInfo di2) {
+ DependencyInfo info = new DependencyInfo();
+ if (di1.resource != di2.resource) {
+ Requirement r1 = getFirstIdentityReq(di1.resource);
+ Requirement r2 = getFirstIdentityReq(di2.resource);
+ if (r1 == null) {
+ info.resource = di1.resource;
+ } else if (r2 == null) {
+ info.resource = di2.resource;
+ } else {
+ String id = ResolverUtil.getSymbolicName(di1.resource) + "/" + ResolverUtil.getVersion(di1.resource);
+ throw new IllegalStateException("Resource " + id + " is duplicated on subsystem " + this.toString() + ". First resource requires " + (r1 != null ? r1 : "nothing") + " while the second requires " + (r2 != null ? r2 : "nothing"));
+ }
+ } else {
+ info.resource = di1.resource;
+ }
+ info.mandatory = di1.mandatory | di2.mandatory;
+ info.start = di1.start | di2.start;
+ if (di1.startLevel > 0 && di2.startLevel > 0) {
+ info.startLevel = Math.min(di1.startLevel, di2.startLevel);
} else {
- info.startLevel = Math.max(info.startLevel, startLevel);
+ info.startLevel = Math.max(di1.startLevel, di2.startLevel);
}
+ return info;
+ }
+
+ private RequirementImpl getFirstIdentityReq(ResourceImpl resource) {
+ for (Requirement r : resource.getRequirements(null)) {
+ if (IDENTITY_NAMESPACE.equals(r.getNamespace())) {
+ return (RequirementImpl) r;
+ }
+ }
+ return null;
}
class DependencyInfo implements BundleInfo {
@@ -560,6 +590,16 @@ public class Subsystem extends ResourceImpl {
boolean start;
int startLevel;
+ public DependencyInfo() {
+ }
+
+ public DependencyInfo(ResourceImpl resource, boolean mandatory, boolean start, int startLevel) {
+ this.resource = resource;
+ this.mandatory = mandatory;
+ this.start = start;
+ this.startLevel = startLevel;
+ }
+
@Override
public boolean isStart() {
return start;
@@ -579,6 +619,13 @@ public class Subsystem extends ResourceImpl {
public boolean isDependency() {
return !mandatory;
}
+
+ @Override
+ public String toString() {
+ return "DependencyInfo{" +
+ "resource=" + resource +
+ '}';
+ }
}
Map<String, Set<String>> createPolicy(List<? extends ScopeFilter> filters) {
http://git-wip-us.apache.org/repos/asf/karaf/blob/495fbd3c/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 59e334c..c162b81 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
@@ -247,7 +247,7 @@ public class SubsystemResolveContext extends ResolveContext {
caps.removeIf(cap -> !providers.contains(cap.getResource()));
}
// Sort caps
- if (distance != null) {
+ if (distance != null && caps.size() > 1) {
caps.sort(candidateComparator);
}
}
http://git-wip-us.apache.org/repos/asf/karaf/blob/495fbd3c/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceImpl.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceImpl.java b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceImpl.java
index 0d85843..892cfc7 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceImpl.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceImpl.java
@@ -17,6 +17,7 @@
package org.apache.karaf.features.internal.resolver;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
import java.util.Map;
@@ -39,12 +40,12 @@ public class ResourceImpl implements Resource {
* has the required identity capability
*/
public ResourceImpl() {
- caps = new ArrayList<>();
- reqs = new ArrayList<>();
+ caps = new ArrayList<>(0);
+ reqs = new ArrayList<>(0);
}
public ResourceImpl(String name, String type, Version version) {
- caps = new ArrayList<>();
+ caps = new ArrayList<>(1);
Map<String, String> dirs = new StringArrayMap<>(0);
Map<String, Object> attrs = new StringArrayMap<>(3);
attrs.put(IdentityNamespace.IDENTITY_NAMESPACE, name);
@@ -52,7 +53,7 @@ public class ResourceImpl implements Resource {
attrs.put(IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE, version);
CapabilityImpl identity = new CapabilityImpl(this, IdentityNamespace.IDENTITY_NAMESPACE, dirs, attrs);
caps.add(identity);
- reqs = new ArrayList<>();
+ reqs = new ArrayList<>(0);
}
public void addCapability(Capability capability) {
@@ -60,10 +61,11 @@ public class ResourceImpl implements Resource {
caps.add(capability);
}
- public void addCapabilities(Iterable<? extends Capability> capabilities) {
+ public void addCapabilities(Collection<? extends Capability> capabilities) {
for (Capability cap : capabilities) {
- addCapability(cap);
+ assert cap.getResource() == this;
}
+ caps.addAll(capabilities);
}
public void addRequirement(Requirement requirement) {
@@ -71,10 +73,11 @@ public class ResourceImpl implements Resource {
reqs.add(requirement);
}
- public void addRequirements(Iterable<? extends Requirement> requirements) {
+ public void addRequirements(Collection<? extends Requirement> requirements) {
for (Requirement req : requirements) {
- addRequirement(req);
+ assert req.getResource() == this;
}
+ reqs.addAll(requirements);
}
public List<Capability> getCapabilities(String namespace) {
http://git-wip-us.apache.org/repos/asf/karaf/blob/495fbd3c/features/core/src/main/java/org/apache/karaf/features/internal/util/StringArrayMap.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/util/StringArrayMap.java b/features/core/src/main/java/org/apache/karaf/features/internal/util/StringArrayMap.java
index d05b7a2..e343bc4 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/util/StringArrayMap.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/util/StringArrayMap.java
@@ -279,4 +279,51 @@ public class StringArrayMap<V> implements Map<String, V> {
Arrays.fill(table, null);
}
+ public int hashCode() {
+ return Objects.hash(table, size);
+ }
+
+ public boolean equals(Object o) {
+ if (o == this)
+ return true;
+ if (!(o instanceof Map))
+ return false;
+ Map<?,?> m = (Map<?,?>) o;
+ if (m.size() != size())
+ return false;
+ try {
+ for (int i = 0, l = size * 2; i < l; i += 2) {
+ Object key = table[i];
+ Object value = table[i+1];
+ if (value == null) {
+ if (!(m.get(key)==null && m.containsKey(key)))
+ return false;
+ } else {
+ if (!value.equals(m.get(key)))
+ return false;
+ }
+ }
+ } catch (ClassCastException | NullPointerException unused) {
+ return false;
+ }
+ return true;
+ }
+
+ public String toString() {
+ if (size == 0)
+ return "{}";
+
+ StringBuilder sb = new StringBuilder();
+ sb.append('{');
+ for (int i = 0, l = size * 2; i < l; i += 2) {
+ if (i > 0) {
+ sb.append(',').append(' ');
+ }
+ sb.append(table[i]);
+ sb.append('=');
+ sb.append(table[i+1] == this ? "(this Map)" : table[i+1]);
+ }
+ return sb.append('}').toString();
+ }
+
}
http://git-wip-us.apache.org/repos/asf/karaf/blob/495fbd3c/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/VerifyMojo.java
----------------------------------------------------------------------
diff --git a/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/VerifyMojo.java b/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/VerifyMojo.java
index 3d008c9..2ff0a53 100644
--- a/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/VerifyMojo.java
+++ b/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/VerifyMojo.java
@@ -496,7 +496,7 @@ public class VerifyMojo extends MojoSupport {
// TODO: find unused resources ?
} catch (Exception e) {
throw new MojoExecutionException("Feature resolution failed for " + features
- + "\nMessage: " + e.getMessage()
+ + "\nMessage: " + (e instanceof ResolutionException ? e.getMessage() : e.toString())
+ "\nRepositories: " + toString(new TreeSet<>(repositories.keySet()))
+ "\nResources: " + toString(new TreeSet<>(manager.getProviders().keySet())), e);
}
[2/2] karaf git commit: [KARAF-5371] Use a defaut region to avoid
having bundles not included in any region
Posted by gn...@apache.org.
[KARAF-5371] Use a defaut region to avoid having bundles not included in any region
Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/28415d0a
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/28415d0a
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/28415d0a
Branch: refs/heads/master
Commit: 28415d0a2e10e6823ba0cef020277d712d7cb5b1
Parents: 495fbd3
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Tue Oct 10 19:21:42 2017 +0200
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Tue Oct 10 19:21:42 2017 +0200
----------------------------------------------------------------------
.../org/apache/karaf/features/internal/region/DigraphHelper.java | 1 +
1 file changed, 1 insertion(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/karaf/blob/28415d0a/features/core/src/main/java/org/apache/karaf/features/internal/region/DigraphHelper.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/region/DigraphHelper.java b/features/core/src/main/java/org/apache/karaf/features/internal/region/DigraphHelper.java
index 265fb94..5897415 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/region/DigraphHelper.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/region/DigraphHelper.java
@@ -176,6 +176,7 @@ public final class DigraphHelper {
if (defaultRegion == null) {
defaultRegion = dg.createRegion(FeaturesServiceImpl.ROOT_REGION);
}
+ dg.setDefaultRegion(defaultRegion);
// Add all unknown bundle to default region
Set<Long> ids = new HashSet<>();
for (Bundle bundle : bundleContext.getBundles()) {