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 2015/09/17 16:12:24 UTC

svn commit: r1703631 [3/3] - in /aries/trunk/subsystem: subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/ subsystem-core/src/main/java/org/apache/aries/subsystem/core/capabilityset/ subsystem-core/src/main/java/org/apache/aries/subs...

Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/VersionRangeAttribute.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/VersionRangeAttribute.java?rev=1703631&r1=1703630&r2=1703631&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/VersionRangeAttribute.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/archive/VersionRangeAttribute.java Thu Sep 17 14:12:21 2015
@@ -18,9 +18,12 @@ import org.osgi.framework.Version;
 import org.osgi.framework.VersionRange;
 
 public class VersionRangeAttribute extends AbstractAttribute {
-	public static final String NAME = Constants.VERSION_ATTRIBUTE;
+	public static final String NAME_BUNDLEVERSION = Constants.BUNDLE_VERSION_ATTRIBUTE;
+	public static final String NAME_VERSION = Constants.VERSION_ATTRIBUTE;
 	
-	public static final VersionRangeAttribute DEFAULT = new VersionRangeAttribute();
+	public static final VersionRangeAttribute DEFAULT_BUNDLEVERSION = new VersionRangeAttribute(
+			NAME_BUNDLEVERSION, new VersionRange(Version.emptyVersion.toString()));
+	public static final VersionRangeAttribute DEFAULT_VERSION = new VersionRangeAttribute();
 	
 	private final VersionRange range;
 	
@@ -33,13 +36,17 @@ public class VersionRangeAttribute exten
 	}
 	
 	public VersionRangeAttribute(VersionRange range) {
-		super(Constants.VERSION_ATTRIBUTE, range.toString());
+		this(Constants.VERSION_ATTRIBUTE, range);
+	}
+	
+	public VersionRangeAttribute(String name, VersionRange range) {
+		super(name, range.toString());
 		this.range = range;
 	}
 	
 	@Override
 	public StringBuilder appendToFilter(StringBuilder builder) {
-		return builder.append(range.toFilterString(Constants.VERSION_ATTRIBUTE));
+		return builder.append(range.toFilterString(name));
 	}
 	
 	@Override

Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/capabilityset/SimpleFilter.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/capabilityset/SimpleFilter.java?rev=1703631&r1=1703630&r2=1703631&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/capabilityset/SimpleFilter.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/capabilityset/SimpleFilter.java Thu Sep 17 14:12:21 2015
@@ -19,6 +19,9 @@
 package org.apache.aries.subsystem.core.capabilityset;
 
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -648,4 +651,86 @@ loop:   for (int i = 0; i < len; i++)
 
         return sf;
     }
+    
+    @Override
+    public int hashCode() {
+        int result = 17;
+        result = 31 * result + (m_name == null ? 0 : m_name.hashCode());
+        result = 31 * result + m_op;
+        if (m_value == null) {
+        	result = 31 * result + 0;
+        }
+        else if (m_name == null && m_value instanceof Collection) {
+        	Iterator iterator = ((Collection)m_value).iterator();
+        	int sum = 0;
+        	while (iterator.hasNext()) {
+        		sum += iterator.next().hashCode();
+        	}
+        	result = 31 * result + sum;
+        }
+        else {
+        	result = 31 * result + m_value.hashCode();
+        }
+        return result;
+    }
+    
+    @Override
+    public boolean equals(Object o) {
+    	if (o == this) {
+    		return true;
+    	}
+    	if (!(o instanceof SimpleFilter)) {
+    		return false;
+    	}
+    	SimpleFilter that = (SimpleFilter)o;
+    	if (!(that.m_name == null ? this.m_name == null : that.m_name.equals(this.m_name))) {
+    		return false;
+    	}
+    	if (that.m_op != this.m_op) {
+    		return false;
+    	}
+    	if (that.m_value == null) {
+    		return this.m_value == null;
+    	}
+    	if (this.m_value == null) {
+    		return false;
+    	}
+    	if (that.m_name == null && that.m_value instanceof Collection) {
+    		if (!(this.m_name == null && this.m_value instanceof Collection)) {
+    			return false;
+    		}
+    		return ((Collection)that.m_value).containsAll((Collection)this.m_value);
+    	}
+    	return that.m_value.equals(this.m_value);
+    }
+    
+    /**
+     * Extracts attributes from the provided filter. If an attribute appears 
+     * more than once, the last value seen will be the value in the map. The 
+     * returned map is the property of the caller.
+     * 
+     * @param filter The filter containing attributes to extract.
+     * @return The map of extracted attributes. The key is the attribute name, 
+     *         and the value is the attribute value.
+     * @throws NullPointerException If the filter is <code>null</code>.
+     * @throws IllegalArgumentException If the filter contains invalid syntax.
+     */
+    public static Map<String, Object> attributes(String filter) {
+    	Map<String, Object> attributes = new HashMap<String, Object>();
+    	attributes(parse(filter), attributes);
+    	return attributes;
+    }
+    
+    private static void attributes(SimpleFilter filter, Map<String, Object> attributes) {
+    	Object value = filter.m_value;
+    	if (value instanceof Collection) {
+    		Collection<SimpleFilter> filters = (Collection<SimpleFilter>)value;
+    		for (SimpleFilter f : filters) {
+        		attributes(f, attributes);
+        	}
+    	}
+    	else {
+    		attributes.put(filter.m_name, value);
+    	}
+    }
 }
\ No newline at end of file

Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/RawSubsystemResource.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/RawSubsystemResource.java?rev=1703631&r1=1703630&r2=1703631&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/RawSubsystemResource.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/RawSubsystemResource.java Thu Sep 17 14:12:21 2015
@@ -46,6 +46,7 @@ import org.apache.aries.subsystem.core.a
 import org.apache.aries.subsystem.core.archive.SubsystemSymbolicNameHeader;
 import org.apache.aries.subsystem.core.archive.SubsystemTypeHeader;
 import org.apache.aries.subsystem.core.archive.SubsystemVersionHeader;
+import org.apache.aries.subsystem.core.capabilityset.SimpleFilter;
 import org.apache.aries.util.filesystem.FileSystem;
 import org.apache.aries.util.filesystem.IDirectory;
 import org.apache.aries.util.filesystem.IFile;
@@ -198,7 +199,7 @@ public class RawSubsystemResource implem
 			capBuilder.namespace(ServiceNamespace.SERVICE_NAMESPACE);
 			capBuilder.attribute(ServiceNamespace.CAPABILITY_OBJECTCLASS_ATTRIBUTE, objectClasses);
 			if (filter != null)
-				capBuilder.attributes(new HashMap<String, Object>(ManifestHeaderProcessor.parseFilter(filter)));
+				capBuilder.attributes(new HashMap<String, Object>(SimpleFilter.attributes(filter)));
 			capBuilder.attribute("service.imported", "");
 			capBuilder.resource(fakeResource);
 			modifiableCaps.add(capBuilder.build());
@@ -328,7 +329,7 @@ public class RawSubsystemResource implem
 		for (Requirement requirement : requirements) {
 			if (!PackageNamespace.PACKAGE_NAMESPACE.equals(requirement.getNamespace()))
 				continue;
-			clauses.add(new ImportPackageHeader.Clause(requirement));
+			clauses.add(ImportPackageHeader.Clause.valueOf(requirement));
 		}
 		if (clauses.isEmpty())
 			return null;
@@ -352,7 +353,7 @@ public class RawSubsystemResource implem
 		for (Requirement requirement : requirements) {
 			if (!BundleNamespace.BUNDLE_NAMESPACE.equals(requirement.getNamespace()))
 				continue;
-			clauses.add(new RequireBundleHeader.Clause(requirement));
+			clauses.add(RequireBundleHeader.Clause.valueOf(requirement));
 		}
 		if (clauses.isEmpty())
 			return null;
@@ -370,7 +371,7 @@ public class RawSubsystemResource implem
 					// Don't filter out the osgi.ee namespace.
 					!namespace.equals(ExecutionEnvironmentNamespace.EXECUTION_ENVIRONMENT_NAMESPACE))
 				continue;
-			clauses.add(new RequireCapabilityHeader.Clause(requirement));
+			clauses.add(RequireCapabilityHeader.Clause.valueOf(requirement));
 		}
 		if (clauses.isEmpty())
 			return null;
@@ -495,7 +496,7 @@ public class RawSubsystemResource implem
 		for (Requirement requirement : requirements) {
 			if (!ServiceNamespace.SERVICE_NAMESPACE.equals(requirement.getNamespace()))
 				continue;
-			clauses.add(new SubsystemImportServiceHeader.Clause(requirement));
+			clauses.add(SubsystemImportServiceHeader.Clause.valueOf(requirement));
 		}
 		if (clauses.isEmpty())
 			return null;

Modified: aries/trunk/subsystem/subsystem-core/src/test/java/org/apache/aries/subsystem/core/archive/BundleRequiredExecutionEnvironmentHeaderTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/test/java/org/apache/aries/subsystem/core/archive/BundleRequiredExecutionEnvironmentHeaderTest.java?rev=1703631&r1=1703630&r2=1703631&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/test/java/org/apache/aries/subsystem/core/archive/BundleRequiredExecutionEnvironmentHeaderTest.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/test/java/org/apache/aries/subsystem/core/archive/BundleRequiredExecutionEnvironmentHeaderTest.java Thu Sep 17 14:12:21 2015
@@ -36,7 +36,7 @@ public class BundleRequiredExecutionEnvi
 	public void testClause() {
 		String clauseStr = "CDC-1.0/Foundation-1.0";
 		BundleRequiredExecutionEnvironmentHeader.Clause clause = new BundleRequiredExecutionEnvironmentHeader.Clause(clauseStr);
-		assertClause(clause, clauseStr, "CDC/Foundation", "1.0", "(|(&(osgi.ee=CDC/Foundation)(version=1.0.0)))");
+		assertClause(clause, clauseStr, "CDC/Foundation", "1.0", "(&(osgi.ee=CDC/Foundation)(version=1.0.0))");
 	}
 	
 	@Test
@@ -60,7 +60,7 @@ public class BundleRequiredExecutionEnvi
 	@Test
 	public void testHeaderWithOneClause() {
 		String value = "OSGi/Minimum-1.2";
-		String filter = "(|(&(osgi.ee=OSGi/Minimum)(version=1.2.0)))";
+		String filter = "(&(osgi.ee=OSGi/Minimum)(version=1.2.0))";
 		BundleRequiredExecutionEnvironmentHeader header = new BundleRequiredExecutionEnvironmentHeader(value);
 		assertEquals("Wrong number of clauses", 1, header.getClauses().size());
 		assertClause(header.getClauses().iterator().next(), value, "OSGi/Minimum", "1.2", filter);
@@ -82,11 +82,11 @@ public class BundleRequiredExecutionEnvi
 				"(&(osgi.ee=JavaSE)(version=1.4.0))" +
 				"(&(osgi.ee=JavaSE)(version=1.6.0))" +
 				"(&(osgi.ee=AA/BB)(version=1.7.0))" +
-				"(&(osgi.ee=V1-1.5/V2-1.6))" +
-				"(&(osgi.ee=MyEE-badVersion)))";
+				"(osgi.ee=V1-1.5/V2-1.6)" +
+				"(osgi.ee=MyEE-badVersion))";
 		BundleRequiredExecutionEnvironmentHeader header = new BundleRequiredExecutionEnvironmentHeader(value);
 		assertEquals("Wrong number of clauses", 7, header.getClauses().size());
-		assertClause(header.getClauses().iterator().next(), "CDC-1.0/Foundation-1.0", "CDC/Foundation", "1.0", "(|(&(osgi.ee=CDC/Foundation)(version=1.0.0)))");
+		assertClause(header.getClauses().iterator().next(), "CDC-1.0/Foundation-1.0", "CDC/Foundation", "1.0", "(&(osgi.ee=CDC/Foundation)(version=1.0.0))");
 		assertEquals("Wrong name", Constants.BUNDLE_REQUIREDEXECUTIONENVIRONMENT, header.getName());
 		assertEquals("Wrong value", value, header.getValue());
 		Resource resource = EasyMock.createNiceMock(Resource.class);

Modified: aries/trunk/subsystem/subsystem-core/src/test/java/org/apache/aries/subsystem/core/archive/ImportPackageHeaderTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/test/java/org/apache/aries/subsystem/core/archive/ImportPackageHeaderTest.java?rev=1703631&r1=1703630&r2=1703631&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/test/java/org/apache/aries/subsystem/core/archive/ImportPackageHeaderTest.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/test/java/org/apache/aries/subsystem/core/archive/ImportPackageHeaderTest.java Thu Sep 17 14:12:21 2015
@@ -24,8 +24,10 @@ public class ImportPackageHeaderTest {
 	public void testVersionAttributeWithMultiplePackages() {
 		String headerStr = "org.foo;org.bar;org.foo.bar;version=1.3";
 		ImportPackageHeader header = new ImportPackageHeader(headerStr);
+		ImportPackageHeader header2 = new ImportPackageHeader(headerStr);
 		assertClauses(header, 1);
 		assertVersionAttribute(header, "org.foo;org.bar;org.foo.bar", "1.3");
+		assertEquals(header, header2);
 	}
 	
 	@Test

Added: aries/trunk/subsystem/subsystem-core/src/test/java/org/apache/aries/subsystem/core/archive/SubsystemManifestEqualityTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/test/java/org/apache/aries/subsystem/core/archive/SubsystemManifestEqualityTest.java?rev=1703631&view=auto
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/test/java/org/apache/aries/subsystem/core/archive/SubsystemManifestEqualityTest.java (added)
+++ aries/trunk/subsystem/subsystem-core/src/test/java/org/apache/aries/subsystem/core/archive/SubsystemManifestEqualityTest.java Thu Sep 17 14:12:21 2015
@@ -0,0 +1,217 @@
+/*
+ * 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.core.archive;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+
+import org.junit.Test;
+
+public class SubsystemManifestEqualityTest {
+
+    @Test
+    public void testSubsystemContentEquality() {
+        String headerStr = "org.aries.bundle;start-order:=0;type=osgi.bundle;version=\"1.8.4\";resolution:=mandatory";
+        SubsystemContentHeader header1 = new SubsystemContentHeader(headerStr);
+        SubsystemContentHeader header2 = new SubsystemContentHeader(headerStr);
+        assertEquals(header1, header2);
+
+        String headerStr1 = "org.aries.bundle;start-order:=0;type=osgi.bundle;version=\"1.8.4\";resolution:=mandatory";
+        String headerStr2 = "org.aries.bundle;type=osgi.bundle;resolution:=mandatory;version=\"1.8.4\";start-order:=0";
+        header1 = new SubsystemContentHeader(headerStr1);
+        header2 = new SubsystemContentHeader(headerStr2);
+        assertEquals(header1, header2);
+    }
+
+    @Test
+    public void testDynamicImportHeaderEquality() {
+        String headerStr1 = "org.eclipse.jetty.*;version=\"[9.0,10.0)\",*;JavaServlet=contract";
+        String headerStr2 = "*;JavaServlet=contract,org.eclipse.jetty.*;version=\"[9.0,10.0)\"";
+        DynamicImportPackageHeader header1 = new DynamicImportPackageHeader(
+                headerStr1);
+        DynamicImportPackageHeader header2 = new DynamicImportPackageHeader(
+                headerStr2);
+        assertEquals(header1, header2);
+    }
+
+    @Test
+    public void testExportPackageHeaderEquality() {
+        String headerStr1 = "javax.servlet;version=\"2.5\",javax.servlet.http; version=\"2.5\"";
+        String headerStr2 = "javax.servlet.http; version=\"2.5\",javax.servlet;version=\"2.5\"";
+        ExportPackageHeader header1 = new ExportPackageHeader(headerStr1);
+        ExportPackageHeader header2 = new ExportPackageHeader(headerStr2);
+        assertEquals(header1, header2);
+    }
+
+    @Test
+    public void testFragmentHostHeaderEquality() {
+        String headerStr1 = "the.parent.bundle;bundle-version=1.2.3";
+        String headerStr2 = "the.parent.bundle;bundle-version=1.2.3";
+        FragmentHostHeader header1 = new FragmentHostHeader(headerStr1);
+        FragmentHostHeader header2 = new FragmentHostHeader(headerStr2);
+        assertEquals(header1, header2);
+    }
+
+    @Test
+    public void testImportPackageHeaderEquality() {
+        String headerStr1 = "javax.servlet;version=\"2.6.0\", javax.servlet.resources;version=\"2.6.0\"";
+        String headerStr2 = "javax.servlet.resources;version=\"2.6.0\",javax.servlet;version=\"2.6.0\"";
+        ImportPackageHeader header1 = new ImportPackageHeader(headerStr1);
+        ImportPackageHeader header2 = new ImportPackageHeader(headerStr2);
+        assertEquals(header1, header2);
+    }
+
+    @Test
+    public void testPreferredProviderHeaderEquality() {
+        String headerStr1 = "org.aries.kernel;version=\"1.0.4\";type=osgi.subsystem.composite";
+        String headerStr2 = "org.aries.kernel;type=osgi.subsystem.composite;version=\"1.0.4\"";
+        PreferredProviderHeader header1 = new PreferredProviderHeader(
+                headerStr1);
+        PreferredProviderHeader header2 = new PreferredProviderHeader(
+                headerStr2);
+        assertEquals(header1, header2);
+    }
+
+    @Test
+    public void testProvideCapabilityHeaderEquality() {
+        String headerStr1 = "osgi.contract;osgi.contract=JavaServlet;version:Version=2.5;uses:=\"javax.servlet,javax.servlet.http\"";
+        String headerStr2 = "osgi.contract;uses:=\"javax.servlet,javax.servlet.http\";osgi.contract=JavaServlet;version:Version=2.5";
+        ProvideCapabilityHeader header1 = new ProvideCapabilityHeader(
+                headerStr1);
+        ProvideCapabilityHeader header2 = new ProvideCapabilityHeader(
+                headerStr2);
+        assertEquals(header1, header2);
+    }
+
+    @Test
+    public void testProvisionResourceHeaderEquality() {
+        String headerStr1 = "com.acme.logging;type=osgi.bundle;deployed-version=1.0.0";
+        String headerStr2 = "com.acme.logging;deployed-version=1.0.0;type=osgi.bundle";
+        ProvisionResourceHeader header1 = new ProvisionResourceHeader(
+                headerStr1);
+        ProvisionResourceHeader header2 = new ProvisionResourceHeader(
+                headerStr2);
+        assertEquals(header1, header2);
+    }
+
+    @Test
+    public void testRequireBundleHeaderEquality() {
+        String headerStr1 = "com.example.acme,com.acme.logging;bundle-version=\"[1.0, 1.1)\"";
+        String headerStr2 = "com.acme.logging;bundle-version=\"[1.0, 1.1)\",com.example.acme";
+        RequireBundleHeader header1 = new RequireBundleHeader(headerStr1);
+        RequireBundleHeader header2 = new RequireBundleHeader(headerStr2);
+        assertEquals(header1, header2);
+    }
+
+    @Test
+    public void testRequireCapabilityHeaderEquality() {
+        String headerStr1 = "osgi.ee; filter:=\"(osgi.ee=*)\",screen.size; filter:=\"(&(width>=800)(height>=600))\"";
+        String headerStr2 = "screen.size; filter:=\"(&(width>=800)(height>=600))\",osgi.ee; filter:=\"(osgi.ee=*)\"";
+        RequireCapabilityHeader header1 = new RequireCapabilityHeader(
+                headerStr1);
+        RequireCapabilityHeader header2 = new RequireCapabilityHeader(
+                headerStr2);
+        assertEquals(header1, header2);
+    }
+
+    @Test
+    public void testSubsystemExportServiceHeaderEquality() {
+        String headerStr1 = "com.acme.service.Logging";
+        String headerStr2 = "com.acme.service.Logging";
+        SubsystemExportServiceHeader header1 = new SubsystemExportServiceHeader(
+                headerStr1);
+        SubsystemExportServiceHeader header2 = new SubsystemExportServiceHeader(
+                headerStr2);
+        assertEquals(header1, header2);
+    }
+
+    @Test
+    public void testSubsystemImportServiceHeaderEquality() {
+        String headerStr1 = "com.acme.service.Logging";
+        String headerStr2 = "com.acme.service.Logging";
+        SubsystemImportServiceHeader header1 = new SubsystemImportServiceHeader(
+                headerStr1);
+        SubsystemImportServiceHeader header2 = new SubsystemImportServiceHeader(
+                headerStr2);
+        assertEquals(header1, header2);
+    }
+
+    @Test
+    public void testSubsystemManifestEquality() throws IOException {
+
+        SubsystemManifest subsystemManifest1 = new SubsystemManifest(getClass()
+                .getResourceAsStream("/files/SUBSYSTEM.MF.1"));
+        SubsystemManifest subsystemManifest2 = new SubsystemManifest(getClass()
+                .getResourceAsStream("/files/SUBSYSTEM.MF.2"));
+        assertEquals(subsystemManifest1, subsystemManifest2);
+    }
+
+    @Test
+    public void testSubsystemTypeHeaderEquality() {
+        String headerStr1 = "osgi.subsystem.composite";
+        String headerStr2 = "osgi.subsystem.composite";
+        SubsystemTypeHeader header1 = new SubsystemTypeHeader(headerStr1);
+        SubsystemTypeHeader header2 = new SubsystemTypeHeader(headerStr2);
+        assertEquals(header1, header2);
+    }
+
+    @Test
+    public void testSubsystemVersionHeaderEquality() {
+        String headerStr1 = "1.0.0";
+        String headerStr2 = "1.0.0";
+        SubsystemVersionHeader header1 = new SubsystemVersionHeader(headerStr1);
+        SubsystemVersionHeader header2 = new SubsystemVersionHeader(headerStr2);
+        assertEquals(header1, header2);
+        
+        headerStr2 = "1";
+        header2 = new SubsystemVersionHeader(headerStr2);
+        assertEquals("Equivalent versions should be equal", header1, header2);
+    }
+
+    @Test
+    public void testBundleSymbolicNameHeaderEquality() {
+        String headerStr1 = "com.example.acme;singleton:=true";
+        String headerStr2 = "com.example.acme;singleton:=true";
+        SymbolicNameHeader header1 = new BundleSymbolicNameHeader(headerStr1);
+        SymbolicNameHeader header2 = new BundleSymbolicNameHeader(headerStr2);
+        assertEquals(header1, header2);
+        
+        headerStr1 = "com.example.acme;fragment-attachment:=never;singleton:=true";
+        headerStr2 = "com.example.acme;singleton:=true;fragment-attachment:=never";
+        header1 = new BundleSymbolicNameHeader(headerStr1);
+        header2 = new BundleSymbolicNameHeader(headerStr2);
+        assertEquals("Equivalent clauses should be equal", header1, header2);
+    }
+
+    @Test
+    public void testSubsystemSymbolicNameHeaderEquality() {
+        String headerStr1 = "org.acme.billing;category=banking";
+        String headerStr2 = "org.acme.billing;category=banking";
+        SymbolicNameHeader header1 = new SubsystemSymbolicNameHeader(
+                headerStr1);
+        SymbolicNameHeader header2 = new SubsystemSymbolicNameHeader(
+                headerStr2);
+        assertEquals(header1, header2);
+    }
+
+    @Test
+    public void testDeployedContentHeaderEquality() {
+        String headerStr1 = "com.acme.logging;type=osgi.bundle;deployed-version=1.0.0";
+        String headerStr2 = "com.acme.logging;type=osgi.bundle;deployed-version=1.0.0";
+        DeployedContentHeader header1 = new DeployedContentHeader(headerStr1);
+        DeployedContentHeader header2 = new DeployedContentHeader(headerStr2);
+        assertEquals(header1, header2);
+    }
+}

Added: aries/trunk/subsystem/subsystem-core/src/test/resources/files/SUBSYSTEM.MF.1
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/test/resources/files/SUBSYSTEM.MF.1?rev=1703631&view=auto
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/test/resources/files/SUBSYSTEM.MF.1 (added)
+++ aries/trunk/subsystem/subsystem-core/src/test/resources/files/SUBSYSTEM.MF.1 Thu Sep 17 14:12:21 2015
@@ -0,0 +1,11 @@
+Export-Package: a.b.c;version="1.0",x.y.z;uses:="m.n"; version="1.1.1",		m.n;version="0"
+Subsystem-Type: osgi.subsystem.composite; provision-policy:=rejectDependencies
+Subsystem-SymbolicName: com.acme.rocket;a=b;apachearies-provision-dependencies:=start
+Import-Package: c.b.a, z.y.x;version=9;resolution:=optional,	n.m;version="[3.1,4.0)";resolution:=mandatory
+Preferred-Provider: foo, org.bar;version="[1,2)";type=osg.bundle
+Provide-Capability: x;a=b, osgi.service;objectClass=o.p.Quick;b=a;effective:=active
+Require-Bundle: com.example.acme,com.acme.logging;bundle-version="[1.0, 1.1)";resolution:=optional
+Require-Capability: osgi.ee; filter:="(osgi.ee=*)",	screen.size; filter:="(&(width>=800)(height>=600))"
+Subsystem-Content: bundle.a,feature.a;start-order:=2;type=osgi.subsystem.feature;version="[1.8,1.8.4)";resolution:=optional
+Subsystem-ExportService: service.a.b.c;filter:="(&(x=y)(y=z)(foo=bar))"
+Subsystem-ImportService: service.x.y.z;filter:="(|(&(a=b)(c=d)(foo=bar))(&(d=c)(bar=foo)(b=a)))"

Added: aries/trunk/subsystem/subsystem-core/src/test/resources/files/SUBSYSTEM.MF.2
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/test/resources/files/SUBSYSTEM.MF.2?rev=1703631&view=auto
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/test/resources/files/SUBSYSTEM.MF.2 (added)
+++ aries/trunk/subsystem/subsystem-core/src/test/resources/files/SUBSYSTEM.MF.2 Thu Sep 17 14:12:21 2015
@@ -0,0 +1,13 @@
+Export-Package: a.b.c;version="1.0",	x.y.z;version="1.1.1";uses:="m.n",m.n
+Subsystem-Type: osgi.subsystem.composite
+Subsystem-SymbolicName: com.acme.rocket; apachearies-provision-dependencies:=start;  a=b
+Import-Package: z.y.x;resolution:=optional;version="9",  n.m;version="[3.1.0, 4)";resolution:=mandatory,c.b.a;resolution:=mandatory;version="0.0"
+Preferred-Provider: org.bar;type=osg.bundle;version="[1,2)",foo;version=0;type=osgi.subsystem.composite
+Provide-Capability: x;  effective:=resolve;a=b, osgi.service;	effective:=active;b=a; objectClass=o.p.Quick
+Require-Bundle: com.example.acme;visibility:=private;bundle-version="0.0.0";resolution:=mandatory,com.acme.logging;resolution:=optional;bundle-version="[1,1.1.0)"
+Require-Capability: osgi.ee; filter:="(osgi.ee=*)";effective:=resolve,screen.size;resolution:=mandatory; filter:="(&(height>=600)(width>=800))"
+Subsystem-Content: bundle.a; resolution:=mandatory;  version="[0, 0.0]";type=osgi.bundle
+Subsystem-Content: bundle.a; resolution:=mandatory;  version="0.0";type=osgi.bundle, feature.a;	type=osgi.subsystem.feature;start-order:=2;resolution:=optional;version="[1.8.0,1.8.4)"
+Subsystem-ExportService: service.a.b.c;filter:="(&(foo=bar)(y=z)(x=y))"
+Subsystem-ImportService: service.x.y.z;filter:="(|(&(bar=foo)(d=c)(b=a))(&(a=b)(foo=bar)(c=d)))"
+Subsystem-Version: 0

Modified: aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/ResolutionTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/ResolutionTest.java?rev=1703631&r1=1703630&r2=1703631&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/ResolutionTest.java (original)
+++ aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/ResolutionTest.java Thu Sep 17 14:12:21 2015
@@ -290,6 +290,7 @@ public class ResolutionTest extends Subs
 			fail("Missing BREE should result in installation failure");
 		}
 		catch (Exception e) {
+			e.printStackTrace();
 			assertTrue("Installation failure should be due to resolution error", e.getCause() instanceof ResolutionException);
 		}
 		finally {

Modified: aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/ServiceDependencyTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/ServiceDependencyTest.java?rev=1703631&r1=1703630&r2=1703631&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/ServiceDependencyTest.java (original)
+++ aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/ServiceDependencyTest.java Thu Sep 17 14:12:21 2015
@@ -64,8 +64,7 @@ public class ServiceDependencyTest exten
 	 * Bundle-Blueprint: OSGI-INF/blueprint/*.xml
 	 * 
 	 * <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-	 * 		<reference interface="bundle.b"/>
-	 * 		<reference interface="bundle.b1" filter="(active=true)"/>
+	 * 		<reference interface="bundle.b" filter="(&(active=true)(mode=shared))"/>
 	 * 		<service interface="bundle.a" ref="bundle.a"/>
 	 * </blueprint>
 	 */
@@ -152,7 +151,8 @@ public class ServiceDependencyTest exten
 					.append("<blueprint ")
 					.append("xmlns=\"http://www.osgi.org/xmlns/blueprint/v1.0.0\">")
 					.append("<reference ")
-					.append("interface=\"bundle.b\"")
+					.append("interface=\"bundle.b\" ")
+					.append("filter=\"(active=true)(mode=shared)\"")
 					.append("/>")
 					.append("<service ")
 					.append("interface=\"bundle.a\" ")
@@ -263,7 +263,7 @@ public class ServiceDependencyTest exten
 			try {
 				Subsystem child = installSubsystemFromFile(parent, APPLICATION_A);
 				try {
-					assertSubsystemImportServiceHeader(child, "osgi.service;filter:=\"(objectClass=bundle.b)\";resolution:=mandatory;cardinality:=single");
+					assertSubsystemImportServiceHeader(child, "bundle.b;filter:=\"(&(active=true)(mode=shared))\";resolution:=mandatory;cardinality:=single;effective:=active");
 				}
 				finally {
 					uninstallSubsystemSilently(child);
@@ -300,7 +300,7 @@ public class ServiceDependencyTest exten
 		try {
 			Subsystem subsystem = installSubsystemFromFile(APPLICATION_B);
 			try {
-				assertSubsystemImportServiceHeader(subsystem, "osgi.service;filter:=\"(objectClass=bundle.a)\";resolution:=optional;cardinality:=single");
+				assertSubsystemImportServiceHeader(subsystem, "bundle.a;resolution:=optional;cardinality:=single;effective:=active");
 			}
 			finally {
 				uninstallSubsystemSilently(subsystem);