/* * Created on Jul 13, 2004 */ package edu.sc.seis.sod.validator.tour; import edu.sc.seis.sod.validator.ModelWalker; 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.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.Text; import edu.sc.seis.sod.validator.model.Value; /** * @author Charlie Groves */ public class MinimalVisitGuide implements TourGuide { private Form root; public MinimalVisitGuide(Form root) { this.root = root; } public void lead(Tourist visitor) { internalLead(visitor, root); } private void internalLead(Tourist visitor, Form curForm) { if (curForm.equals(root) || curForm.getMin() != 0 || curForm.getAnnotation().getInclude()) { if (curForm instanceof NamedElement) { NamedElement cur = (NamedElement) curForm; visitor.visit(cur); internalLead(visitor, cur.getChild()); visitor.leave(cur); } else if (curForm instanceof Choice) { Choice c = (Choice) curForm; visitor.visit(c); Form[] children = c.getChildren(); for (int i = 0; i < children.length; i++) { if (!ModelWalker.requiresSelfReferentiality(children[i])) { internalLead(visitor, children[i]); break; } } visitor.leave(c); } else if (curForm instanceof Group) { Group g = (Group) curForm; visitor.visit(g); Form[] children = g.getChildren(); for (int i = 0; i < children.length; i++) { if (!ModelWalker.requiresSelfReferentiality(children[i])) { internalLead(visitor, children[i]); } } visitor.leave(g); } else if (curForm instanceof Interleave) { Interleave g = (Interleave) curForm; visitor.visit(g); Form[] children = g.getChildren(); for (int i = 0; i < children.length; i++) { if (!ModelWalker.requiresSelfReferentiality(children[i])) { internalLead(visitor, children[i]); } } visitor.leave(g); } else if (curForm instanceof Value) { visitor.visit((Value) curForm); } else if (curForm instanceof Data) { visitor.visit((Data) curForm); } else if (curForm instanceof Text) { visitor.visit((Text) curForm); }else if (curForm instanceof Attribute){ Attribute attr = (Attribute)curForm; visitor.visit(attr); internalLead(visitor, attr.getChild()); visitor.leave(attr); } } } }