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();