package org.gatein.integration.jboss.as7.deployment; import org.gatein.cdi.CDIPortletContextExtension; import org.gatein.integration.jboss.as7.GateInConfiguration; import org.jboss.as.server.deployment.Attachments; import org.jboss.as.server.deployment.DeploymentPhaseContext; import org.jboss.as.server.deployment.DeploymentUnit; import org.jboss.as.server.deployment.DeploymentUnitProcessingException; import org.jboss.as.server.deployment.DeploymentUnitProcessor; import org.jboss.as.server.deployment.reflect.DeploymentReflectionIndex; import org.jboss.as.weld.WeldDeploymentMarker; import org.jboss.as.weld.deployment.WeldPortableExtensions; import org.jboss.logging.Logger; import org.jboss.modules.Module; import javax.enterprise.inject.spi.Extension; import java.lang.reflect.Constructor; /** * Need to forcibly add our CDI extension into the list created by Weld subsystem as * any dependencies don't have their services files read by container. * * @author <a href="http://community.jboss.org/people/kenfinni">Ken Finnigan</a> */ public class CdiContextExtensionProcessor implements DeploymentUnitProcessor { private static final Logger log = Logger.getLogger(CdiContextExtensionProcessor.class); private static final String[] EMPTY_STRING_ARRAY = {}; @Override public void deploy(DeploymentPhaseContext phaseContext) throws DeploymentUnitProcessingException { DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit(); if (!GateInConfiguration.isPortletArchive(deploymentUnit)) { return; } if (!WeldDeploymentMarker.isPartOfWeldDeployment(deploymentUnit)) { return; // skip non weld deployments } final Module module = deploymentUnit.getAttachment(Attachments.MODULE); final DeploymentReflectionIndex index = deploymentUnit.getAttachment(Attachments.REFLECTION_INDEX); final Extension extension = loadExtension(CDIPortletContextExtension.class.getName(), index, module.getClassLoader()); log.debug("Loaded portable extension " + extension); WeldPortableExtensions wpe = WeldPortableExtensions.getPortableExtensions(deploymentUnit); wpe.registerExtensionInstance(extension, deploymentUnit); } private Extension loadExtension(String serviceClassName, final DeploymentReflectionIndex index, final ClassLoader loader) throws DeploymentUnitProcessingException { Class<?> clazz; Class<Extension> serviceClass; try { clazz = loader.loadClass(serviceClassName); serviceClass = (Class<Extension>) clazz; final Constructor<Extension> ctor = index.getClassIndex(serviceClass).getConstructor(EMPTY_STRING_ARRAY); return ctor.newInstance(); } catch (ClassCastException e) { throw new DeploymentUnitProcessingException( "Service class " + serviceClassName + " didn't implement the javax.enterprise.inject.spi.Extension interface", e); } catch (Exception e) { log.warnf("Could not load portable extension class %s: %s", serviceClassName, e.getMessage()); } return null; } @Override public void undeploy(DeploymentUnit context) { } }