Package org.jboss.forge.furnace.proxy.classloader

Source Code of org.jboss.forge.furnace.proxy.classloader.SidewaysProxyAnonymousCollisionTest

/*
* Copyright 2012 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.furnace.proxy.classloader;

import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.forge.arquillian.archive.ForgeArchive;
import org.jboss.forge.arquillian.services.LocalServices;
import org.jboss.forge.classloader.mock.sidewaysproxy.AbstractExtra;
import org.jboss.forge.classloader.mock.sidewaysproxy.Action;
import org.jboss.forge.classloader.mock.sidewaysproxy.Action1;
import org.jboss.forge.classloader.mock.sidewaysproxy.Context;
import org.jboss.forge.classloader.mock.sidewaysproxy.ContextImpl;
import org.jboss.forge.classloader.mock.sidewaysproxy.ContextValue;
import org.jboss.forge.classloader.mock.sidewaysproxy.ContextValueImpl;
import org.jboss.forge.classloader.mock.sidewaysproxy.Extra;
import org.jboss.forge.classloader.mock.sidewaysproxy.Payload;
import org.jboss.forge.classloader.mock.sidewaysproxy.Payload1;
import org.jboss.forge.furnace.addons.AddonId;
import org.jboss.forge.furnace.addons.AddonRegistry;
import org.jboss.forge.furnace.proxy.ClassLoaderAdapterBuilder;
import org.jboss.forge.furnace.proxy.Proxies;
import org.jboss.forge.furnace.repositories.AddonDependencyEntry;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(Arquillian.class)
public class SidewaysProxyAnonymousCollisionTest
{
   @Deployment(order = 3)
   public static ForgeArchive getDeploymentA()
   {
      ForgeArchive archive = ShrinkWrap
               .create(ForgeArchive.class)
               .addBeansXML()
               .addClasses(Context.class, ContextImpl.class, ContextValue.class, Action.class, Action1.class,
                        Payload.class, Payload1.class, Extra.class, AbstractExtra.class, ContextValueImpl.class)
               .addAsLocalServices(SidewaysProxyAnonymousCollisionTest.class);

      return archive;
   }

   @Deployment(name = "B,1", testable = false, order = 2)
   public static ForgeArchive getDeploymentB()
   {
      ForgeArchive archive = ShrinkWrap.create(ForgeArchive.class)
               .addClasses(Action1.class)
               .addAsAddonDependencies(
                        AddonDependencyEntry.create("D", "1")
               );

      return archive;
   }

   @Deployment(name = "C,1", testable = false, order = 1)
   public static ForgeArchive getDeploymentC()
   {
      ForgeArchive archive = ShrinkWrap.create(ForgeArchive.class)
               .addClasses(Payload.class, Payload1.class)
               .addAsAddonDependencies(
                        AddonDependencyEntry.create("E", "1")
               );

      return archive;
   }

   @Deployment(name = "D,1", testable = false, order = 1)
   public static ForgeArchive getDeploymentD()
   {
      ForgeArchive archive = ShrinkWrap.create(ForgeArchive.class)
               .addClasses(Context.class, Action.class, ContextImpl.class, ContextValue.class);

      return archive;
   }

   @Deployment(name = "E,1", testable = false, order = 1)
   public static ForgeArchive getDeploymentE()
   {
      ForgeArchive archive = ShrinkWrap.create(ForgeArchive.class)
               .addClasses(Extra.class, AbstractExtra.class);

      return archive;
   }

   @Test
   public void testSidewaysCollision() throws Exception
   {
      AddonRegistry registry = LocalServices.getFurnace(getClass().getClassLoader())
               .getAddonRegistry();
      ClassLoader A = this.getClass().getClassLoader();
      ClassLoader B = registry.getAddon(AddonId.from("B", "1")).getClassLoader();
      ClassLoader C = registry.getAddon(AddonId.from("C", "1")).getClassLoader();

      Class<?> typeAction1 = B.loadClass(Action1.class.getName());
      Action action1 = getProxiedInstance(A, B, typeAction1);

      Class<?> typePayload1 = C.loadClass(Payload1.class.getName());
      Payload payload1 = getProxiedInstance(A, C, typePayload1);

      Context context = new ContextImpl();
      ContextValue<Payload> value = new ContextValueImpl<Payload>();
      value.set(payload1);
      context.set(value);

      action1.handle(context);
   }

   @SuppressWarnings("unchecked")
   private <T> T getProxiedInstance(ClassLoader A, ClassLoader B, Class<?> type)
            throws InstantiationException,
            IllegalAccessException
   {
      Object delegate = type.newInstance();
      T enhanced = (T) ClassLoaderAdapterBuilder.callingLoader(A).delegateLoader(B).enhance(delegate);
      Assert.assertTrue(Proxies.isForgeProxy(enhanced));
      return enhanced;
   }
}
TOP

Related Classes of org.jboss.forge.furnace.proxy.classloader.SidewaysProxyAnonymousCollisionTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.