| /******************************************************************************* |
| * 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; |
| } |
| } |