/******************************************************************************* * 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.io.IOException; import java.io.Reader; import java.io.StringReader; import java.util.Map; import org.codehaus.plexus.component.annotations.Configuration; import org.codehaus.plexus.component.annotations.Requirement; import org.codehaus.plexus.util.IOUtil; import org.codehaus.plexus.util.InterpolationFilterReader; import org.eclipse.sisu.bean.BeanProperty; /** * Runtime {@link PlexusBeanMetadata} based on {@link BeanProperty} annotations. */ public final class PlexusAnnotatedMetadata implements PlexusBeanMetadata { // ---------------------------------------------------------------------- // Implementation fields // ---------------------------------------------------------------------- @SuppressWarnings( "rawtypes" ) private final Map variables; // ---------------------------------------------------------------------- // Constructors // ---------------------------------------------------------------------- /** * Provides runtime Plexus metadata based on simple property annotations. * * @param variables The filter variables */ public PlexusAnnotatedMetadata( final Map<?, ?> variables ) { this.variables = variables; } // ---------------------------------------------------------------------- // Public methods // ---------------------------------------------------------------------- public boolean isEmpty() { return false; // metadata comes from the properties themselves } public Configuration getConfiguration( final BeanProperty<?> property ) { final Configuration configuration = property.getAnnotation( Configuration.class ); if ( configuration != null && variables != null ) { // support runtime interpolation of @Configuration values final String uninterpolatedValue = configuration.value(); final String value = interpolate( uninterpolatedValue ); if ( !value.equals( uninterpolatedValue ) ) { return new ConfigurationImpl( configuration.name(), value ); } } return configuration; } public Requirement getRequirement( final BeanProperty<?> property ) { return property.getAnnotation( Requirement.class ); } // ---------------------------------------------------------------------- // Implementation methods // ---------------------------------------------------------------------- private String interpolate( final String text ) { if ( null == text || !text.contains( "${" ) ) { return text; } // use same interpolation method as XML for sake of consistency final Reader r = new InterpolationFilterReader( new StringReader( text ), variables ); try { return IOUtil.toString( r ); } catch ( final IOException e ) { return text; // should never actually happen, as no actual I/O involved } finally { IOUtil.close( r ); } } }