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          //assertNotNull(ds.getActionRegistry());        
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         //PropertyValue propValue=(PropertyValue)registry.getService(PropertyValue.class);
166         //assertNotNull(propValue);
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         //pserv.reset();
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 }