/* * Copyright 2014 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.container.cdi.lifecycle; import javax.enterprise.inject.spi.BeanManager; import org.jboss.forge.furnace.Furnace; import org.jboss.forge.furnace.addons.Addon; import org.jboss.forge.furnace.addons.AddonRegistry; import org.jboss.forge.furnace.container.cdi.events.EventManagerImpl; import org.jboss.forge.furnace.container.cdi.events.EventManagerProducer; import org.jboss.forge.furnace.container.cdi.events.LocalLiteral; import org.jboss.forge.furnace.container.cdi.impl.AddonProducer; import org.jboss.forge.furnace.container.cdi.impl.AddonRegistryProducer; import org.jboss.forge.furnace.container.cdi.impl.AddonRepositoryProducer; import org.jboss.forge.furnace.container.cdi.impl.ContainerBeanRegistrant; import org.jboss.forge.furnace.container.cdi.impl.ContainerServiceExtension; import org.jboss.forge.furnace.container.cdi.impl.FurnaceProducer; import org.jboss.forge.furnace.container.cdi.impl.ServiceRegistryProducer; import org.jboss.forge.furnace.container.cdi.impl.WeldServiceRegistry; import org.jboss.forge.furnace.container.cdi.util.BeanManagerUtils; import org.jboss.forge.furnace.container.cdi.weld.AddonResourceLoader; import org.jboss.forge.furnace.container.cdi.weld.ModularURLScanner; import org.jboss.forge.furnace.container.cdi.weld.ModuleScanResult; import org.jboss.forge.furnace.event.EventManager; import org.jboss.forge.furnace.event.PostStartup; import org.jboss.forge.furnace.event.PreShutdown; import org.jboss.forge.furnace.lifecycle.AddonLifecycleProvider; import org.jboss.forge.furnace.lifecycle.ControlType; import org.jboss.forge.furnace.spi.ServiceRegistry; import org.jboss.forge.furnace.util.Assert; import org.jboss.weld.environment.se.Weld; import org.jboss.weld.environment.se.WeldContainer; import org.jboss.weld.resources.spi.ResourceLoader; /** * @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a> */ public class WeldAddonLifecycleProvider implements AddonLifecycleProvider { private Furnace furnace; private AddonRegistry addonRegistry; private WeldServiceRegistry serviceRegistry; private BeanManager manager; private EventManagerImpl eventManager; private Addon container; private WeldContainer weldContainer; @Override public void initialize(Furnace furnace, AddonRegistry registry, Addon container) { this.furnace = furnace; this.addonRegistry = registry; this.container = container; } @Override public void start(Addon addon) throws Exception { ResourceLoader resourceLoader = new AddonResourceLoader(addon); ModularURLScanner scanner = new ModularURLScanner(resourceLoader, "META-INF/beans.xml"); ModuleScanResult scanResult = scanner.scan(); if (!scanResult.getDiscoveredResourceUrls().isEmpty()) { ContainerServiceExtension serviceExtension = new ContainerServiceExtension(container, addon); ContainerBeanRegistrant registrantExtension = new ContainerBeanRegistrant(); weldContainer = new Weld(addon.getId().getName()).setResourceLoader(resourceLoader) .addExtension(serviceExtension).addExtension(registrantExtension) .property("org.jboss.weld.bootstrap.preloaderThreadPoolSize", 0) .property("org.jboss.weld.bootstrap.concurrentDeployment", false).initialize(); manager = weldContainer.getBeanManager(); Assert.notNull(manager, "BeanManager was null"); AddonRepositoryProducer repositoryProducer = BeanManagerUtils.getContextualInstance(manager, AddonRepositoryProducer.class); repositoryProducer.setRepository(addon.getRepository()); FurnaceProducer forgeProducer = BeanManagerUtils.getContextualInstance(manager, FurnaceProducer.class); forgeProducer.setFurnace(furnace); AddonProducer addonProducer = BeanManagerUtils.getContextualInstance(manager, AddonProducer.class); addonProducer.setAddon(addon); AddonRegistryProducer addonRegistryProducer = BeanManagerUtils.getContextualInstance(manager, AddonRegistryProducer.class); addonRegistryProducer.setRegistry(addonRegistry); ServiceRegistryProducer serviceRegistryProducer = BeanManagerUtils.getContextualInstance(manager, ServiceRegistryProducer.class); serviceRegistry = new WeldServiceRegistry(furnace.getLockManager(), addon, manager, serviceExtension.getServices()); serviceRegistryProducer.setServiceRegistry(serviceRegistry); Assert.notNull(BeanManagerUtils.getContextualInstance(manager, ServiceRegistry.class), "InboundEvent registry was null."); EventManagerProducer eventManagerProducer = BeanManagerUtils.getContextualInstance(manager, EventManagerProducer.class); eventManager = new EventManagerImpl(addon, manager); eventManagerProducer.setEventManager(eventManager); Assert.notNull(BeanManagerUtils.getContextualInstance(manager, EventManager.class), "InboundEvent registry was null."); } } @Override public void postStartup(Addon addon) { if (eventManager != null) eventManager.fireEvent(new PostStartup(addon), new LocalLiteral()); } @Override public void preShutdown(Addon addon) { if (eventManager != null) eventManager.fireEvent(new PreShutdown(addon), new LocalLiteral()); } @Override public void stop(Addon addon) { if (weldContainer != null) { weldContainer.shutdown(); } serviceRegistry.close(); serviceRegistry = null; eventManager = null; } @Override public EventManager getEventManager(Addon addon) { return eventManager; } @Override public ServiceRegistry getServiceRegistry(Addon addon) { return serviceRegistry; } @Override public ControlType getControlType() { return ControlType.DEPENDENTS; } }