blob: d1f89f2be6eb1c9bc3db7ace97a060650a4c7764 [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
*
* Minimal facade required to be binary-compatible with legacy Plexus API
*******************************************************************************/
package org.codehaus.plexus.component.repository;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.codehaus.plexus.classworlds.realm.ClassRealm;
import org.codehaus.plexus.configuration.PlexusConfiguration;
import org.eclipse.sisu.plexus.Hints;
import org.eclipse.sisu.plexus.Strategies;
public class ComponentDescriptor<T>
{
// ----------------------------------------------------------------------
// Implementation fields
// ----------------------------------------------------------------------
private String role;
private String hint = Hints.DEFAULT_HINT;
private String description = "";
private String instantiationStrategy = Strategies.SINGLETON;
private String implementation;
private ClassRealm classRealm;
private Class<?> implementationClass;
private String componentComposer;
private String componentConfigurator;
private String componentFactory;
private List<ComponentRequirement> requirements = Collections.emptyList();
private PlexusConfiguration configuration;
private String alias;
private String version;
private String componentType;
private String componentProfile;
private String lifecycleHandler;
private boolean isolatedRealm;
// ----------------------------------------------------------------------
// Constructors
// ----------------------------------------------------------------------
public ComponentDescriptor()
{
// nothing to set
}
public ComponentDescriptor( final Class<T> implementationClass, final ClassRealm classRealm )
{
setImplementationClass( implementationClass );
this.classRealm = classRealm;
}
// ----------------------------------------------------------------------
// Public methods
// ----------------------------------------------------------------------
public final void setRole( final String role )
{
this.role = role;
}
public final void setRoleClass( final Class<?> roleClass )
{
role = roleClass.getName();
}
public final void setRoleHint( final String hint )
{
this.hint = Hints.canonicalHint( hint );
}
public final void setDescription( final String description )
{
this.description = null != description ? description : "";
}
public final void setInstantiationStrategy( final String instantiationStrategy )
{
this.instantiationStrategy = instantiationStrategy;
}
public final void setImplementation( final String implementation )
{
this.implementation = implementation;
implementationClass = null;
}
public final void setRealm( final ClassRealm classRealm )
{
this.classRealm = classRealm;
implementationClass = null;
}
@SuppressWarnings( "rawtypes" )
public final void setImplementationClass( final Class implementationClass )
{
this.implementationClass = implementationClass;
implementation = implementationClass.getName();
}
public final void setComponentComposer( final String componentComposer )
{
this.componentComposer = componentComposer;
}
public final void setComponentConfigurator( final String componentConfigurator )
{
this.componentConfigurator = componentConfigurator;
}
public final void setComponentFactory( final String componentFactory )
{
this.componentFactory = componentFactory;
}
public final void addRequirement( final ComponentRequirement requirement )
{
if ( requirements.isEmpty() )
{
requirements = new ArrayList<ComponentRequirement>();
}
requirements.add( requirement );
}
public final void setConfiguration( final PlexusConfiguration configuration )
{
this.configuration = configuration;
}
public final void setAlias( final String alias )
{
this.alias = alias;
}
public final void setVersion( final String version )
{
this.version = version;
}
public final void setComponentType( final String componentType )
{
this.componentType = componentType;
}
public final void setComponentProfile( final String componentProfile )
{
this.componentProfile = componentProfile;
}
public final void setLifecycleHandler( final String lifecycleHandler )
{
this.lifecycleHandler = lifecycleHandler;
}
public final void setIsolatedRealm( final boolean isolatedRealm )
{
this.isolatedRealm = isolatedRealm;
}
public String getRole()
{
return role;
}
@SuppressWarnings( "unchecked" )
public final Class<T> getRoleClass()
{
try
{
return (Class<T>) classRealm.loadClass( getRole() );
}
catch ( final Exception e )
{
throw new TypeNotPresentException( getRole(), e );
}
catch ( final LinkageError e )
{
throw new TypeNotPresentException( getRole(), e );
}
}
public String getRoleHint()
{
return hint;
}
public final String getDescription()
{
return description;
}
public final String getInstantiationStrategy()
{
return instantiationStrategy;
}
public final String getImplementation()
{
return implementation;
}
public final ClassRealm getRealm()
{
return classRealm;
}
@SuppressWarnings( "unchecked" )
public final Class<T> getImplementationClass()
{
if ( null == implementationClass && null != classRealm )
{
try
{
implementationClass = classRealm.loadClass( implementation );
}
catch ( final Exception e )
{
throw new TypeNotPresentException( implementation, e );
}
catch ( final LinkageError e )
{
throw new TypeNotPresentException( implementation, e );
}
}
return (Class<T>) implementationClass;
}
public final String getComponentComposer()
{
return componentComposer;
}
public final String getComponentConfigurator()
{
return componentConfigurator;
}
public final String getComponentFactory()
{
return componentFactory;
}
public final List<ComponentRequirement> getRequirements()
{
return Collections.unmodifiableList( requirements );
}
public final boolean hasConfiguration()
{
return configuration != null;
}
public final PlexusConfiguration getConfiguration()
{
return configuration;
}
public final String getAlias()
{
return alias;
}
public final String getVersion()
{
return version;
}
public String getComponentType()
{
return componentType;
}
public final String getComponentProfile()
{
return componentProfile;
}
public final String getLifecycleHandler()
{
return lifecycleHandler;
}
public final boolean isIsolatedRealm()
{
return isolatedRealm;
}
public final String getHumanReadableKey()
{
return "role: '" + getRole() + "', implementation: '" + implementation + "', role hint: '" + getRoleHint()
+ "'";
}
@Override
public final String toString()
{
return getClass().getName() + " [role: '" + getRole() + "', hint: '" + getRoleHint() + "', realm: " + classRealm
+ "]";
}
@Override
public boolean equals( final Object rhs )
{
if ( this == rhs )
{
return true;
}
if ( rhs instanceof ComponentDescriptor<?> )
{
final ComponentDescriptor<?> rhsDescriptor = (ComponentDescriptor<?>) rhs;
return equals( getRole(), rhsDescriptor.getRole() ) && equals( getRoleHint(), rhsDescriptor.getRoleHint() )
&& equals( classRealm, rhsDescriptor.classRealm );
}
return false;
}
@Override
public int hashCode()
{
return ( ( 17 * 31 + hash( getRole() ) ) * 31 + hash( getRoleHint() ) ) * 31 + hash( classRealm );
}
// ----------------------------------------------------------------------
// Implementation methods
// ----------------------------------------------------------------------
private static final <T> boolean equals( final T lhs, final T rhs )
{
return null != lhs ? lhs.equals( rhs ) : null == rhs;
}
private static final int hash( final Object obj )
{
return null != obj ? obj.hashCode() : 0;
}
}