package org.neo4j.kernel.impl.management; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.management.AttributeList; import javax.management.AttributeNotFoundException; import javax.management.MBeanAttributeInfo; import javax.management.MBeanException; import javax.management.MBeanInfo; import javax.management.NotCompliantMBeanException; import javax.management.ReflectionException; import org.neo4j.kernel.Config; @Description( "The configuration parameters used to configure Neo4j" ) class Configuration extends Neo4jMBean { private static final Map<String, String> parameterDescriptions; static { final Map<String, String> descriptions = new HashMap<String, String>(); for ( final Field field : Config.class.getFields() ) { if ( Modifier.isStatic( field.getModifiers() ) && Modifier.isFinal( field.getModifiers() ) ) { final Description descr = field.getAnnotation( Description.class ); if ( descr == null || field.getType() != String.class ) continue; try { if ( !field.isAccessible() ) field.setAccessible( true ); descriptions.put( (String) field.get( null ), descr.value() ); } catch ( Exception e ) { continue; } } } parameterDescriptions = Collections.unmodifiableMap( descriptions ); } private final Map<Object, Object> config; Configuration( int instanceId, Map<Object, Object> config ) throws NotCompliantMBeanException { super( instanceId ); this.config = config; } private static String describeConfigParameter( String param ) { String description = parameterDescriptions.get( param ); return description != null ? description : "Configuration attribute"; } private MBeanAttributeInfo[] keys() { List<MBeanAttributeInfo> keys = new ArrayList<MBeanAttributeInfo>(); for ( Map.Entry<Object, Object> entry : config.entrySet() ) { if ( entry.getKey() instanceof String ) { keys.add( new MBeanAttributeInfo( (String) entry.getKey(), String.class.getName(), describeConfigParameter( (String) entry.getKey() ), true, false, false ) ); } } return keys.toArray( new MBeanAttributeInfo[keys.size()] ); } @Override public Object getAttribute( String attribute ) throws AttributeNotFoundException, MBeanException, ReflectionException { return config.get( attribute ); } @Override public AttributeList getAttributes( String[] attributes ) { AttributeList result = new AttributeList( attributes.length ); for ( String attribute : attributes ) { try { result.add( getAttribute( attribute ) ); } catch ( Exception e ) { throw new RuntimeException( e ); } } return result; } @Override public MBeanInfo getMBeanInfo() { Description description = getClass().getAnnotation( Description.class ); return new MBeanInfo( getClass().getName(), description != null ? description.value() : "Neo4j configuration", keys(), null, null, null ); } }