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 2010/12/21 22:03:01 UTC

svn commit: r1051651 - in /incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook: SpiFly/src/org/apache/aries/spifly/ SpiFlyTests/src/org/apache/aries/mytest/ SpiFlyTests/src/org/apache/aries/spifly/ SpiFlyTests/src/org/apache/aries/spifly/impl...

Author: davidb
Date: Tue Dec 21 21:03:00 2010
New Revision: 1051651

URL: http://svn.apache.org/viewvc?rev=1051651&view=rev
Log:
Most of the tests fail now - this is WIP

Added:
    incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/mytest/AltSPI.java
    incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/AltTestClient.java
    incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/impl2/AltSPIImpl1.java
    incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/impl2/META-INF/services/org.apache.aries.mytest.AltSPI
    incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/impl4/AltSPIImpl2.java
    incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/impl4/META-INF/services/org.apache.aries.mytest.AltSPI
Modified:
    incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/Activator.java
    incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/ClientWeavingHook.java
    incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/Util.java
    incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/WeavingData.java
    incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/ClientWeavingHookTest.java

Modified: incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/Activator.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/Activator.java?rev=1051651&r1=1051650&r2=1051651&view=diff
==============================================================================
--- incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/Activator.java (original)
+++ incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/Activator.java Tue Dec 21 21:03:00 2010
@@ -18,9 +18,12 @@
  */
 package org.apache.aries.spifly;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.SortedMap;
 import java.util.TreeMap;
 import java.util.concurrent.ConcurrentHashMap;
@@ -39,7 +42,8 @@ import org.osgi.util.tracker.ServiceTrac
 
 public class Activator implements BundleActivator {
     static Activator activator;
-    
+
+    private BundleContext bundleContext;
     private ServiceRegistration<WeavingHook> weavingHookService;
     private LogServiceTracker lst;
     private List<LogService> logServices = new CopyOnWriteArrayList<LogService>();
@@ -48,10 +52,15 @@ public class Activator implements Bundle
     private final ConcurrentMap<String, SortedMap<Long, Bundle>>registeredProviders = 
             new ConcurrentHashMap<String, SortedMap<Long, Bundle>>();
 
-    private final ConcurrentMap<Bundle, Collection<Bundle>> registeredConsumers = 
-            new ConcurrentHashMap<Bundle, Collection<Bundle>>();
+    private final ConcurrentMap<Bundle, Collection<String>> consumerProviders = 
+            new ConcurrentHashMap<Bundle, Collection<String>>();
+
+    private Map<Bundle, Map<Integer, String>> consumerArgRestrictions =
+            new ConcurrentHashMap<Bundle, Map<Integer,String>>();
 
     public synchronized void start(BundleContext context) throws Exception {
+        bundleContext = context;
+        
         lst = new LogServiceTracker(context);
         lst.open();
 
@@ -119,15 +128,53 @@ public class Activator implements Bundle
     }
     
     // TODO unRegisterProviderBundle();
-    public void registerConsumerBundle(Bundle consumer, Collection<Bundle> spiProviders) {
-        if (spiProviders == null)
-            return;
+    public void registerConsumerBundle(Bundle consumer, Collection<String> spiProviders, String className, String methodName, Map<Integer, String> argRestrictions) {
+        if (spiProviders != null)
+            consumerProviders.put(consumer, spiProviders);
         
-        registeredConsumers.put(consumer, spiProviders);
+        if (className != null) {            
+            Map<String, Map<String, Map<Integer, String>>> restrictions = new HashMap<String, Map<String, Map<Integer, String>>>();
+            Map<String, Map<Integer, String>> restriction = null;
+            if (methodName != null) {
+                restriction = new HashMap<String, Map<Integer,String>>();
+                restriction.put(methodName, argRestrictions);
+            }
+            restrictions.put(className, restriction);
+            // TODO consumerRestrictions.put(consumer, restrictions);
+        }
+        if (argRestrictions != null)
+            consumerArgRestrictions.put(consumer, argRestrictions);
     }
     
-    public Collection<Bundle> findConsumerRestrictions(Bundle consumer) {
-        return registeredConsumers.get(consumer);
+    public Collection<Bundle> findConsumerRestrictions(Bundle consumer, int argIdx, String argVal) {
+        List<Bundle> result = new ArrayList<Bundle>();
+        for (String allowedBundle : findComsumerRestrictions2(consumer, argIdx)) {
+            for (Bundle b : bundleContext.getBundles()) {
+                if (b.getSymbolicName().equals(allowedBundle)) {
+                    result.add(b);
+                }
+            }
+        }
+        return result;
+    }
+
+    private Collection<String> findComsumerRestrictions2(Bundle consumer, int argIdx) {
+        Collection<String> providers = consumerProviders.get(consumer);
+        Map<Integer, String> argRestrictions = consumerArgRestrictions.get(consumer);
+
+        if (providers != null) { 
+            if (argRestrictions != null) {
+                // Clone providers because we're going to modify it...
+                providers = new ArrayList<String>(providers);
+                providers.retainAll(Collections.singleton(argRestrictions.get(argIdx)));
+            }
+            return providers;
+        } else {
+            if (argRestrictions != null) {
+                return Collections.singleton(argRestrictions.get(argIdx));
+            }
+            return null;
+        }
     }
 
     // TODO unRegisterConsumerBundle();

Modified: incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/ClientWeavingHook.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/ClientWeavingHook.java?rev=1051651&r1=1051650&r2=1051651&view=diff
==============================================================================
--- incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/ClientWeavingHook.java (original)
+++ incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/ClientWeavingHook.java Tue Dec 21 21:03:00 2010
@@ -19,7 +19,9 @@
 package org.apache.aries.spifly;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.ServiceLoader;
 
 import org.apache.aries.spifly.HeaderParser.PathElement;
@@ -90,13 +92,15 @@ public class ClientWeavingHook implement
 	 * @return an instance of the {@link WeavingData} class.
 	 */
     private WeavingData parseHeader(Bundle consumerBundle, String consumerHeader) {
-        List<Bundle> selectedBundles = new ArrayList<Bundle>();
+        List<String> allowedBundles = new ArrayList<String>();
 
         for (PathElement element : HeaderParser.parseHeader(consumerHeader)) {
             String name = element.getName().trim();
             String className;
             String methodName;
             String[] argClasses;
+            Map<Integer, String> argValues = null;
+            
             int hashIdx = name.indexOf('#');
             if (hashIdx > 0) {
                 className = name.substring(0, hashIdx);
@@ -107,7 +111,25 @@ public class ClientWeavingHook implement
                     if (closeIdx > 0) {
                         String classes = name.substring(hashIdx + braceIdx + 1, hashIdx + closeIdx).trim();
                         if (classes.length() > 0) {
-                            argClasses = classes.split(",");
+                            if (classes.indexOf('[') > 0) {
+                                List<String> argClsList = new ArrayList<String>();
+                                argValues = new HashMap<Integer, String>();
+                                int argNumber = 0;
+                                for (String s : classes.split(",")) {
+                                    int idx = s.indexOf('[');
+                                    int end = s.indexOf(idx, ']');
+                                    if (idx > 0 && end > idx) {
+                                        argClsList.add(s.substring(0, idx));
+                                        argValues.put(argNumber, s.substring(idx + 1, end));
+                                    } else {
+                                        argClsList.add(s);
+                                    }
+                                    argNumber++;
+                                }
+                                argClasses = argClsList.toArray(new String[] {});
+                            } else {
+                                argClasses = classes.split(",");
+                            }
                         } else { 
                             argClasses = null;
                         }
@@ -130,30 +152,26 @@ public class ClientWeavingHook implement
                 
             String bsn = element.getAttribute("bundle");
             if (bsn != null) {
-                for (Bundle b : consumerBundle.getBundleContext().getBundles()) {
-                    if (b.getSymbolicName().equals(bsn)) {
-                        selectedBundles.add(b);
-                        break;                        
-                    }
-                }
+                allowedBundles.add(bsn);
             }
             
+            // TODO bundle version
+            
             String bid = element.getAttribute("bundleId");
             if (bid != null) {
                 bid = bid.trim();
                 for (Bundle b : consumerBundle.getBundleContext().getBundles()) {
-                    if (("" + b.getBundleId()).equals(bid)) {
-                        selectedBundles.add(b);
+                    if (("" + b.getBundleId()).equals(bid)) {                       
+                        allowedBundles.add(b.getSymbolicName());
                         break;                        
                     }
                 }                
             }
             
             Activator.activator.log(LogService.LOG_INFO, "Weaving " + className + "#" + methodName + " from bundle " + 
-                consumerBundle.getSymbolicName() + " to " + (selectedBundles.size() == 0 ? " any provider" : selectedBundles));
-            
-            if (selectedBundles.size() > 0)
-                Activator.activator.registerConsumerBundle(consumerBundle, selectedBundles);
+                consumerBundle.getSymbolicName() + " to " + (allowedBundles.size() == 0 ? " any provider" : allowedBundles));
+                        
+            Activator.activator.registerConsumerBundle(consumerBundle, allowedBundles, className, methodName, argValues);
            
             // TODO support more than one definition
             return new WeavingData(className, methodName, argClasses);

Modified: incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/Util.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/Util.java?rev=1051651&r1=1051650&r2=1051651&view=diff
==============================================================================
--- incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/Util.java (original)
+++ incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/Util.java Tue Dec 21 21:03:00 2010
@@ -68,7 +68,7 @@ public class Util {
         Collection<Bundle> bundles = new ArrayList<Bundle>(activator.findProviderBundles(cls.getName()));
         activator.log(LogService.LOG_DEBUG, "Found bundles providing " + cls + ": " + bundles);
                 
-        Collection<Bundle> allowedBundles = activator.findConsumerRestrictions(consumerBundle);
+        Collection<Bundle> allowedBundles = activator.findConsumerRestrictions(consumerBundle, 0, cls.getName());
         if (allowedBundles != null) {
             for (Iterator<Bundle> it = bundles.iterator(); it.hasNext(); ) {
                 if (!allowedBundles.contains(it.next())) {

Modified: incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/WeavingData.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/WeavingData.java?rev=1051651&r1=1051650&r2=1051651&view=diff
==============================================================================
--- incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/WeavingData.java (original)
+++ incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFly/src/org/apache/aries/spifly/WeavingData.java Tue Dec 21 21:03:00 2010
@@ -18,15 +18,17 @@
  */
 package org.apache.aries.spifly;
 
+import java.util.Map;
+
 public class WeavingData {
     private final String className;
     private final String methodName;
     private final String[] argClasses;
     
-    public WeavingData(String className, String methodName, String[] argClasses2) {
+    public WeavingData(String className, String methodName, String[] argClasses) {
         this.className = className;
         this.methodName = methodName;
-        this.argClasses = argClasses2;
+        this.argClasses = argClasses;
     }
 
     public String getClassName() {
@@ -39,5 +41,5 @@ public class WeavingData {
 
     public String[] getArgClasses() {
         return argClasses;
-    }
+    }    
 }

Added: incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/mytest/AltSPI.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/mytest/AltSPI.java?rev=1051651&view=auto
==============================================================================
--- incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/mytest/AltSPI.java (added)
+++ incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/mytest/AltSPI.java Tue Dec 21 21:03:00 2010
@@ -0,0 +1,5 @@
+package org.apache.aries.mytest;
+
+public interface AltSPI {
+    long square(long l);
+}

Added: incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/AltTestClient.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/AltTestClient.java?rev=1051651&view=auto
==============================================================================
--- incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/AltTestClient.java (added)
+++ incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/AltTestClient.java Tue Dec 21 21:03:00 2010
@@ -0,0 +1,17 @@
+package org.apache.aries.spifly;
+
+import java.util.ServiceLoader;
+
+import org.apache.aries.mytest.AltSPI;
+
+public class AltTestClient {
+    public long test(long input) {
+        long result = 0;
+        
+        ServiceLoader<AltSPI> loader = ServiceLoader.load(AltSPI.class);
+        for (AltSPI mySPI : loader) {
+            result += mySPI.square(input);
+        }
+        return result;
+    }
+}

Modified: incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/ClientWeavingHookTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/ClientWeavingHookTest.java?rev=1051651&r1=1051650&r2=1051651&view=diff
==============================================================================
--- incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/ClientWeavingHookTest.java (original)
+++ incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/ClientWeavingHookTest.java Tue Dec 21 21:03:00 2010
@@ -153,6 +153,84 @@ public class ClientWeavingHookTest {
         Object result = method.invoke(cls.newInstance(), "hello");
         Assert.assertEquals("Only the services from bundle impl2 should be selected", "HELLO5", result);        
     }
+    
+    @Test
+    public void testClientSpecifyingProviderVersion() throws Exception {
+        Dictionary<String, String> headers = new Hashtable<String, String>();
+        headers.put(SpiFlyConstants.SPI_CONSUMER_HEADER, "java.util.ServiceLoader#load(java.lang.Class);bundle=impl2;version=1.2.3");
+
+        Bundle providerBundle1 = mockProviderBundle("impl1", 1, "META-INF/services/org.apache.aries.mytest.MySPI");
+        Bundle providerBundle2 = mockProviderBundle("impl2", 2, "META-INF/services/org.apache.aries.mytest.MySPI");
+        Bundle providerBundle3 = mockProviderBundle("impl2", 3, new Version(1, 2, 3),  "META-INF/services/org.apache.aries.mytest.MySPI");
+        Activator.activator.registerProviderBundle("org.apache.aries.mytest.MySPI", providerBundle1);
+        Activator.activator.registerProviderBundle("org.apache.aries.mytest.MySPI", providerBundle2);
+        Activator.activator.registerProviderBundle("org.apache.aries.mytest.MySPI", providerBundle3);
+
+        Bundle consumerBundle = mockConsumerBundle(headers, providerBundle1, providerBundle2, providerBundle3);
+        Bundle spiFlyBundle = mockSpiFlyBundle(consumerBundle, providerBundle1, providerBundle2, providerBundle3);        
+        WeavingHook wh = new ClientWeavingHook(spiFlyBundle.getBundleContext());
+
+        // Weave the TestClient class.
+        URL clsUrl = getClass().getResource("TestClient.class");
+        WovenClass wc = new MyWovenClass(clsUrl, "org.apache.aries.spifly.TestClient", consumerBundle);
+        wh.weave(wc);
+
+        // Invoke the woven class and check that it propertly sets the TCCL so that the 
+        // META-INF/services/org.apache.aries.mytest.MySPI file from impl2 is visible.
+        Class<?> cls = wc.getDefinedClass();
+        Method method = cls.getMethod("test", new Class [] {String.class});
+        Object result = method.invoke(cls.newInstance(), "hello");
+        Assert.assertEquals("Only the services from bundle impl2 should be selected", "Updated!Hello!Updated", result);        
+    }
+
+    @Test
+    public void testClientSpecificProviderLoadArgument() throws Exception {
+        Dictionary<String, String> headers = new Hashtable<String, String>();
+        headers.put(SpiFlyConstants.SPI_CONSUMER_HEADER, 
+                "java.util.ServiceLoader#load(java.lang.Class[org.apache.aries.mytest.MySPI])," +
+                "java.util.ServiceLoader#load(java.lang.Class[org.apache.aries.mytest.AltSPI]);bundle=impl4");
+
+        Bundle providerBundle1 = mockProviderBundle("impl1", 1, "META-INF/services/org.apache.aries.mytest.MySPI");
+        Bundle providerBundle2 = mockProviderBundle("impl2", 2, "META-INF/services/org.apache.aries.mytest.MySPI", "META-INF/services/org.apache.aries.mytest.AltSPI");
+        Bundle providerBundle4 = mockProviderBundle("impl4", 4, "META-INF/services/org.apache.aries.mytest.MySPI", "META-INF/services/org.apache.aries.mytest.AltSPI");
+        Activator.activator.registerProviderBundle("org.apache.aries.mytest.MySPI", providerBundle1);
+        Activator.activator.registerProviderBundle("org.apache.aries.mytest.MySPI", providerBundle2);
+        Activator.activator.registerProviderBundle("org.apache.aries.mytest.AltSPI", providerBundle2);
+        Activator.activator.registerProviderBundle("org.apache.aries.mytest.MySPI", providerBundle4);        
+        Activator.activator.registerProviderBundle("org.apache.aries.mytest.AltSPI", providerBundle4);        
+
+        Bundle consumerBundle = mockConsumerBundle(headers, providerBundle1, providerBundle2, providerBundle4);
+        Bundle spiFlyBundle = mockSpiFlyBundle(consumerBundle, providerBundle1, providerBundle2, providerBundle4);        
+        WeavingHook wh = new ClientWeavingHook(spiFlyBundle.getBundleContext());
+
+        // Weave the TestClient class.
+        URL clsUrl = getClass().getResource("TestClient.class");
+        WovenClass wc = new MyWovenClass(clsUrl, "org.apache.aries.spifly.TestClient", consumerBundle);
+        wh.weave(wc);
+
+        // Invoke the woven class and check that it propertly sets the TCCL so that the 
+        // META-INF/services/org.apache.aries.mytest.MySPI file from impl2 is visible.
+        Class<?> cls = wc.getDefinedClass();
+        Method method = cls.getMethod("test", new Class [] {String.class});
+        Object result = method.invoke(cls.newInstance(), "hello");
+        Assert.assertEquals("Only the services from bundle impl2 should be selected", "ollehHELLO5", result);        
+
+        // Weave the AltTestClient class.
+        URL cls2Url = getClass().getResource("AltTestClient.class");
+        WovenClass wc2 = new MyWovenClass(cls2Url, "org.apache.aries.spifly.AltTestClient", consumerBundle);
+        wh.weave(wc2);
+
+        // Invoke the AltTestClient
+        Class<?> cls2 = wc2.getDefinedClass();
+        Method method2 = cls2.getMethod("test", new Class [] {long.class});
+        Object result2 = method2.invoke(cls2.newInstance(), 4096);
+        Assert.assertEquals("Only the services from bundle impl4 should be selected", 8192, result2);        
+    }
+    
+    @Test
+    public void testClientSpecifyingTwoDifferentMethodsLimitedToDifferentProviders() {
+        Assert.fail();
+    }
         
     @Test
     public void testJAXPClientWantsJREImplementation1() throws Exception {
@@ -267,6 +345,10 @@ public class ClientWeavingHookTest {
     }
 
     private Bundle mockProviderBundle(String subdir, long id, String ... resources) {
+        return mockProviderBundle(subdir, id, Version.emptyVersion, resources);
+    }
+    
+    private Bundle mockProviderBundle(String subdir, long id, Version version, String ... resources) {
         // Set up the classloader that will be used by the ASM-generated code as the TCCL. 
         // It can load a META-INF/services file
         ClassLoader cl = new TestImplClassLoader(subdir, resources);
@@ -280,6 +362,7 @@ public class ClientWeavingHookTest {
         EasyMock.expect(providerBundle.adapt(BundleWiring.class)).andReturn(bw);
         EasyMock.expect(providerBundle.getSymbolicName()).andReturn(subdir).anyTimes();
         EasyMock.expect(providerBundle.getBundleId()).andReturn(id).anyTimes();
+        EasyMock.expect(providerBundle.getVersion()).andReturn(version).anyTimes();
         EasyMock.replay(providerBundle);
         return providerBundle;
     }

Added: incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/impl2/AltSPIImpl1.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/impl2/AltSPIImpl1.java?rev=1051651&view=auto
==============================================================================
--- incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/impl2/AltSPIImpl1.java (added)
+++ incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/impl2/AltSPIImpl1.java Tue Dec 21 21:03:00 2010
@@ -0,0 +1,10 @@
+package org.apache.aries.spifly.impl2;
+
+import org.apache.aries.mytest.AltSPI;
+
+public class AltSPIImpl1 implements AltSPI {
+    @Override
+    public long square(long l) {
+        return l * l;
+    }
+}

Added: incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/impl2/META-INF/services/org.apache.aries.mytest.AltSPI
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/impl2/META-INF/services/org.apache.aries.mytest.AltSPI?rev=1051651&view=auto
==============================================================================
--- incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/impl2/META-INF/services/org.apache.aries.mytest.AltSPI (added)
+++ incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/impl2/META-INF/services/org.apache.aries.mytest.AltSPI Tue Dec 21 21:03:00 2010
@@ -0,0 +1 @@
+org.apache.aries.spifly.impl2.AltSPIImpl1

Added: incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/impl4/AltSPIImpl2.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/impl4/AltSPIImpl2.java?rev=1051651&view=auto
==============================================================================
--- incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/impl4/AltSPIImpl2.java (added)
+++ incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/impl4/AltSPIImpl2.java Tue Dec 21 21:03:00 2010
@@ -0,0 +1,10 @@
+package org.apache.aries.spifly.impl4;
+
+import org.apache.aries.mytest.AltSPI;
+
+public class AltSPIImpl2 implements AltSPI {
+    @Override
+    public long square(long l) {
+        return -l * l;
+    }
+}

Added: incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/impl4/META-INF/services/org.apache.aries.mytest.AltSPI
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/impl4/META-INF/services/org.apache.aries.mytest.AltSPI?rev=1051651&view=auto
==============================================================================
--- incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/impl4/META-INF/services/org.apache.aries.mytest.AltSPI (added)
+++ incubator/aries/trunk/spi-fly/contrib/pilot_using_weavinghook/SpiFlyTests/src/org/apache/aries/spifly/impl4/META-INF/services/org.apache.aries.mytest.AltSPI Tue Dec 21 21:03:00 2010
@@ -0,0 +1 @@
+org.apache.aries.spifly.impl4.AltSPIImpl2