/* Copyright 2012 Google, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.arbeitspferde.groningen.config; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.arbeitspferde.groningen.config.GroningenConfig.ClusterConfig; import org.arbeitspferde.groningen.config.GroningenConfig.SubjectConfig; import org.arbeitspferde.groningen.config.GroningenConfig.SubjectGroupConfig; import org.arbeitspferde.groningen.experimentdb.jvmflags.JvmFlag; import org.arbeitspferde.groningen.proto.GroningenConfigProto.ProgramConfiguration; import org.arbeitspferde.groningen.proto.Params.GroningenParams; import org.arbeitspferde.groningen.proto.Params.GroningenParamsOrBuilder; import javax.annotation.Nullable; import java.lang.reflect.Field; import java.util.List; import java.util.Map; /** * Stub for enabling a ConfigManagerProvider system. Classes defined here have a generic mutator * which sets fields via reflection in addition to the accessors so that return values can be set. * The mutator is static in the top level class and therefore requires that member vars are * protected and not private. */ public class StubConfigManager implements ConfigManager { /** * Generic mutator. * * @param dest an {@link Object} which should be mutated * @param varName name of the instance var (remove the get from the accessor and lowercase the new * first letter) as a {@link String} * @param newValue an {@link Object} representing the new value. primitive types will need to be * passed in as their Object counterparts * @return true iff the set was successful, false if an exception was thrown during modification */ public static boolean set(Object dest, String varName, Object newValue) { boolean ret = true; // errors are swallowed as this expected to only be used during development // and testing try { Field instanceVar = dest.getClass().getDeclaredField(varName); instanceVar.set(dest, newValue); } catch (IllegalAccessException e) { ret = false; } catch (IllegalArgumentException e) { ret = false; } catch (SecurityException e) { ret = false; } catch (NoSuchFieldException e) { ret = false; } return ret; } /** * @see org.arbeitspferde.groningen.config.ConfigManager#initialize() */ @Override public void initialize() { // nothing to do } /** * @see org.arbeitspferde.groningen.config.ConfigManager#queryConfig() */ @Override public GroningenConfig queryConfig() { return null; } /** * Stub Config class that can be modified * */ public static class StubConfig implements GroningenConfig { // Instance vars map to the getters in GroningenConfig protected final Map<String, ClusterConfig> clusterConfigs = Maps.newHashMap(); protected final SearchSpaceBundle searchSpaceBundle = null; protected GroningenParams paramBlock = null; /** * @see org.arbeitspferde.groningen.config.GroningenConfig#getClusterConfig(String) */ @Override public ClusterConfig getClusterConfig(String clusterName) { return clusterConfigs.get(clusterName); } /** * @see org.arbeitspferde.groningen.config.GroningenConfig#getClusterConfigs() */ @Override public ImmutableList<ClusterConfig> getClusterConfigs() { return ImmutableList.copyOf(clusterConfigs.values()); } /** * @see org.arbeitspferde.groningen.config.GroningenConfig#getJvmSearchSpaceRestriction() */ @Override public SearchSpaceBundle getJvmSearchSpaceRestriction() { return searchSpaceBundle; } /** * @see org.arbeitspferde.groningen.config.GroningenConfig#getParamBlock() */ @Override public GroningenParamsOrBuilder getParamBlock() { return paramBlock; } @Override public ProgramConfiguration getProtoConfig() { throw new RuntimeException("Not implemented."); } } /** * Stub implementation of ClusterConfig * * Use the mutator in StubConfigManager * */ public static class StubClusterConfig implements ClusterConfig { @Nullable protected final GroningenConfig parentConfig = null; protected final Map<String, SubjectGroupConfig> groupConfigs = Maps.newHashMap(); protected final String name = null; /** * @see GroningenConfig.ClusterConfig#getSubjectGroupConfig(String) */ @Override public SubjectGroupConfig getSubjectGroupConfig(String name) { return groupConfigs.get(name); } /** * @see org.arbeitspferde.groningen.config.GroningenConfig.ClusterConfig#getSubjectGroupConfigs() */ @Override public ImmutableList<SubjectGroupConfig> getSubjectGroupConfigs() { return ImmutableList.copyOf(groupConfigs.values()); } /** * @see org.arbeitspferde.groningen.config.GroningenConfig.ClusterConfig#getName() */ @Override public String getName() { return name; } /** * @see org.arbeitspferde.groningen.config.GroningenConfig.ClusterConfig#getParentConfig() */ @Override public GroningenConfig getParentConfig() { return parentConfig; } } /** * Stub implementation of SubjectGroupConfig * * Use the mutator in StubConfigManager * */ public static class StubGroupConfig implements SubjectGroupConfig { protected final ClusterConfig parentCluster = null; protected final String expSettingsFilesDir = null; protected final String name = null; protected final String user = null; protected List<String> restartCommand = Lists.newArrayList(); protected final List<SubjectConfig> specialSubjectConfigs = Lists.newArrayList(); protected final int numberOfSubjects = 0; protected final int subjectWarmupTimeout = 0; protected final int numberOfDefaultSubjects = 0; /** * @see SubjectGroupConfig#getName() */ @Override public String getName() { return name; } /** * @see SubjectGroupConfig#getSpecialSubjectConfigs() */ @Override public ImmutableList<SubjectConfig> getSpecialSubjectConfigs() { return ImmutableList.copyOf(specialSubjectConfigs); } /** * @see SubjectGroupConfig#getUser() */ @Override public String getUser() { return user; } /** * @see SubjectGroupConfig#getParentCluster() */ @Override public ClusterConfig getParentCluster() { return parentCluster; } @Override public int getNumberOfSubjects() { return numberOfSubjects; } @Override public int getNumberOfDefaultSubjects() { return numberOfDefaultSubjects; } @Override public int getSubjectWarmupTimeout() { return subjectWarmupTimeout; } @Override public String getExperimentSettingsFilesDir() { return expSettingsFilesDir; } /** * Set the restart command. */ public void setRestartCommand(List<String> newCommand) { restartCommand = newCommand; } @Override public boolean hasRestartCommand() { return restartCommand.size() > 0; } @Override public String[] getRestartCommand() { return restartCommand.toArray(new String[0]); } } /** * Stub implementation of SubjectConfig * * Use the mutator in StubConfigManager * */ public static class StubSubjectConfig implements SubjectConfig { protected final SubjectGroupConfig parentGroup = null; protected final SearchSpaceBundle jvmSearchSpaceDefinition = null; protected final int subjectIndex = -1; /** * @see SubjectConfig#getJvmSearchSpaceDefinition() */ @Override public SearchSpaceBundle getJvmSearchSpaceDefinition() { return jvmSearchSpaceDefinition; } /** * @see SubjectConfig#getSubjectIndex() */ @Override public Integer getSubjectIndex() { return subjectIndex; } /* * (non-Javadoc) * * @see * com.google.perftools.jtune.config.GroningenConfig.SubjectConfig#getParentGroup() */ @Override public SubjectGroupConfig getParentSubjectGroup() { return parentGroup; } } /** * Stub implementation of {@link SearchSpaceBundle} which allows the user to * generate an array of {@link SearchSpaceBundle.SearchSpaceEntry * SearchSpaceEntry.SearchSpaceEntrys} which can then be retrieved. A stub * implementation of {@link SearchSpaceBundle.SearchSpaceEntry} can be found * at {@link StubSearchSpaceEntry}. * * The reflection based mutator above can be used to set the searchSpaces * which is an array of {@link SearchSpaceBundle.SearchSpaceEntry} */ public static class StubSearchSpaceBundle implements SearchSpaceBundle { protected final SearchSpaceEntry[] searchSpaces = new SearchSpaceEntry[JvmFlag.values().length]; /** * Retrieve a specific CommandLineArgument from the current searchSpaces * array. You will want to set that array before using this method. */ @Override public SearchSpaceEntry getSearchSpace(JvmFlag arg) { if (arg.ordinal() >= searchSpaces.length) { throw new IllegalArgumentException("CommandLineArgument outside expected range"); } return searchSpaces[arg.ordinal()]; } /** * Retrieve a copy of the searchSpaces array. You will want to set that * array before using this method. */ @Override public SearchSpaceEntry[] getSearchSpaces() { return searchSpaces.clone(); } } /** * Bean for holding SearchSpaceEntry information * * Constructor sets but instance vars can be reset using reflection based * mutator above */ public static class StubSearchSpaceEntry implements SearchSpaceBundle.SearchSpaceEntry { protected JvmFlag representedArg = null; protected Long floor = Long.MAX_VALUE; protected Long ceiling = Long.MIN_VALUE; protected Long stepSize = Long.MIN_VALUE; public StubSearchSpaceEntry(JvmFlag arg, long floor, long ceiling, long step) { representedArg = arg; this.floor = floor; this.ceiling = ceiling; this.stepSize = step; } /** * @see SearchSpaceBundle.SearchSpaceEntry#getRepresentedArg() */ @Override public JvmFlag getRepresentedArg() { return representedArg; } /** * @see SearchSpaceBundle.SearchSpaceEntry#getFloor() */ @Override public long getFloor() { return floor; } /** * @see SearchSpaceBundle.SearchSpaceEntry#getCeiling() */ @Override public long getCeiling() { return ceiling; } /** * @see SearchSpaceBundle.SearchSpaceEntry#getStepSize() */ @Override public long getStepSize() { return stepSize; } } /** * @see ConfigManager#shutdown() */ @Override public void shutdown() { } }