blob: 266dc712ba3cd56072cc931aa66434c0daf6091b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2013 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Stuart McCulloch (Sonatype, Inc.) - initial API and implementation
*******************************************************************************/
package org.eclipse.sisu.plexus;
import java.util.Map;
import org.codehaus.plexus.component.annotations.Component;
import org.eclipse.sisu.BeanScanning;
import org.eclipse.sisu.space.ClassSpace;
import org.eclipse.sisu.space.SpaceModule;
import org.eclipse.sisu.space.SpaceVisitor;
import com.google.inject.Binder;
import com.google.inject.Module;
/**
* {@link PlexusBeanModule} that registers Plexus beans by scanning classes for runtime annotations.
*/
public final class PlexusAnnotatedBeanModule
implements PlexusBeanModule
{
// ----------------------------------------------------------------------
// Constants
// ----------------------------------------------------------------------
private static final SpaceModule.Strategy PLEXUS_STRATEGY = new SpaceModule.Strategy()
{
public SpaceVisitor visitor( final Binder binder )
{
return new PlexusTypeVisitor( new PlexusTypeBinder( binder ) );
}
};
// ----------------------------------------------------------------------
// Implementation fields
// ----------------------------------------------------------------------
private final Module spaceModule;
private final PlexusBeanSource beanSource;
// ----------------------------------------------------------------------
// Constructors
// ----------------------------------------------------------------------
/**
* Creates a bean source that scans the given class space for Plexus annotations using the given scanner.
*
* @param space The local class space
* @param variables The filter variables
*/
public PlexusAnnotatedBeanModule( final ClassSpace space, final Map<?, ?> variables )
{
this( space, variables, BeanScanning.ON );
}
/**
* Creates a bean source that scans the given class space for Plexus annotations using the given scanner.
*
* @param space The local class space
* @param variables The filter variables
* @param scanning The scanning options
*/
public PlexusAnnotatedBeanModule( final ClassSpace space, final Map<?, ?> variables, final BeanScanning scanning )
{
if ( null != space && scanning != BeanScanning.OFF )
{
spaceModule = new SpaceModule( space, scanning ).with( PLEXUS_STRATEGY );
}
else
{
spaceModule = null;
}
beanSource = new PlexusAnnotatedBeanSource( variables );
}
// ----------------------------------------------------------------------
// Public methods
// ----------------------------------------------------------------------
public PlexusBeanSource configure( final Binder binder )
{
if ( null != spaceModule )
{
spaceModule.configure( binder );
}
return beanSource;
}
// ----------------------------------------------------------------------
// Implementation types
// ----------------------------------------------------------------------
/**
* {@link PlexusBeanSource} backed by runtime annotation metadata.
*/
private static final class PlexusAnnotatedBeanSource
implements PlexusBeanSource
{
// ----------------------------------------------------------------------
// Implementation fields
// ----------------------------------------------------------------------
private final PlexusBeanMetadata metadata;
// ----------------------------------------------------------------------
// Constructors
// ----------------------------------------------------------------------
PlexusAnnotatedBeanSource( final Map<?, ?> variables )
{
metadata = new PlexusAnnotatedMetadata( variables );
}
// ----------------------------------------------------------------------
// Public methods
// ----------------------------------------------------------------------
public PlexusBeanMetadata getBeanMetadata( final Class<?> implementation )
{
return implementation.isAnnotationPresent( Component.class ) ? metadata : null;
}
}
}