001 /* 002 @license.text@ 003 */ 004 package biz.hammurapi.util; 005 006 007 /** 008 * Implements Visitable contract. Subclasses shall implement visitChildren() method. 009 * @author Pavel Vlasov 010 * @version $Revision: 1.4 $ 011 */ 012 public abstract class VisitableBase implements Visitable { 013 014 public boolean accept(Visitor visitor) { 015 if (visitor==null) { 016 return false; 017 } 018 019 if (visitor.visit(this)) { 020 acceptChildren(visitor); 021 if (visitor instanceof PoliteVisitor) { 022 ((PoliteVisitor) visitor).leave(this); 023 } 024 return true; 025 } 026 027 return false; 028 } 029 030 /** 031 * Override this method to navigate visitor through object constituents. 032 * @param visitor 033 */ 034 protected void acceptChildren(Visitor visitor) { 035 // No functionality 036 } 037 038 /** 039 * Properly handles passing visitor to a child - takes into account that child is visitable and visitor may 040 * be an instance of PoliteVisitor. 041 * @param visitor 042 * @param child 043 */ 044 public static void object2visitor(Object object, Visitor visitor) { 045 if (visitor!=null && object!=null) { 046 if (object instanceof Visitable) { 047 ((Visitable) object).accept(visitor); 048 } else { 049 if (visitor.visit(object) && visitor instanceof PoliteVisitor) { 050 ((PoliteVisitor) visitor).leave(object); 051 } 052 } 053 } 054 } 055 }