package org.jboss.as.weld.deployment; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import javax.enterprise.inject.spi.Extension; import org.jboss.as.server.deployment.AttachmentKey; import org.jboss.as.server.deployment.DeploymentUnit; import org.jboss.as.server.deployment.DeploymentUnitProcessingException; import org.jboss.as.weld.logging.WeldLogger; import org.jboss.weld.bootstrap.spi.Metadata; import org.jboss.weld.bootstrap.spi.helpers.MetadataImpl; /** * Container class that is attached to the top level deployment that holds all portable extension metadata. * <p/> * A portable extension may be available to multiple deployment class loaders, however for each PE we * only want to register a single instance. * <p/> * This container provides a mechanism for making sure that only a single PE of a given type is registered. * * @author Stuart Douglas */ public class WeldPortableExtensions { public static final AttachmentKey<WeldPortableExtensions> ATTACHMENT_KEY = AttachmentKey.create(WeldPortableExtensions.class); public static WeldPortableExtensions getPortableExtensions(final DeploymentUnit deploymentUnit) { if (deploymentUnit.getParent() == null) { WeldPortableExtensions pes = deploymentUnit.getAttachment(WeldPortableExtensions.ATTACHMENT_KEY); if (pes == null) { deploymentUnit.putAttachment(ATTACHMENT_KEY, pes = new WeldPortableExtensions()); } return pes; } else { return getPortableExtensions(deploymentUnit.getParent()); } } private final Map<Class<?>, Metadata<Extension>> extensions = new HashMap<>(); public synchronized void tryRegisterExtension(final Class<?> extensionClass, final DeploymentUnit deploymentUnit) throws DeploymentUnitProcessingException { if (!Extension.class.isAssignableFrom(extensionClass)) { throw WeldLogger.ROOT_LOGGER.extensionDoesNotImplementExtension(extensionClass); } if (extensions.containsKey(extensionClass)) { return; } try { extensions.put(extensionClass, new MetadataImpl<>((Extension) extensionClass.newInstance(), deploymentUnit.getName())); } catch (Exception e) { WeldLogger.DEPLOYMENT_LOGGER.couldNotLoadPortableExceptionClass(extensionClass.getName(), e); } } public synchronized void registerExtensionInstance(final Extension extension, final DeploymentUnit deploymentUnit) { extensions.put(extension.getClass(), new MetadataImpl<>(extension, deploymentUnit.getName())); } public Collection<Metadata<Extension>> getExtensions() { return new HashSet<>(extensions.values()); } }