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    }