package rtt.core.manager.data.history; import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import java.util.Calendar; import java.util.List; import rtt.core.archive.configuration.Configuration; import rtt.core.archive.history.History; import rtt.core.archive.history.Version; import rtt.core.archive.input.Input; import rtt.core.archive.output.Output; import rtt.core.loader.ArchiveLoader; import rtt.core.loader.LoaderUtils; import rtt.core.loader.fetching.SimpleFileFetching; import rtt.core.manager.data.AbstractDataManager; import rtt.core.testing.generation.DataGenerator; import rtt.core.testing.generation.Executor; import rtt.core.utils.GenerationInformation.GenerationResult; import rtt.core.utils.RTTLogging; public class OutputDataManager extends AbstractDataManager<History> implements IHistoryManager { public enum OutputDataType { REFERENCE("ref","Reference"), TEST("test", "Test"); private String path; private String text; private OutputDataType(String path, String text) { this.path = path; this.text = text; } public String getPath() { return path; } public String getText() { return text; } } protected OutputManager outputManager; protected String path; protected String suiteName; protected String caseName; private InputManager inputManager; private OutputDataType type; public OutputDataManager(ArchiveLoader loader, String suiteName, String caseName, Configuration config, OutputDataType type) { super(loader); this.suiteName = suiteName; this.caseName = caseName; this.type = type; path = LoaderUtils.getPath(suiteName, caseName, config.getName(), type.getPath()); setFetchingStrategy(new SimpleFileFetching("history.xml", path)); inputManager = new InputManager(loader, suiteName, caseName); outputManager = new OutputManager(loader, path); try { this.load(); } catch (Exception e) { RTTLogging.trace("Could not load output data history", e); } } @Override public final void doSave(History data) { marshall(History.class, data); } @Override public final History doLoad() { History h; try { h = unmarshall(History.class); } catch (Exception e) { h = new History(); } return h; } @Override public String getSuiteName() { return suiteName; } @Override public String getCaseName() { return caseName; } public OutputDataType getType() { return type; } public Output getOutputData(Integer version) { return outputManager.getData(version); } public InputStream getOutputDataInputStream(Integer version) { return outputManager.getStreamData(version); } @Override public History getHistory() { return data; } @Override protected History getEmptyData() { return new History(); } public boolean isOutDated(Integer latestInputID) { for (Version version : data.getVersion()) { if (version.getInputBase().equals(latestInputID)) { return false; } } return true; } public GenerationResult createData(Executor executor, Integer inputVersion, List<String> params) { GenerationResult result = new GenerationResult(suiteName, caseName); Output newOutput = null; try { Input input = inputManager.getInput(inputVersion); newOutput = DataGenerator.generateOutput(input, params, executor); } catch (Throwable t) { RTTLogging.trace("Could not create output data", t); if (t instanceof InvocationTargetException) { t = t.getCause(); } result.exception = t; return result; } result.noError = true; boolean replace = false; int lastVersion = data.getVersion().size(); if (lastVersion == 0) { // previous history data are not available, write new one replace = true; } else { // previous data is available, load and check if data has changed Output oldOutput = outputManager.getData(lastVersion); replace = isOutDated(inputVersion) || !OutputManager.dataEqual(oldOutput, newOutput); } if (replace) { addVersion(newOutput, inputVersion, lastVersion); result.hasReplaced = true; } return result; } private void addVersion(Output newOutput, int inputVersion, int lastVersion) { Version newVersion = new Version(); newVersion.setDate(Calendar.getInstance()); int versionNr = lastVersion + 1; newVersion.setNr(versionNr); newVersion.setInputBase(inputVersion); data.getVersion().add(newVersion); outputManager.setData(newOutput, versionNr); } @Override public boolean equals(Object obj) { if (obj instanceof OutputDataManager) { OutputDataManager manager = (OutputDataManager) obj; if (!manager.suiteName.equals(this.suiteName)) { return false; } if (!manager.caseName.equals(this.caseName)) { return false; } if (manager.loader != this.loader) { return false; } return true; } return false; } @Override public int hashCode() { // TODO Auto-generated method stub return super.hashCode(); } }