You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by da...@apache.org on 2014/11/15 18:37:08 UTC

svn commit: r1639908 - in /aries/trunk/subsystem: subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/ subsystem-itests/ subsystem-itests/src/test/bundles/tb4/ subsystem-itests/src/test/bundles/tb4/META-INF/ subsystem-itests/src/test/b...

Author: davidb
Date: Sat Nov 15 17:37:07 2014
New Revision: 1639908

URL: http://svn.apache.org/r1639908
Log:
ARIES-1263 Allow '*' wildcard as classname in Subsystem-ImportService and Subsystem-ExportService

Integration test (CompositeServiceTest.java) added.

Added:
    aries/trunk/subsystem/subsystem-itests/src/test/bundles/tb4/
    aries/trunk/subsystem/subsystem-itests/src/test/bundles/tb4/META-INF/
    aries/trunk/subsystem/subsystem-itests/src/test/bundles/tb4/META-INF/MANIFEST.MF
    aries/trunk/subsystem/subsystem-itests/src/test/bundles/tb4/org/
    aries/trunk/subsystem/subsystem-itests/src/test/bundles/tb4/org/apache/
    aries/trunk/subsystem/subsystem-itests/src/test/bundles/tb4/org/apache/aries/
    aries/trunk/subsystem/subsystem-itests/src/test/bundles/tb4/org/apache/aries/subsystem/
    aries/trunk/subsystem/subsystem-itests/src/test/bundles/tb4/org/apache/aries/subsystem/itests/
    aries/trunk/subsystem/subsystem-itests/src/test/bundles/tb4/org/apache/aries/subsystem/itests/tb4/
    aries/trunk/subsystem/subsystem-itests/src/test/bundles/tb4/org/apache/aries/subsystem/itests/tb4/Activator.java
    aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/CompositeServiceTest.java
    aries/trunk/subsystem/subsystem-itests/src/test/resources/composite2/
    aries/trunk/subsystem/subsystem-itests/src/test/resources/composite2/OSGI-INF/
    aries/trunk/subsystem/subsystem-itests/src/test/resources/composite2/OSGI-INF/SUBSYSTEM.MF
Modified:
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/Grammar.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemExportServiceHeader.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemImportServiceHeader.java
    aries/trunk/subsystem/subsystem-itests/pom.xml

Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/Grammar.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/Grammar.java?rev=1639908&r1=1639907&r2=1639908&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/Grammar.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/Grammar.java Sat Nov 15 17:37:07 2014
@@ -15,17 +15,17 @@ package org.apache.aries.subsystem.core.
 
 
 public interface Grammar {
-//	  section:                       *header +newline 
-//	  nonempty-section:      +header +newline 
-//	  newline:                      CR LF | LF | CR (not followed by LF) 
-//	  header:                       name : value 
-//	  name:                         alphanum *headerchar 
-//	  value:                          SPACE *otherchar newline *continuation 
-//	  continuation:              SPACE *otherchar newline 
-//	  alphanum:                  {A-Z} | {a-z} | {0-9} 
-//	  headerchar:                alphanum | - | _ 
+//	  section:                       *header +newline
+//	  nonempty-section:      +header +newline
+//	  newline:                      CR LF | LF | CR (not followed by LF)
+//	  header:                       name : value
+//	  name:                         alphanum *headerchar
+//	  value:                          SPACE *otherchar newline *continuation
+//	  continuation:              SPACE *otherchar newline
+//	  alphanum:                  {A-Z} | {a-z} | {0-9}
+//	  headerchar:                alphanum | - | _
 //	  otherchar:                  any UTF-8 character except NUL, CR and LF
-	
+
 //	public static final String ALPHA = "[A-Za-z]";
 //	public static final String DIGIT = "[0-9]";
 //	public static final String ALPHANUM = ALPHA + '|' + DIGIT;
@@ -39,16 +39,16 @@ public interface Grammar {
 //	public static final String HEADER = NAME + ':' + VALUE;
 //	public static final String SECTION = "(?:" + HEADER + ")*(?:" + NEWLINE + ")+";
 //	public static final String NONEMPTY_SECTION = "(?:" + HEADER + ")+(?:" + NEWLINE + ")+";
-	
-//	  manifest-file:                    main-section newline *individual-section 
-//	  main-section:                    version-info newline *main-attribute 
-//	  version-info:                      Manifest-Version : version-number 
-//	  version-number :               digit+{.digit+}* 
-//	  main-attribute:                 (any legitimate main attribute) newline 
-//	  individual-section:             Name : value newline *perentry-attribute 
-//	  perentry-attribute:            (any legitimate perentry attribute) newline  
+
+//	  manifest-file:                    main-section newline *individual-section
+//	  main-section:                    version-info newline *main-attribute
+//	  version-info:                      Manifest-Version : version-number
+//	  version-number :               digit+{.digit+}*
+//	  main-attribute:                 (any legitimate main attribute) newline
+//	  individual-section:             Name : value newline *perentry-attribute
+//	  perentry-attribute:            (any legitimate perentry attribute) newline
 //	   digit:                                {0-9}
-	
+
 //	public static final String VERSION_NUMBER = DIGIT + "+(?:\\." + DIGIT + "+)*";
 //	public static final String VERSION_INFO = "Manifest-Version: " + VERSION_NUMBER;
 //	public static final String MAIN_ATTRIBUTE = HEADER + NEWLINE;
@@ -56,7 +56,7 @@ public interface Grammar {
 //	public static final String PERENTRY_ATTRIBUTE = HEADER + NEWLINE;
 //	public static final String INDIVIDUAL_SECTION = "Name: " + VALUE + NEWLINE + "(?:" + PERENTRY_ATTRIBUTE + ")*";
 //	public static final String MANIFEST_FILE = MAIN_SECTION + NEWLINE + "(?:" + INDIVIDUAL_SECTION + ")*";
-	
+
 //	digit ::= [0..9]
 //	alpha ::= [a..zA..Z]
 //	alphanum ::= alpha | digit
@@ -72,7 +72,7 @@ public interface Grammar {
 //	path-sep ::= /
 //	header ::= clause ( , clause ) *
 //	clause ::= path ( ; path ) * ( ; parameter ) *
-	
+
 	public static final String DIGIT = "[0-9]";
 	public static final String ALPHA = "[A-Za-z]";
 	public static final String ALPHANUM = DIGIT + '|' + ALPHA;
@@ -93,7 +93,7 @@ public interface Grammar {
 	public static final String HEADERCHAR = ALPHANUM + "|_|-";
 	public static final String NAME = ALPHANUM + "(?:" + HEADERCHAR + ")*";
 	public static final String HEADER = NAME + ": " + CLAUSE + "(?:," + CLAUSE + ")*";
-	
+
 	/*
 	 * jletter ::= a character for which the method Character.isJavaIdentifierStart(int) returns true
 	 * jletterordigit::= a character for which the method Character.isJavaIdentifierPart(int) returns true
@@ -104,7 +104,7 @@ public interface Grammar {
 	 * import ::= package-names ( ';' parameter )*
 	 * package-names ::= package-name ( ';' package-name )* // See 1.3.2
 	 */
-	
+
 	public static final String JLETTER = "\\p{javaJavaIdentifierStart}";
 	public static final String JLETTERORDIGIT = "\\p{javaJavaIdentifierPart}";
 	public static final String IDENTIFIER = JLETTER + "(?:" + JLETTERORDIGIT + ")*";
@@ -114,32 +114,33 @@ public interface Grammar {
 	public static final String PACKAGENAMES = PACKAGENAME + "\\s*(?:\\;\\s*" + PACKAGENAME + ")*";
 	public static final String IMPORT = PACKAGENAMES + "(?:;\\s*(?:" + PARAMETER + "))*";
 	public static final String IMPORTPACKAGE = IMPORT + "(?:\\,\\s*" + IMPORT + ")*";
-	
+
 	public static final String NAMESPACE = SYMBOLICNAME;
 	public static final String REQUIREMENT = NAMESPACE + "(?:;\\s*(?:" + PARAMETER + "))*";
 	public static final String REQUIRE_CAPABILITY = REQUIREMENT + "(?:,\\s*(?:" + REQUIREMENT + "))*";
-	
+
 	public static final String BUNDLE_DESCRIPTION = SYMBOLICNAME + "(?:;\\s*(?:" + PARAMETER + "))*";
 	public static final String REQUIRE_BUNDLE = BUNDLE_DESCRIPTION + "(?:,\\s*(?:" + BUNDLE_DESCRIPTION + "))*";
-	
+
 	public static final String EXPORT = PACKAGENAMES + "(?:;\\s*(?:" + PARAMETER + "))*";
 	public static final String EXPORT_PACKAGE = EXPORT + "(?:,\\s*(?:" + EXPORT + "))*";
-	
+
 	public static final String SCALAR = "String|Version|Long|Double";
 	public static final String LIST = "List<(?:" + SCALAR + ")>";
 	public static final String TYPE = "(?:" + SCALAR + ")|" + LIST;
 	public static final String TYPED_ATTR = EXTENDED + "(?:\\:" + TYPE + ")?=(?:" + ARGUMENT + ')';
 	public static final String CAPABILITY = NAMESPACE + "(?:;\\s*(?:(?:" + DIRECTIVE + ")|(?:" + TYPED_ATTR + ")))*";
 	public static final String PROVIDE_CAPABILITY = CAPABILITY + "(?:,\\s*(?:" + CAPABILITY + "))*";
-	
+
 	public static final String OBJECTCLASS = PACKAGENAME;
-	public static final String SERVICE = OBJECTCLASS + "(?:;\\s*(?:" + PARAMETER + "))*";
-	public static final String SUBSYSTEM_EXPORTSERVICE = SERVICE + "(?:,\\s*(?:" + SERVICE + "))*";
-	public static final String SUBSYSTEM_IMPORTSERVICE = SERVICE + "(?:,\\s*(?:" + SERVICE + "))*";
-	
+	public static final String SERVICE_OR_WILDCARD = "(" + OBJECTCLASS + "|[*])(?:;\\s*(?:" + PARAMETER + "))*";
+	public static final String SUBSYSTEM_IMPORTEXPORTSERVICE = SERVICE_OR_WILDCARD + "(?:,\\s*(?:" + SERVICE_OR_WILDCARD + "))*";
+    public static final String SUBSYSTEM_EXPORTSERVICE = SUBSYSTEM_IMPORTEXPORTSERVICE;
+	public static final String SUBSYSTEM_IMPORTSERVICE = SUBSYSTEM_IMPORTEXPORTSERVICE;
+
 	public static final String RESOURCE = SYMBOLICNAME + "(?:;\\s*(?:" + PARAMETER + "))*";
 	public static final String PREFERRED_PROVIDER = RESOURCE + "(?:,\\s*(?:" + RESOURCE + "))*";
-	
+
 	/*
 	 * number ::= digit+
 	 * version ::= major( '.' minor ( '.' micro ( '.' qualifier )? )? )?
@@ -153,7 +154,7 @@ public interface Grammar {
 	 * floor ::= version
 	 * ceiling ::= version
 	 */
-	
+
 	public static final String NUMBER = DIGIT + '+';
 	public static final String MAJOR = NUMBER;
 	public static final String MINOR = NUMBER;

Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemExportServiceHeader.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemExportServiceHeader.java?rev=1639908&r1=1639907&r2=1639908&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemExportServiceHeader.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemExportServiceHeader.java Sat Nov 15 17:37:07 2014
@@ -36,19 +36,19 @@ import org.osgi.service.subsystem.Subsys
 public class SubsystemExportServiceHeader implements Header<SubsystemExportServiceHeader.Clause> {
 	public static class Clause implements org.apache.aries.subsystem.core.archive.Clause {
 		public static final String DIRECTIVE_FILTER = Constants.FILTER_DIRECTIVE;
-		
-		private static final Pattern PATTERN_OBJECTCLASS = Pattern.compile('(' + Grammar.OBJECTCLASS + ")(?=;|\\z)");
+
+		private static final Pattern PATTERN_OBJECTCLASS_OR_STAR = Pattern.compile("((" + Grammar.OBJECTCLASS + ")|[*])(?=;|\\z)");
 		private static final Pattern PATTERN_PARAMETER = Pattern.compile('(' + Grammar.PARAMETER + ")(?=;|\\z)");
-		
+
 		private static void fillInDefaults(Map<String, Parameter> parameters) {
 			// No defaults.
 		}
-		
+
 		private final String path;
 		private final Map<String, Parameter> parameters = new HashMap<String, Parameter>();
-		
+
 		public Clause(String clause) {
-			Matcher main = PATTERN_OBJECTCLASS.matcher(clause);
+			Matcher main = PATTERN_OBJECTCLASS_OR_STAR.matcher(clause);
 			if (!main.find())
 				throw new IllegalArgumentException("Missing objectClass path: " + clause);
 			path = main.group();
@@ -59,7 +59,7 @@ public class SubsystemExportServiceHeade
 			}
 			fillInDefaults(parameters);
 		}
-		
+
 		@Override
 		public Attribute getAttribute(String name) {
 			Parameter result = parameters.get(name);
@@ -101,7 +101,7 @@ public class SubsystemExportServiceHeade
 			directives.trimToSize();
 			return directives;
 		}
-		
+
 		public String getObjectClass() {
 			return path;
 		}
@@ -115,12 +115,12 @@ public class SubsystemExportServiceHeade
 		public Collection<Parameter> getParameters() {
 			return Collections.unmodifiableCollection(parameters.values());
 		}
-		
+
 		@Override
 		public String getPath() {
 			return path;
 		}
-		
+
 		public List<Capability> toCapabilities(Resource resource) throws InvalidSyntaxException {
 			List<Capability> capabilities = resource.getCapabilities(ServiceNamespace.SERVICE_NAMESPACE);
 			if (capabilities.isEmpty())
@@ -133,7 +133,7 @@ public class SubsystemExportServiceHeade
 			result.trimToSize();
 			return result;
 		}
-		
+
 		@Override
 		public String toString() {
 			StringBuilder builder = new StringBuilder()
@@ -143,11 +143,11 @@ public class SubsystemExportServiceHeade
 			}
 			return builder.toString();
 		}
-		
+
 		private Filter computeFilter() throws InvalidSyntaxException {
 			return FrameworkUtil.createFilter(computeFilterString());
 		}
-		
+
 		private String computeFilterString() {
 			Directive directive = getDirective(DIRECTIVE_FILTER);
 			return new StringBuilder()
@@ -161,13 +161,13 @@ public class SubsystemExportServiceHeade
 					.toString();
 		}
 	}
-	
+
 	public static final String NAME = SubsystemConstants.SUBSYSTEM_EXPORTSERVICE;
-	
-	private static final Pattern PATTERN = Pattern.compile('(' + Grammar.SERVICE + ")(?=,|\\z)");
-	
+
+    private static final Pattern PATTERN = Pattern.compile("(" + Grammar.SUBSYSTEM_EXPORTSERVICE + ")(?=,|\\z)");
+
 	private final Set<Clause> clauses = new HashSet<Clause>();
-	
+
 	public SubsystemExportServiceHeader(String value) {
 		Matcher matcher = PATTERN.matcher(value);
 		while (matcher.find())
@@ -175,7 +175,7 @@ public class SubsystemExportServiceHeade
 		if (clauses.isEmpty())
 			throw new IllegalArgumentException("A " + NAME + " header must have at least one clause");
 	}
-	
+
 	@Override
 	public Collection<SubsystemExportServiceHeader.Clause> getClauses() {
 		return Collections.unmodifiableSet(clauses);
@@ -190,14 +190,14 @@ public class SubsystemExportServiceHeade
 	public String getValue() {
 		return toString();
 	}
-	
+
 	public List<Capability> toCapabilities(Resource resource) throws InvalidSyntaxException {
 		List<Capability> result = new ArrayList<Capability>();
 		for (Clause clause : clauses)
 			result.addAll(clause.toCapabilities(resource));
 		return result;
 	}
-	
+
 	@Override
 	public String toString() {
 		StringBuilder builder = new StringBuilder();

Modified: 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=1639908&r1=1639907&r2=1639908&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemImportServiceHeader.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/SubsystemImportServiceHeader.java Sat Nov 15 17:37:07 2014
@@ -35,10 +35,10 @@ public class SubsystemImportServiceHeade
 		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_OBJECTCLASS_OR_STAR = Pattern.compile("((" + Grammar.OBJECTCLASS + ")|[*])(?=;|\\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)
@@ -47,12 +47,12 @@ public class SubsystemImportServiceHeade
 			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);
+			Matcher matcher = PATTERN_OBJECTCLASS_OR_STAR.matcher(clause);
 			if (!matcher.find())
 				throw new IllegalArgumentException("Missing namespace path: " + clause);
 			path = matcher.group();
@@ -63,13 +63,13 @@ public class SubsystemImportServiceHeade
 			}
 			fillInDefaults(parameters);
 		}
-		
+
 		public Clause(Requirement requirement) {
 			path = requirement.getNamespace();
 			for (Entry<String, String> directive : requirement.getDirectives().entrySet())
 				parameters.put(directive.getKey(), DirectiveFactory.createDirective(directive.getKey(), directive.getValue()));
 		}
-		
+
 		@Override
 		public Attribute getAttribute(String name) {
 			Parameter result = parameters.get(name);
@@ -126,11 +126,11 @@ public class SubsystemImportServiceHeade
 		public String getPath() {
 			return path;
 		}
-		
+
 		public SubsystemImportServiceRequirement toRequirement(Resource resource) {
 			return new SubsystemImportServiceRequirement(this, resource);
 		}
-		
+
 		@Override
 		public String toString() {
 			StringBuilder builder = new StringBuilder()
@@ -141,12 +141,11 @@ public class SubsystemImportServiceHeade
 			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 static final Pattern PATTERN = Pattern.compile("(" + Grammar.SUBSYSTEM_IMPORTSERVICE + ")(?=,|\\z)");
+
 	private static Collection<Clause> processHeader(String header) {
 		Matcher matcher = PATTERN.matcher(header);
 		Set<Clause> clauses = new HashSet<Clause>();
@@ -154,19 +153,19 @@ public class SubsystemImportServiceHeade
 			clauses.add(new Clause(matcher.group()));
 		return clauses;
 	}
-	
+
 	private final Set<Clause> clauses;
-	
+
 	public SubsystemImportServiceHeader(String value) {
 		this(processHeader(value));
 	}
-	
+
 	public SubsystemImportServiceHeader(Collection<Clause> clauses) {
 		if (clauses.isEmpty())
 			throw new IllegalArgumentException("A " + NAME + " header must have at least one clause");
 		this.clauses = new HashSet<Clause>(clauses);
 	}
-	
+
 	@Override
 	public Collection<SubsystemImportServiceHeader.Clause> getClauses() {
 		return Collections.unmodifiableSet(clauses);
@@ -181,7 +180,7 @@ public class SubsystemImportServiceHeade
 	public String getValue() {
 		return toString();
 	}
-	
+
 	@Override
 	public List<SubsystemImportServiceRequirement> toRequirements(Resource resource) {
 		List<SubsystemImportServiceRequirement> requirements = new ArrayList<SubsystemImportServiceRequirement>(clauses.size());
@@ -189,7 +188,7 @@ public class SubsystemImportServiceHeade
 			requirements.add(clause.toRequirement(resource));
 		return requirements;
 	}
-	
+
 	@Override
 	public String toString() {
 		StringBuilder builder = new StringBuilder();

Modified: aries/trunk/subsystem/subsystem-itests/pom.xml
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-itests/pom.xml?rev=1639908&r1=1639907&r2=1639908&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-itests/pom.xml (original)
+++ aries/trunk/subsystem/subsystem-itests/pom.xml Sat Nov 15 17:37:07 2014
@@ -448,6 +448,24 @@
                         </configuration>
                         <phase>process-test-classes</phase>
                     </execution>
+                    <execution>
+                        <id>tb4-composite2</id>
+                        <goals>
+                            <goal>jar</goal>
+                        </goals>
+                        <configuration>
+                            <archive>
+                                <manifestFile>src/test/bundles/tb4/META-INF/MANIFEST.MF</manifestFile>
+                            </archive>
+                            <classesDirectory>${project.build.directory}/test-classes</classesDirectory>
+                            <includes>
+                                <include>org/apache/aries/subsystem/itests/tb4/**</include>
+                            </includes>
+                            <outputDirectory>${project.build.directory}/test-classes/composite2</outputDirectory>
+                            <finalName>tb4</finalName>
+                        </configuration>
+                        <phase>process-test-classes</phase>
+                    </execution>
 
                     <!-- New pom for hello + related tests, part 1 -->
 
@@ -534,6 +552,18 @@
                             </sources>
                         </configuration>
                     </execution>
+                    <execution>
+                        <id>add-source-tb4</id>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>add-test-source</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>src/test/bundles/tb4</source>
+                            </sources>
+                        </configuration>
+                    </execution>
 
                     <!-- New pom for hello tests, part 2 -->
 

Added: aries/trunk/subsystem/subsystem-itests/src/test/bundles/tb4/META-INF/MANIFEST.MF
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-itests/src/test/bundles/tb4/META-INF/MANIFEST.MF?rev=1639908&view=auto
==============================================================================
--- aries/trunk/subsystem/subsystem-itests/src/test/bundles/tb4/META-INF/MANIFEST.MF (added)
+++ aries/trunk/subsystem/subsystem-itests/src/test/bundles/tb4/META-INF/MANIFEST.MF Sat Nov 15 17:37:07 2014
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: TB4
+Bundle-SymbolicName: org.apache.aries.subsystem.itests.tb4
+Bundle-Version: 1.0.0
+Bundle-Activator: org.apache.aries.subsystem.itests.tb4.Activator
+Import-Package: org.osgi.framework,org.osgi.util.tracker

Added: aries/trunk/subsystem/subsystem-itests/src/test/bundles/tb4/org/apache/aries/subsystem/itests/tb4/Activator.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-itests/src/test/bundles/tb4/org/apache/aries/subsystem/itests/tb4/Activator.java?rev=1639908&view=auto
==============================================================================
--- aries/trunk/subsystem/subsystem-itests/src/test/bundles/tb4/org/apache/aries/subsystem/itests/tb4/Activator.java (added)
+++ aries/trunk/subsystem/subsystem-itests/src/test/bundles/tb4/org/apache/aries/subsystem/itests/tb4/Activator.java Sat Nov 15 17:37:07 2014
@@ -0,0 +1,46 @@
+/*
+ * Licensed 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.aries.subsystem.itests.tb4;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Filter;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class Activator implements BundleActivator {
+    private ServiceTracker<String, String> st;
+
+    @Override
+    public void start(BundleContext context) throws Exception {
+        Filter filter = context.createFilter(
+                "(&(objectClass=java.lang.String)(test=testCompositeServiceImports))");
+        st = new ServiceTracker<String, String>(context, filter, null);
+        st.open();
+
+        String svc = st.waitForService(5000);
+        if ("testCompositeServiceImports".equals(svc)) {
+            Dictionary<String, Object> props = new Hashtable<String, Object>();
+            props.put("test", "tb4");
+            context.registerService(String.class, "tb4", props);
+        }
+    }
+
+    @Override
+    public void stop(BundleContext context) throws Exception {
+        st.close();
+    }
+}

Added: aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/CompositeServiceTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/CompositeServiceTest.java?rev=1639908&view=auto
==============================================================================
--- aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/CompositeServiceTest.java (added)
+++ aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/CompositeServiceTest.java Sat Nov 15 17:37:07 2014
@@ -0,0 +1,61 @@
+/*
+ * Licensed 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.aries.subsystem.itests;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.junit.Test;
+import org.osgi.framework.Filter;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.subsystem.Subsystem;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class CompositeServiceTest extends SubsystemTest {
+
+    @Override
+    protected void createApplications() throws Exception {
+        createApplication("composite2", "tb4.jar");
+    }
+
+    @Test
+    public void testCompositeServiceImportExportWildcards() throws Exception {
+        Dictionary<String, Object> props = new Hashtable<String, Object>();
+        props.put("test", "testCompositeServiceImports");
+        ServiceRegistration<String> reg = bundleContext.registerService(String.class, "testCompositeServiceImports", props);
+
+        Filter filter = bundleContext.createFilter("(&(objectClass=java.lang.String)(test=tb4))");
+        ServiceTracker<String, String> st = new ServiceTracker<String, String>(bundleContext, filter, null);
+        st.open();
+
+        Subsystem subsystem = installSubsystemFromFile("composite2.esa");
+        try {
+            assertEquals(Subsystem.State.INSTALLED, subsystem.getState());
+            subsystem.start();
+
+            String svc = st.waitForService(5000);
+            assertNotNull("The service registered by the bundle inside the composite cannot be found", svc);
+
+            assertEquals(Subsystem.State.ACTIVE, subsystem.getState());
+        } finally {
+            subsystem.stop();
+            uninstallSubsystem(subsystem);
+            reg.unregister();
+            st.close();
+        }
+    }
+}

Added: aries/trunk/subsystem/subsystem-itests/src/test/resources/composite2/OSGI-INF/SUBSYSTEM.MF
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-itests/src/test/resources/composite2/OSGI-INF/SUBSYSTEM.MF?rev=1639908&view=auto
==============================================================================
--- aries/trunk/subsystem/subsystem-itests/src/test/resources/composite2/OSGI-INF/SUBSYSTEM.MF (added)
+++ aries/trunk/subsystem/subsystem-itests/src/test/resources/composite2/OSGI-INF/SUBSYSTEM.MF Sat Nov 15 17:37:07 2014
@@ -0,0 +1,6 @@
+Subsystem-SymbolicName: org.apache.aries.subsystem.itests.composite2
+Subsystem-Type: osgi.subsystem.composite
+Subsystem-Content: org.apache.aries.subsystem.itests.tb4;version="[1.0.0,1.0.0]"
+Import-Package: org.osgi.framework,org.osgi.util.tracker
+Subsystem-ExportService: *;filter:="(test=tb4)"
+Subsystem-ImportService: *;filter:="(test=testCompositeServiceImports)"
\ No newline at end of file