package com.googlecode.zohhak.internal; import java.util.ArrayList; import java.util.List; import com.googlecode.zohhak.api.Configuration; import com.googlecode.zohhak.api.Configure; import com.googlecode.zohhak.api.DefaultConfiguration; import com.googlecode.zohhak.internal.model.ConfigLine; import com.googlecode.zohhak.internal.model.ConfigurationBuilder; import com.googlecode.zohhak.internal.model.SingleTestMethod; public class ConfigurationResolver { private final ConfigLine defaultConfigLine = new ConfigLine(new DefaultConfiguration()); //TODO test it. refactor singletestMethod for easier mocking. check if result does not contain repeated classes public ConfigurationBuilder calculateConfiguration(SingleTestMethod singleTestMethod) { List<ConfigLine> configLines = addConfigLines(singleTestMethod); return mergeConfig(configLines); } private List<ConfigLine> addConfigLines(SingleTestMethod singleTestMethod) { List<ConfigLine> configs = new ArrayList<ConfigLine>(); Configure configure = singleTestMethod.realMethod.getDeclaringClass().getAnnotation(Configure.class); if (configure != null) { addConfigLine(configure.configuration(), configs); //config field from class configs.add(new ConfigLine(configure)); //rest fields from class } addConfigLine(singleTestMethod.annotation.configuration(), configs); //config field from method configs.add(new ConfigLine(singleTestMethod.annotation)); //rest fields from method //TODO @Configure annotation from method return configs; } ConfigurationBuilder mergeConfig(List<ConfigLine> configLines) { ConfigurationBuilder builder = new ConfigurationBuilder(); builder.addConfigLine(defaultConfigLine); for (ConfigLine configLine : configLines) { builder.addConfigLine(configLine); } return builder; } private void addConfigLine(Class<? extends Configuration> configuration, List<ConfigLine> configs) { try { Configuration instance = configuration.newInstance(); //TODO cache it configs.add(new ConfigLine(instance)); } catch (Exception e) { throw new IllegalArgumentException("Cannot instantiate configuration class: "+configuration.getName(), e); } } }