/** * Copyright (c) 2002-2012 "Neo Technology," * Network Engine for Objects in Lund AB [http://neotechnology.com] * * This file is part of Neo4j. * * Neo4j is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.neo4j.perftest.enterprise.util; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import static java.lang.reflect.Modifier.isStatic; public abstract class Configuration { public static final Configuration SYSTEM_PROPERTIES = new Configuration() { @Override protected String getConfiguration( String name ) { return System.getProperty( name ); } }; public static Configuration combine( Configuration first, Configuration other, Configuration... more ) { final Configuration[] configurations = new Configuration[2 + (more == null ? 0 : more.length)]; configurations[0] = first; configurations[1] = other; if ( more != null ) { System.arraycopy( more, 0, configurations, 2, more.length ); } return new Configuration() { @Override protected String getConfiguration( String name ) { for ( Configuration configuration : configurations ) { String value = configuration.getConfiguration( name ); if ( value != null ) { return value; } } return null; } }; } public static Setting<?>[] settingsOf( Class<?>... settingsHolders ) { List<Setting<?>> result = new ArrayList<Setting<?>>(); for ( Class<?> settingsHolder : settingsHolders ) { for ( Field field : settingsHolder.getDeclaredFields() ) { if ( isStatic( field.getModifiers() ) && field.getType() == Setting.class ) { field.setAccessible( true ); try { result.add( (Setting) field.get( settingsHolder ) ); } catch ( IllegalAccessException e ) { throw new IllegalStateException( "Field should have been made accessible", e ); } } } } return result.toArray( new Setting<?>[result.size()] ); } public static Configuration fromMap( final Map<String, String> config ) { return new Configuration() { @Override protected String getConfiguration( String name ) { return config.get( name ); } }; } public static final class Builder { public Configuration build() { return fromMap( new HashMap<String, String>( config ) ); } private final Map<String, String> config; private Builder( HashMap<String, String> config ) { this.config = config; } public void set( Setting<?> setting, String value ) { setting.validateValue( value ); config.put( setting.name(), value ); } public <T> void setValue( Setting<T> setting, T value ) { set( setting, setting.asString( value ) ); } } public <T> T get( Setting<T> setting ) { String value = getConfiguration( setting.name() ); if ( value == null ) { return setting.defaultValue(); } return setting.parse( value ); } protected abstract String getConfiguration( String name ); public static Builder builder() { return new Builder( new HashMap<String, String>() ); } }