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/02/27 19:05:35 UTC
svn commit: r1294252 - in
/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core:
archive/ internal/
Author: jwross
Date: Mon Feb 27 18:05:35 2012
New Revision: 1294252
URL: http://svn.apache.org/viewvc?rev=1294252&view=rev
Log:
ARIES-825: Update subsystems to latest Subsystem, Resolver, and Repository APIs.
Initial support for Subsystem-ImportService header in composites.
Added:
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemImportServiceHeader.java
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemImportServiceRequirement.java
Modified:
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/DeploymentManifest.java
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/HeaderFactory.java
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/ImportPackageHeader.java
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/RequireCapabilityHeader.java
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemManifest.java
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/AriesSubsystem.java
Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/DeploymentManifest.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/DeploymentManifest.java?rev=1294252&r1=1294251&r2=1294252&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/DeploymentManifest.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/DeploymentManifest.java Mon Feb 27 18:05:35 2012
@@ -32,14 +32,13 @@ import org.osgi.service.subsystem.Subsys
public class DeploymentManifest {
public static final String DEPLOYED_CONTENT = SubsystemConstants.DEPLOYED_CONTENT;
- public static final String DEPLOYED_EXPORTSERVICE = "Deployed-ExportService"; // TODO Needs constant on SubsystemConstants.
- public static final String DEPLOYED_IMPORTSERVICE = "Deployed-ImportService"; // TODO Needs constant on SubsystemConstants.
public static final String DEPLOYMENT_MANIFESTVERSION = "Deployment-ManifestVersion"; // TODO Needs constant on SubsystemConstants.
public static final String EXPORT_PACKAGE = Constants.EXPORT_PACKAGE;
public static final String IMPORT_PACKAGE = Constants.IMPORT_PACKAGE;
public static final String PROVISION_RESOURCE = SubsystemConstants.PROVISION_RESOURCE;
public static final String REQUIRE_BUNDLE = Constants.REQUIRE_BUNDLE;
public static final String REQUIRE_CAPABILITY = Constants.REQUIRE_CAPABILITY;
+ public static final String SUBSYSTEM_IMPORTSERVICE = SubsystemConstants.SUBSYSTEM_IMPORTSERVICE;
public static final String SUBSYSTEM_SYMBOLICNAME = SubsystemConstants.SUBSYSTEM_SYMBOLICNAME;
public static final String SUBSYSTEM_VERSION = SubsystemConstants.SUBSYSTEM_VERSION;
@@ -125,6 +124,9 @@ public class DeploymentManifest {
header = subsystemManifest.getRequireCapabilityHeader();
if (header != null)
headers.put(REQUIRE_CAPABILITY, header);
+ header = subsystemManifest.getSubsystemImportServiceHeader();
+ if (header != null)
+ headers.put(SUBSYSTEM_IMPORTSERVICE, header);
// TODO Compute additional headers for a composite.
}
// Features require no additional headers.
@@ -160,6 +162,10 @@ public class DeploymentManifest {
return (RequireCapabilityHeader)getHeaders().get(REQUIRE_CAPABILITY);
}
+ public SubsystemImportServiceHeader getSubsystemImportServiceHeader() {
+ return (SubsystemImportServiceHeader)getHeaders().get(SUBSYSTEM_IMPORTSERVICE);
+ }
+
public void write(OutputStream out) throws IOException {
Manifest manifest = new Manifest();
Attributes attributes = manifest.getMainAttributes();
Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/HeaderFactory.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/HeaderFactory.java?rev=1294252&r1=1294251&r2=1294252&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/HeaderFactory.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/HeaderFactory.java Mon Feb 27 18:05:35 2012
@@ -13,7 +13,6 @@
*/
package org.apache.aries.subsystem.core.archive;
-
public class HeaderFactory {
// public static final String APPLICATIONCONTENT_HEADER = ApplicationContentHeader.NAME;
// public static final String APPLICATIONSYMBOLICNAME_HEADER = ApplicationSymbolicNameHeader.NAME;
@@ -55,7 +54,7 @@ public class HeaderFactory {
// private static final String REGEX = '(' + Grammar.CLAUSE + ")(?:,(" + Grammar.CLAUSE + "))*";
// private static final Pattern PATTERN = Pattern.compile(REGEX);
- public static Header createHeader(String name, String value) {
+ public static Header<?> createHeader(String name, String value) {
// Matcher matcher = PATTERN.matcher(value);
// if (!matcher.matches())
// throw new IllegalArgumentException("Invalid header: " + name + ": " + value);
@@ -98,6 +97,8 @@ public class HeaderFactory {
return new SubsystemManifestVersionHeader(value);
if (RequireCapabilityHeader.NAME.equals(name))
return new RequireCapabilityHeader(value);
+ if (SubsystemImportServiceHeader.NAME.equals(name))
+ return new SubsystemImportServiceHeader(value);
return new GenericHeader(name, value);
}
Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/ImportPackageHeader.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/ImportPackageHeader.java?rev=1294252&r1=1294251&r2=1294252&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/ImportPackageHeader.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/ImportPackageHeader.java Mon Feb 27 18:05:35 2012
@@ -86,6 +86,7 @@ public class ImportPackageHeader impleme
fillInDefaults(myParameters);
}
+ @Override
public Attribute getAttribute(String name) {
Parameter result = myParameters.get(name);
if (result instanceof Attribute) {
@@ -94,6 +95,7 @@ public class ImportPackageHeader impleme
return null;
}
+ @Override
public Collection<Attribute> getAttributes() {
ArrayList<Attribute> attributes = new ArrayList<Attribute>(myParameters.size());
for (Parameter parameter : myParameters.values()) {
@@ -105,6 +107,7 @@ public class ImportPackageHeader impleme
return attributes;
}
+ @Override
public Directive getDirective(String name) {
Parameter result = myParameters.get(name);
if (result instanceof Directive) {
@@ -113,6 +116,7 @@ public class ImportPackageHeader impleme
return null;
}
+ @Override
public Collection<Directive> getDirectives() {
ArrayList<Directive> directives = new ArrayList<Directive>(myParameters.size());
for (Parameter parameter : myParameters.values()) {
@@ -128,14 +132,17 @@ public class ImportPackageHeader impleme
return Arrays.asList(myPath.split(";"));
}
+ @Override
public Parameter getParameter(String name) {
return myParameters.get(name);
}
+ @Override
public Collection<Parameter> getParameters() {
return Collections.unmodifiableCollection(myParameters.values());
}
+ @Override
public String getPath() {
return myPath;
}
@@ -186,6 +193,7 @@ public class ImportPackageHeader impleme
return (VersionRangeAttribute)myParameters.get(Constants.VERSION_ATTRIBUTE);
}
+ @Override
public String toString() {
StringBuilder builder = new StringBuilder()
.append(getPath());
Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/RequireCapabilityHeader.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/RequireCapabilityHeader.java?rev=1294252&r1=1294251&r2=1294252&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/RequireCapabilityHeader.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/RequireCapabilityHeader.java Mon Feb 27 18:05:35 2012
@@ -106,6 +106,16 @@ public class RequireCapabilityHeader imp
public String getPath() {
return getNamespace();
}
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder()
+ .append(getPath());
+ for (Parameter parameter : getParameters()) {
+ builder.append(';').append(parameter);
+ }
+ return builder.toString();
+ }
}
public static final String NAME = Constants.REQUIRE_CAPABILITY;
Added: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemImportServiceHeader.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemImportServiceHeader.java?rev=1294252&view=auto
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemImportServiceHeader.java (added)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemImportServiceHeader.java Mon Feb 27 18:05:35 2012
@@ -0,0 +1,162 @@
+package org.apache.aries.subsystem.core.archive;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.osgi.framework.Constants;
+import org.osgi.service.subsystem.SubsystemConstants;
+
+public class SubsystemImportServiceHeader implements Header<SubsystemImportServiceHeader.Clause> {
+ public static class Clause implements org.apache.aries.subsystem.core.archive.Clause {
+ public static final String DIRECTIVE_EFFECTIVE = Constants.EFFECTIVE_DIRECTIVE;
+ public static final String DIRECTIVE_FILTER = Constants.FILTER_DIRECTIVE;
+ public static final String DIRECTIVE_RESOLUTION = Constants.RESOLUTION_DIRECTIVE;
+
+ private static final Pattern PATTERN_NAMESPACE = Pattern.compile('(' + Grammar.NAMESPACE + ")(?=;|\\z)");
+ private static final Pattern PATTERN_PARAMETER = Pattern.compile('(' + Grammar.PARAMETER + ")(?=;|\\z)");
+
+ private static void fillInDefaults(Map<String, Parameter> parameters) {
+ Parameter parameter = parameters.get(DIRECTIVE_EFFECTIVE);
+ if (parameter == null)
+ parameters.put(DIRECTIVE_EFFECTIVE, EffectiveDirective.ACTIVE);
+ parameter = parameters.get(DIRECTIVE_RESOLUTION);
+ if (parameter == null)
+ parameters.put(DIRECTIVE_RESOLUTION, ResolutionDirective.MANDATORY);
+ }
+
+ private final String path;
+ private final Map<String, Parameter> parameters = new HashMap<String, Parameter>();
+
+ public Clause(String clause) {
+ Matcher matcher = PATTERN_NAMESPACE.matcher(clause);
+ if (!matcher.find())
+ throw new IllegalArgumentException("Missing namespace path: " + clause);
+ path = matcher.group();
+ matcher.usePattern(PATTERN_PARAMETER);
+ while (matcher.find()) {
+ Parameter parameter = ParameterFactory.create(matcher.group());
+ parameters.put(parameter.getName(), parameter);
+ }
+ fillInDefaults(parameters);
+ }
+
+ @Override
+ public Attribute getAttribute(String name) {
+ Parameter result = parameters.get(name);
+ if (result instanceof Attribute) {
+ return (Attribute)result;
+ }
+ return null;
+ }
+
+ @Override
+ public Collection<Attribute> getAttributes() {
+ ArrayList<Attribute> attributes = new ArrayList<Attribute>(parameters.size());
+ for (Parameter parameter : parameters.values()) {
+ if (parameter instanceof Attribute) {
+ attributes.add((Attribute)parameter);
+ }
+ }
+ attributes.trimToSize();
+ return attributes;
+ }
+
+ @Override
+ public Directive getDirective(String name) {
+ Parameter result = parameters.get(name);
+ if (result instanceof Directive) {
+ return (Directive)result;
+ }
+ return null;
+ }
+
+ @Override
+ public Collection<Directive> getDirectives() {
+ ArrayList<Directive> directives = new ArrayList<Directive>(parameters.size());
+ for (Parameter parameter : parameters.values()) {
+ if (parameter instanceof Directive) {
+ directives.add((Directive)parameter);
+ }
+ }
+ directives.trimToSize();
+ return directives;
+ }
+
+ @Override
+ public Parameter getParameter(String name) {
+ return parameters.get(name);
+ }
+
+ @Override
+ public Collection<Parameter> getParameters() {
+ return Collections.unmodifiableCollection(parameters.values());
+ }
+
+ @Override
+ public String getPath() {
+ return path;
+ }
+
+ public String getServiceName() {
+ return path;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder()
+ .append(getPath());
+ for (Parameter parameter : getParameters()) {
+ builder.append(';').append(parameter);
+ }
+ return builder.toString();
+ }
+ }
+
+ public static final String NAME = SubsystemConstants.SUBSYSTEM_IMPORTSERVICE;
+
+ // TODO Subsystem-ImportService currently does not have its own grammar, but it's similar to Require-Capability.
+ private static final Pattern PATTERN = Pattern.compile('(' + Grammar.REQUIREMENT + ")(?=,|\\z)");
+
+ private final Set<Clause> clauses = new HashSet<Clause>();
+
+ public SubsystemImportServiceHeader(String value) {
+ Matcher matcher = PATTERN.matcher(value);
+ while (matcher.find())
+ clauses.add(new Clause(matcher.group()));
+ if (clauses.isEmpty())
+ throw new IllegalArgumentException("A " + NAME + " header must have at least one clause");
+ }
+
+ @Override
+ public Collection<SubsystemImportServiceHeader.Clause> getClauses() {
+ return Collections.unmodifiableSet(clauses);
+ }
+
+ @Override
+ public String getName() {
+ return NAME;
+ }
+
+ @Override
+ public String getValue() {
+ return toString();
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ for (Clause clause : getClauses()) {
+ builder.append(clause).append(',');
+ }
+ // Remove the trailing comma. Note at least one clause is guaranteed to exist.
+ builder.deleteCharAt(builder.length() - 1);
+ return builder.toString();
+ }
+}
Added: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemImportServiceRequirement.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemImportServiceRequirement.java?rev=1294252&view=auto
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemImportServiceRequirement.java (added)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemImportServiceRequirement.java Mon Feb 27 18:05:35 2012
@@ -0,0 +1,56 @@
+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.resource.AbstractRequirement;
+import org.osgi.framework.Constants;
+import org.osgi.resource.Namespace;
+import org.osgi.resource.Resource;
+
+public class SubsystemImportServiceRequirement extends AbstractRequirement {
+ public static final String DIRECTIVE_FILTER = Namespace.REQUIREMENT_FILTER_DIRECTIVE;
+ // TODO Replace value with ServiceNamspace.SERVICE_NAMESPACE constant when available.
+ public static final String NAMESPACE = "osgi.service";
+
+ private final Map<String, String> directives = new HashMap<String, String>(1);
+ private final Resource resource;
+
+ public SubsystemImportServiceRequirement(SubsystemImportServiceHeader.Clause clause) {
+ this(clause, null);
+ }
+
+ public SubsystemImportServiceRequirement(
+ SubsystemImportServiceHeader.Clause clause, Resource resource) {
+ StringBuilder builder = new StringBuilder("(&(")
+ .append(Constants.OBJECTCLASS).append('=')
+ .append(clause.getServiceName()).append(')');
+ Directive filter = clause
+ .getDirective(SubsystemImportServiceHeader.Clause.DIRECTIVE_FILTER);
+ if (filter != null)
+ builder.append(filter.getValue());
+ 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/SubsystemManifest.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemManifest.java?rev=1294252&r1=1294251&r2=1294252&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemManifest.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemManifest.java Mon Feb 27 18:05:35 2012
@@ -122,6 +122,10 @@ public class SubsystemManifest {
return (SubsystemContentHeader)getHeaders().get(SUBSYSTEM_CONTENT);
}
+ public SubsystemImportServiceHeader getSubsystemImportServiceHeader() {
+ return (SubsystemImportServiceHeader)getHeaders().get(SUBSYSTEM_IMPORTSERVICE);
+ }
+
public SubsystemSymbolicNameHeader getSubsystemSymbolicNameHeader() {
return (SubsystemSymbolicNameHeader)getHeaders().get(SUBSYSTEM_SYMBOLICNAME);
}
Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/AriesSubsystem.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/AriesSubsystem.java?rev=1294252&r1=1294251&r2=1294252&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/AriesSubsystem.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/AriesSubsystem.java Mon Feb 27 18:05:35 2012
@@ -54,6 +54,8 @@ import org.apache.aries.subsystem.core.a
import org.apache.aries.subsystem.core.archive.RequireCapabilityHeader;
import org.apache.aries.subsystem.core.archive.RequireCapabilityRequirement;
import org.apache.aries.subsystem.core.archive.SubsystemArchive;
+import org.apache.aries.subsystem.core.archive.SubsystemImportServiceHeader;
+import org.apache.aries.subsystem.core.archive.SubsystemImportServiceRequirement;
import org.apache.aries.subsystem.core.archive.SubsystemManifest;
import org.apache.aries.subsystem.core.obr.SubsystemEnvironment;
import org.apache.aries.subsystem.core.resource.SubsystemDirectoryResource;
@@ -1057,6 +1059,10 @@ public class AriesSubsystem implements S
// In the case of applications, the header is generated.
header = getDeploymentManifest().getRequireCapabilityHeader();
setImportIsolationPolicy(builder, (RequireCapabilityHeader)header);
+ // Both applications and composites have Subsystem-ImportService headers that require processing.
+ // In the case of applications, the header is generated.
+ header = getDeploymentManifest().getSubsystemImportServiceHeader();
+ setImportIsolationPolicy(builder, (SubsystemImportServiceHeader)header);
RegionFilter regionFilter = builder.build();
if (LOGGER.isDebugEnabled())
LOGGER.debug("Establishing region connection: from=" + from
@@ -1098,6 +1104,19 @@ public class AriesSubsystem implements S
builder.allow(policy, filter);
}
}
+
+ private static void setImportIsolationPolicy(RegionFilterBuilder builder, SubsystemImportServiceHeader header) throws InvalidSyntaxException {
+ if (header == null)
+ return;
+ for (SubsystemImportServiceHeader.Clause clause : header.getClauses()) {
+ SubsystemImportServiceRequirement requirement = new SubsystemImportServiceRequirement(clause);
+ String policy = RegionFilter.VISIBLE_SERVICE_NAMESPACE;
+ String filter = requirement.getDirectives().get(RequireCapabilityRequirement.DIRECTIVE_FILTER);
+ if (LOGGER.isDebugEnabled())
+ LOGGER.debug("Allowing " + policy + " of " + filter);
+ builder.allow(policy, filter);
+ }
+ }
private void startBundleResource(Resource resource, Coordination coordination) throws BundleException {
final Bundle bundle = ((BundleRevision)resource).getBundle();