package com.eucalyptus.configurable; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import org.apache.log4j.Logger; import com.eucalyptus.configurable.PropertyDirectory.NoopEventListener; import com.eucalyptus.event.PassiveEventListener; public class StaticPropertyEntry extends AbstractConfigurableProperty { static Logger LOG = Logger.getLogger( StaticPropertyEntry.class ); private Field field; public StaticPropertyEntry( Class definingClass, String entrySetName, Field field, String description, String defaultValue, PropertyTypeParser typeParser, Boolean readOnly, String displayName, ConfigurableFieldType widgetType, String alias, PassiveEventListener changeListener ) { super( definingClass, entrySetName, field.getName( ), defaultValue, description, typeParser, readOnly, displayName, widgetType, alias, changeListener ); this.field = field; } public Field getField( ) { return this.field; } @Override public String getValue( ) { try { return ""+this.field.get( null ); } catch ( Exception e ) { LOG.debug( e, e ); return super.getDefaultValue(); } } @Override public String setValue( String s ) { try { Object o = super.getTypeParser( ).parse( s ); this.field.set( null, o ); this.fireChange( ); LOG.info( "Set configurable property: " + super.getQualifiedName( ) + " to " + s ); } catch ( Throwable t ) { LOG.warn( "Failed to set property: " + super.getQualifiedName( ) + " because of " + t.getMessage( ) ); LOG.debug( t, t ); } return this.getValue( ); } public static class StaticPropertyBuilder implements ConfigurablePropertyBuilder { private static String qualifiedName( Class c, Field f ) { ConfigurableClass annote = ( ConfigurableClass ) c.getAnnotation( ConfigurableClass.class ); return annote.root( ) + "." + f.getName( ).toLowerCase( ); } @Override public ConfigurableProperty buildProperty( Class c, Field field ) throws ConfigurablePropertyException { if( c.isAnnotationPresent( ConfigurableClass.class ) && field.isAnnotationPresent( ConfigurableField.class ) ) { ConfigurableClass classAnnote = ( ConfigurableClass ) c.getAnnotation( ConfigurableClass.class ); ConfigurableField annote = ( ConfigurableField ) field.getAnnotation( ConfigurableField.class ); String description = annote.description( ); String defaultValue = annote.initial( ); String fq = qualifiedName( c, field ); String fqPrefix = fq.replaceAll( "\\..*", "" ); String alias = classAnnote.alias(); PropertyTypeParser p = PropertyTypeParser.get( field.getType( ) ); ConfigurableProperty entry = null; Class<? extends PassiveEventListener> changeListenerClass = annote.changeListener( ); PassiveEventListener changeListener; if( !changeListenerClass.equals( NoopEventListener.class ) ) { try { changeListener = changeListenerClass.newInstance( ); } catch ( Throwable e ) { changeListener = NoopEventListener.NOOP; } } else { changeListener = NoopEventListener.NOOP; } int modifiers = field.getModifiers( ); if ( Modifier.isPublic( modifiers ) && Modifier.isStatic( modifiers ) ) { entry = new StaticPropertyEntry( c, fqPrefix, field, description, defaultValue, p, annote.readonly( ), annote.displayName(), annote.type(), alias, changeListener ); entry.setValue( defaultValue ); return entry; } } return null; } } }