KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > bridge > implementation > BasicNodeList


1 /*
2
3 This software is OSI Certified Open Source Software.
4 OSI Certified is a certification mark of the Open Source Initiative.
5
6 The license (Mozilla version 1.0) can be read at the MMBase site.
7 See http://www.MMBase.org/license
8
9 */

10
11 package org.mmbase.bridge.implementation;
12
13 import java.util.Collection JavaDoc;
14 import java.util.Map JavaDoc;
15 import org.mmbase.bridge.*;
16 import org.mmbase.module.core.*;
17 import org.mmbase.bridge.util.MapNode;
18 import org.mmbase.module.corebuilders.*;
19 import org.mmbase.util.logging.*;
20
21 /**
22  * A list of nodes
23  *
24  * @author Pierre van Rooden
25  * @version $Id: BasicNodeList.java,v 1.47 2006/07/09 14:14:39 michiel Exp $
26  */

27 public class BasicNodeList extends BasicList implements NodeList {
28
29     private static final Logger log = Logging.getLoggerInstance(BasicNodeList.class);
30     protected Cloud cloud;
31     protected NodeManager nodeManager = null;
32
33     BasicNodeList() {
34         super();
35     }
36
37     BasicNodeList(Collection JavaDoc c, Cloud cloud) {
38         super(c);
39         this.cloud = cloud;
40     }
41
42     BasicNodeList(Collection JavaDoc c, NodeManager nodeManager) {
43         super(c);
44         this.nodeManager = nodeManager;
45         this.cloud = nodeManager.getCloud();
46     }
47
48     /**
49      * since MMBase 1.8
50      */

51     protected NodeManager castToNodeManager(Node n) {
52         if (n instanceof NodeManager) {
53             return (NodeManager) n;
54         } else {
55             log.error("Node " + n.getNumber() + " is not a node manager (but a " + n.getNodeManager() + "), taking it Object for now");
56             return cloud.getNodeManager("object");
57         }
58     }
59
60
61     /**
62      */

63     protected Object JavaDoc convert(Object JavaDoc o, int index) {
64         if (o instanceof Node || o == null) {
65             return o;
66         }
67         Node node = null;
68         if (o instanceof String JavaDoc) { // a string indicates a nodemanager by name, or, if numeric, a node number..
69
String JavaDoc s = (String JavaDoc) o;
70             if (org.mmbase.datatypes.StringDataType.NON_NEGATIVE_INTEGER_PATTERN.matcher(s).matches()) {
71                 node = cloud.getNode(s);
72             } else {
73                 if (cloud.hasNodeManager(s)) {
74                     node = cloud.getNodeManager(s);
75                 } else { // an alias?
76
node = cloud.getNode(s);
77                 }
78             }
79         } else if (o instanceof MMObjectBuilder) { // a builder
80
node = cloud.getNodeManager(((MMObjectBuilder)o).getTableName());
81         } else if (o instanceof Map JavaDoc) {
82             if (nodeManager == null) {
83                 node = new MapNode((Map JavaDoc) o, cloud);
84             } else {
85                 node = new MapNode((Map JavaDoc) o, nodeManager);
86             }
87         } else if (o instanceof Number JavaDoc) {
88             node = cloud.getNode(((Number JavaDoc) o).intValue());
89         } else {
90             MMObjectNode coreNode = (MMObjectNode) o;
91             MMObjectBuilder coreBuilder = coreNode.getBuilder();
92             if (coreBuilder instanceof TypeDef) {
93                 String JavaDoc builderName = coreNode.getStringValue("name");
94                 if (cloud.hasNodeManager(builderName)) {
95                     try {
96                         node = cloud.getNodeManager(builderName);
97                     } catch (Throwable JavaDoc t) {
98                         node = cloud.getNode(coreNode.getNumber());
99                     }
100                 } else {
101                     node = cloud.getNode(coreNode.getNumber());
102                 }
103             } else if (coreBuilder instanceof RelDef) {
104                 node = cloud.getRelationManager(coreNode.getStringValue("sname"));
105             } else if (coreBuilder instanceof TypeRel) {
106                 int snumber = coreNode.getIntValue("snumber");
107                 int dnumber = coreNode.getIntValue("dnumber");
108                 int rnumber = coreNode.getIntValue("rnumber");
109                 NodeManager nm1;
110                 if (cloud.hasNode(snumber)) {
111                     nm1 = castToNodeManager(cloud.getNode(snumber));
112                 } else {
113                     log.warn("Source of typerel " + coreNode.getNumber() + " is " + (coreNode.isNull("snumber") ? "NULL" : "" + snumber));
114                     nm1 = cloud.getNodeManager("object");
115                 }
116                 NodeManager nm2;
117                 if (cloud.hasNode(dnumber)) {
118                     nm2 = castToNodeManager(cloud.getNode(dnumber));
119                 } else {
120                     log.warn("Destination of typerel " + coreNode.getNumber() + " is " + (coreNode.isNull("dnumber") ? "NULL" : "" + dnumber));
121                     nm2 = cloud.getNodeManager("object");
122                 }
123                 Node role;
124                 if (cloud.hasNode(rnumber)) {
125                     role = cloud.getNode(rnumber);
126                 } else {
127                     log.warn("Role of typerel " + coreNode.getNumber() + " is " + (coreNode.isNull("rnumber") ? "NULL" : "" + rnumber));
128                     role = cloud.getNode(BasicCloudContext.mmb.getRelDef().getNumberByName("related"));
129                 }
130                 node = cloud.getRelationManager(nm1.getName(), nm2.getName(), role.getStringValue("sname"));
131             } else if(coreBuilder instanceof InsRel) {
132                 node = cloud.getNode(coreNode.getNumber());
133             } else if (coreNode instanceof org.mmbase.module.core.VirtualNode) {
134                 MMObjectBuilder builder = coreNode.getBuilder();
135                 if (builder instanceof VirtualBuilder) {
136                     if (nodeManager != null) {
137                         node = new VirtualNode(cloud, (org.mmbase.module.core.VirtualNode) coreNode, nodeManager);
138                     } else {
139                         node = new VirtualNode((org.mmbase.module.core.VirtualNode) coreNode, cloud);
140                     }
141                 } else {
142                     node = new VirtualNode(cloud, (org.mmbase.module.core.VirtualNode) coreNode, cloud.getNodeManager(builder.getObjectType()));
143                 }
144             } else {
145                 int n = coreNode.getNumber();
146                 if (cloud.hasNode(n)) {
147                     node = cloud.getNode(n);
148                 } else {
149                     log.warn("No node with number " + n + " converting to null");
150                     node = null;
151                 }
152             }
153         }
154         set(index, node);
155         return node;
156     }
157
158     protected Object JavaDoc validate(Object JavaDoc o) throws ClassCastException JavaDoc {
159         if (o instanceof MMObjectNode || o instanceof String JavaDoc) {
160             return o;
161         } else {
162             return (Node)o;
163         }
164     }
165
166     /**
167      *
168      */

169     public Node getNode(int index) {
170         return (Node)get(index);
171     }
172
173     /**
174      *
175      */

176     public NodeList subNodeList(int fromIndex, int toIndex) {
177         if (nodeManager != null) {
178             return new BasicNodeList(subList(fromIndex, toIndex), nodeManager);
179         } else {
180             return new BasicNodeList(subList(fromIndex, toIndex), cloud);
181         }
182     }
183
184     /**
185      *
186      */

187     public NodeIterator nodeIterator() {
188         return new BasicNodeIterator();
189     }
190
191
192     protected class BasicNodeIterator extends BasicIterator implements NodeIterator {
193
194         public Node nextNode() {
195             return (Node)next();
196         }
197
198         public Node previousNode() {
199             return (Node)previous();
200         }
201     }
202 }
203
Popular Tags