1 10 11 package org.mmbase.bridge.implementation; 12 13 import java.util.Collection ; 14 import java.util.Map ; 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 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 c, Cloud cloud) { 38 super(c); 39 this.cloud = cloud; 40 } 41 42 BasicNodeList(Collection c, NodeManager nodeManager) { 43 super(c); 44 this.nodeManager = nodeManager; 45 this.cloud = nodeManager.getCloud(); 46 } 47 48 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 63 protected Object convert(Object o, int index) { 64 if (o instanceof Node || o == null) { 65 return o; 66 } 67 Node node = null; 68 if (o instanceof String ) { String s = (String ) 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 { node = cloud.getNode(s); 77 } 78 } 79 } else if (o instanceof MMObjectBuilder) { node = cloud.getNodeManager(((MMObjectBuilder)o).getTableName()); 81 } else if (o instanceof Map ) { 82 if (nodeManager == null) { 83 node = new MapNode((Map ) o, cloud); 84 } else { 85 node = new MapNode((Map ) o, nodeManager); 86 } 87 } else if (o instanceof Number ) { 88 node = cloud.getNode(((Number ) o).intValue()); 89 } else { 90 MMObjectNode coreNode = (MMObjectNode) o; 91 MMObjectBuilder coreBuilder = coreNode.getBuilder(); 92 if (coreBuilder instanceof TypeDef) { 93 String builderName = coreNode.getStringValue("name"); 94 if (cloud.hasNodeManager(builderName)) { 95 try { 96 node = cloud.getNodeManager(builderName); 97 } catch (Throwable 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 validate(Object o) throws ClassCastException { 159 if (o instanceof MMObjectNode || o instanceof String ) { 160 return o; 161 } else { 162 return (Node)o; 163 } 164 } 165 166 169 public Node getNode(int index) { 170 return (Node)get(index); 171 } 172 173 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 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 |