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 }