1   package org.weda.store;
2   
3   import java.util.Arrays;
4   import java.util.List;
5   import org.apache.commons.logging.Log;
6   import org.apache.commons.logging.LogFactory;
7   import org.weda.domain.Employee.Sex;
8   import org.weda.domain.ObjectModification;
9   import org.weda.domain.ObjectModificationPk;
10  import org.weda.property.PropertyValue;
11  import org.weda.domain.Address;
12  import org.weda.domain.Company;
13  import org.weda.test.WedaTestCase;
14  import org.weda.domain.Employee;
15  import org.weda.domain.Post;
16  
17  /**
18   *
19   * @author Mikhail Titov
20   */
21  public class ObjectStoreTest extends WedaTestCase {
22      private Log log = LogFactory.getLog(ObjectStoreTest.class);
23      private ObjectStore store;
24      
25      /** Creates a new instance of HibernateServiceTest */
26      public ObjectStoreTest(String name) throws Exception {
27          super(name);
28          //registry = RegistryBuilder.constructDefaultRegistry();        
29      }
30      
31      public void setUp() throws Exception {
32          super.setUp();
33          store = (ObjectStore)registry.getService(ObjectStore.class);
34      }
35      
36      private void deleteAll() throws Exception {
37          store.deleteAll(Post.class);        
38          store.deleteAll(Employee.class);
39          store.deleteAll(Company.class);
40          store.deleteAll(Address.class);
41      }
42      
43      public void test_save_load() throws Exception {
44          Company comp = new Company();
45          comp.setName("МТС");
46          comp.setComment("Комментарий10");
47          store.save(comp);
48          //
49          comp.setComment("Новый комментарий 987");
50          store.save(comp);
51          //
52          Company comp2=(Company)store.load(Company.class, comp.getId());
53          //assertNotSame(comp, comp2);
54          assertEquals(comp.getName(), comp2.getName());
55          assertEquals(comp.getComment(), comp2.getComment());
56          assertEquals(comp.getId(), comp2.getId());
57          //
58          Employee emp = new Employee();
59          emp.setSex(Sex.мужской);
60          store.save(emp);
61      }
62      
63      public void test_queryAllRows() throws Exception {
64          ObjectSourceRegistry dsr = (ObjectSourceRegistry)
65                  registry.getService(ObjectSourceRegistry.class);
66          ObjectSource ds=dsr.getObjectSource("company2");
67          
68          Company comp=new Company();
69          comp.setName("МТС-РК");
70          comp.setComment("Комментарий11");
71          store.save(comp);
72          
73          List<Object[]> rows = store.queryAllRows(ds);
74          assertTrue(rows.size()>=2);
75          ds.getQueryFilter().setExpression("company.name", "%МТС-РК");
76          ds.getQueryFilter().setExpression("company.id", ">="+comp.getId());
77          rows = store.queryAllRows(ds);
78          assertEquals(1, rows.size());
79          Company comp2=(Company)rows.get(0)[0];
80          assertEquals(comp.getName(), comp2.getName());
81          assertEquals(comp.getComment(), comp2.getComment());
82          assertEquals(comp.getId(), comp2.getId());        
83      }
84      
85      public void test_delete() throws Exception {
86          Company comp = new Company();
87          comp.setName("МТС");
88          comp.setComment("Комментарий10");
89          store.save(comp);
90          //
91          comp.setComment("Новый комментарий 987");
92          store.save(comp);
93          assertNotNull(store.load(Company.class, comp.getId()));
94          store.delete(comp);
95          assertNull(store.load(Company.class, comp.getId()));
96      }
97      
98      public void test_deleteAll() throws Exception {
99          ObjectSourceRegistry dsr = (ObjectSourceRegistry)
100                 registry.getService(ObjectSourceRegistry.class);
101         store.save(new Post());
102         store.save(new Post());
103         ObjectSource ds=dsr.getObjectSource("post");
104         assertTrue(store.queryAllRows(ds).size()>0);
105         store.deleteAll(Post.class);
106         assertEquals(0, store.queryAllRows(ds).size());
107         //
108         deleteAll();
109     }
110     
111     public void test_getObjectId() throws Exception {
112         Company comp = new Company();
113         comp.setName("company name");
114         store.save(comp);
115         assertEquals(comp.getId(), store.getObjectId(comp));
116     }
117     
118     public void _test_autoCommit() throws Exception {
119         store.setAutoCommit(false);
120         try{
121             Company comp = new Company();
122             comp.setName("МТС");
123             comp.setComment("Комментарий10");
124             store.beginTransaction();
125             store.save(comp);
126             Address addr = new Address();
127             addr.setStreet("Советская, 72");
128             store.save(addr);
129             store.commit();
130             //
131             //serv.reset();
132 //            serv.beginTransaction();
133 //            assertNotNull(comp.getId());
134 //            assertNotNull(serv.load(Company.class, comp.getId()));
135 //            serv.commit();
136 //
137 //            serv.beginTransaction();
138 //            //comp.setId(null);   
139 //            serv.save(comp);
140 //            serv.commit();
141 //            serv.beginTransaction();
142 //            assertNotNull(comp.getId());
143 //            assertNotNull(serv.load(Company.class, comp.getId()));
144 //            serv.commit();
145         }finally{
146             store.setAutoCommit(false);
147             deleteAll();
148         }
149         //
150     }
151     
152     public void test_lock1() throws Exception { 
153         Company comp = new Company();
154         comp.setName("МТС");
155         comp.setComment("Комментарий10");
156         store.save(comp);
157         Company comp2 = (Company)store.load(Company.class, comp.getId());
158         store.beginTransaction();
159         store.lock(comp2);
160         comp2.setDsc("Новый комментарий");
161         store.save(comp2);
162         store.commit();
163         //
164         deleteAll();
165     }
166     
167     public void test_lock2() throws Exception {
168         Company comp = new Company();
169         comp.setName("МТС");
170         comp.setComment("Комментарий10");
171         store.save(comp);
172         store.beginTransaction();
173         store.lock(comp);
174         comp.setDsc("Новый комментарий");
175         store.commit();
176         
177         store.beginTransaction();
178         store.lock(comp);
179         LockerThread locker = new LockerThread(store, comp.getId());        
180         locker.start();
181         locker.join(15000);
182         assertFalse(locker.isAlive());
183         assertFalse(locker.isSuccess());
184         store.commit();
185         //
186         log.debug("Phase 2");
187         //Thread.currentThread().sleep(5000);
188         locker = new LockerThread(store, comp.getId());        
189         locker.start();
190         locker.join(15000);
191         assertFalse(locker.isAlive());
192         assertTrue(locker.isSuccess());
193         //
194         deleteAll();
195     }
196     
197     public void test_relations() throws Exception {
198         Company comp = new Company();
199         comp.setName("МТС");
200         comp.setComment("Комментарий10");
201         store.save(comp);
202         //
203         comp.setComment("Новый комментарий 987");
204         store.save(comp);
205         //
206         Address addr = new Address();
207         addr.setStreet("Адрес для компании");
208         store.save(addr);
209         //
210         //Company comp2=(Company)serv.load(Company.class, comp.getId());
211         Company comp2=comp;
212         Address addr2=(Address)store.load(Address.class, addr.getId());
213         //assertNotSame(comp, comp2);
214         comp2.setAddress(addr2);
215         store.save(comp2);
216         //
217         deleteAll();
218     }
219     
220     public void test_binaryData() throws Exception {
221         Employee emp = new Employee();
222         emp.setName("test name");
223         byte[] photo = new byte[]{1,2,4,5};
224         emp.setPhoto(photo);
225         store.save(emp);
226         emp = (Employee)store.load(Employee.class, emp.getId());
227         store.beginTransaction();
228         try{
229             store.refresh(emp);
230             assertTrue(Arrays.equals(photo, emp.getPhoto()));
231         }finally{
232             store.commit();
233         }
234         //
235         deleteAll();
236     }
237     
238     public void test_lazyProperty() throws Exception {
239         PropertyValue propValue = (PropertyValue)
240             registry.getService(PropertyValue.class);
241         Employee emp = new Employee();
242         emp.setName("test name");
243         byte[] photo = new byte[]{1,2,4,5};
244         emp.setPhoto(photo);
245         store.save(emp);
246         emp = (Employee)store.load(Employee.class, emp.getId());
247         Integer id = propValue.compileGetter(Employee.class, "photo");
248         byte[] photoTest = (byte[])propValue.getValue(emp, id);
249         assertTrue(Arrays.equals(photo, photoTest));
250         //
251         deleteAll();
252     }
253     
254     public void test_isPropertyIsNull() throws Exception {
255         Employee emp = new Employee();
256         emp.setName("test name");
257         byte[] photo = new byte[]{1,2,4,5};
258         emp.setPhoto(photo);
259         store.save(emp);
260         assertFalse(store.isPropertyValueNull(emp, "photo"));
261         assertTrue(store.isPropertyValueNull(emp, "photo2"));
262         //
263         deleteAll();
264     }
265     
266     public void _test_auditDomainObjects() throws Exception {
267         ObjectModificationPk pk = 
268                 new ObjectModificationPk(1l, Company.class.getName());
269         ObjectModification objMod = new ObjectModification(pk);
270         store.save(objMod);
271     }
272     
273     private class LockerThread extends Thread{
274         private ObjectStore pserv;
275         private Long id;
276         private boolean success = false;
277                 
278         public LockerThread(ObjectStore service, Long obj){
279             pserv = service;
280             id = obj;
281         }
282         
283         public void run() {
284             try {
285                 log.debug("-->Locker thread run()");
286                 Object object = pserv.load(Company.class, id);
287                 pserv.beginTransaction();
288                 log.debug("locking object from locker");
289                 pserv.lock(object);
290                 ((Company)object).setDsc("comment");
291                 pserv.save(object);
292                 pserv.commit();
293                 log.debug("locked");
294                 success = true;
295             }catch(Exception e){
296                 try{
297                     pserv.commit();
298                 }catch(Exception e2){
299                     log.error("Rollback error", e2);
300                 }
301                 log.error("Lock error", e);
302             }
303         }
304 
305         public boolean isSuccess() {
306             return success;
307         }
308     }
309         
310 }