blob: 899b54a518820d16d140fd22335619407d7220db [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010-present 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 javax.inject.Inject;
import javax.inject.Named;
import org.codehaus.plexus.component.annotations.Configuration;
import org.codehaus.plexus.component.annotations.Requirement;
import org.eclipse.sisu.bean.BeanManager;
import org.eclipse.sisu.bean.BeanProperty;
import org.eclipse.sisu.bean.PropertyBinding;
import org.eclipse.sisu.inject.DeferredClass;
import org.eclipse.sisu.space.URLClassSpace;
import com.google.inject.AbstractModule;
import com.google.inject.Binder;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.name.Names;
import junit.framework.TestCase;
public class PlexusBeanMetadataTest
extends TestCase
{
@Inject
@Named( "2" )
Bean bean;
@Inject
Injector injector;
@Override
protected void setUp()
{
Guice.createInjector( new AbstractModule()
{
@Override
protected void configure()
{
install( new PlexusDateTypeConverter() );
bind( PlexusBeanLocator.class ).to( DefaultPlexusBeanLocator.class );
bind( PlexusBeanConverter.class ).to( PlexusXmlBeanConverter.class );
bindConstant().annotatedWith( Names.named( "KEY1" ) ).to( "REQUIREMENT" );
final BeanManager manager = new TestBeanManager();
install( new PlexusBindingModule( null, new BeanSourceA() ) );
install( new PlexusBindingModule( manager, new BeanSourceB() ) );
install( new PlexusBindingModule( null, new BeanSourceC() ) );
install( new PlexusBindingModule( null, new CustomizedBeanSource() ) );
requestInjection( PlexusBeanMetadataTest.this );
}
} );
}
static class TestBeanManager
implements BeanManager
{
public boolean manage( final Class<?> clazz )
{
return false;
}
public PropertyBinding manage( final BeanProperty<?> property )
{
return null;
}
public boolean manage( final Object bean )
{
return false;
}
public boolean unmanage( final Object bean )
{
return false;
}
public boolean unmanage()
{
return false;
}
}
interface Bean
{
Object getExtraMetadata();
void setExtraMetadata( Object metadata );
}
static class DefaultBean1
implements Bean
{
Object extraMetadata;
public Object getExtraMetadata()
{
return extraMetadata;
}
public void setExtraMetadata( final Object metadata )
{
extraMetadata = metadata;
}
}
static class DefaultBean2
{
String extraMetadata;
String leftovers;
}
static class BeanSourceA
implements PlexusBeanModule
{
public PlexusBeanSource configure( final Binder binder )
{
binder.withSource( "A" ).bind( Bean.class ).annotatedWith( Names.named( "2" ) ).to( DefaultBean1.class ).asEagerSingleton();
return null;
}
}
static class BeanSourceB
implements PlexusBeanModule
{
public PlexusBeanSource configure( final Binder binder )
{
binder.withSource( "B" ).bind( DefaultBean2.class );
return null;
}
}
static class BeanSourceC
implements PlexusBeanModule
{
public PlexusBeanSource configure( final Binder binder )
{
binder.withSource( "C" ).bind( DefaultBean2.class ).annotatedWith( Names.named( "2" ) ).to( DefaultBean2.class );
return null;
}
}
static class CustomizedBeanSource
implements PlexusBeanModule, PlexusBeanSource
{
public PlexusBeanSource configure( final Binder binder )
{
return this;
}
public PlexusBeanMetadata getBeanMetadata( final Class<?> implementation )
{
if ( DefaultBean1.class.equals( implementation ) )
{
return new PlexusBeanMetadata()
{
public boolean isEmpty()
{
return false;
}
@SuppressWarnings( "deprecation" )
public Requirement getRequirement( final BeanProperty<?> property )
{
if ( "extraMetadata".equals( property.getName() ) )
{
return new RequirementImpl( String.class, false, "KEY1" );
}
return null;
}
public Configuration getConfiguration( final BeanProperty<?> property )
{
return null;
}
};
}
if ( DefaultBean2.class.equals( implementation ) )
{
return new PlexusBeanMetadata()
{
private boolean used = false;
public boolean isEmpty()
{
return used;
}
public Requirement getRequirement( final BeanProperty<?> property )
{
return null;
}
public Configuration getConfiguration( final BeanProperty<?> property )
{
if ( "extraMetadata".equals( property.getName() ) )
{
used = true;
return new ConfigurationImpl( "KEY2", "CONFIGURATION" );
}
return null;
}
};
}
return null;
}
}
public void testExtraMetadata()
{
assertEquals( "REQUIREMENT", bean.getExtraMetadata() );
assertEquals( "CONFIGURATION", injector.getInstance( DefaultBean2.class ).extraMetadata );
assertSame( bean, injector.getInstance( Key.get( Bean.class, Names.named( "2" ) ) ) );
}
static DeferredClass<?> defer( final Class<?> clazz )
{
return new URLClassSpace( TestCase.class.getClassLoader() ).deferLoadClass( clazz.getName() );
}
}