Search in sources :

Example 6 with WeavingHook

use of org.osgi.framework.hooks.weaving.WeavingHook in project aries by apache.

the class ClientWeavingHookTest method testTCCLResetting.

@Test
public void testTCCLResetting() throws Exception {
    ClassLoader cl = new URLClassLoader(new URL[] {});
    Thread.currentThread().setContextClassLoader(cl);
    Assert.assertSame("Precondition", cl, Thread.currentThread().getContextClassLoader());
    Dictionary<String, String> consumerHeaders = new Hashtable<String, String>();
    consumerHeaders.put(SpiFlyConstants.SPI_CONSUMER_HEADER, "*");
    // Register the bundle that provides the SPI implementation.
    Bundle providerBundle = mockProviderBundle("impl1", 1);
    activator.registerProviderBundle("org.apache.aries.mytest.MySPI", providerBundle, new HashMap<String, Object>());
    Bundle consumerBundle = mockConsumerBundle(consumerHeaders, providerBundle);
    activator.addConsumerWeavingData(consumerBundle, SpiFlyConstants.SPI_CONSUMER_HEADER);
    Bundle spiFlyBundle = mockSpiFlyBundle("spifly", Version.parseVersion("1.9.4"), consumerBundle, providerBundle);
    WeavingHook wh = new ClientWeavingHook(spiFlyBundle.getBundleContext(), activator);
    // Weave the TestClient class.
    URL clsUrl = getClass().getResource("TestClient.class");
    Assert.assertNotNull("Precondition", clsUrl);
    String clientClassName = "org.apache.aries.spifly.dynamic.TestClient";
    WovenClass wc = new MyWovenClass(clsUrl, clientClassName, consumerBundle);
    Assert.assertEquals("Precondition", 0, wc.getDynamicImports().size());
    wh.weave(wc);
    Assert.assertEquals(1, wc.getDynamicImports().size());
    String di1 = "org.apache.aries.spifly;bundle-symbolic-name=spifly;bundle-version=1.9.4";
    String di2 = "org.apache.aries.spifly;bundle-version=1.9.4;bundle-symbolic-name=spifly";
    String di = wc.getDynamicImports().get(0);
    Assert.assertTrue("Weaving should have added a dynamic import", di1.equals(di) || di2.equals(di));
    // Invoke the woven class and check that it properly sets the TCCL so that the
    // META-INF/services/org.apache.aries.mytest.MySPI file from impl1 is visible.
    Class<?> cls = wc.getDefinedClass();
    Method method = cls.getMethod("test", new Class[] { String.class });
    method.invoke(cls.newInstance(), "hi there");
    Assert.assertSame(cl, Thread.currentThread().getContextClassLoader());
}
Also used : Hashtable(java.util.Hashtable) Bundle(org.osgi.framework.Bundle) WovenClass(org.osgi.framework.hooks.weaving.WovenClass) Method(java.lang.reflect.Method) URL(java.net.URL) URLClassLoader(java.net.URLClassLoader) URLClassLoader(java.net.URLClassLoader) WeavingHook(org.osgi.framework.hooks.weaving.WeavingHook) Test(org.junit.Test)

Example 7 with WeavingHook

use of org.osgi.framework.hooks.weaving.WeavingHook in project aries by apache.

the class ClientWeavingHookGenericCapabilityTest method testTCCLResettingOnException.

@Test
public void testTCCLResettingOnException() throws Exception {
    ClassLoader cl = new URLClassLoader(new URL[] {});
    Thread.currentThread().setContextClassLoader(cl);
    Assert.assertSame("Precondition", cl, Thread.currentThread().getContextClassLoader());
    Dictionary<String, String> headers = new Hashtable<String, String>();
    headers.put(SpiFlyConstants.REQUIRE_CAPABILITY, SpiFlyConstants.CLIENT_REQUIREMENT);
    Bundle providerBundle5 = mockProviderBundle("impl5", 1);
    activator.registerProviderBundle("org.apache.aries.mytest.MySPI", providerBundle5, new HashMap<String, Object>());
    Bundle consumerBundle = mockConsumerBundle(headers, providerBundle5);
    activator.addConsumerWeavingData(consumerBundle, SpiFlyConstants.REQUIRE_CAPABILITY);
    Bundle spiFlyBundle = mockSpiFlyBundle(consumerBundle, providerBundle5);
    WeavingHook wh = new ClientWeavingHook(spiFlyBundle.getBundleContext(), activator);
    // Weave the TestClient class.
    URL clsUrl = getClass().getResource("TestClient.class");
    WovenClass wc = new MyWovenClass(clsUrl, "org.apache.aries.spifly.dynamic.TestClient", consumerBundle);
    wh.weave(wc);
    Class<?> cls = wc.getDefinedClass();
    Method method = cls.getMethod("test", new Class[] { String.class });
    // That implementation throws an exception, after which we are making sure that the TCCL is set back appropriately.
    try {
        method.invoke(cls.newInstance(), "hello");
        Assert.fail("Invocation should have thrown an exception");
    } catch (InvocationTargetException ite) {
        RuntimeException re = (RuntimeException) ite.getCause();
        String msg = re.getMessage();
        Assert.assertEquals("Uh-oh: hello", msg);
        // The TCCL should have been reset correctly
        Assert.assertSame(cl, Thread.currentThread().getContextClassLoader());
    }
}
Also used : Hashtable(java.util.Hashtable) Bundle(org.osgi.framework.Bundle) WovenClass(org.osgi.framework.hooks.weaving.WovenClass) Method(java.lang.reflect.Method) URL(java.net.URL) InvocationTargetException(java.lang.reflect.InvocationTargetException) URLClassLoader(java.net.URLClassLoader) URLClassLoader(java.net.URLClassLoader) WeavingHook(org.osgi.framework.hooks.weaving.WeavingHook) Test(org.junit.Test)

Example 8 with WeavingHook

use of org.osgi.framework.hooks.weaving.WeavingHook in project aries by apache.

the class ClientWeavingHookGenericCapabilityTest method testAltServiceLoaderLoadUnprocessed.

@Test
public void testAltServiceLoaderLoadUnprocessed() throws Exception {
    Bundle spiFlyBundle = mockSpiFlyBundle();
    Dictionary<String, String> headers = new Hashtable<String, String>();
    headers.put(SpiFlyConstants.REQUIRE_CAPABILITY, SpiFlyConstants.CLIENT_REQUIREMENT);
    Bundle consumerBundle = mockConsumerBundle(headers, spiFlyBundle);
    WeavingHook wh = new ClientWeavingHook(spiFlyBundle.getBundleContext(), activator);
    // Weave the TestClient class.
    URL clsUrl = getClass().getResource("UnaffectedTestClient.class");
    Assert.assertNotNull("Precondition", clsUrl);
    WovenClass wc = new MyWovenClass(clsUrl, "org.apache.aries.spifly.dynamic.UnaffectedTestClient", consumerBundle);
    Assert.assertEquals("Precondition", 0, wc.getDynamicImports().size());
    wh.weave(wc);
    Assert.assertEquals("The client is not affected so no additional imports should have been added", 0, wc.getDynamicImports().size());
    // ok the weaving is done, now prepare the registry for the call
    Bundle providerBundle = mockProviderBundle("impl1", 1);
    activator.registerProviderBundle("org.apache.aries.mytest.MySPI", providerBundle, new HashMap<String, Object>());
    // 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 impl1 is visible.
    Class<?> cls = wc.getDefinedClass();
    Method method = cls.getMethod("test", new Class[] { String.class });
    Object result = method.invoke(cls.newInstance(), "hello");
    Assert.assertEquals("impl4", result);
}
Also used : Bundle(org.osgi.framework.Bundle) Hashtable(java.util.Hashtable) WovenClass(org.osgi.framework.hooks.weaving.WovenClass) Method(java.lang.reflect.Method) URL(java.net.URL) WeavingHook(org.osgi.framework.hooks.weaving.WeavingHook) Test(org.junit.Test)

Example 9 with WeavingHook

use of org.osgi.framework.hooks.weaving.WeavingHook in project aries by apache.

the class ClientWeavingHookTest method testJAXPClientWantsAltImplementation2.

@Test
public void testJAXPClientWantsAltImplementation2() throws Exception {
    Bundle systembundle = mockSystemBundle();
    Bundle providerBundle = mockProviderBundle("impl3", 1);
    activator.registerProviderBundle("javax.xml.parsers.DocumentBuilderFactory", providerBundle, new HashMap<String, Object>());
    Dictionary<String, String> headers = new Hashtable<String, String>();
    headers.put(SpiFlyConstants.SPI_CONSUMER_HEADER, "javax.xml.parsers.DocumentBuilderFactory#newInstance();bundle=impl3");
    Bundle consumerBundle = mockConsumerBundle(headers, providerBundle, systembundle);
    activator.addConsumerWeavingData(consumerBundle, SpiFlyConstants.SPI_CONSUMER_HEADER);
    WeavingHook wh = new ClientWeavingHook(mockSpiFlyBundle(consumerBundle, providerBundle, systembundle).getBundleContext(), activator);
    URL clsUrl = getClass().getResource("JaxpClient.class");
    WovenClass wc = new MyWovenClass(clsUrl, "org.apache.aries.spifly.dynamic.JaxpClient", consumerBundle);
    wh.weave(wc);
    Class<?> cls = wc.getDefinedClass();
    Method method = cls.getMethod("test", new Class[] {});
    Class<?> result = (Class<?>) method.invoke(cls.newInstance());
    Assert.assertEquals("JAXP implementation from alternative bundle", "org.apache.aries.spifly.dynamic.impl3.MyAltDocumentBuilderFactory", result.getName());
}
Also used : Bundle(org.osgi.framework.Bundle) Hashtable(java.util.Hashtable) WovenClass(org.osgi.framework.hooks.weaving.WovenClass) Method(java.lang.reflect.Method) URL(java.net.URL) WovenClass(org.osgi.framework.hooks.weaving.WovenClass) WeavingHook(org.osgi.framework.hooks.weaving.WeavingHook) Test(org.junit.Test)

Example 10 with WeavingHook

use of org.osgi.framework.hooks.weaving.WeavingHook in project aries by apache.

the class Aries1429Test method testMissingParentChildEdgeTolerated.

@Test
public void testMissingParentChildEdgeTolerated() throws Exception {
    final AtomicBoolean weavingHookCalled = new AtomicBoolean();
    final AtomicReference<FrameworkEvent> frameworkEvent = new AtomicReference<FrameworkEvent>();
    bundleContext.registerService(WeavingHook.class, new WeavingHook() {

        @Override
        public void weave(WovenClass wovenClass) {
            Bundle bundle = wovenClass.getBundleWiring().getBundle();
            if (BUNDLE_A.equals(bundle.getSymbolicName())) {
                wovenClass.getDynamicImports().add("com.acme.tnt");
                weavingHookCalled.set(true);
            }
        }
    }, null);
    Subsystem applicationA = installSubsystemFromFile(APPLICATION_A);
    try {
        removeConnectionWithParent(applicationA);
        BundleContext context = applicationA.getBundleContext();
        Bundle bundleA = context.installBundle(BUNDLE_A, TinyBundles.bundle().add(getClass().getClassLoader().loadClass("a.A"), InnerClassStrategy.NONE).set(Constants.BUNDLE_SYMBOLICNAME, BUNDLE_A).build(TinyBundles.withBnd()));
        bundleContext.addFrameworkListener(new FrameworkListener() {

            @Override
            public void frameworkEvent(FrameworkEvent event) {
                if (FrameworkEvent.ERROR == event.getType() && getSubsystemCoreBundle().equals(event.getBundle())) {
                    frameworkEvent.set(event);
                    if (event.getThrowable() != null) {
                        event.getThrowable().printStackTrace();
                    }
                }
            }
        });
        bundleA.loadClass("a.A");
        assertTrue("Weaving hook not called", weavingHookCalled.get());
        Thread.sleep(1000);
        assertNull("An exception was thrown", frameworkEvent.get());
    } finally {
        uninstallSubsystemSilently(applicationA);
    }
}
Also used : AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) FrameworkEvent(org.osgi.framework.FrameworkEvent) Bundle(org.osgi.framework.Bundle) AriesSubsystem(org.apache.aries.subsystem.AriesSubsystem) Subsystem(org.osgi.service.subsystem.Subsystem) WovenClass(org.osgi.framework.hooks.weaving.WovenClass) AtomicReference(java.util.concurrent.atomic.AtomicReference) FrameworkListener(org.osgi.framework.FrameworkListener) WeavingHook(org.osgi.framework.hooks.weaving.WeavingHook) BundleContext(org.osgi.framework.BundleContext) SubsystemTest(org.apache.aries.subsystem.itests.SubsystemTest) Test(org.junit.Test)

Aggregations

WeavingHook (org.osgi.framework.hooks.weaving.WeavingHook)35 Bundle (org.osgi.framework.Bundle)32 WovenClass (org.osgi.framework.hooks.weaving.WovenClass)32 Test (org.junit.Test)27 Hashtable (java.util.Hashtable)26 Method (java.lang.reflect.Method)24 URL (java.net.URL)24 HashSet (java.util.HashSet)9 HashMap (java.util.HashMap)6 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)6 ArrayList (java.util.ArrayList)4 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)4 BundleContext (org.osgi.framework.BundleContext)4 ServiceRegistration (org.osgi.framework.ServiceRegistration)4 File (java.io.File)3 URLClassLoader (java.net.URLClassLoader)3 LinkedHashMap (java.util.LinkedHashMap)3 List (java.util.List)3 CopyOnWriteArrayList (java.util.concurrent.CopyOnWriteArrayList)3 Equinox (org.eclipse.osgi.launch.Equinox)3