Skip to content

Commit

Permalink
expose Scanner directly for OSGi support
Browse files Browse the repository at this point in the history
  • Loading branch information
pmuir committed May 25, 2010
1 parent 4f42278 commit 61f4d72
Show file tree
Hide file tree
Showing 14 changed files with 269 additions and 347 deletions.
117 changes: 56 additions & 61 deletions src/main/java/org/jboss/weld/environment/se/Weld.java
Expand Up @@ -16,44 +16,44 @@
*/
package org.jboss.weld.environment.se;

import java.lang.annotation.Annotation;
import java.util.Arrays;

import javax.annotation.PostConstruct;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.UnsatisfiedResolutionException;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;

import org.jboss.weld.bootstrap.api.Bootstrap;
import org.jboss.weld.bootstrap.api.Environments;
import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive;
import org.jboss.weld.bootstrap.spi.Deployment;
import org.jboss.weld.context.api.BeanStore;
import org.jboss.weld.context.api.helpers.ConcurrentHashMapBeanStore;
import org.jboss.weld.environment.se.beans.InstanceManager;
import org.jboss.weld.environment.se.discovery.NewSEWeldDeployment;
import org.jboss.weld.environment.se.discovery.WeldSEBeanDeploymentArchive;
import org.jboss.weld.environment.se.discovery.URLScanner;
import org.jboss.weld.environment.se.util.WeldManagerUtils;
import org.jboss.weld.manager.api.WeldManager;
import org.jboss.weld.resources.DefaultResourceLoader;
import org.jboss.weld.environment.se.discovery.WeldSEDeployment;
import org.jboss.weld.environment.se.discovery.url.URLScanner;
import org.jboss.weld.environment.se.discovery.url.WeldSEResourceLoader;
import org.jboss.weld.resources.spi.ResourceLoader;

/**
* An alternative means of booting WeldContainer form an arbitrary main method within an
* SE application, <em>without</em> using the built-in ContainerInitialized event.
* Typical usage of this API looks like this:
* <code>
* An alternative means of booting WeldContainer form an arbitrary main method
* within an SE application, <em>without</em> using the built-in
* ContainerInitialized event. Typical usage of this API looks like this: <code>
* WeldContainer weld = new Weld().initialize();
* weld.instance().select(Foo.class).get();
* weld.event().select(Bar.class).fire(new Bar());
* weld.shutdown();
* </code>
*
*
* @author Peter Royle
*/
public class Weld
{

protected static final String[] RESOURCES = { "META-INF/beans.xml" };

private static final String BOOTSTRAP_IMPL_CLASS_NAME = "org.jboss.weld.bootstrap.WeldBootstrap";
private WeldManager manager;

public Weld()
{
}
private ShutdownManager shutdownManager;

/**
* Boots Weld and creates and returns a WeldContainer instance, through which
Expand All @@ -64,81 +64,76 @@ public WeldContainer initialize()
{

BeanStore applicationBeanStore = new ConcurrentHashMapBeanStore();
Deployment deployment = createDeployment();
WeldSEDeployment deployment = createDeployment();

Bootstrap bootstrap = null;
try
{
bootstrap = (Bootstrap) deployment.getServices().get(ResourceLoader.class).classForName(BOOTSTRAP_IMPL_CLASS_NAME).newInstance();
} catch (InstantiationException ex)
}
catch (InstantiationException ex)
{
throw new IllegalStateException("Error loading Weld bootstrap, check that Weld is on the classpath", ex);
} catch (IllegalAccessException ex)
}
catch (IllegalAccessException ex)
{
throw new IllegalStateException("Error loading Weld bootstrap, check that Weld is on the classpath", ex);
}

BeanDeploymentArchive discovery = discoverBeansAndResources(deployment);
// transfer discovered classes and resources to the deployment in a single BeanDeploymentArchive
deployment.getBeanDeploymentArchives().add(discovery);


// Kick off the scan
deployment.getScanner().scan(deployment.getServices().get(ResourceLoader.class));

// Set up the container
bootstrap.startContainer(Environments.SE, deployment, applicationBeanStore);
final BeanDeploymentArchive mainBeanDepArch = deployment.getBeanDeploymentArchives().iterator().next();
this.manager = bootstrap.getManager(mainBeanDepArch);

// Start the container
bootstrap.startInitialization();
bootstrap.deployBeans();
WeldManagerUtils.getInstanceByType(manager, ShutdownManager.class).setBootstrap(bootstrap);
getInstanceByType(bootstrap.getManager(deployment.loadBeanDeploymentArchive(ShutdownManager.class)), ShutdownManager.class).setBootstrap(bootstrap);
bootstrap.validateBeans();
bootstrap.endInitialization();

InstanceManager instanceManager = WeldManagerUtils.getInstanceByType(manager, InstanceManager.class);
// Set up the ShutdownManager for later
this.shutdownManager = getInstanceByType(bootstrap.getManager(deployment.loadBeanDeploymentArchive(ShutdownManager.class)), ShutdownManager.class);

return new WeldContainer(instanceManager, manager);

}

/*
* Users can subclass and override this method to customise the classes and
* resources that Weld finds when it boots up.
*/
protected BeanDeploymentArchive discoverBeansAndResources(Deployment deployment)
{
WeldSEBeanDeploymentArchive discovery = new WeldSEBeanDeploymentArchive("weld-se-main-archive");
final ResourceLoader resourceLoader = deployment.getServices().get(ResourceLoader.class);
URLScanner scanner = new URLScanner(resourceLoader, discovery);
scanner.scanResources(new String[]
{
"META-INF/beans.xml"
});
return discovery;
return getInstanceByType(bootstrap.getManager(deployment.loadBeanDeploymentArchive(WeldContainer.class)), WeldContainer.class);
}

/**
* Users can subclass and override this method to customise the deployment
* before weld boots up. For example, to add a custom ResourceLoader, you would
* subclass Weld like so:
* <code>
* before weld boots up. For example, to add a custom ResourceLoader, you
* would subclass Weld like so: <code>
* public class MyWeld extends Weld {
* @Override
* protected void createDeployment() {
* Deployment myDeployment = new MyDeployment();
* deployment.getServices().add(ResourceLoader.class, new OSGIResourceLoader());
* }
* }
* </code>
*
* @Override protected WeldSEDeployment createDeployment() { WeldSEDeployment
* myDeployment = super.createDeployment();
* deployment.getServices().add(ResourceLoader.class, new
* OSGIResourceLoader()); } } </code>
*/
private Deployment createDeployment()
protected WeldSEDeployment createDeployment()
{
NewSEWeldDeployment deployment = new NewSEWeldDeployment();
deployment.getServices().add(ResourceLoader.class, new DefaultResourceLoader());
WeldSEDeployment deployment = new WeldSEDeployment(new URLScanner(RESOURCES));
deployment.getServices().add(ResourceLoader.class, new WeldSEResourceLoader());
return deployment;
}

protected <T> T getInstanceByType(BeanManager manager, Class<T> type, Annotation... bindings)
{
final Bean<?> bean = manager.resolve(manager.getBeans(type));
if (bean == null)
{
throw new UnsatisfiedResolutionException("Unable to resolve a bean for " + type + " with bindings " + Arrays.asList(bindings));
}
CreationalContext<?> cc = manager.createCreationalContext(bean);
return type.cast(manager.getReference(bean, type, cc));
}

/**
* Shuts down Weld.
*/
public void shutdown()
{
WeldManagerUtils.getInstanceByType(manager, ShutdownManager.class).shutdown();
shutdownManager.shutdown();
}
}
Expand Up @@ -19,6 +19,8 @@
import javax.enterprise.event.Event;
import javax.enterprise.inject.Instance;
import javax.enterprise.inject.spi.BeanManager;
import javax.inject.Inject;

import org.jboss.weld.environment.se.beans.InstanceManager;

/**
Expand All @@ -39,6 +41,7 @@ public class WeldContainer
private final InstanceManager instanceManager;
private final BeanManager beanManager;

@Inject
protected WeldContainer(InstanceManager instanceManager, BeanManager beanManager)
{
this.instanceManager = instanceManager;
Expand Down
Expand Up @@ -16,17 +16,18 @@
*/
package org.jboss.weld.environment.se;

import org.jboss.weld.environment.se.threading.RunnableDecorator;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.spi.AfterBeanDiscovery;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.BeforeBeanDiscovery;
import javax.enterprise.inject.spi.Extension;

import org.jboss.weld.context.api.BeanStore;
import org.jboss.weld.context.beanstore.HashMapBeanStore;
import org.jboss.weld.environment.se.beans.InstanceManager;
import org.jboss.weld.environment.se.beans.ParametersFactory;
import org.jboss.weld.environment.se.contexts.ThreadContext;
import org.jboss.weld.environment.se.threading.RunnableDecorator;

/**
* Explicitly registers all of the 'built-in' Java SE related beans and contexts.
Expand All @@ -42,8 +43,8 @@ public void registerWeldSEBeans(@Observes BeforeBeanDiscovery event, BeanManager
event.addAnnotatedType(manager.createAnnotatedType(ShutdownManager.class));
event.addAnnotatedType(manager.createAnnotatedType(ParametersFactory.class));
event.addAnnotatedType(manager.createAnnotatedType(InstanceManager.class));
event.addAnnotatedType(manager.createAnnotatedType(Weld.class));
event.addAnnotatedType(manager.createAnnotatedType(RunnableDecorator.class));
event.addAnnotatedType(manager.createAnnotatedType(WeldContainer.class));
}

public void registerWeldSEContexts(@Observes AfterBeanDiscovery event)
Expand Down

This file was deleted.

22 changes: 15 additions & 7 deletions src/main/java/org/jboss/weld/environment/se/discovery/Scanner.java
Expand Up @@ -16,11 +16,14 @@
*/
package org.jboss.weld.environment.se.discovery;

import java.util.List;

import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive;
import org.jboss.weld.bootstrap.spi.Deployment;
import org.jboss.weld.resources.spi.ResourceLoader;

/**
* The Scanner is used to find resources to be processed by Seam
*
* The processing is done by {@link DeploymentHandler}s
* The Scanner is used to find resources to be processed by Weld SE
*
* @author Pete Muir
*
Expand All @@ -29,10 +32,15 @@ public interface Scanner
{

/**
* Scan for structures which contain any of the given resources in their root
*
* @param resources The resources to scan for
* Scan for structures which should be deployed by Weld. For example,
* scanning for META-INF/beans.xml should return a graph of
* {@link BeanDeploymentArchive}s, representing their accessibility. For more
* on deployment structures see {@link Deployment}.
*/
public void scanResources(String[] resources);
public void scan(ResourceLoader resourceLoader);

public BeanDeploymentArchive getBeanDeploymentArchive(Class<?> clazz);

public List<BeanDeploymentArchive> getBeanDeploymentArchives();

}
Expand Up @@ -22,6 +22,7 @@
import java.util.Collections;
import java.util.HashSet;
import java.util.List;

import org.jboss.weld.bootstrap.api.ServiceRegistry;
import org.jboss.weld.bootstrap.api.helpers.SimpleServiceRegistry;
import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive;
Expand All @@ -42,7 +43,7 @@ public class WeldSEBeanDeploymentArchive implements BeanDeploymentArchive
private final Collection<URL> weldUrls;
private final ServiceRegistry serviceRegistry;
private final List<BeanDeploymentArchive> beanDeploymentArchives;
private String id;
private final String id;

public WeldSEBeanDeploymentArchive(String id)
{
Expand Down Expand Up @@ -87,14 +88,6 @@ public String getId()
return this.id;
}

/**
* @param id the id to set
*/
public void setId(String id)
{
this.id = id;
}

public ServiceRegistry getServices()
{
return this.serviceRegistry;
Expand Down

0 comments on commit 61f4d72

Please sign in to comment.