package rtt.core.manager.data.history;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.Calendar;
import rtt.core.archive.history.History;
import rtt.core.archive.history.Version;
import rtt.core.archive.input.Input;
import rtt.core.exceptions.RTTException;
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.utils.RTTLogging;
public class InputManager extends AbstractDataManager<History> implements
IHistoryManager {
private String suiteName;
private String caseName;
private int versionCount;
public InputManager(ArchiveLoader loader, String suiteName, String caseName) {
super(loader, new SimpleFileFetching("history.xml",
LoaderUtils.getPath(".", suiteName, caseName, "input")));
this.suiteName = suiteName;
this.caseName = caseName;
try {
load();
} catch (RTTException e) {
RTTLogging.trace("Could not load input history", e);
}
versionCount = data.getVersion().size();
}
@Override
public String getSuiteName() {
return suiteName;
}
@Override
public String getCaseName() {
return caseName;
}
@Override
protected History getEmptyData() {
return new History();
}
@Override
protected final History doLoad() {
History history;
try {
history = unmarshall(History.class);
} catch (Exception e) {
history = new History();
}
return history;
}
@Override
public final void doSave(History data) {
marshall(History.class, data);
}
@Override
public final History getHistory() {
return data;
}
public boolean addInput(Input newData, boolean force) {
Integer versionNr = versionCount;
Input oldData = getInput(versionNr);
if (force || (dataEqual(oldData, newData) == false)) {
versionNr++;
Version version = new Version();
version.setNr(versionNr);
version.setDate(Calendar.getInstance());
data.getVersion().add(version);
versionCount = versionNr;
// CHRISTIAN wirklich schon speichern ?
try {
OutputStream os = loader.getOutputStream("input." + versionNr
+ ".src", strategy.getFolders());
os.write(newData.getValue().getBytes());
os.flush();
os.close();
} catch (Exception e) {
RTTLogging.trace("Could not write input data", e);
}
return true;
}
return false;
}
public Input getInput(Integer version) {
Input input = new Input();
InputStream in = loader.getInputStream("input." + version + ".src",
strategy.getFolders());
if (in != null) {
input.setValue(getContent(in));
try {
in.close();
} catch (IOException e) {
RTTLogging.trace("Could not retrieve input", e);
}
return input;
}
return new Input();
}
public boolean dataEqual(Input oldData, Input newData) {
if (oldData == null || oldData.getValue() == null) {
return false;
}
if (newData == null || newData.getValue() == null) {
return false;
}
return oldData.getValue().equals(newData.getValue());
}
public static String getContent(InputStream input) {
if (input != null) {
StringBuffer fileData = new StringBuffer(1000);
BufferedReader reader = new BufferedReader(new InputStreamReader(
input));
try {
char[] buf = new char[1024];
int numRead = 0;
while ((numRead = reader.read(buf)) != -1) {
String readData = String.valueOf(buf, 0, numRead);
fileData.append(readData);
buf = new char[1024];
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch (IOException e) {
RTTLogging.trace("Could not get content from InputStream", e);
}
}
return fileData.toString();
}
return "";
}
}