You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by jw...@apache.org on 2012/06/29 19:29:44 UTC
svn commit: r1355479 - in
/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core:
archive/ internal/
Author: jwross
Date: Fri Jun 29 17:29:42 2012
New Revision: 1355479
URL: http://svn.apache.org/viewvc?rev=1355479&view=rev
Log:
ARIES-825: Multiple changes.
(1) Stopping the root subsystem should stop child subsystems but not bundles.
(2) Arbitrary attributes on Subsystem-Content and Subsystem-SymbolicName headers are now honored.
Added:
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/DeployedContentRequirement.java
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemContentRequirement.java
Modified:
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/DeployedContentHeader.java
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/DeployedVersionAttribute.java
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemContentHeader.java
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StopAction.java
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemResource.java
Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/DeployedContentHeader.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/DeployedContentHeader.java?rev=1355479&r1=1355478&r2=1355479&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/DeployedContentHeader.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/DeployedContentHeader.java Fri Jun 29 17:29:42 2012
@@ -18,6 +18,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
@@ -26,10 +27,11 @@ import java.util.regex.Pattern;
import org.apache.aries.subsystem.core.internal.ResourceHelper;
import org.apache.aries.subsystem.core.internal.Utils;
import org.osgi.framework.Version;
+import org.osgi.resource.Requirement;
import org.osgi.resource.Resource;
import org.osgi.service.subsystem.SubsystemConstants;
-public class DeployedContentHeader implements Header<DeployedContentHeader.Clause> {
+public class DeployedContentHeader implements RequirementHeader<DeployedContentHeader.Clause> {
public static class Clause implements org.apache.aries.subsystem.core.archive.Clause {
public static final String ATTRIBUTE_DEPLOYEDVERSION = DeployedVersionAttribute.NAME;
public static final String ATTRIBUTE_RESOURCEID = "resourceId";
@@ -141,6 +143,10 @@ public class DeployedContentHeader imple
return ((TypeAttribute)getAttribute(ATTRIBUTE_TYPE)).getType();
}
+ public DeployedContentRequirement toRequirement(Resource resource) {
+ return new DeployedContentRequirement(this, resource);
+ }
+
@Override
public String toString() {
StringBuilder builder = new StringBuilder()
@@ -242,6 +248,14 @@ public class DeployedContentHeader imple
}
@Override
+ public List<Requirement> toRequirements(Resource resource) {
+ List<Requirement> requirements = new ArrayList<Requirement>(clauses.size());
+ for (Clause clause : clauses)
+ requirements.add(clause.toRequirement(resource));
+ return requirements;
+ }
+
+ @Override
public String toString() {
StringBuilder builder = new StringBuilder();
for (Clause clause : getClauses()) {
Added: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/DeployedContentRequirement.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/DeployedContentRequirement.java?rev=1355479&view=auto
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/DeployedContentRequirement.java (added)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/DeployedContentRequirement.java Fri Jun 29 17:29:42 2012
@@ -0,0 +1,48 @@
+package org.apache.aries.subsystem.core.archive;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.aries.subsystem.core.internal.AbstractRequirement;
+import org.osgi.framework.namespace.IdentityNamespace;
+import org.osgi.resource.Resource;
+
+public class DeployedContentRequirement extends AbstractRequirement {
+ public static final String DIRECTIVE_FILTER = IdentityNamespace.REQUIREMENT_FILTER_DIRECTIVE;
+ public static final String NAMESPACE = IdentityNamespace.IDENTITY_NAMESPACE;
+
+ private final Map<String, String> directives = new HashMap<String, String>();
+ private final Resource resource;
+
+ public DeployedContentRequirement(
+ DeployedContentHeader.Clause clause, Resource resource) {
+ StringBuilder builder = new StringBuilder("(&(")
+ .append(NAMESPACE).append('=')
+ .append(clause.getSymbolicName()).append(')');
+ for (Attribute attribute : clause.getAttributes())
+ attribute.appendToFilter(builder);
+ directives.put(DIRECTIVE_FILTER, builder.append(')').toString());
+ this.resource = resource;
+ }
+
+ @Override
+ public Map<String, Object> getAttributes() {
+ return Collections.emptyMap();
+ }
+
+ @Override
+ public Map<String, String> getDirectives() {
+ return Collections.unmodifiableMap(directives);
+ }
+
+ @Override
+ public String getNamespace() {
+ return NAMESPACE;
+ }
+
+ @Override
+ public Resource getResource() {
+ return resource;
+ }
+}
Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/DeployedVersionAttribute.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/DeployedVersionAttribute.java?rev=1355479&r1=1355478&r2=1355479&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/DeployedVersionAttribute.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/DeployedVersionAttribute.java Fri Jun 29 17:29:42 2012
@@ -14,6 +14,7 @@
package org.apache.aries.subsystem.core.archive;
import org.osgi.framework.Version;
+import org.osgi.framework.VersionRange;
import org.osgi.service.subsystem.SubsystemConstants;
public class DeployedVersionAttribute extends AbstractAttribute {
@@ -25,6 +26,12 @@ public class DeployedVersionAttribute ex
super(NAME, value);
deployedVersion = Version.parseVersion(value);
}
+
+ @Override
+ public StringBuilder appendToFilter(StringBuilder builder) {
+ VersionRange versionRange = new VersionRange(VersionRange.LEFT_CLOSED, getVersion(), getVersion(), VersionRange.RIGHT_CLOSED);
+ return builder.append(versionRange.toFilterString(VersionRangeAttribute.NAME));
+ }
public Version getDeployedVersion() {
return deployedVersion;
Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemContentHeader.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemContentHeader.java?rev=1355479&r1=1355478&r2=1355479&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemContentHeader.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemContentHeader.java Fri Jun 29 17:29:42 2012
@@ -24,7 +24,6 @@ import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import org.apache.aries.subsystem.core.internal.OsgiIdentityRequirement;
import org.apache.aries.subsystem.core.internal.ResourceHelper;
import org.osgi.framework.Version;
import org.osgi.framework.VersionRange;
@@ -161,8 +160,8 @@ public class SubsystemContentHeader impl
return ((ResolutionDirective)getDirective(DIRECTIVE_RESOLUTION)).isMandatory();
}
- public OsgiIdentityRequirement toRequirement(Resource resource) {
- return new OsgiIdentityRequirement(getSymbolicName(), getVersionRange(), getType(), false);
+ public SubsystemContentRequirement toRequirement(Resource resource) {
+ return new SubsystemContentRequirement(this, resource);
}
@Override
@@ -176,67 +175,6 @@ public class SubsystemContentHeader impl
}
}
-// public static class Content {
-// private final boolean mandatory;
-// private final String name;
-// private final int startOrder;
-// private final String type;
-// private final VersionRange versionRange;
-//
-// public Content(boolean mandatory, String name, String type, VersionRange versionRange, int startOrder) {
-// this.mandatory = mandatory;
-// this.name = name;
-// this.type = type;
-// this.versionRange = versionRange;
-// this.startOrder = startOrder;
-// }
-//
-// public String getName() {
-// return name;
-// }
-//
-// public int getStartOrder() {
-// return startOrder;
-// }
-//
-// public String getType() {
-// return type;
-// }
-//
-// public VersionRange getVersionRange() {
-// return versionRange;
-// }
-//
-// public boolean isMandatory() {
-// return mandatory;
-// }
-//
-// public Requirement toRequirement() {
-// return new OsgiIdentityRequirement(name, versionRange, type, false);
-// }
-//
-// public String toString() {
-// return new StringBuilder(getName())
-// .append(';')
-// .append(VersionAttribute.NAME)
-// .append('=')
-// .append(getVersionRange())
-// .append(';')
-// .append(TypeAttribute.NAME)
-// .append("=")
-// .append(getType())
-// .append(';')
-// .append(ResolutionDirective.NAME)
-// .append(":=")
-// .append(isMandatory())
-// .append(';')
-// .append(StartOrderDirective.NAME)
-// .append(":=")
-// .append(getStartOrder())
-// .toString();
-// }
-// }
-
public static final String NAME = SubsystemConstants.SUBSYSTEM_CONTENT;
public static SubsystemContentHeader newInstance(Collection<Resource> resources) {
@@ -275,25 +213,6 @@ public class SubsystemContentHeader impl
return clauses;
}
-// private static String processResources(Collection<Resource> resources) {
-// if (resources.isEmpty())
-// throw new IllegalArgumentException("At least one resource must be specified");
-// StringBuilder sb = new StringBuilder();
-// for (Resource resource : resources) {
-// Capability c = resource.getCapabilities(IdentityNamespace.IDENTITY_NAMESPACE).get(0);
-// Map<String, Object> a = c.getAttributes();
-// String s = (String)a.get(IdentityNamespace.IDENTITY_NAMESPACE);
-// Version v = (Version)a.get(IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE);
-// String t = (String)a.get(IdentityNamespace.CAPABILITY_TYPE_ATTRIBUTE);
-// sb.append(s).append(';')
-// .append(IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE).append('=').append(v).append(';')
-// .append(IdentityNamespace.CAPABILITY_TYPE_ATTRIBUTE).append('=').append(t).append(',');
-// }
-// // Remove the trailing comma.
-// sb.deleteCharAt(sb.length() - 1);
-// return sb.toString();
-// }
-
private final Set<Clause> clauses;
public SubsystemContentHeader(Collection<Clause> clauses) {
@@ -306,10 +225,6 @@ public class SubsystemContentHeader impl
this(processHeader(value));
}
-// public SubsystemContentHeader(Collection<Resource> resources) {
-// this(processResources(resources));
-// }
-
public boolean contains(Resource resource) {
return getClause(resource) != null;
}
@@ -332,38 +247,12 @@ public class SubsystemContentHeader impl
return Collections.unmodifiableSet(clauses);
}
-// public Content getContent(Resource resource) {
-// String symbolicName = ResourceHelper.getSymbolicNameAttribute(resource);
-// Version version = ResourceHelper.getVersionAttribute(resource);
-// String type = ResourceHelper.getTypeAttribute(resource);
-// for (Content content : contents) {
-// if (symbolicName.equals(content.getName())
-// && content.getVersionRange().includes(version)
-// && type.equals(content.getType()))
-// return content;
-// }
-// return null;
-// }
-//
-// public Collection<Content> getContents() {
-// return Collections.unmodifiableCollection(contents);
-// }
-
public boolean isMandatory(Resource resource) {
Clause clause = getClause(resource);
if (clause == null)
return false;
return clause.isMandatory();
-// Content content = getContent(resource);
-// return content == null ? false : content.isMandatory();
}
-
-// public List<Requirement> toRequirements() {
-// ArrayList<Requirement> result = new ArrayList<Requirement>(contents.size());
-// for (Content content : contents)
-// result.add(content.toRequirement());
-// return result;
-// }
@Override
public String getName() {
Added: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemContentRequirement.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemContentRequirement.java?rev=1355479&view=auto
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemContentRequirement.java (added)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemContentRequirement.java Fri Jun 29 17:29:42 2012
@@ -0,0 +1,48 @@
+package org.apache.aries.subsystem.core.archive;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.aries.subsystem.core.internal.AbstractRequirement;
+import org.osgi.framework.namespace.IdentityNamespace;
+import org.osgi.resource.Resource;
+
+public class SubsystemContentRequirement extends AbstractRequirement {
+ public static final String DIRECTIVE_FILTER = IdentityNamespace.REQUIREMENT_FILTER_DIRECTIVE;
+ public static final String NAMESPACE = IdentityNamespace.IDENTITY_NAMESPACE;
+
+ private final Map<String, String> directives = new HashMap<String, String>();
+ private final Resource resource;
+
+ public SubsystemContentRequirement(
+ SubsystemContentHeader.Clause clause, Resource resource) {
+ StringBuilder builder = new StringBuilder("(&(")
+ .append(NAMESPACE).append('=')
+ .append(clause.getSymbolicName()).append(')');
+ for (Attribute attribute : clause.getAttributes())
+ attribute.appendToFilter(builder);
+ directives.put(DIRECTIVE_FILTER, builder.append(')').toString());
+ this.resource = resource;
+ }
+
+ @Override
+ public Map<String, Object> getAttributes() {
+ return Collections.emptyMap();
+ }
+
+ @Override
+ public Map<String, String> getDirectives() {
+ return Collections.unmodifiableMap(directives);
+ }
+
+ @Override
+ public String getNamespace() {
+ return NAMESPACE;
+ }
+
+ @Override
+ public Resource getResource() {
+ return resource;
+ }
+}
Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StopAction.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StopAction.java?rev=1355479&r1=1355478&r2=1355479&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StopAction.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StopAction.java Fri Jun 29 17:29:42 2012
@@ -43,24 +43,21 @@ public class StopAction extends Abstract
subsystem.stop();
}
subsystem.setState(State.STOPPING);
- // For non-root subsystems, stop any remaining constituents.
- if (!subsystem.isRoot()){
- List<Resource> resources = new ArrayList<Resource>(Activator.getInstance().getSubsystems().getResourcesReferencedBy(subsystem));
- SubsystemContentHeader header = subsystem.getSubsystemManifest().getSubsystemContentHeader();
- if (header != null) {
- Collections.sort(resources, new StartResourceComparator(subsystem.getSubsystemManifest().getSubsystemContentHeader()));
- Collections.reverse(resources);
- }
- for (Resource resource : resources) {
- // Don't stop the region context bundle.
- if (ResourceHelper.getSymbolicNameAttribute(resource).startsWith(RegionContextBundleHelper.SYMBOLICNAME_PREFIX))
- continue;
- try {
- stopResource(resource);
- }
- catch (Exception e) {
- logger.error("An error occurred while stopping resource " + resource + " of subsystem " + subsystem, e);
- }
+ List<Resource> resources = new ArrayList<Resource>(Activator.getInstance().getSubsystems().getResourcesReferencedBy(subsystem));
+ SubsystemContentHeader header = subsystem.getSubsystemManifest().getSubsystemContentHeader();
+ if (header != null) {
+ Collections.sort(resources, new StartResourceComparator(subsystem.getSubsystemManifest().getSubsystemContentHeader()));
+ Collections.reverse(resources);
+ }
+ for (Resource resource : resources) {
+ // Don't stop the region context bundle.
+ if (ResourceHelper.getSymbolicNameAttribute(resource).startsWith(RegionContextBundleHelper.SYMBOLICNAME_PREFIX))
+ continue;
+ try {
+ stopResource(resource);
+ }
+ catch (Exception e) {
+ logger.error("An error occurred while stopping resource " + resource + " of subsystem " + subsystem, e);
}
}
// TODO Can we automatically assume it actually is resolved?
@@ -83,6 +80,8 @@ public class StopAction extends Abstract
}
private void stopBundleResource(Resource resource) throws BundleException {
+ if (subsystem.isRoot())
+ return;
((BundleRevision)resource).getBundle().stop();
}
Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemResource.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemResource.java?rev=1355479&r1=1355478&r2=1355479&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemResource.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemResource.java Fri Jun 29 17:29:42 2012
@@ -322,9 +322,7 @@ public class SubsystemResource implement
if (contentHeader == null)
return;
for (SubsystemContentHeader.Clause clause : contentHeader.getClauses()) {
- OsgiIdentityRequirement requirement = new OsgiIdentityRequirement(
- clause.getSymbolicName(), clause.getVersionRange(),
- clause.getType(), false);
+ Requirement requirement = clause.toRequirement(this);
Resource resource = findContent(requirement);
if (resource == null) {
if (clause.isMandatory())
@@ -471,7 +469,7 @@ public class SubsystemResource implement
};
}
- private Resource findContent(OsgiIdentityRequirement requirement) {
+ private Resource findContent(Requirement requirement) {
Map<Requirement, Collection<Capability>> map;
// TODO System repository for scoped subsystems should be searched in
// the case of a persisted subsystem.
@@ -510,10 +508,7 @@ public class SubsystemResource implement
else
return Activator.getInstance().getSubsystems().getSubsystemById(resourceId);
}
- OsgiIdentityRequirement requirement = new OsgiIdentityRequirement(
- clause.getPath(), clause.getDeployedVersion(),
- clause.getType(), false);
- return findContent(requirement);
+ return findContent(clause.toRequirement(this));
}
private Resource findDependency(ProvisionResourceHeader.ProvisionedResource provisionedResource) {