/**
* ExampleBuilder.java
*
* @author Created by Philip Oliver-Paull
*/
package edu.sc.seis.sod.validator.example;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import edu.sc.seis.sod.validator.ModelWalker;
import edu.sc.seis.sod.validator.model.Annotation;
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.DataList;
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.MultigenitorForm;
import edu.sc.seis.sod.validator.model.NamedElement;
import edu.sc.seis.sod.validator.model.Text;
import edu.sc.seis.sod.validator.model.Value;
public class ExampleBuilder {
public ExampleBuilder(boolean htmlReadable) {
if(htmlReadable) {
openBracket = "<";
closeBracket = ">";
} else {
openBracket = "<";
closeBracket = ">";
}
}
public ExampleBuilder(String openBracket, String closeBracket) {
this.openBracket = openBracket;
this.closeBracket = closeBracket;
}
public void setRequiredExample(Annotation ann) {
this.requiredExample = ann;
this.requiredForm = ann.getFormProvider().getForm();
}
public boolean isExampleInserted() {
return exampleInserted;
}
public void write(Form f) {
write(f, true);
}
public void write(Form f, boolean ignoreMin) {
if(f.getMin() == 0 && !ignoreMin && !f.getAnnotation().getInclude()
&& !ModelWalker.isTowards(f, requiredForm)){
return;
}
if(f.equals(requiredForm)) {
exampleInserted = true;
buf.append(requiredExample.getExample(false));
requiredExample = null;
requiredForm = null;
return;
}
//this attribute stuff is wrong. Don't worry right now
if(f instanceof Attribute) {
//System.out.println("f instanceof Attribute");
Attribute attr = (Attribute)f;
if(!attrQueue.contains(attr)) {
attrQueue.add(attr); //this gets rid of double processing of
// attributes
buf.append(' ' + attr.getName() + "=\"");
Form kid = attr.getChild();
if(kid != null) {
write(kid, false);
}
buf.append('\"');
} else {
attrQueue.remove(attr);
}
} else if(f instanceof Choice) {
Choice c = (Choice)f;
Form[] children = c.getChildren();
if(ModelWalker.getDistance(f, requiredForm) != -1) {
int minDist = Integer.MAX_VALUE;
Form chosenChild = null;
for(int i = 0; i < children.length; i++) {
int curDist = ModelWalker.getDistance(children[i],
requiredForm);
if(curDist > -1 && curDist < minDist) {
minDist = curDist;
chosenChild = children[i];
}
}
write(chosenChild, true);
} else {
for(int i = 0; i < children.length; i++) {
if(!ModelWalker.requiresSelfReferentiality(children[i])) {
//System.out.println("otherwise chosen " +
// ModelUtil.toString(children[i]));
write(children[i], false);
break;
}
}
}
} else if(f instanceof Value) {
buf.append(((Value)f).getValue());
} else if(f instanceof Data) {
if(f.getAnnotation().hasExampleFromAnnotation()) {
buf.append(f.getAnnotation().getExample(false));
} else {
buf.append(DEFAULT_INT_VALUE);
}
} else if(f instanceof DataList) {} else if(f instanceof Group
|| f instanceof Interleave) {
MultigenitorForm m = (MultigenitorForm)f;
Form[] kids = m.getChildren();
for(int i = 0; i < kids.length; i++) {
if(requiredExample != null && f.equals(kids[i])) {
write(kids[i], true);
} else {
write(kids[i], false);
}
}
} else if(f instanceof NamedElement) {
NamedElement ne = (NamedElement)f;
buf.append(openBracket + ne.getName());
if(ne.getAttributes() != null) {
Attribute[] attrs = ne.getAttributes();
for(int i = 0; i < attrs.length; i++) {
write(attrs[i], false);
}
}
if(ne.getChild() instanceof Empty
&& !(ne.getChild() instanceof Text)) {
//System.out.println("ne.getChild() instanceof Empty");
buf.append(" /" + closeBracket + '\n');
} else {
buf.append(closeBracket);
Form kid = ne.getChild();
if(kid != null) {
write(kid, false);
}
buf.append(openBracket + '/' + ne.getName() + closeBracket
+ '\n');
}
} else if(f instanceof Text) {
buf.append(DEFAULT_TEXT_VALUE);
} else if(f instanceof Empty) {}
}
public String toString() {
return buf.toString();
}
public static String getNamespacePrefix(String nsURL) {
StringTokenizer tok = new StringTokenizer(nsURL, "/");
String prefix = null;
while(tok.hasMoreTokens()) {
prefix = tok.nextToken();
}
return prefix;
}
private StringBuffer buf = new StringBuffer();
private List attrQueue = new ArrayList();
private String openBracket, closeBracket;
private Annotation requiredExample = null;
private Form requiredForm;
private boolean exampleInserted = false;
public static final String DEFAULT_TEXT_VALUE = "text";
public static final int DEFAULT_INT_VALUE = 12;
}