/*
* Created on Jul 13, 2004
*/
package edu.sc.seis.sod.validator.tour;
import edu.sc.seis.sod.validator.model.Attribute;
import edu.sc.seis.sod.validator.model.Choice;
import edu.sc.seis.sod.validator.model.Data;
import edu.sc.seis.sod.validator.model.Empty;
import edu.sc.seis.sod.validator.model.Form;
import edu.sc.seis.sod.validator.model.Group;
import edu.sc.seis.sod.validator.model.Interleave;
import edu.sc.seis.sod.validator.model.NamedElement;
import edu.sc.seis.sod.validator.model.NotAllowed;
import edu.sc.seis.sod.validator.model.Text;
import edu.sc.seis.sod.validator.model.Value;
/**
* @author Charlie Groves
*/
public class XMLWritingTourist implements Tourist {
public XMLWritingTourist() {
this(false);
}
public XMLWritingTourist(boolean escapeBrackets) {
if(escapeBrackets) {
open = "<";
close = ">";
}
}
private Form preAttrForm;
public void visit(Attribute attr) {
replaceClose("");
write(" " + attr.getName() + "=\"");
preAttrForm = lastForm;
}
public void leave(Attribute attr) {
write("\"" + close);
lastForm = preAttrForm;
}
public void visit(Data d) {
lastForm = d;
if(d.getAnnotation().hasExampleFromAnnotation()) {
write(d.getAnnotation().getExample());
} else {
write(d.getDatatype().getExampleValue());
}
}
public void visit(NamedElement ne) {
if(!ne.equals(lastForm) && lastForm != null && !leftLast) {
write("\n");
}
if(waitToLeave == null && ne.getAnnotation().hasExampleFromAnnotation()) {
String example = ne.getAnnotation().getExample(true);
indentAndWrite(example.replaceAll("\n", "\n" + getCurIndent())
+ "\n");
waitToLeave = ne;
} else {
indentAndWrite(open + ne.getName() + close);
lastForm = ne;
leftLast = false;
}
depth++;
}
public void leave(NamedElement ne) {
depth--;
if(ne.equals(lastForm)) {
replaceClose("/" + close + "\n");
} else {
indentAndWrite(open + "/" + ne.getName() + close + "\n");
}
leftLast = true;
if(ne.equals(waitToLeave)) {
waitToLeave = null;
}
}
private void indentAndWrite(String text) {
write(getCurIndent() + text);
}
private String getCurIndent() {
StringBuffer indent = new StringBuffer();
if(result.length() > 0 && result.charAt(result.length() - 1) == '\n') {
for(int i = 0; i < depth; i++) {
indent.append(" ");
}
}
return indent.toString();
}
private void write(String text) {
if(waitToLeave == null) {
result.append(text);
}
}
private void replaceClose(String with) {
if(waitToLeave == null) {
result.replace(result.length() - close.length(),
result.length(),
with);
}
}
public void visit(Text t) {
lastForm = t;
if(t.getAnnotation().hasExampleFromAnnotation()) {
write(t.getAnnotation().getExample());
} else {
write(DEFAULT_TEXT_VALUE);
}
}
public void visit(Value v) {
lastForm = v;
write(v.getValue());
}
public String getResult() {
return result.toString();
}
public void visit(Choice choice) {}
public void leave(Choice choice) {}
public void visit(Empty e) {}
public void visit(Group g) {}
public void leave(Group g) {}
public void visit(Interleave i) {}
public void leave(Interleave i) {}
public void visit(NotAllowed na) {}
private StringBuffer result = new StringBuffer();
private boolean leftLast;
int depth = 0;
private Form lastForm;
private Form waitToLeave;
public static final int DEFAULT_INT_VALUE = 12;
public static final String DEFAULT_TEXT_VALUE = "text";
private String open = "<";
private String close = ">";
}