1 10 11 package org.mmbase.tests; 12 import junit.framework.TestCase; 13 import java.util.*; 14 import org.mmbase.bridge.*; 15 import org.mmbase.bridge.util.Queries; 16 import org.mmbase.storage.search.*; 17 import org.mmbase.util.Casting; 18 import org.w3c.dom.Document ; 19 24 public class Clustering extends BridgeTest { 25 26 protected static Cloud cloud1; 27 protected static Cloud cloud2; 28 protected static NodeList aa2list; 29 protected static NodeList bb2related; 30 protected static Node nodea1; 31 public void setUp() { 32 if (cloud1 == null) { 33 cloud1 = getRemoteCloud("rmi://127.0.0.1:1221/remotecontext"); 34 cloud2 = getRemoteCloud("rmi://127.0.0.1:1222/remotecontext"); 35 36 NodeManager aa2 = cloud2.getNodeManager("aa"); 37 NodeManager aa1 = cloud1.getNodeManager("aa"); 38 NodeManager bb2 = cloud2.getNodeManager("bb"); 39 aa2list = aa2.getList(null, null, null); aa1.getList(null, null, null); nodea1 = aa1.createNode(); 42 nodea1.commit(); 43 NodeQuery nq = Queries.createRelatedNodesQuery(cloud2.getNode(nodea1.getNumber()), bb2, "related", "both"); 44 bb2related = bb2.getList(nq); 45 46 NodeManager object2 = cloud2.getNodeManager("object"); 47 NodeQuery nq2 = Queries.createRelatedNodesQuery(cloud2.getNode(nodea1.getNumber()), object2, null, null); 48 object2.getList(nq2); } 50 } 51 52 53 57 protected void allowLatency() { 58 try { 59 Thread.sleep(1000); 60 } catch (InterruptedException ie) { 61 } 62 } 63 64 public void fieldEquals(Node n1, Node n2) { 65 FieldIterator fi = n1.getNodeManager().getFields(NodeManager.ORDER_CREATE).fieldIterator(); 66 while (fi.hasNext()) { 67 Field f = fi.nextField(); 68 if (f.getName().equals("number")) { 69 assertEquals(n1.getNumber(), n2.getNumber()); 71 } else { 72 Object value1 = n1.getValue(f.getName()); 73 Object value2 = n2.getValue(f.getName()); 74 assertTrue("" + value1 + " != " + value2 + " (value of " + n1.getNumber() + "/" + f.getName() + ")", value1 == null ? value2 == null : value1.equals(value2)); 75 } 76 } 77 } 78 79 public void testCreateNode() { 80 assertTrue(cloud2.hasNode(nodea1.getNumber())); 81 Node nodea2 = cloud2.getNode(nodea1.getNumber()); 82 fieldEquals(nodea1, nodea2); 83 } 84 85 public void testList() { 86 NodeList aa2List1 = cloud1.getNodeManager("aa").getList(null, null, null); assertEquals(aa2List1.size(), 1); 88 89 NodeManager aa2 = cloud2.getNodeManager("aa"); 90 NodeList aa2list2 = aa2.getList(null, null, null); allowLatency(); 92 aa2list2 = aa2.getList(null, null, null); assertTrue("List before create was not size 0", aa2list.size() == 0); 95 assertTrue("Check wether node-list got invalidated failed " + aa2list2.size() + " != " + aa2list.size() + " + 1", aa2list2.size() == aa2list.size() + 1); 96 } 97 98 private Node getRole(Cloud cl, String name) { 99 NodeManager reldef = cl.getNodeManager("reldef"); 100 NodeQuery nq = reldef.createQuery(); 101 Constraint c = Queries.createConstraint(nq, "sname", Queries.getOperator("="), name); 102 nq.setConstraint(c); 103 NodeList roles = reldef.getList(nq); 104 if (roles.size() == 0) throw new RuntimeException ("Role '" + name + "' not found in " + (cl == cloud2 ? " cloud 2 " : " cloud 1")); 105 if (roles.size() > 1) { 106 throw new RuntimeException ("More roles '" + name + "' not found in " + (cl == cloud2 ? " cloud 2 " : " cloud 1")); 107 } 108 return roles.getNode(0); 109 } 110 111 115 private RelationManager createTypeRel(Cloud cl, String role, String nm1, String nm2) { 116 NodeManager typerel = cl.getNodeManager("typerel"); 117 118 Node newTypeRel = typerel.createNode(); 119 newTypeRel.setValue("rnumber", getRole(cl, role)); 120 newTypeRel.setValue("snumber", cl.getNodeManager(nm1)); 121 newTypeRel.setValue("dnumber", cl.getNodeManager(nm2)); 122 newTypeRel.commit(); 123 return (RelationManager) newTypeRel; 124 } 125 126 public void testCreateTypeRel() { 127 RelationManager rm = createTypeRel(cloud1, "posrel", "bb", "aa"); 129 130 NodeManager bb1 = cloud1.getNodeManager("bb"); 132 NodeQuery nq1 = Queries.createRelatedNodesQuery(cloud1.getNode(nodea1.getNumber()), bb1, null, "both"); 133 NodeList related1 = bb1.getList(nq1); 134 assertTrue("Locale list is null!", related1 != null); 135 assertTrue("Locale list is not empty.",related1.size() == 0); 136 137 NodeManager bb2 = cloud2.getNodeManager("bb"); 139 NodeQuery nq2 = Queries.createRelatedNodesQuery(cloud2.getNode(nodea1.getNumber()), bb2, null, "both"); 140 NodeList related2 = bb2.getList(nq2); 141 assertTrue("Remote list is null!", related2 != null); 142 assertTrue("Locale list is not empty.", related2.size() == 0); 143 144 Node bbnode1 = bb1.createNode(); 146 bbnode1.commit(); 147 Relation r1 = bbnode1.createRelation(nodea1, rm); 148 r1.commit(); 149 150 related1 = bb1.getList(nq1); 152 assertTrue("Created a relation, but local related list size is not 1, but " + related1.size() + 153 ".\nUsed query: " + nq1, related1.size() == 1); allowLatency(); 156 related2 = bb2.getList(nq2); 157 assertTrue("Created a relation, but remote related list size is not 1, but " + related2.size() + 158 ".\nUsed query: " + nq2, related2.size() == 1); 160 r1.delete(); 162 163 related1 = bb1.getList(nq1); 165 assertTrue("Deleted a relation, but local related list size is not 0, but " + related1.size() + 166 ".\nUsed query: " + nq1, related1.size() == 0); allowLatency(); 169 related2 = bb2.getList(nq2); 170 assertTrue("Deleted a relation, but remote related list size is not 0, but " + related2.size() + 171 ".\nUsed query: " + nq2, related2.size() == 0); } 173 174 public void testInstallBuilder() { 175 176 NodeManager typedef = cloud1.getNodeManager("typedef"); 178 Node zz = typedef.createNode(); 179 zz.setStringValue("name", "zz"); 180 Document builderXML = Casting.toXML("<?xml version='1.0' encoding='UTF-8'?>\n" + 181 "<!DOCTYPE builder PUBLIC \"-//MMBase//builder config 1.1//EN\" \"http://www.mmbase.org/dtd/builder_1_1.dtd\">\n" + 182 "<builder extends='object' maintainer='mmbase.org' name='zz' version='0'></builder>"); 183 System.out.println("Using builder XML " + org.mmbase.util.xml.XMLWriter.write(builderXML, true)); 184 zz.setXMLValue("config", builderXML); 185 zz.commit(); 186 187 NodeManager zz1 = cloud1.getNodeManager("zz"); 188 assertTrue(cloud1.hasNodeManager("zz")); 189 assertTrue(zz1 != null); 190 if (cloud2.hasNodeManager("zz")) { 191 throw new RuntimeException ("Odd, the 'zz' node-manager should only appear in cloud 1 now!, appears in cloud 2 too. Something wrong with test-case, or this issue was solved, and these test-cases need review then."); 192 } 193 194 } 195 196 public void testCreateNodeUnknownType() { 197 Node zNode = cloud1.getNodeManager("zz").createNode(); 199 zNode.commit(); 200 202 if (cloud2.hasNode(zNode.getNumber())) { 203 Node zNode2 = cloud2.getNode(zNode.getNumber()); 204 assertTrue("A node of unknown type falls back to 'object'", zNode2.getNodeManager().getName().equals("object")); 205 } else { 206 fail("New node " + zNode + " (of unknown type in cloud 2) is not contained by cloud 2"); 207 } 208 209 } 210 211 public void testCreateTypeRelUnknownType() { 212 NodeManager zz = cloud1.getNodeManager("zz"); 213 215 RelationManager rm = createTypeRel(cloud1, "related", "aa", "zz"); 216 217 Node zNode1 = zz.createNode(); zNode1.commit(); 218 Node zNode2 = zz.createNode(); zNode2.commit(); 219 Relation r1 = nodea1.createRelation(zNode1, rm); r1.commit(); 220 Relation r2 = nodea1.createRelation(zNode2, rm); r2.commit(); 221 222 allowLatency(); 223 224 if(cloud2.hasNode(nodea1.getNumber())) { 225 Node nodea2 = cloud2.getNode(nodea1.getNumber()); 227 228 List related1 = nodea1.getRelatedNodes(); 229 List related2 = nodea2.getRelatedNodes(); 230 assertTrue("relatednodes " + related1 + " != " + related2, related1.size() == related2.size()); 231 } else { 232 fail("Node " + nodea1 + " is not contained by cloud 2"); 233 } 234 235 } 236 237 public void testRelatedUnknownType() { 238 List related1 = nodea1.getRelatedNodes("zz"); 240 assertTrue("Size: " + related1.size() + " != 2", related1.size() == 2); 242 Node nodea2 = cloud2.getNode(nodea1.getNumber()); 244 try { 245 List related2 = nodea2.getRelatedNodes("zz"); fail("zz is unknown in cloud 2!, but could still find nodes of this type: " + related2); 247 } catch (org.mmbase.bridge.NotFoundException nfe) { 248 } 249 250 } 251 252 public void testRelatedUnknownType2() { 253 254 NodeManager object1 = cloud1.getNodeManager("object"); 255 NodeManager object2 = cloud2.getNodeManager("object"); 256 NodeQuery nq1 = Queries.createRelatedNodesQuery(nodea1, object1, null, null); 258 NodeQuery nq2 = Queries.createRelatedNodesQuery(cloud2.getNode(nodea1.getNumber()), object2, null, null); 259 List related1 = object1.getList(nq1); 260 List related2 = object2.getList(nq2); 261 assertTrue("Nr of local relations reported is not 2 but " + related1.size(), related1.size() == 2); 263 assertTrue("Nr of remote relations reported is not " + related1.size() + " but " + related2.size(), related1.size() == related2.size()); 264 } 265 266 public void testCreateRelDef() { 267 NodeManager reldef = cloud1.getNodeManager("reldef"); 269 270 Node newRole = reldef.createNode(); 271 newRole.setValue("sname", "newrole"); 272 newRole.setValue("builder", cloud1.getNodeManager("insrel")); 273 newRole.commit(); 274 275 RelationManager rm = createTypeRel(cloud1, "newrole", "aa", "bb"); 276 277 NodeManager bb = cloud1.getNodeManager("bb"); 278 Node b1 = bb.createNode(); 279 b1.commit(); 280 281 Relation r = nodea1.createRelation(b1, rm); r.commit(); 282 283 assertTrue(nodea1.getRelatedNodes("bb", "newrole", null).size() == 1); 284 285 allowLatency(); try { 287 assertTrue(cloud2.getNode(nodea1.getNumber()).getRelatedNodes("bb", "newrole", null).size() == 1); 288 } catch (Exception e) { 289 fail(e.getMessage()); 291 } 292 } 293 294 } 295 296 | Popular Tags |