Update root entity merge calls to use new merge method.
[taxeditor.git] / eu.etaxonomy.taxeditor.test / src / test / java / eu / etaxonomy / taxeditor / session / CdmEntitySessionAwareTest.java
1 // $Id$
2 /**
3 * Copyright (C) 2014 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10 package eu.etaxonomy.taxeditor.session;
11
12 import java.util.ArrayList;
13 import java.util.Iterator;
14 import java.util.List;
15 import java.util.Map;
16 import java.util.Set;
17 import java.util.UUID;
18
19 import org.apache.log4j.Logger;
20 import org.hibernate.collection.spi.PersistentCollection;
21 import org.junit.Assert;
22 import org.junit.BeforeClass;
23 import org.junit.Ignore;
24 import org.junit.Test;
25 import org.unitils.dbunit.annotation.DataSet;
26
27 import eu.etaxonomy.cdm.api.application.CdmApplicationState;
28 import eu.etaxonomy.cdm.api.service.ICommonService;
29 import eu.etaxonomy.cdm.api.service.IPolytomousKeyNodeService;
30 import eu.etaxonomy.cdm.api.service.IPolytomousKeyService;
31 import eu.etaxonomy.cdm.api.service.ITaxonService;
32 import eu.etaxonomy.cdm.api.service.ITermService;
33 import eu.etaxonomy.cdm.api.service.IUserService;
34 import eu.etaxonomy.cdm.api.service.IVocabularyService;
35 import eu.etaxonomy.cdm.model.agent.AgentBase;
36 import eu.etaxonomy.cdm.model.agent.Person;
37 import eu.etaxonomy.cdm.model.common.CdmBase;
38 import eu.etaxonomy.cdm.model.common.Credit;
39 import eu.etaxonomy.cdm.model.common.DefinedTermBase;
40 import eu.etaxonomy.cdm.model.common.Extension;
41 import eu.etaxonomy.cdm.model.common.IdentifiableSource;
42 import eu.etaxonomy.cdm.model.common.Language;
43 import eu.etaxonomy.cdm.model.common.LanguageString;
44 import eu.etaxonomy.cdm.model.common.TermType;
45 import eu.etaxonomy.cdm.model.common.TermVocabulary;
46 import eu.etaxonomy.cdm.model.description.KeyStatement;
47 import eu.etaxonomy.cdm.model.description.PolytomousKey;
48 import eu.etaxonomy.cdm.model.description.PolytomousKeyNode;
49 import eu.etaxonomy.cdm.model.media.Rights;
50 import eu.etaxonomy.cdm.model.taxon.Taxon;
51 import eu.etaxonomy.taxeditor.httpinvoker.RemotingSessionAwareTest;
52
53 /**
54 * @author cmathew
55 * @date 7 Oct 2014
56 *
57 */
58 @DataSet
59 public class CdmEntitySessionAwareTest extends RemotingSessionAwareTest {
60
61 private static final Logger logger = Logger.getLogger(CdmEntitySessionAwareTest.class);
62
63 UUID polytomousKeyUuid = UUID.fromString("0d53ba20-7de4-4baa-bd8a-401048447d66");
64 UUID subKeyUuid = UUID.fromString("9d8bf4f6-a70a-4b80-8556-2ccfb436ff01");
65 //UUID polytomousKeyUuid = UUID.fromString("bab66772-2c83-428a-bb6d-655d12ac6097");
66 UUID taxon1Uuid = UUID.fromString("2b336df7-29e8-4f79-985f-66502739d22f");
67 UUID personUuid = UUID.fromString("945d08f2-eb92-45b6-9252-6275ea6d338b");
68
69
70
71 IPolytomousKeyService polytomousKeyService = getRemoteApplicationController().getPolytomousKeyService();
72 IPolytomousKeyNodeService polytomousKeyNodeService = getRemoteApplicationController().getPolytomousKeyNodeService();
73 ICommonService commonService = getRemoteApplicationController().getCommonService();
74 ITaxonService taxonService = getRemoteApplicationController().getTaxonService();
75 IVocabularyService vocabularyService = getRemoteApplicationController().getVocabularyService();
76 ITermService termService = getRemoteApplicationController().getTermService();
77 IUserService userService = getRemoteApplicationController().getUserService();
78
79 //Language english = Language.getLanguageFromUuid(Language.uuidEnglish);
80
81
82
83 @BeforeClass
84 public static void initializePolytomousKeyTest() {
85 }
86
87
88 @Test
89 public void readAllPolytomousKeys() {
90 List<PolytomousKey> pKeys = polytomousKeyService.list(PolytomousKey.class, null, null, null, null);
91 Iterator<PolytomousKey> pKeysItr = pKeys.iterator();
92 Assert.assertEquals(pKeysItr.next().getUuid(),UUID.fromString("9d8bf4f6-a70a-4b80-8556-2ccfb436ff01"));
93 Assert.assertEquals(pKeysItr.next().getUuid(),UUID.fromString("0d53ba20-7de4-4baa-bd8a-401048447d66"));
94 }
95
96
97 @Test
98 //@DataSet("PolytomousKeyTest.readPolytmousKeyData.xml")
99 public void readPolytmousKeyData() {
100 PolytomousKey pKey = CdmBase.deproxy(polytomousKeyService.find(polytomousKeyUuid),PolytomousKey.class);
101 Set<Taxon> taxonomicScope = pKey.getTaxonomicScope();
102 Iterator<Taxon> tsItr = taxonomicScope.iterator();
103 Taxon taxon = tsItr.next();
104
105 Assert.assertEquals("Achillea sec. Cyprus", taxon.getTitleCache());
106 Assert.assertEquals(tsItr.hasNext(), false);
107
108 List<Credit> credits = pKey.getCredits();
109 AgentBase agent = credits.get(0).getAgent();
110 Assert.assertEquals(agent.getId(),4809);
111 Assert.assertEquals(agent.getTitleCache(),"R. A. Graham");
112 Assert.assertEquals(credits.get(0).getText(),"Credits Text Test");
113
114 Set<Extension> exts = pKey.getExtensions();
115 Iterator<Extension> extItr = exts.iterator();
116 Extension ext = extItr.next();
117 Assert.assertEquals(ext.getValue(), "http://test.com");
118
119 Set<Rights> rights = pKey.getRights();
120 Iterator<Rights> rightsItr = rights.iterator();
121 Rights right = rightsItr.next();
122 Assert.assertEquals(right.getText(),"Rights Text Test");
123
124 Set<IdentifiableSource> sources = pKey.getSources();
125 Iterator<IdentifiableSource> sourcesItr = sources.iterator();
126 IdentifiableSource source = sourcesItr.next();
127 Assert.assertEquals(source.getId(), 23710);
128 source = sourcesItr.next();
129 Assert.assertEquals(source.getId(), 23711);
130
131 // TO DO : Added tests for Annotations , Markers
132 }
133
134
135
136 @Test
137 public void readPolytomousKeyDataFromNodes() {
138 PolytomousKey pKey = CdmBase.deproxy(polytomousKeyService.find(polytomousKeyUuid),PolytomousKey.class);
139 PolytomousKeyNode rootNode = pKey.getRoot();
140
141
142 Assert.assertEquals(rootNode.getId(), 2750);
143
144 Assert.assertEquals(rootNode.getChildAt(0).getId(), 2751);
145 Assert.assertEquals(rootNode.getChildAt(0).getParent().getId(), rootNode.getId());
146 Assert.assertEquals(rootNode.getKey().getId(), pKey.getId());
147 Integer sortIndex = (Integer)getFieldValueViaReflection(rootNode.getChildAt(0), "sortIndex");
148 Assert.assertEquals(sortIndex, new Integer(0));
149 String statement = "Capitula without ligulate ray-florets; leaves entire or subentire";
150 Assert.assertEquals(rootNode.getChildAt(0).getStatement().getLabelText(Language.ENGLISH()), statement);
151
152 Assert.assertEquals(rootNode.getChildAt(1).getId(), 2753);
153 Assert.assertEquals(rootNode.getChildAt(1).getParent().getId(), rootNode.getId());
154 Assert.assertEquals(rootNode.getChildAt(1).getKey().getId(), pKey.getId());
155 sortIndex = (Integer)getFieldValueViaReflection(rootNode.getChildAt(1), "sortIndex");
156 Assert.assertEquals(sortIndex, new Integer(1));
157 statement = "Capitula with ligulate ray-florets; leaves pinnatisect";
158 Assert.assertEquals(rootNode.getChildAt(1).getStatement().getLabelText(Language.ENGLISH()), statement);
159
160 Assert.assertEquals(rootNode.getChildAt(1).getChildAt(0).getId(), 2754);
161 Assert.assertEquals(rootNode.getChildAt(1).getChildAt(0).getParent().getId(), rootNode.getChildAt(1).getId());
162 Assert.assertEquals(rootNode.getChildAt(1).getChildAt(0).getKey().getId(), pKey.getId());
163 sortIndex = (Integer)getFieldValueViaReflection(rootNode.getChildAt(1).getChildAt(0), "sortIndex");
164 Assert.assertEquals(sortIndex, new Integer(0));
165 statement = "Ray-florets yellow";
166 Assert.assertEquals(rootNode.getChildAt(1).getChildAt(0).getStatement().getLabelText(Language.ENGLISH()), statement);
167 Assert.assertEquals(rootNode.getChildAt(1).getChildAt(0).getChildAt(0).getTaxon().getTitleCache(), "Achillea arabica Kotschy sec. Cyprus");
168 }
169
170 @Test
171 public void addGrandChildPolytomousKeyNode() {
172
173 PolytomousKey pKey = CdmBase.deproxy(polytomousKeyService.find(polytomousKeyUuid),PolytomousKey.class);
174 PolytomousKeyNode rootChildNode = pKey.getRoot().getChildAt(0);
175 PolytomousKeyNode grandChildNode = PolytomousKeyNode.NewInstance();
176 rootChildNode.addChild(grandChildNode);
177
178 polytomousKeyService.merge(pKey, true);
179 grandChildNode = pKey.getRoot().getChildAt(0).getChildAt(0);
180 Assert.assertTrue(0 != grandChildNode.getId());
181 KeyStatement ks = KeyStatement.NewInstance("test");
182 grandChildNode.setStatement(ks);
183 polytomousKeyService.merge(pKey, true);
184
185 //grandChildNode = pKey.getRoot().getChildAt(0).getChildAt(0);
186 //KeyStatement ks = grandChildNode.getStatement();
187 Assert.assertTrue(0 != ks.getId());
188
189 }
190
191 @Test
192 public void addGreatGrandChildPolytomousKeyNode() {
193
194 PolytomousKey pKey = CdmBase.deproxy(polytomousKeyService.find(polytomousKeyUuid),PolytomousKey.class);
195 PolytomousKeyNode rootChildNode = pKey.getRoot().getChildAt(0);
196 PolytomousKeyNode grandChildNode = PolytomousKeyNode.NewInstance();
197 rootChildNode.addChild(grandChildNode);
198
199
200 polytomousKeyNodeService.merge(grandChildNode);
201
202
203 Assert.assertFalse(pKey.getRoot().getChildAt(0).getChildAt(0).getId() == 0);
204 }
205
206 @Test
207 public void savePolytomousKeyNodeData() {
208 PolytomousKey pkey = CdmBase.deproxy(polytomousKeyService.find(polytomousKeyUuid),PolytomousKey.class);
209
210 PolytomousKeyNode pkeynode = pkey.getRoot();
211 String newQuestion = "New Question";
212 String newStatement = "New Statement";
213
214 Assert.assertEquals("Question 1",pkeynode.getQuestion().getLabel().get(Language.ENGLISH()).getText());
215 for(PolytomousKeyNode node : pkeynode.getChildren()) {
216
217 node.setQuestion(null);
218 node.setStatement(null);
219 }
220 //FIXME:Remoting Add tests for feature after fixing problem
221
222 //Feature feature = pkeynode.getFeature();
223 //Assert.assertEquals(feature.getTitleCache(),"Systematics");
224 //pkeynode.setFeature(null);
225
226 Assert.assertEquals(pkeynode.getChildAt(0).getModifyingText().get(Language.ENGLISH()).getText(),"Modifying Text 1a");
227 String modifyingText = "Modifying Text 1a updated";
228
229 //pkeynode.getChildAt(0).putModifyingText(Language.ENGLISH(), modifyingText);
230
231 Assert.assertEquals(pkeynode.getChildAt(0).getSubkey().getId(),751);
232 Assert.assertEquals("Asphodeline", pkeynode.getChildAt(0).getSubkey().getTitleCache());
233 Assert.assertNull(pkeynode.getChildAt(1).getTaxon());
234 Taxon taxon = CdmBase.deproxy(taxonService.find(taxon1Uuid),Taxon.class);
235 pkeynode.getChildAt(1).setTaxon(taxon);
236
237 polytomousKeyService.merge(pkey);
238
239 pkey = CdmBase.deproxy(polytomousKeyService.find(polytomousKeyUuid),PolytomousKey.class);
240
241
242 pkeynode = pkey.getRoot();
243 for(PolytomousKeyNode node : pkeynode.getChildren()) {
244 Assert.assertNull(node.getQuestion());
245 node.setQuestion(KeyStatement.NewInstance(Language.ENGLISH(),newQuestion));
246 Assert.assertNull(node.getStatement());
247 node.setStatement(KeyStatement.NewInstance(Language.ENGLISH(),newStatement));
248 }
249
250 Assert.assertEquals(pkeynode.getChildAt(1).getTaxon(), taxon);
251
252 polytomousKeyService.merge(pkey);
253
254 pkey = CdmBase.deproxy(polytomousKeyService.find(polytomousKeyUuid),PolytomousKey.class);
255
256 pkeynode = pkey.getRoot();
257 for(PolytomousKeyNode node : pkeynode.getChildren()) {
258 Assert.assertNotNull(node.getQuestion());
259 Map<Language, LanguageString> label = node.getQuestion().getLabel();
260 Assert.assertEquals(newQuestion, label.get(Language.ENGLISH()).getText());
261 Assert.assertNotNull(node.getStatement());
262 Assert.assertEquals(newStatement, node.getStatement().getLabel(Language.ENGLISH()).getText());
263 }
264 //Assert.assertEquals(pkeynode.getFeature().getId(), feature.getId());
265
266 }
267
268
269 @Test
270 public void savePolytomousKeyNodeDataWithSameSubKey() {
271
272 PolytomousKey pkey = CdmBase.deproxy(polytomousKeyService.find(polytomousKeyUuid),PolytomousKey.class);
273
274
275 PolytomousKeyNode pkeynode = pkey.getRoot();
276
277 PolytomousKey subkey1 = CdmBase.deproxy(pkeynode.getChildAt(0).getSubkey(), PolytomousKey.class);
278 String subkey1title = subkey1.getTitleCache();
279 subkey1.setTitleCache(subkey1title + "test", true);
280
281
282 PolytomousKey subkey2 = CdmBase.deproxy(pkeynode.getChildAt(1).getChildAt(0).getSubkey(), PolytomousKey.class);
283 String subkey2title = subkey2.getTitleCache();
284 subkey2.setTitleCache(subkey2title + "test", true);
285
286 Assert.assertSame(subkey1, subkey2);
287
288 polytomousKeyService.merge(pkey);
289 }
290
291 @Test
292 public void savePolytomousKeyNodeDataWithSameSubKeyUsingService() {
293
294 PolytomousKey pkey = CdmBase.deproxy(polytomousKeyService.find(polytomousKeyUuid),PolytomousKey.class);
295
296
297 PolytomousKeyNode pkeynode = pkey.getRoot();
298
299 PersistentCollection children = (PersistentCollection) pkeynode.getChildren();
300 PolytomousKeyNode childNode0 = (PolytomousKeyNode)commonService.get(pkeynode.getUuid(), "children", 0);
301 PolytomousKey subkey1 = CdmBase.deproxy(childNode0.getSubkey(),PolytomousKey.class);
302 String subkey1title = subkey1.getTitleCache();
303 subkey1.setTitleCache(subkey1title + "test", true);
304
305 PolytomousKeyNode childNode1 = (PolytomousKeyNode)commonService.get(pkeynode.getUuid(), "children", 1);
306 PolytomousKey subkey2 = CdmBase.deproxy(childNode1.getSubkey(),PolytomousKey.class);
307 String subkey2title = subkey2.getTitleCache();
308 subkey2.setTitleCache(subkey2title + "test", true);
309
310 Assert.assertNotSame(childNode0, childNode1);
311
312 Assert.assertSame(subkey1, subkey2);
313
314 polytomousKeyService.merge(pkey);
315 }
316
317
318
319 @Test
320 public void savePolytomousKeyNodeDataWithSameLanguageInLabel() {
321
322 PolytomousKey pkey = CdmBase.deproxy(polytomousKeyService.find(polytomousKeyUuid),PolytomousKey.class);
323 PolytomousKeyNode pkeynode = pkey.getRoot();
324
325 Map<Language, LanguageString> label1 = pkeynode.getQuestion().getLabel();
326 label1.size();
327
328
329 Map<Language, LanguageString> label2 = pkeynode.getChildAt(0).getStatement().getLabel();
330 label2.size();
331
332
333 polytomousKeyService.merge(pkey);
334 }
335
336 @Test
337 public void deleteSubKeyInPolytomousSubKeyWithoutInitializing() {
338 PolytomousKey pKey = CdmBase.deproxy(polytomousKeyService.find(polytomousKeyUuid),PolytomousKey.class);
339
340
341 PolytomousKeyNode rootNode = pKey.getRoot();
342 PolytomousKeyNode child = rootNode.getChildAt(0);
343 PolytomousKey subKey = child.getSubkey();
344
345 polytomousKeyService.delete(subKey.getUuid());
346
347 // retrieving subkey shows its null
348 subKey = CdmBase.deproxy(polytomousKeyService.find(subKeyUuid),PolytomousKey.class);
349 Assert.assertNull(subKey);
350
351 pKey = CdmBase.deproxy(polytomousKeyService.find(polytomousKeyUuid),PolytomousKey.class);
352
353
354 rootNode = pKey.getRoot();
355 child = rootNode.getChildAt(0);
356 subKey = child.getSubkey();
357 // subkey will not be null, because the delete functionality of the subkey
358 // does not currently delete it from a polytomous key node
359
360 // FIXME: With the new delete functionality this should be null, shouldn't it ?
361 Assert.assertNotNull(subKey);
362 }
363
364
365 @Test
366 public void deleteSubKeyInPolytomousNode() {
367 PolytomousKey pKey = CdmBase.deproxy(polytomousKeyService.find(polytomousKeyUuid),PolytomousKey.class);
368
369
370 PolytomousKeyNode rootNode = pKey.getRoot();
371 List<PolytomousKeyNode> children = rootNode.getChildren();
372 PolytomousKeyNode child = rootNode.getChildAt(0);
373 polytomousKeyNodeService.delete(child.getUuid(), true);
374
375 pKey = CdmBase.deproxy(polytomousKeyService.find(polytomousKeyUuid),PolytomousKey.class);
376
377 rootNode = pKey.getRoot();
378 children = rootNode.getChildren();
379 Assert.assertFalse(children.contains(child));
380 }
381
382 @Test
383 public void deleteSubKeyInPolytomousSubKeyAfterInitializing() {
384 PolytomousKey pKey = CdmBase.deproxy(polytomousKeyService.find(polytomousKeyUuid),PolytomousKey.class);
385
386
387 PolytomousKeyNode rootNode = pKey.getRoot();
388 PolytomousKeyNode child = rootNode.getChildAt(0);
389 PolytomousKey subKey = child.getSubkey();
390 // this call initializes the subkey
391 subKey.getRoot();
392
393 polytomousKeyService.delete(subKey);
394
395 // since subKey was initialized before the delete, it will be
396 // accesible even after the delete. This behaviour is similar
397 // to hibernate session delete where the deleted object is
398 // made transient, but not deleted from the object graph
399
400 PolytomousKeyNode subKeyRootNode = subKey.getRoot();
401 Assert.assertNotNull(subKey);
402 }
403
404 @Test
405 public void saveNewTermVocabulary() {
406 TermVocabulary termVocabulary =
407 TermVocabulary.NewInstance(TermType.Feature,
408 null,
409 "Untitled",
410 null,
411 null);
412 try {
413 List<TermVocabulary<DefinedTermBase>> vocabularies = vocabularyService.findByTermType(TermType.Feature);
414
415 for(TermVocabulary vocab : vocabularies) {
416 vocab.getTermsOrderedByLabels(Language.ENGLISH());
417 }
418
419 termVocabulary = vocabularyService.merge(termVocabulary);
420 vocabularies.add(termVocabulary);
421 termVocabulary.setLabel("Test");
422 vocabularyService.merge(new ArrayList<TermVocabulary>(vocabularies));
423 } finally {
424 vocabularyService.delete(termVocabulary);
425 }
426 }
427
428 @Ignore // should be enabled once resolution of #5066 is merged into cdmlib main branch
429 @Test
430 public void saveNewTerm() {
431 UUID vocNameFeatureUuid = UUID.fromString("fa7ca3eef-4092-49e1-beec-ed5096193e5e");
432 UUID vocFeatureUuid = UUID.fromString("b187d555-f06f-4d65-9e53-da7c93f8eaa8");
433 DefinedTermBase newTerm = TermType.Feature.getEmptyDefinedTermBase();
434 newTerm.setLabel("CreateTest");
435
436 try {
437
438 Assert.assertNotNull(newTerm);
439 TermVocabulary vocNameFeature = vocabularyService.find(vocNameFeatureUuid);
440 TermVocabulary vocFeature = vocabularyService.find(vocFeatureUuid);
441
442 List<TermVocabulary> vocs = new ArrayList<TermVocabulary>();
443
444 vocs.add(vocNameFeature);
445 vocs.add(vocFeature);
446
447 vocNameFeature.addTerm(newTerm);
448
449 vocs = vocabularyService.merge(vocs);
450 for(TermVocabulary voc : vocs) {
451 if(voc.getUuid().equals(vocNameFeatureUuid)) {
452 vocNameFeature = voc;
453 }
454 }
455
456 Assert.assertTrue(vocNameFeature.getTerms().contains(newTerm));
457
458 for(Object obj : vocNameFeature.getTerms()) {
459 DefinedTermBase dtb = (DefinedTermBase)obj;
460 if("CreateTest".equals(dtb.getLabel())) {
461 newTerm = dtb;
462 Assert.assertNotNull(dtb.getCreatedBy());
463 Assert.assertNotNull(dtb.getCreated());
464 } else {
465 Assert.assertNull(dtb.getCreatedBy());
466 }
467 }
468 newTerm.setLabel("UpdateTest");
469 newTerm = termService.merge(newTerm);
470 Assert.assertNotNull(newTerm.getUpdatedBy());
471 Assert.assertNotNull(newTerm.getUpdated());
472
473 Assert.assertNull(vocNameFeature.getCreatedBy());
474 Assert.assertNull(vocFeature.getCreatedBy());
475 } finally {
476 if(termService.find(newTerm.getUuid()) != null) {
477 termService.delete(newTerm.getUuid());
478 }
479 }
480 }
481
482 @Ignore // activate after fixing #5138
483 @Test
484 public void updatePerson() {
485 Person person = (Person) CdmApplicationState.getCurrentAppConfig().getAgentService().load(personUuid);
486 // Note : at this point the contact field in Person (AgentBase) is initialized even though no
487 // data related to the Contact class exists in the database.
488 person.setFirstname("Me");
489 CdmApplicationState.getCurrentAppConfig().getAgentService().merge(person);
490
491 }
492
493 @Ignore // activate after fixing #5138
494 @Test
495 public void createPerson() {
496
497 Person person = Person.NewInstance();
498 //person.setTitleCache("New Person", true);
499 person = (Person) CdmApplicationState.getCurrentAppConfig().getAgentService().merge(person);
500 //Note : at this point the contact field in Person (AgentBase) is set to null which is
501 // different behaviour as compared to a load call on an existing Person entity.
502 // The fact that the contact is null will lead to the all-delete-orphan error.
503 person = (Person) CdmApplicationState.getCurrentAppConfig().getAgentService().load(person.getUuid());
504 person.setFirstname("Some");
505 CdmApplicationState.getCurrentAppConfig().getAgentService().merge(person);
506 }
507 }