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 2015/10/27 17:06:43 UTC

svn commit: r1710841 - in /aries/trunk/subsystem/subsystem-core/src: main/java/org/apache/aries/subsystem/core/internal/ResolveContext.java test/java/org/apache/aries/subsystem/core/internal/ResolveContextTest.java

Author: davidb
Date: Tue Oct 27 16:06:42 2015
New Revision: 1710841

URL: http://svn.apache.org/viewvc?rev=1710841&view=rev
Log:
ARIES--1439 Aries ResolveContext.insertHostedCapability() calls unsupported add() method on capabilies

Also added unit test.

Added:
    aries/trunk/subsystem/subsystem-core/src/test/java/org/apache/aries/subsystem/core/internal/ResolveContextTest.java
Modified:
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ResolveContext.java

Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ResolveContext.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ResolveContext.java?rev=1710841&r1=1710840&r2=1710841&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ResolveContext.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ResolveContext.java Tue Oct 27 16:06:42 2015
@@ -48,7 +48,7 @@ public class ResolveContext extends org.
 	private final SubsystemResource resource;
 	private final Repository systemRepository;
 	private final Map<Resource, Wiring> wirings = computeWirings();
-	
+
 	public ResolveContext(SubsystemResource resource) {
 		this.resource = resource;
 		contentRepository = new ContentRepository(resource.getInstallableContent(), resource.getSharedContent());
@@ -57,13 +57,13 @@ public class ResolveContext extends org.
 		repositoryServiceRepository = new RepositoryServiceRepository();
 		systemRepository = Activator.getInstance().getSystemRepository();
 	}
-	
+
 	@Override
 	public List<Capability> findProviders(Requirement requirement) {
 		ArrayList<Capability> result = new ArrayList<Capability>();
 		try {
 			// Only check the system repository for osgi.ee and osgi.native
-			if (ExecutionEnvironmentNamespace.EXECUTION_ENVIRONMENT_NAMESPACE.equals(requirement.getNamespace()) 
+			if (ExecutionEnvironmentNamespace.EXECUTION_ENVIRONMENT_NAMESPACE.equals(requirement.getNamespace())
 					|| NativeNamespace.NATIVE_NAMESPACE.equals(requirement.getNamespace())) {
 				addDependenciesFromSystemRepository(requirement, result);
 			} else {
@@ -98,21 +98,27 @@ public class ResolveContext extends org.
 
 	@Override
 	public int insertHostedCapability(List<Capability> capabilities, HostedCapability hostedCapability) {
-		capabilities.add(hostedCapability);
-		return capabilities.size() - 1;
+	    // Must specify the location where the capability is to be added. From the ResoveContext javadoc:
+	    // "This method must insert the specified HostedCapability in a place that makes the list maintain
+	    // the preference order."
+	    // The Felix implementation provides a list that requires the index to be specified in the add() call,
+	    // otherwise it will throw an exception.
+        int sz = capabilities.size();
+		capabilities.add(sz, hostedCapability);
+        return sz;
 	}
 
 	@Override
 	public boolean isEffective(Requirement requirement) {
 		return true;
 	}
-	
+
 	@Override
 	public Collection<Resource> getMandatoryResources() {
 		return resource.getMandatoryResources();
 	}
-	
-	@Override 
+
+	@Override
 	public Collection<Resource> getOptionalResources() {
 		return resource.getOptionalResources();
 	}
@@ -121,7 +127,7 @@ public class ResolveContext extends org.
 	public Map<Resource, Wiring> getWirings() {
 		return wirings;
 	}
-	
+
 	private boolean addDependencies(Repository repository, Requirement requirement, List<Capability> capabilities, boolean validate) throws BundleException, IOException, InvalidSyntaxException, URISyntaxException {
 		if (repository == null)
 			return false;
@@ -172,7 +178,7 @@ public class ResolveContext extends org.
 			wirings.put(br, br.getWiring());
 		}
 	}
-	
+
 	private Map<Resource, Wiring> computeWirings() {
 		Map<Resource, Wiring> wirings = new HashMap<Resource, Wiring>();
 		for (BasicSubsystem subsystem : Activator.getInstance().getSubsystems().getSubsystems()) { // NEED
@@ -198,7 +204,7 @@ public class ResolveContext extends org.
 				}
 				// For applications and features, we must ensure capabilities
 				// are visible to their scoped parent. Features import
-				// everything. Applications have their sharing policies 
+				// everything. Applications have their sharing policies
 				// computed, so if capabilities are visible to the parent, we
 				// know we can make them visible to the application.
 				return this.resource.getParents().iterator().next().getRegion();

Added: aries/trunk/subsystem/subsystem-core/src/test/java/org/apache/aries/subsystem/core/internal/ResolveContextTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/test/java/org/apache/aries/subsystem/core/internal/ResolveContextTest.java?rev=1710841&view=auto
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/test/java/org/apache/aries/subsystem/core/internal/ResolveContextTest.java (added)
+++ aries/trunk/subsystem/subsystem-core/src/test/java/org/apache/aries/subsystem/core/internal/ResolveContextTest.java Tue Oct 27 16:06:42 2015
@@ -0,0 +1,99 @@
+/*
+ * 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.internal;
+
+import java.io.File;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.easymock.EasyMock;
+import org.junit.Test;
+import org.osgi.framework.BundleContext;
+import org.osgi.resource.Capability;
+import org.osgi.service.resolver.HostedCapability;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+
+public class ResolveContextTest {
+    @Test
+    public void testInsertHostedCapability() throws Exception {
+        Activator prev = getActivator();
+        try {
+            Activator activator = createActivator();
+            setActivator(activator);
+
+            SubsystemResource res = new SubsystemResource(new File("."));
+            ResolveContext rc = new ResolveContext(res);
+
+            HostedCapability hc = EasyMock.createNiceMock(HostedCapability.class);
+
+            List<Capability> caps = new ArrayList<Capability>() {
+                // Must use add(idx, obj), get the other add() overloads to complain
+
+                @Override
+                public boolean add(Capability e) {
+                    throw new UnsupportedOperationException();
+                }
+
+                @Override
+                public boolean addAll(Collection<? extends Capability> c) {
+                    throw new UnsupportedOperationException();
+                }
+
+                @Override
+                public boolean addAll(int index, Collection<? extends Capability> c) {
+                    throw new UnsupportedOperationException();
+                }
+            };
+            caps.add(0, EasyMock.createNiceMock(HostedCapability.class));
+
+            assertEquals(1, rc.insertHostedCapability(caps, hc));
+            assertSame(hc, caps.get(1));
+        } finally {
+            setActivator(prev);
+        }
+    }
+
+    private Activator createActivator() throws Exception {
+        BundleContext bc = EasyMock.createNiceMock(BundleContext.class);
+        EasyMock.replay(bc);
+
+        Activator a = new Activator();
+
+        Field f = Activator.class.getDeclaredField("subsystems");
+        f.setAccessible(true);
+        f.set(a, new Subsystems());
+
+        Field f2 = Activator.class.getDeclaredField("systemRepositoryManager");
+        f2.setAccessible(true);
+        f2.set(a, new SystemRepositoryManager(bc));
+
+        return a;
+    }
+
+    private Activator getActivator() throws Exception {
+        Field f = Activator.class.getDeclaredField("instance");
+        f.setAccessible(true);
+        return (Activator) f.get(null);
+    }
+
+    private void setActivator(Activator a) throws Exception {
+        Field f = Activator.class.getDeclaredField("instance");
+        f.setAccessible(true);
+        f.set(null, a);
+    }
+}