KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > tests > Clustering


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.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 JavaDoc;
19 /**
20  *
21  * @author Michiel Meeuwissen
22  * @since MMBase-1.8
23  */

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); // cache list result
40
aa1.getList(null, null, null); // cache list result
41
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); // just to put it in some cache or so..
49
}
50     }
51
52
53     /**
54      * It's no hard requirement that changes are visibility immediately on the other side. So, sometimes wait a bit, to be
55      * on the safe side.
56      */

57     protected void allowLatency() {
58         try {
59             Thread.sleep(1000);
60         } catch (InterruptedException JavaDoc 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                 // sigh, 'number' is a NODE field...
70
assertEquals(n1.getNumber(), n2.getNumber());
71             } else {
72                 Object JavaDoc value1 = n1.getValue(f.getName());
73                 Object JavaDoc 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); // a node of type aa was created, so list must now be size 1.
87
assertEquals(aa2List1.size(), 1);
88
89         NodeManager aa2 = cloud2.getNodeManager("aa");
90         NodeList aa2list2 = aa2.getList(null, null, null); // should not give error, but may be size 0, because still in cache
91
allowLatency();
92         aa2list2 = aa2.getList(null, null, null); // should also be size 1!
93
assertTrue("List before create was not size 0", aa2list.size() == 0); // was determined before the createNode, should still be 0.
94

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 JavaDoc 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 JavaDoc("Role '" + name + "' not found in " + (cl == cloud2 ? " cloud 2 " : " cloud 1"));
105         if (roles.size() > 1) {
106             throw new RuntimeException JavaDoc("More roles '" + name + "' not found in " + (cl == cloud2 ? " cloud 2 " : " cloud 1"));
107         }
108         return roles.getNode(0);
109     }
110
111     /**
112      * @todo Perhaps these kind of functions would come in handy in a org.mmbase.bridge.util.System
113      * utitility class or so
114      */

115     private RelationManager createTypeRel(Cloud cl, String JavaDoc role, String JavaDoc nm1, String JavaDoc 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         // create new typerel, and see if that has influence on cloud 2.
128
RelationManager rm = createTypeRel(cloud1, "posrel", "bb", "aa");
129
130         // query for local cloud
131
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         // query for remote cloud
138
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         // create node and relation
145
Node bbnode1 = bb1.createNode();
146         bbnode1.commit();
147         Relation r1 = bbnode1.createRelation(nodea1, rm);
148         r1.commit();
149
150         // re-query local cloud
151
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); // local
154
// re-query remote cloud
155
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); // remote
159

160         // drop the relation again
161
r1.delete();
162
163         // re-query local cloud
164
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); // local
167
// re-query remote cloud
168
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); // remote
172
}
173
174     public void testInstallBuilder() {
175
176         // create a builder only in of the clouds (1).
177
NodeManager typedef = cloud1.getNodeManager("typedef");
178         Node zz = typedef.createNode();
179         zz.setStringValue("name", "zz");
180         Document JavaDoc 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 JavaDoc("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         // creating a node of this new type, and look what happens in the cloud which does not know this type.
198
Node zNode = cloud1.getNodeManager("zz").createNode();
199         zNode.commit();
200         // allowLatency(); no need, this is a _new_ node! Must result in database action any way, it should be in database!
201

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         // now create a typerel from aa to zz (which in cloud2 will look quite odd).
214

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             // now ask the number of related nodes from nodea1;
226
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         // in cloud 1 should be ok
239
List related1 = nodea1.getRelatedNodes("zz");
240         assertTrue("Size: " + related1.size() + " != 2", related1.size() == 2); // create 2 related nodes...
241

242         // but in cloud 2...
243
Node nodea2 = cloud2.getNode(nodea1.getNumber());
244         try {
245             List related2 = nodea2.getRelatedNodes("zz"); //
246
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         // this version does not depend on MMobjectNode#getRelatedNodes
257
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         // nr of relations reported = 2 (0 x a -> bb, 2 x a -> zz).
262
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         // create new reldef in cloud1, and see what happens in cloud 2.
268
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(); // give the new role some time to cast to other mmbase.
286
try {
287             assertTrue(cloud2.getNode(nodea1.getNumber()).getRelatedNodes("bb", "newrole", null).size() == 1);
288         } catch (Exception JavaDoc e) {
289             // its stacktrace is a bit long...
290
fail(e.getMessage());
291         }
292     }
293
294 }
295
296
Popular Tags