1 package org.weda.store;
2
3 import java.util.Collection;
4 import java.util.HashMap;
5 import java.util.List;
6 import java.util.Map;
7 import org.weda.ObjectStoreTestCase;
8 import org.weda.action.ActionRegistry;
9 import org.weda.action.ActionState;
10 import org.weda.test.WedaTestCase;
11 import org.weda.domain.Contract;
12 import org.weda.enhance.InjectHivemindObject;
13 import org.weda.store.impl.ObjectSourceConstraintImpl;
14 import org.weda.store.impl.ObjectSet;
15 import org.weda.domain.Address;
16 import org.weda.domain.Company;
17 import org.weda.domain.Employee;
18
19 public class ObjectSourceImplTest extends ObjectStoreTestCase {
20 private ObjectSourceRegistry dsr;
21 private ObjectSource ds;
22
23 public ObjectSourceImplTest(String name) throws Exception {
24 super(name);
25 }
26
27 public void setUp() throws Exception {
28 super.setUp();
29 dsr =
30 (ObjectSourceRegistry)registry
31 .getService(ObjectSourceRegistry.class);
32 ds = dsr.getObjectSource("company2");
33 }
34
35 public void test_config() throws Exception{
36 Collection<DetailObjectSourceInfo> infos = ds.getDetailInfos();
37 assertNotNull(infos);
38 assertEquals(2, infos.size());
39 DetailObjectSourceInfo detailInfo = infos.iterator().next();
40 DetailObjectSourceInfo empInfo = null, contrInfo = null;
41 for (DetailObjectSourceInfo info: infos)
42 if ("employee".equals(info.getName()))
43 empInfo = info;
44 else if ("contract".equals(info.getName()))
45 contrInfo = info;
46 assertNotNull(empInfo);
47 assertNotNull(contrInfo);
48 assertEquals("employee", empInfo.getName());
49 assertEquals("company", empInfo.getPropertyName());
50
51 ObjectSource ds2 = dsr.getObjectSource("company3");
52 assertTrue(ds2.isReadOnly());
53 assertFalse(ds.isReadOnly());
54
55 List<ActionState> actions = ds.getActionsStates();
56 assertNotNull(actions);
57 assertTrue(actions.size()>0);
58 log.debug(String.format(
59 "----Actions from DataSource. Class (%s)"
60 , ds.getClass().getName()));
61 showActionDescriptors(actions);
62 ActionRegistry actionReg =
63 (ActionRegistry)registry.getService(ActionRegistry.class);
64 log.debug("----Actions from ActionRegistry");
65 showActionDescriptors(actionReg.getActionsStates(ds, ds.getClass()));
66 }
67
68 public void test_filterInsertMarker() throws Exception {
69 Company comp = new Company();
70 comp.setName("company 1");
71 store.save(comp);
72 comp = new Company();
73 comp.setName("company 2");
74 store.save(comp);
75
76 ObjectSource ds2 = dsr.getObjectSource("company5");
77 assertNotNull(ds2);
78 ds2.refresh();
79 assertEquals(2, ds2.getRowCount());
80
81 ds2.getQueryFilter()
82 .getFilterElement("company.name").setExpression("company 1");
83 ds2.refresh();
84 assertEquals(1, ds2.getRowCount());
85 }
86
87 public void test_filterParameterName() throws Exception {
88 Company comp = new Company();
89 comp.setName("company");
90 comp.setEmployeCount(1);
91 store.save(comp);
92 comp = new Company();
93 comp.setName("company");
94 comp.setEmployeCount(100);
95 store.save(comp);
96
97 ObjectSource ds2 = dsr.getObjectSource("company6");
98 assertNotNull(ds2);
99 ds2.getQueryFilter().getFilterElement("company.employeCount")
100 .setExpression("10");
101 ds2.getQueryFilter().getFilterElement("company.name")
102 .setExpression("company");
103 ds2.refresh();
104 assertEquals(1, ds2.getRowCount());
105 }
106
107 public void test_getValueAt() throws Exception {
108 Company comp;
109 for (int i=0; i<2; i++){
110 comp = new Company();
111 comp.setName("name "+i);
112 store.save(comp);
113 }
114 ds.refresh();
115 assertEquals(2, ds.getRowCount());
116 comp = new Company();
117 comp.setName("name 2");
118 store.save(comp);
119 ds.refresh();
120 assertEquals(3, ds.getRowCount());
121 }
122
123 public void test_additionalIdentifier() throws Exception {
124 ObjectSource ds2 = dsr.getObjectSource("company2");
125 assertSame(ds, ds2);
126 ds2 = dsr.getObjectSource("company2#1");
127 assertNotSame(ds, ds2);
128 assertNotNull(ds2);
129 assertEquals("company2", ds2.getName());
130 try{
131 ds2 = dsr.getObjectSource("company#");
132 fail();
133 }catch(Exception e){
134 }
135 }
136
137 public void test_getValueAt_equals() throws Exception {
138 Company comp;
139 Map<String, Company> companies = new HashMap<String, Company>();
140 for (int i=0; i<5; i++){
141 comp = new Company();
142 comp.setName("name "+i);
143 Address addr = new Address();
144 addr.setStreet("street "+i);
145 comp.setAddress(addr);
146 store.save(addr);
147 store.save(comp);
148 companies.put(comp.getName(), comp);
149 }
150 ds.refresh();
151 for (int i=0; i<ds.getRowCount(); ++i ){
152 Object[] values = ds.getRowAt(i);
153 assertNotNull(values[0]);
154 Company comp2 = (Company)values[0];
155 assertNotNull(comp2.getName());
156 comp = companies.get(comp2.getName());
157 assertNotNull(comp);
158 assertEquals(comp.getId(), comp2.getId());
159 assertEquals(comp.getAddress().getStreet()
160 , comp2.getAddress().getStreet());
161 }
162 }
163
164 public void test_getSelectedObjectSet() throws Exception {
165
166
167 Company comp;
168 Map<String, Company> companies = new HashMap<String, Company>();
169 for (int i=0; i<2; i++){
170 comp = new Company();
171 comp.setName("name "+i);
172 store.save(comp);
173 companies.put(comp.getName(), comp);
174 }
175 ds.refresh();
176 ds.selectRow(0);
177 ds.beginModification();
178 ObjectSet objectSet = ds.getSelectedObjectSet();
179 ds.cancelModification();
180 assertNotNull(objectSet);
181 assertTrue(companies.containsKey(objectSet.getValue("name")));
182
183 ds.selectRow(1);
184 ds.beginModification();
185 objectSet = ds.getSelectedObjectSet();
186 ds.cancelModification();
187 Object[] objects = objectSet.getObjects();
188 assertTrue(companies.containsKey(((Company)objects[0]).getName()));
189 assertTrue(companies.containsKey(((Company)objects[1]).getName()));
190 }
191
192 public void test_modifications() throws Exception {
193 Company comp = new Company();
194 comp.setName("name");
195 store.save(comp);
196
197 ds.refresh();
198 ds.selectRow(0);
199 ds.beginModification();
200 ds.saveModification();
201 }
202
203 public void test_createNewRow() throws Exception {
204 Company comp = new Company();
205 comp.setName("Some company");
206 store.save(comp);
207 ds.createNewRow();
208 ds.getSelectedObjectSet().setValue("name", "ОАО МТС");
209 ds.saveModification();
210 assertEquals(1, ds.getSelectedRowCount());
211 assertEquals("ОАО МТС", ((Company)ds.getRowAt(0)[0]).getName());
212 ds.refresh();
213 assertEquals(2, ds.getRowCount());
214 assertTrue(
215 "ОАО МТС".equals(((Company)ds.getRowAt(0)[0]).getName())
216 || "ОАО МТС".equals(((Company)ds.getRowAt(1)[0]).getName()));
217 }
218
219 public void test_addConstraint_select() throws Exception{
220
221 Company comp1 = new Company();
222 comp1.setName("Company 1");
223 store.save(comp1);
224 Employee emp = new Employee();
225 emp.setCompany(comp1);
226 emp.setName("c1 e1");
227 store.save(emp);
228 emp = new Employee();
229 emp.setName("c1 e2");
230 emp.setCompany(comp1);
231 store.save(emp);
232
233 Company comp2 = new Company();
234 comp2.setName("Company 2");
235 store.save(comp2);
236 emp = new Employee();
237 emp.setCompany(comp2);
238 emp.setName("c2 e1");
239 store.save(emp);
240
241 ObjectSource eds = dsr.getObjectSource("employee");
242 assertNotNull(eds);
243 eds.refresh();
244 assertEquals(3, eds.getRowCount());
245 ObjectSourceConstraintImpl constraint =
246 new ObjectSourceConstraintImpl();
247 constraint.setPropertyName("company");
248 constraint.setValue(comp1);
249 eds.addConstraint(constraint);
250 eds.refresh();
251 assertEquals(2, eds.getRowCount());
252
253 eds.removeConstraint(constraint);
254 eds.refresh();
255 assertEquals(3, eds.getRowCount());
256
257 constraint = new ObjectSourceConstraintImpl();
258 constraint.setPropertyName("company");
259 constraint.setValue(comp2);
260 eds.addConstraint(constraint);
261 eds.refresh();
262 assertEquals(1, eds.getRowCount());
263 eds.removeConstraint(constraint);
264 }
265
266 public void test_addConstraint_addNewRecord() throws Exception {
267
268 Company comp = new Company();
269 comp.setName("Company");
270 store.save(comp);
271
272 ObjectSourceConstraintImpl constraint =
273 new ObjectSourceConstraintImpl();
274 constraint.setPropertyName("company");
275 constraint.setValue(comp);
276
277 ObjectSource eds = dsr.getObjectSource("employee");
278 eds.addConstraint(constraint);
279 eds.createNewRow();
280 ObjectSet objSet = eds.getSelectedObjectSet();
281 objSet.setValue("name", "employee");
282 eds.saveModification();
283
284 eds.refresh();
285 Employee emp = (Employee)eds.getRowAt(0)[0];
286 assertNotNull(emp);
287 assertEquals(comp.getId(), emp.getCompany().getId());
288 eds.removeConstraint(constraint);
289 }
290
291 public void test_activateDetailConstraints() throws Exception {
292 initData();
293 ds.refresh();
294 Company comp = (Company)ds.getRowAt(0)[0];
295 int empCount = 1;
296 if ("Company 1".equals(comp.getName()))
297 empCount = 2;
298 ds.activateDetailConstraints(comp, false);
299 ObjectSource empDs = dsr.getObjectSource("employee");
300 empDs.refresh();
301 assertEquals(empCount, empDs.getRowCount());
302
303 ObjectSource contDs = dsr.getObjectSource("contract");
304 assertEquals(empCount==1?2:1, contDs.getRowCount());
305
306 ds.deactivateDetailConstraints();
307 empDs.refresh();
308 assertEquals(3, empDs.getRowCount());
309
310 contDs.refresh();
311 assertEquals(3, contDs.getRowCount());
312
313 empCount = empCount==1?2:1;
314 ds.activateDetailConstraints(ds.getRowAt(1)[0], false);
315 empDs.refresh();
316 assertEquals(empCount, empDs.getRowCount());
317
318 assertEquals(empCount==1?2:1, contDs.getRowCount());
319
320 ds.deactivateDetailConstraints();
321 empDs.refresh();
322 assertEquals(3, empDs.getRowCount());
323
324 contDs.refresh();
325 assertEquals(3, contDs.getRowCount());
326 }
327
328 public void test_activateDetailConstraints2() throws Exception {
329 Company comp = new Company();
330 comp.setName("company1");
331 store.save(comp);
332 Contract cont = new Contract();
333 cont.setCompany(comp);
334 cont.setNum("#1 (company1)");
335 store.save(cont);
336 cont = new Contract();
337 cont.setCompany(comp);
338 cont.setNum("#2 (company1)");
339 store.save(cont);
340
341 Company comp2 = new Company();
342 comp2.setName("company2");
343 store.save(comp2);
344 cont = new Contract();
345 cont.setCompany(comp2);
346 cont.setNum("#1 (company2)");
347 store.save(cont);
348
349
350 ObjectSource contOs = dsr.getObjectSource("contract");
351 contOs.refresh();
352 assertEquals(3, contOs.getRowCount());
353 ObjectSource checkOs = dsr.getObjectSource("check");
354 checkOs.createNewRow();
355 checkOs.getSelectedObjectSet().setValue("company", comp);
356 checkOs.applyModification();
357 contOs.refresh();
358 assertEquals(2, contOs.getRowCount());
359 checkOs.saveModification();
360 contOs.refresh();
361 assertEquals(3, contOs.getRowCount());
362
363 checkOs.refresh();
364 assertEquals(1, checkOs.getRowCount());
365 checkOs.selectRow(0);
366 checkOs.beginModification();
367 contOs.refresh();
368 assertEquals(2, contOs.getRowCount());
369 checkOs.saveModification();
370 contOs.refresh();
371 assertEquals(3, contOs.getRowCount());
372 }
373
374 public void test_activateDetailConstraints_modific_opers()
375 throws Exception
376 {
377 ObjectSource eds = dsr.getObjectSource("employee");
378 initData();
379 ds.refresh();
380 ds.selectRow(0);
381 int empCount = 1;
382 Company comp = (Company)ds.getRowAt(0)[0];
383 if ("Company 1".equals(comp.getName()))
384 empCount = 2;
385 ds.beginModification();
386 eds.refresh();
387 assertEquals(empCount, eds.getRowCount());
388
389 ds.cancelModification();
390 eds.refresh();
391 assertEquals(3, eds.getRowCount());
392
393 ds.refresh();
394 ds.selectRow(0);
395 ds.beginModification();
396 eds.refresh();
397 assertEquals(empCount, eds.getRowCount());
398
399 ds.saveModification();
400 eds.refresh();
401 assertEquals(3, eds.getRowCount());
402
403 ds.createNewRow();
404 assertFalse(ds.isModificationApplied());
405 ds.getSelectedObjectSet().setValue("name", "new company");
406 ds.applyModification();
407 assertTrue(ds.isModificationApplied());
408 eds.createNewRow();
409 eds.getSelectedObjectSet().setValue("name", "new employee");
410 eds.saveModification();
411 ds.saveModification();
412
413 ds.refresh();
414 assertEquals(3, ds.getRowCount());
415 eds.refresh();
416 assertEquals(4, eds.getRowCount());
417 Company newComp = null;
418 for (int i=0; i<ds.getRowCount(); ++i){
419 Company c = (Company)ds.getRowAt(i)[0];
420 if ("new company".equals(c.getName())){
421 newComp = c;
422 break;
423 }
424 }
425 assertNotNull(newComp);
426 ds.activateDetailConstraints(newComp, false);
427 eds.refresh();
428 assertEquals(1, eds.getRowCount());
429 Employee newEmp = (Employee)eds.getRowAt(0)[0];
430 assertEquals("new employee", newEmp.getName());
431 }
432
433 public void test_removeSelectedRows() throws Exception {
434 Company comp = new Company();
435 comp.setName("name");
436 store.save(comp);
437 comp = new Company();
438 comp.setName("name2");
439 store.save(comp);
440
441 ds.refresh();
442 assertEquals(2, ds.getRowCount());
443 ds.selectRow(0);
444 ds.removeSelectedRows();
445 assertEquals(1, ds.getRowCount());
446 assertEquals(0, ds.getSelectedRowCount());
447 assertEquals(-1, ds.getSelectedRow());
448
449 ds.refresh();
450 assertEquals(1, ds.getRowCount());
451 }
452
453 public void test_listeners() throws Exception {
454 TestObjectSourceListener listener =
455 (TestObjectSourceListener)registry.getService(
456 "org.weda.test.TestObjectSourceListener"
457 , TestObjectSourceListener.class);
458 listener.resetStates();
459 assertFalse(listener.isAdding());
460 assertFalse(listener.isUpdating());
461 assertFalse(listener.isDeleting());
462 assertFalse(listener.isRefreshing());
463
464 assertFalse(listener.isAdded());
465 assertFalse(listener.isUpdated());
466 assertFalse(listener.isDeleted());
467 assertFalse(listener.isRefreshed());
468
469 ds.createNewRow();
470 ds.getSelectedObjectSet().setValue("name", "name1");
471 ds.saveModification();
472 assertTrue(listener.isAdding());
473 assertFalse(listener.isUpdating());
474 assertFalse(listener.isDeleting());
475 assertFalse(listener.isRefreshing());
476
477 assertTrue(listener.isAdded());
478 assertFalse(listener.isUpdated());
479 assertFalse(listener.isDeleted());
480 assertFalse(listener.isRefreshed());
481 listener.resetStates();
482
483 ds.refresh();
484 assertFalse(listener.isAdding());
485 assertFalse(listener.isUpdating());
486 assertFalse(listener.isDeleting());
487 assertTrue(listener.isRefreshing());
488
489 assertTrue(listener.isRefreshed());
490 assertFalse(listener.isAdded());
491 assertFalse(listener.isUpdated());
492 assertFalse(listener.isDeleted());
493 listener.resetStates();
494
495 ds.selectRow(0);
496 ds.beginModification();
497 ds.getSelectedObjectSet().setValue("name", "name2");
498 ds.saveModification();
499 assertFalse(listener.isAdding());
500 assertTrue(listener.isUpdating());
501 assertFalse(listener.isDeleting());
502 assertFalse(listener.isRefreshing());
503
504 assertFalse(listener.isRefreshed());
505 assertFalse(listener.isAdded());
506 assertTrue(listener.isUpdated());
507 assertFalse(listener.isDeleted());
508 listener.resetStates();
509
510 ds.removeSelectedRows();
511 assertFalse(listener.isAdding());
512 assertFalse(listener.isUpdating());
513 assertTrue(listener.isDeleting());
514 assertFalse(listener.isRefreshing());
515
516 assertFalse(listener.isRefreshed());
517 assertFalse(listener.isAdded());
518 assertFalse(listener.isUpdated());
519 assertTrue(listener.isDeleted());
520 }
521
522 public void test_summaryRow() throws Exception {
523 SummaryRow sumRow = ds.getSummaryRow();
524 assertNotNull(sumRow);
525 ds.refresh();
526 Object res = sumRow.getResultValue(0, "employeCount");
527 assertNull(res);
528
529 Company comp = new Company();
530 comp.setName("comp1");
531 comp.setEmployeCount(10);
532 store.save(comp);
533
534 comp = new Company();
535 comp.setName("comp2");
536 comp.setEmployeCount(100);
537 store.save(comp);
538
539
540 ds.refresh();
541 res = sumRow.getResultValue(0, "employeCount");
542 assertEquals(110l, res);
543
544 ds.createNewRow();
545 ds.getSelectedObjectSet().setValue("name", "comp3");
546 ds.getSelectedObjectSet().setValue("employeCount", 90);
547 ds.saveModification();
548
549 ds.refresh();
550 res = sumRow.getResultValue(0, "employeCount");
551 assertEquals(200l, res);
552 }
553
554 public void test_filterWithNamesList() throws Exception {
555 ObjectSource os = dsr.getObjectSource("company4");
556 assertNotNull(os);
557 QueryFilter filter = os.getQueryFilter();
558 assertNotNull(filter.getFilterElement("company.id"));
559 assertNotNull(filter.getFilterElement("company.name"));
560 }
561
562 public void _test() throws Exception {
563
564 store.beginTransaction();
565 Company comp1 = new Company();
566 comp1.setName("Company 1");
567 store.save(comp1);
568
569 Employee emp = new Employee();
570 emp.setName("Employee 1 company 1");
571 emp.setCompany(comp1);
572 store.save(emp);
573 store.commit();
574
575 }
576
577 private void initData() throws Exception {
578
579 Company comp1 = new Company();
580 comp1.setName("Company 1");
581 store.save(comp1);
582
583 Company comp2 = new Company();
584 comp2.setName("Company 2");
585 store.save(comp2);
586
587 Employee emp = new Employee();
588 emp.setName("Employee 1 company 1");
589 emp.setCompany(comp1);
590 store.save(emp);
591
592 emp = new Employee();
593 emp.setName("Employee 2 company 1");
594 emp.setCompany(comp1);
595 store.save(emp);
596
597 Contract contr = new Contract();
598 contr.setNum("Contract 1 company 1");
599 contr.setCompany(comp1);
600 store.save(contr);
601
602 emp = new Employee();
603 emp.setName("Employee 1 company 2");
604 emp.setCompany(comp2);
605 store.save(emp);
606
607 contr = new Contract();
608 contr.setNum("Contract 1 company 2");
609 contr.setCompany(comp2);
610 store.save(contr);
611
612 contr = new Contract();
613 contr.setNum("Contract 2 company 2");
614 contr.setCompany(comp2);
615 store.save(contr);
616
617
618
619 }
620
621 public void showActionDescriptors(List<ActionState> states){
622 for (ActionState state: states)
623 log.debug(String.format(
624 "Action: name=(%s), class=(%s)"
625 , state.getActionDescriptor().getName()
626 , state.getActionDescriptor().getActionClass()));
627 }
628
629 }