/* * 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.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; /** * @author Charlie Groves * * Takes a tourist that it leads through all of the children of the root node. * The path taken may not even be valid, so be forewarned */ public class MaximalVisitGuide implements TourGuide { public MaximalVisitGuide(Form root) { this.root = root; } public void lead(Tourist visitor) { internalLead(visitor, root); } private void internalLead(Tourist visitor, Form curForm) { if (!ModelWalker.lineageContainsRefTo(curForm, curForm.getDef(), root)) { 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); handleKids(visitor, c); visitor.leave(c); } else if (curForm instanceof Group) { Group g = (Group) curForm; visitor.visit(g); handleKids(visitor, g); visitor.leave(g); } else if (curForm instanceof Interleave) { Interleave g = (Interleave) curForm; visitor.visit(g); handleKids(visitor, g); 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); } } else { MinimalVisitGuide min = new MinimalVisitGuide(curForm); min.lead(visitor); } } private void handleKids(Tourist visitor, MultigenitorForm f) { Form[] children = f.getChildren(); for (int i = 0; i < children.length; i++) { internalLead(visitor, children[i]); } } private Form root; }