package uk.co.optimisticpanda.dropwizard.dbdeploy;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import com.dbdeploy.exceptions.DbDeployException;
import com.dbdeploy.scripts.ChangeScript;
import com.google.common.base.Charsets;
public class ClasspathChangeScript extends ChangeScript {
private final String location;
private final Charset encoding;
private static final String UNDO_MARKER = "--//@UNDO";
public ClasspathChangeScript(long id) {
this(id, "test");
}
public ClasspathChangeScript(long id, String description) {
super(id,description);
this.location = null;
this.encoding = Charsets.UTF_8;
}
public ClasspathChangeScript(long id, String location, Charset encoding) {
super(id,location);
this.location = location;
this.encoding = encoding;
}
@Override
public File getFile() {
throw new UnsupportedOperationException("Classpath resources don't neccessarily have files");
}
public String getContent() {
return getChangeContents(false);
}
public String getUndoContent() {
return getChangeContents(true);
}
private String getChangeContents(boolean onlyAfterUndoMarker) {
try {
StringBuilder content = new StringBuilder();
boolean foundUndoMarker = false;
BufferedReader reader = new BufferedReader(ClasspathResourceScanner.reader(encoding, location).getInput());
try {
for (;;) {
String str = reader.readLine();
if (str == null)
break;
if (str.trim().equals(UNDO_MARKER)) {
foundUndoMarker = true;
continue;
}
if (foundUndoMarker == onlyAfterUndoMarker) {
content.append(str);
content.append('\n');
}
}
} finally {
reader.close();
}
return content.toString();
} catch (IOException e) {
throw new DbDeployException("Failed to read change script file", e);
}
}
}