blob: 7233ecbafd10ddc5eaa19603c11b4fc44255f590 [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 java.lang.annotation.Annotation;
import org.codehaus.plexus.component.annotations.Component;
/**
* Partial runtime implementation of Plexus @{@link Component} annotation, supporting the most common attributes.
*/
public final class ComponentImpl
implements Component
{
// ----------------------------------------------------------------------
// Constants
// ----------------------------------------------------------------------
// computed hashCode representing hard-coded attributes
private static final int HASH_CODE_OFFSET = 0x685499F5;
// ----------------------------------------------------------------------
// Implementation fields
// ----------------------------------------------------------------------
private final Class<?> role;
private final String hint;
private final String instantiationStrategy;
private final String description;
// ----------------------------------------------------------------------
// Constructors
// ----------------------------------------------------------------------
public ComponentImpl( final Class<?> role, final String hint, final String instantiationStrategy,
final String description )
{
if ( null == role || null == hint || null == instantiationStrategy || null == description )
{
throw new IllegalArgumentException( "@Component cannot contain null values" );
}
this.role = role;
this.hint = hint;
this.instantiationStrategy = instantiationStrategy;
this.description = description;
}
// ----------------------------------------------------------------------
// Annotation properties
// ----------------------------------------------------------------------
public Class<?> role()
{
return role;
}
public String hint()
{
return hint;
}
public String instantiationStrategy()
{
return instantiationStrategy;
}
public String description()
{
return description;
}
public boolean isolatedRealm()
{
return false;
}
public String alias()
{
return "";
}
public String composer()
{
return "";
}
public String configurator()
{
return "";
}
public String factory()
{
return "";
}
public String lifecycleHandler()
{
return "";
}
public String profile()
{
return "";
}
public String type()
{
return "";
}
public String version()
{
return "";
}
// ----------------------------------------------------------------------
// Standard annotation behaviour
// ----------------------------------------------------------------------
@Override
public boolean equals( final Object rhs )
{
if ( this == rhs )
{
return true;
}
if ( rhs instanceof Component )
{
final Component cmp = (Component) rhs;
if ( role.equals( cmp.role() ) && hint.equals( cmp.hint() )
&& instantiationStrategy.equals( cmp.instantiationStrategy() )
&& description.equals( cmp.description() ) )
{
// optimization: we hard-code all these attributes to be empty
final String hardCodedAttributes = cmp.alias() + cmp.composer() + cmp.configurator() + cmp.factory()
+ cmp.lifecycleHandler() + cmp.profile() + cmp.type() + cmp.version();
return hardCodedAttributes.length() == 0 && !cmp.isolatedRealm();
}
}
return false;
}
@Override
public int hashCode()
{
return HASH_CODE_OFFSET + ( 127 * "role".hashCode() ^ role.hashCode() )
+ ( 127 * "hint".hashCode() ^ hint.hashCode() )
+ ( 127 * "instantiationStrategy".hashCode() ^ instantiationStrategy.hashCode() )
+ ( 127 * "description".hashCode() ^ description.hashCode() );
}
@Override
public String toString()
{
return String.format( "@%s(isolatedRealm=false, composer=, configurator=, alias=, description=%s, "
+ "instantiationStrategy=%s, factory=, hint=%s, type=, lifecycleHandler=, version=, "
+ "profile=, role=%s)", Component.class.getName(), description, instantiationStrategy, hint, role );
}
public Class<? extends Annotation> annotationType()
{
return Component.class;
}
}