/** * {@inheritDoc} * * @see org.jboss.shrinkwrap.api.ExtensionLoader#load(java.lang.Class, org.jboss.shrinkwrap.api.Archive) */ @Override public <T extends Assignable> T load(Class<T> extensionClass, Archive<?> baseArchive) throws UnknownExtensionTypeException { if (isCached(extensionClass)) { return createFromCache(extensionClass, baseArchive); } T object = createFromLoadExtension(extensionClass, baseArchive); addToCache(extensionClass, object.getClass()); return object; }
private <T extends Assignable> T createFromCache(Class<T> extensionClass, Archive<?> archive) { Class<T> extensionImplClass = getFromCache(extensionClass); return createExtension(extensionImplClass, archive); }
/** * Finds the SPI configuration, wraps it into a {@link ExtensionWrapper} and loads it to * {@link ServiceExtensionLoader#extensionMappings}. * * @param <T> * @param extensionClass * @return */ private <T extends Assignable> ExtensionWrapper loadExtensionMapping(Class<T> extensionClass) { final InputStream extensionStream = findExtensionImpl(extensionClass); ExtensionWrapper extensionWrapper = loadExtensionWrapper(extensionStream, extensionClass); this.extensionMappings.put(extensionClass, extensionWrapper); return extensionWrapper; }
/** * Creates a new instance of a <code>extensionClass</code> implementation. The implementation class is found in a * provider-configuration file in META-INF/services/ * * @param <T> * @param extensionClass * @param archive * @return an instance of the <code>extensionClass</code>' implementation. */ private <T extends Assignable> T createFromLoadExtension(Class<T> extensionClass, Archive<?> archive) { ExtensionWrapper extensionWrapper = loadExtensionMapping(extensionClass); if (extensionWrapper == null) { throw new RuntimeException("Failed to load ExtensionMapping"); } Class<T> extensionImplClass = loadExtension(extensionWrapper); if (!extensionClass.isAssignableFrom(extensionImplClass)) { throw new RuntimeException("Found extension impl class " + extensionImplClass.getName() + " not assignable to extension interface " + extensionClass.getName()); } return createExtension(extensionImplClass, archive); }
Constructor<T> extensionImplConstructor = findConstructor(extensionImplClass); extension = extensionImplConstructor.newInstance(archive); } else { extension = extensionImplConstructor.newInstance(load(constructorArg, archive));
@Test public void shouldBeAbleToOverrideExtension() throws Exception { Extension extension = createLoaderUsingTccl().addOverride(Extension.class, ExtensionImpl2.class).load( Extension.class, ShrinkWrap.create(JavaArchive.class, "test.jar")); Assert.assertNotNull(extension); Assert.assertTrue(extension.getClass() == ExtensionImpl2.class); }
@Test public void shouldBeAbleToLoadExtension() throws Exception { Extension extension = createLoaderUsingTccl().load(Extension.class, ShrinkWrap.create(JavaArchive.class, "test.jar")); Assert.assertNotNull(extension); Assert.assertTrue(extension.getClass() == ExtensionImpl.class); }
/** * Check to see if a specific extension interface is beeing overloaded * * @param extensionClass * The ExtensionType interface class * @return true if found */ public boolean isOverriden(Class<?> extensionClass) { return isCached(extensionClass); }
/** * Creates a new {@link ServiceExtensionLoader using the TCCL} * * @return */ private ServiceExtensionLoader createLoaderUsingTccl() { final Collection<ClassLoader> cls = new ArrayList<ClassLoader>(1); cls.add(TestSecurityActions.getThreadContextClassLoader()); return new ServiceExtensionLoader(cls); } }
/** * {@inheritDoc} * * @see org.jboss.shrinkwrap.api.ExtensionLoader#addOverride(java.lang.Class, java.lang.Class) */ public <T extends Assignable> ServiceExtensionLoader addOverride(final Class<T> extensionClass, final Class<? extends T> extensionImplClass) { addToCache(extensionClass, extensionImplClass); return this; }
/** * Creates a new instance of a <code>extensionClass</code> implementation. The implementation class is found in a * provider-configuration file in META-INF/services/ * * @param <T> * @param extensionClass * @param archive * @return an instance of the <code>extensionClass</code>' implementation. */ private <T extends Assignable> T createFromLoadExtension(Class<T> extensionClass, Archive<?> archive) { ExtensionWrapper extensionWrapper = loadExtensionMapping(extensionClass); if (extensionWrapper == null) { throw new RuntimeException("Failed to load ExtensionMapping"); } Class<T> extensionImplClass = loadExtension(extensionWrapper); if (!extensionClass.isAssignableFrom(extensionImplClass)) { throw new RuntimeException("Found extension impl class " + extensionImplClass.getName() + " not assignable to extension interface " + extensionClass.getName()); } return createExtension(extensionImplClass, archive); }
Constructor<T> extensionImplConstructor = findConstructor(extensionImplClass); extension = extensionImplConstructor.newInstance(archive); } else { extension = extensionImplConstructor.newInstance(load(constructorArg, archive));
@Test(expected = RuntimeException.class) public void shouldThrowExceptionOnMissingExtension() throws Exception { createLoaderUsingTccl().load(MissingExtension.class, ShrinkWrap.create(JavaArchive.class, "test.jar")); }
/** * Check to see if a specific extension interface is beeing overloaded * * @param extensionClass * The ExtensionType interface class * @return true if found */ public boolean isOverriden(Class<?> extensionClass) { return isCached(extensionClass); }
public static VDBArchive archiveFromCurrentApp() throws Exception { Configuration config = ShrinkWrap.getDefaultDomain().getConfiguration(); ArrayList<ClassLoader> existing = new ArrayList<>(); Iterator<ClassLoader> it = config.getClassLoaders().iterator(); while (it.hasNext()) { existing.add(it.next()); } existing.add(VDBArchive.class.getClassLoader()); ConfigurationBuilder builder = new ConfigurationBuilder(); builder.classLoaders(existing); builder.extensionLoader(new ServiceExtensionLoader(existing)); Domain domain = ShrinkWrap.createDomain(builder); final VDBArchive archive = domain.getArchiveFactory().create(VDBArchive.class, determineName()); //final VDBArchive archive = ShrinkWrap.create(VDBArchive.class, determineName()); final DefaultDeploymentFactory factory = new DefaultVDBDeploymentFactory(); factory.setup(archive); archive.addAllDependencies(); return archive; }
/** * {@inheritDoc} * * @see org.jboss.shrinkwrap.api.ExtensionLoader#addOverride(java.lang.Class, java.lang.Class) */ public <T extends Assignable> ServiceExtensionLoader addOverride(final Class<T> extensionClass, final Class<? extends T> extensionImplClass) { addToCache(extensionClass, extensionImplClass); return this; }
/** * {@inheritDoc} * * @see org.jboss.shrinkwrap.api.ExtensionLoader#load(java.lang.Class, org.jboss.shrinkwrap.api.Archive) */ @Override public <T extends Assignable> T load(Class<T> extensionClass, Archive<?> baseArchive) throws UnknownExtensionTypeException { if (isCached(extensionClass)) { return createFromCache(extensionClass, baseArchive); } T object = createFromLoadExtension(extensionClass, baseArchive); addToCache(extensionClass, object.getClass()); return object; }
@Test(expected = RuntimeException.class) public void shouldThrowExceptionOnWrongImplType() throws Exception { createLoaderUsingTccl().load(WrongImplExtension.class, ShrinkWrap.create(JavaArchive.class, "test.jar")); }
private <T extends Assignable> T createFromCache(Class<T> extensionClass, Archive<?> archive) { Class<T> extensionImplClass = getFromCache(extensionClass); return createExtension(extensionImplClass, archive); }