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
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
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
132
133
134
135
136
137
138
139
140
141
142
143
144
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
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
211 Company comp2=comp;
212 Address addr2=(Address)store.load(Address.class, addr.getId());
213
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 }