/* * Created on Jul 14, 2004 */ package edu.sc.seis.sod.validator.tour; import edu.sc.seis.sod.SodUtil; import edu.sc.seis.sod.validator.documenter.SchemaDocumenter; 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.MultigenitorForm; 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 HTMLOutlineTourist implements Tourist { public HTMLOutlineTourist(String curLoc) { this.curLoc = curLoc.replace('\\', '/'); } public void visit(Attribute attr) { genericVisit(attr); result.append("An attribute named " + attr.getName() + " with a value of "); } public void leave(Attribute attr) { genericLeave(attr); result.append("\n"); } public void visit(Choice choice) { genericVisit(choice); result.append(getDefLink(choice) + " " + getCardinality(choice)); appendIfChildren = " " + getChoiceLink() + "\n<div id=\"choice\">\n"; } public void leave(Choice choice) { appendIfChildren = "</div> \n<br />"; appendIfNoChildren = "<br />\n"; genericLeave(choice); } private String getChoiceLink() { return "<i><a class=\"choice\" href=\"" + getTagDocHelpHREF() + "#choice\">choice</a></i> "; } public void visit(Data d) { genericVisit(d); result.append("<b>"); if(d.isFromDef()) { result.append(getDefLink(d)); } else { result.append("<a href=\"" + getDatatypeHREF(d) + "\">" + d.getDatatype() + "</a>"); } result.append("</b>"); } public void visit(Value v) { genericVisit(v); String output = "<b>" + v.getValue() + "</b>"; if(v.getParent() instanceof MultigenitorForm) { output = "<div>" + output + "</div>\n"; } result.append(output); } public void visit(Empty e) {} public void visit(Group g) { genericVisit(g); String cardinality = getCardinality(g); if(!cardinality.equals("")) { result.append(getDefLink(g) + getGroupLink() + getCardinality(g) + "\n"); } appendIfChildren = "<div id=\"group\">\n"; } public void leave(Group g) { appendIfNoChildren = getDefLink(g) + " "+getCardinality(g) + "<br />\n"; appendIfChildren = "</div>\n"; genericLeave(g); } private String getGroupLink() { return "<i><a href=\"" + getTagDocHelpHREF() + "#group\">group</a> </i>"; } public void visit(Interleave i) { genericVisit(i); result.append(getDefLink(i) + " "+getCardinality(i)); appendIfChildren = getInterLink() + "\n<div id=\"inter\">\n"; } public void leave(Interleave i) { appendIfNoChildren = "<br />\n"; appendIfChildren = "</div> \n"; genericLeave(i); } private String getInterLink() { return "<i><a href=\"" + getTagDocHelpHREF() + "#interleave\">interleave</a></i>"; } public void visit(NamedElement ne) { genericVisit(ne); if(ne.getChild() instanceof Empty) { result.append("<" + getName(ne) + "/>\n"); } else { result.append("<" + getName(ne) + ">"); if(!isData(ne.getChild())) { appendIfChildren = " " + getCardinality(ne) + "<div>\n"; } } } public void leave(NamedElement ne) { appendIfNoChildren = " " + getCardinality(ne) + "<br />"; if(!(ne.getChild() instanceof Empty)) { if(!isData(ne.getChild())) { appendIfChildren = "</div>\n</" + getName(ne) + "><br />\n"; } else { appendIfChildren = "</" + getName(ne) + "> " + getCardinality(ne) + "<br />\n"; } } genericLeave(ne); } private String getName(NamedElement ne) { if(ne.getDef() != null) { return getDefLink(ne, ne.getName()); } else { return ne.getName(); } } public boolean isData(Form f) { return f instanceof Data || f instanceof Value || f instanceof Text; } public void visit(Text t) { genericVisit(t); result.append("<b><a href=\"" + getDatatypeHREF(t) + "\">Any Text</a></b>"); } public void visit(NotAllowed na) {} public String getResult() { return result.toString(); } private String getTagDocHelpHREF() { return getBasePath() + "ingredients/abstractStructure.html"; } private String getBasePath() { String baseString = "../"; for(int i = 0; i < curLoc.length(); i++) { if(curLoc.charAt(i) == '/') { baseString += "../"; } } return baseString; } private String getDatatypeHREF(Form d) { Class c = d.getClass(); //add one to get the final package period if(d instanceof Data) { c = ((Data)d).getDatatype().getClass(); } String classname = c.getName().substring(c.getPackage() .getName() .length() + 1); return getBasePath() + "ingredients/datatypes/" + classname + ".html"; } private String getDefLink(Form f) { if(f.getDef() != null) { return getDefLink(f, f.getDef().getName()); } return ""; } private String getDefLink(Form f, String name) { String path = SchemaDocumenter.makePath(f.getDef()) + ".html"; String href = SodUtil.getRelativePath(curLoc, path, "/"); String title = ""; if(f.getAnnotation().hasSummary()) { title = "title=\"" + f.getAnnotation().getSummary() + "\""; } return "<a href=\"" + href + "\" " + title + ">" + name + "</a>"; } private String getCardinality(Form f) { String baseString = getTagDocHelpHREF(); if(f.getMin() == 0) { if(f.getMax() == 1) { return "<i><a href=\"" + baseString + "#optional\">optional</a> </i>"; } return "<i><a href=\"" + baseString + "#Any number of times\">Any number of times</a> </i>"; } else if(f.getMax() > 1) { return "<i><a href=\"" + baseString + "#At least once\">At least once</a> </i>"; } else { return ""; } } private void genericVisit(Form f) { result.append(appendIfChildren); appendIfChildren = ""; appendIfNoChildren = ""; lastForm = f; } private void genericLeave(Form f) { if(f.equals(lastForm)) { result.append(appendIfNoChildren); } else { result.append(appendIfChildren); } appendIfNoChildren = ""; appendIfChildren = ""; } private Form lastForm; private String appendIfChildren = ""; private String appendIfNoChildren = ""; private String curLoc; private StringBuffer result = new StringBuffer(); }