01: /*
02: * hgcommons 7
03: * Hammurapi Group Common Library
04: * Copyright (C) 2003 Hammurapi Group
05: *
06: * This program is free software; you can redistribute it and/or
07: * modify it under the terms of the GNU Lesser General Public
08: * License as published by the Free Software Foundation; either
09: * version 2 of the License, or (at your option) any later version.
10: *
11: * This program is distributed in the hope that it will be useful,
12: * but WITHOUT ANY WARRANTY; without even the implied warranty of
13: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14: * Lesser General Public License for more details.
15: *
16: * You should have received a copy of the GNU Lesser General Public
17: * License along with this library; if not, write to the Free Software
18: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19: *
20: * URL: http://www.hammurapi.biz/hammurapi-biz/ef/xmenu/hammurapi-group/products/products/hgcommons/index.html
21: * e-Mail: support@hammurapi.biz
22: */
23: package biz.hammurapi.util;
24:
25: /**
26: * Implements Visitable contract. Subclasses shall implement visitChildren() method.
27: * @author Pavel Vlasov
28: * @version $Revision: 1.4 $
29: */
30: public abstract class VisitableBase implements Visitable {
31:
32: public boolean accept(Visitor visitor) {
33: if (visitor == null) {
34: return false;
35: }
36:
37: if (visitor.visit(this )) {
38: acceptChildren(visitor);
39: if (visitor instanceof PoliteVisitor) {
40: ((PoliteVisitor) visitor).leave(this );
41: }
42: return true;
43: }
44:
45: return false;
46: }
47:
48: /**
49: * Override this method to navigate visitor through object constituents.
50: * @param visitor
51: */
52: protected void acceptChildren(Visitor visitor) {
53: // No functionality
54: }
55:
56: /**
57: * Properly handles passing visitor to a child - takes into account that child is visitable and visitor may
58: * be an instance of PoliteVisitor.
59: * @param visitor
60: * @param child
61: */
62: public static void object2visitor(Object object, Visitor visitor) {
63: if (visitor != null && object != null) {
64: if (object instanceof Visitable) {
65: ((Visitable) object).accept(visitor);
66: } else {
67: if (visitor.visit(object)
68: && visitor instanceof PoliteVisitor) {
69: ((PoliteVisitor) visitor).leave(object);
70: }
71: }
72: }
73: }
74: }
|