1 10 11 package org.mmbase.bridge.implementation; 12 13 import java.util.List ; 14 import java.util.ArrayList ; 15 16 import org.mmbase.bridge.*; 17 import org.mmbase.security.*; 18 import org.mmbase.storage.search.SearchQueryException; 19 import org.mmbase.module.core.*; 20 import org.mmbase.module.corebuilders.*; 21 import org.mmbase.util.logging.*; 22 23 30 public class BasicRelationManager extends BasicNodeManager implements RelationManager { 31 private static final Logger log = Logging.getLoggerInstance(BasicRelationManager.class); 32 33 public MMObjectNode relDefNode; 34 private MMObjectNode typeRelNode; 35 36 45 BasicRelationManager(MMObjectNode node, BasicCloud cloud, int nodeId) { 46 super(node, cloud, nodeId); 47 } 48 49 57 BasicRelationManager(MMObjectNode node, BasicCloud cloud) { 58 super(node, cloud); 59 } 60 61 public final boolean isRelationManager() { 62 return true; 63 } 64 public final RelationManager toRelationManager() { 65 return this; 66 } 67 68 72 protected void initManager() { 73 MMObjectBuilder bul = noderef.getBuilder(); 74 if (bul instanceof RelDef) { 75 relDefNode = noderef; 76 } else if (bul instanceof TypeRel) { 77 typeRelNode = noderef; 78 relDefNode = typeRelNode.getBuilder().getNode(typeRelNode.getIntValue("rnumber")); 79 if (relDefNode == null) { 80 log.warn("No node found for 'rnumber'" + typeRelNode.getIntValue("rnumber")); 81 } 82 } else { 83 throw new RuntimeException ("The builder of node " + noderef.getNumber() + " is not reldef or typerel, but " + bul.getTableName() + " cannot instantiate a relation manager with this"); 84 } 85 86 RelDef relDef = (RelDef) relDefNode.getBuilder(); 87 if (relDef != null) { 88 builder = relDef.getBuilder(relDefNode.getNumber()); 89 } else { 90 log.warn("builder of " + relDefNode + " was null"); 91 } 92 super.initManager(); 93 } 94 95 96 protected void setNodeManager(MMObjectNode node) { 97 int nodeNumber = node.getNumber(); 98 if (nodeNumber >= 0 && nodeNumber == getNode().getBuilder().getNumber()) { nodeManager = this; 100 } else { 101 super.setNodeManager(node); 102 } 103 } 104 105 public String getForwardRole() { 106 return relDefNode.getStringValue("sname"); 107 } 108 109 public String getReciprocalRole() { 110 return relDefNode.getStringValue("dname"); 111 } 112 113 public String getForwardGUIName() { 114 return relDefNode.getStringValue("sguiname"); 115 } 116 117 public String getReciprocalGUIName() { 118 return relDefNode.getStringValue("dguiname"); 119 } 120 121 public int getDirectionality() { 122 return relDefNode.getIntValue("dir"); 123 } 124 125 int getBuilder() { 126 return relDefNode.getIntValue("builder"); 127 } 128 129 public NodeManager getSourceManager() { 130 if (typeRelNode == null) { 131 throw new BridgeException("This relationmanager does not contain source information."); 132 } 133 int nr = typeRelNode.getIntValue("snumber"); 134 return cloud.getNodeManager(nr); 135 } 136 137 public NodeManager getDestinationManager() { 138 if (typeRelNode == null) { 139 throw new BridgeException("This relationmanager does not contain destination information."); 140 } 141 int nr = typeRelNode.getIntValue("dnumber"); 142 return cloud.getNodeManager(nr); 143 } 144 145 146 protected final BasicNode createBasicNode() { 147 return createBasicRelation(); 148 } 149 150 154 protected BasicRelation createBasicRelation() { 155 if(relDefNode == null) { 156 throw new RuntimeException ("reldef node is null"); 157 } 158 NodeAndId n = createMMObjectNode(); 159 BasicRelation relation = new BasicRelation(n.node, cloud, n.id); 160 relation.setValueWithoutChecks("rnumber", new Integer (relDefNode.getNumber())); 161 return relation; 162 } 163 164 public Relation createRelation(Node sourceNode, Node destinationNode) { 165 if (sourceNode.getCloud() != cloud) { 170 throw new BridgeException("Relationmanager and source node are not in the same transaction or in different clouds."); 171 } 172 if (destinationNode.getCloud() != cloud) { 173 throw new BridgeException("Relationmanager and destination node are not in the same transaction or in different clouds."); 174 } 175 if (!(cloud instanceof Transaction) && (sourceNode.isNew() || destinationNode.isNew())) { 176 throw new BridgeException("Cannot add a relation to a new node that has not been committed."); 177 } 178 179 BasicRelation relation = createBasicRelation(); 180 relation.setSource(sourceNode); 181 relation.setDestination(destinationNode); 182 relation.checkValid(); 183 return relation; 185 } 186 187 public RelationList getRelations(Node node) { 188 InsRel insRel = (InsRel) builder; 190 List result = insRel.getRelationsVector(node.getNumber()); 191 return new BasicRelationList(result, this); 192 } 193 194 public boolean mayCreateRelation(Node sourceNode, Node destinationNode) { 195 return cloud.check(Operation.CREATE, builder.getNumber(), 196 sourceNode.getNumber(), destinationNode.getNumber()); 197 } 198 } 199 | Popular Tags |