1
|
/**
|
2
|
* Copyright (C) 2020 EDIT
|
3
|
* European Distributed Institute of Taxonomy
|
4
|
* http://www.e-taxonomy.eu
|
5
|
*
|
6
|
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
7
|
* See LICENSE.TXT at the top of this package for the full license terms.
|
8
|
*/
|
9
|
package eu.etaxonomy.cdm.api.service;
|
10
|
|
11
|
import static org.junit.Assert.assertNotNull;
|
12
|
import static org.junit.Assert.assertNull;
|
13
|
|
14
|
import java.io.FileNotFoundException;
|
15
|
import java.util.ArrayList;
|
16
|
import java.util.List;
|
17
|
import java.util.UUID;
|
18
|
|
19
|
import org.junit.Assert;
|
20
|
import org.junit.Test;
|
21
|
import org.unitils.dbunit.annotation.DataSet;
|
22
|
import org.unitils.dbunit.annotation.DataSets;
|
23
|
import org.unitils.dbunit.datasetloadstrategy.impl.RefreshLoadStrategy;
|
24
|
import org.unitils.spring.annotation.SpringBeanByType;
|
25
|
|
26
|
import eu.etaxonomy.cdm.api.service.config.NodeDeletionConfigurator.ChildHandling;
|
27
|
import eu.etaxonomy.cdm.api.service.config.TermNodeDeletionConfigurator;
|
28
|
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
|
29
|
import eu.etaxonomy.cdm.model.common.CdmBase;
|
30
|
import eu.etaxonomy.cdm.model.common.ITreeNode;
|
31
|
import eu.etaxonomy.cdm.model.common.Language;
|
32
|
import eu.etaxonomy.cdm.model.description.Character;
|
33
|
import eu.etaxonomy.cdm.model.description.Feature;
|
34
|
import eu.etaxonomy.cdm.model.term.DefinedTerm;
|
35
|
import eu.etaxonomy.cdm.model.term.Representation;
|
36
|
import eu.etaxonomy.cdm.model.term.TermNode;
|
37
|
import eu.etaxonomy.cdm.model.term.TermTree;
|
38
|
import eu.etaxonomy.cdm.model.term.TermType;
|
39
|
import eu.etaxonomy.cdm.persistence.dto.CharacterDto;
|
40
|
import eu.etaxonomy.cdm.persistence.dto.CharacterNodeDto;
|
41
|
import eu.etaxonomy.cdm.persistence.dto.TermDto;
|
42
|
import eu.etaxonomy.cdm.persistence.dto.TermNodeDto;
|
43
|
import eu.etaxonomy.cdm.persistence.dto.TermTreeDto;
|
44
|
import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest;
|
45
|
import eu.etaxonomy.cdm.test.unitils.CleanSweepInsertLoadStrategy;
|
46
|
|
47
|
/**
|
48
|
* @author k.luther
|
49
|
* @since Oct 30, 2020
|
50
|
*/
|
51
|
public class TermNodeServiceImplTest extends CdmTransactionalIntegrationTest{
|
52
|
|
53
|
private static final String sep = ITreeNode.separator;
|
54
|
private static final String pref = ITreeNode.treePrefix;
|
55
|
|
56
|
private static final UUID featureTreeUuid = UUID.fromString("6c2bc8d9-ee62-4222-be89-4a8e31770878");
|
57
|
private static final UUID featureTree2Uuid = UUID.fromString("43d67247-936f-42a3-a739-bbcde372e334");
|
58
|
private static final UUID node2Uuid= UUID.fromString("484a1a77-689c-44be-8e65-347d835f47e8");
|
59
|
private static final UUID node3Uuid = UUID.fromString("2d41f0c2-b785-4f73-a436-cc2d5e93cc5b");
|
60
|
private static final UUID node4Uuid = UUID.fromString("fdaec4bd-c78e-44df-ae87-28f18110968c");
|
61
|
private static final UUID node5Uuid = UUID.fromString("c4d5170a-7967-4dac-ab76-ae2019eefde5");
|
62
|
private static final UUID node6Uuid = UUID.fromString("b419ba5e-9c8b-449c-ad86-7abfca9a7340");
|
63
|
|
64
|
private TermNode<Feature> node3;
|
65
|
private TermNode<Feature> node2;
|
66
|
|
67
|
@SpringBeanByType
|
68
|
private ITermNodeService termNodeService;
|
69
|
|
70
|
@SpringBeanByType
|
71
|
private ITermTreeService termTreeService;
|
72
|
|
73
|
@SpringBeanByType
|
74
|
private ITermService termService;
|
75
|
|
76
|
@Test
|
77
|
@DataSets({
|
78
|
@DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class, value="/eu/etaxonomy/cdm/database/ClearDB_with_Terms_DataSet.xml"),
|
79
|
@DataSet(value="/eu/etaxonomy/cdm/database/TermsDataSet-with_auditing_info.xml"),
|
80
|
})
|
81
|
public void testSaveCharacterNode_supportedData() {
|
82
|
UUID characterTreeUuid = createAndSaveCharacterTree();
|
83
|
|
84
|
TermTreeDto dto = termTreeService.getTermTreeDtoByUuid(characterTreeUuid);
|
85
|
List<TermNodeDto> children = dto.getRoot().getChildren();
|
86
|
CharacterNodeDto nodeDto = (CharacterNodeDto) children.get(0);
|
87
|
TermDto termDto = nodeDto.getTerm();
|
88
|
if (termDto instanceof CharacterDto){
|
89
|
CharacterDto characterDto = (CharacterDto) termDto;
|
90
|
characterDto.setSupportsCategoricalData(true);
|
91
|
List<CharacterNodeDto> dtos = new ArrayList<>();
|
92
|
dtos.add(nodeDto);
|
93
|
termNodeService.saveCharacterNodeDtoList(dtos);
|
94
|
commitAndStartNewTransaction();
|
95
|
@SuppressWarnings("unchecked")
|
96
|
TermTree<Feature> characterTree = termTreeService.load(characterTreeUuid);
|
97
|
List<TermNode<Feature>> childNodes = characterTree.getRoot().getChildNodes();
|
98
|
TermNode<Feature> child = childNodes.get(0);
|
99
|
|
100
|
Assert.assertTrue(child.getTerm().isSupportsCategoricalData());
|
101
|
|
102
|
}else{
|
103
|
Assert.fail();
|
104
|
}
|
105
|
}
|
106
|
|
107
|
@Test
|
108
|
public void testSaveCharacterNode_representation() {
|
109
|
UUID characterTreeUuid = createAndSaveCharacterTree();
|
110
|
|
111
|
TermTreeDto dto = termTreeService.getTermTreeDtoByUuid(characterTreeUuid);
|
112
|
List<TermNodeDto> children = dto.getRoot().getChildren();
|
113
|
CharacterNodeDto nodeDto = (CharacterNodeDto) children.get(0);
|
114
|
TermDto termDto = nodeDto.getTerm();
|
115
|
if (termDto instanceof CharacterDto){
|
116
|
CharacterDto characterDto = (CharacterDto) termDto;
|
117
|
Representation rep = characterDto.getPreferredRepresentation(Language.DEFAULT());
|
118
|
if (rep != null){
|
119
|
rep.setText("Test");
|
120
|
}else{
|
121
|
rep = Representation.NewInstance("Test", "", "", Language.DEFAULT());
|
122
|
characterDto.addRepresentation(rep);
|
123
|
}
|
124
|
List<CharacterNodeDto> dtos = new ArrayList<>();
|
125
|
dtos.add(nodeDto);
|
126
|
termNodeService.saveCharacterNodeDtoList(dtos);
|
127
|
commitAndStartNewTransaction();
|
128
|
@SuppressWarnings("unchecked")
|
129
|
TermTree<Feature> characterTree = termTreeService.load(characterTreeUuid);
|
130
|
List<TermNode<Feature>> childNodes = characterTree.getRoot().getChildNodes();
|
131
|
TermNode<Feature> child = childNodes.get(0);
|
132
|
|
133
|
Assert.assertTrue(child.getTerm().getPreferredRepresentation(Language.DEFAULT()).getText().equals("Test"));
|
134
|
|
135
|
}else{
|
136
|
Assert.fail();
|
137
|
}
|
138
|
}
|
139
|
|
140
|
private UUID createAndSaveCharacterTree() {
|
141
|
DefinedTerm structure = DefinedTerm.NewInstance(TermType.Structure);
|
142
|
TermTree<DefinedTerm> structureTree = TermTree.NewInstance(TermType.Structure);
|
143
|
TermNode<DefinedTerm> nodeStructure = structureTree.getRoot().addChild(structure);
|
144
|
|
145
|
DefinedTerm property = DefinedTerm.NewInstance(TermType.Property);
|
146
|
TermTree<DefinedTerm> propertyTree = TermTree.NewInstance(TermType.Property);
|
147
|
TermNode<DefinedTerm> nodeProperty = propertyTree.getRoot().addChild(property);
|
148
|
termService.saveOrUpdate(property);
|
149
|
termService.saveOrUpdate(structure);
|
150
|
termTreeService.saveOrUpdate(structureTree);
|
151
|
termTreeService.saveOrUpdate(propertyTree);
|
152
|
|
153
|
TermTree<Feature> characterTree = TermTree.NewInstance(TermType.Feature);
|
154
|
UUID characterTreeUuid = characterTree.getUuid();
|
155
|
Character character = Character.NewInstance(nodeStructure, nodeProperty);
|
156
|
character.setSupportsCategoricalData(false);
|
157
|
|
158
|
characterTree.getRoot().addChild(character);
|
159
|
termService.saveOrUpdate(character);
|
160
|
termTreeService.saveOrUpdate(characterTree);
|
161
|
commitAndStartNewTransaction();
|
162
|
|
163
|
return characterTreeUuid;
|
164
|
}
|
165
|
|
166
|
|
167
|
@Test
|
168
|
public void testIndexCreatRoot() {
|
169
|
TermTree<Feature> featureTree = TermTree.NewFeatureInstance();
|
170
|
termTreeService.save(featureTree);
|
171
|
|
172
|
Feature feature = (Feature)termService.find(914);
|
173
|
TermNode<Feature> newNode = featureTree.getRoot().addChild(feature);
|
174
|
termTreeService.save(featureTree);
|
175
|
|
176
|
termNodeService.saveOrUpdate(newNode);
|
177
|
|
178
|
commitAndStartNewTransaction(/*new String[]{"FeatureNode"}*/);
|
179
|
newNode = termNodeService.load(newNode.getUuid());
|
180
|
Assert.assertEquals("", sep + pref+featureTree.getId()+sep + featureTree.getRoot().getId()+ sep + newNode.getId() + sep, newNode.treeIndex());
|
181
|
}
|
182
|
|
183
|
|
184
|
@Test
|
185
|
@DataSet(loadStrategy=RefreshLoadStrategy.class, value="TermNodeServiceImplTest-indexing.xml")
|
186
|
public final void testIndexCreateNode() {
|
187
|
|
188
|
Feature feature = (Feature)termService.find(914);
|
189
|
|
190
|
node2 = termNodeService.load(node2Uuid);
|
191
|
String oldTreeIndex = node2.treeIndex();
|
192
|
|
193
|
TermNode<Feature> newNode = node2.addChild(feature);
|
194
|
termNodeService.saveOrUpdate(node2);
|
195
|
|
196
|
commitAndStartNewTransaction();
|
197
|
newNode = termNodeService.load(newNode.getUuid());
|
198
|
Assert.assertEquals("", oldTreeIndex + newNode.getId() + sep, newNode.treeIndex());
|
199
|
}
|
200
|
|
201
|
|
202
|
@Test
|
203
|
@DataSet(loadStrategy=RefreshLoadStrategy.class ,value="TermNodeServiceImplTest-indexing.xml")
|
204
|
//this may fail in single test if it is the first test as long as #8174 is not fixed
|
205
|
public void testIndexMoveNode() {
|
206
|
//in feature tree
|
207
|
@SuppressWarnings("unused")
|
208
|
TermTree<Feature> featureTree = termTreeService.load(featureTreeUuid);
|
209
|
node2 = termNodeService.load(node2Uuid);
|
210
|
node3 = termNodeService.load(node3Uuid);
|
211
|
node3.addChild(node2);
|
212
|
termNodeService.saveOrUpdate(node2);
|
213
|
commitAndStartNewTransaction();
|
214
|
TermNode<?> node6 = termNodeService.load(node6Uuid);
|
215
|
Assert.assertEquals("Node6 treeindex is not correct", node3.treeIndex() + "2#4#6#", node6.treeIndex());
|
216
|
|
217
|
//root of new feature tree
|
218
|
TermTree<Feature> featureTree2 = termTreeService.load(featureTree2Uuid);
|
219
|
node2 = termNodeService.load(node2Uuid);
|
220
|
featureTree2.getRoot().addChild(node2);
|
221
|
termNodeService.saveOrUpdate(node2);
|
222
|
commitAndStartNewTransaction();
|
223
|
node2 = termNodeService.load(node2Uuid);
|
224
|
Assert.assertEquals("Node2 treeindex is not correct", "#t5002#7#2#", node2.treeIndex());
|
225
|
node6 = termNodeService.load(node6Uuid);
|
226
|
Assert.assertEquals("Node6 treeindex is not correct", "#t5002#7#2#4#6#", node6.treeIndex());
|
227
|
|
228
|
//into new classification
|
229
|
node3 = termNodeService.load(node3Uuid);
|
230
|
TermNode<Feature> node5 = termNodeService.load(node5Uuid);
|
231
|
node5.addChild(node3);
|
232
|
termNodeService.saveOrUpdate(node5);
|
233
|
commitAndStartNewTransaction(new String[]{"FeatureNode"});
|
234
|
node3 = termNodeService.load(node3Uuid);
|
235
|
Assert.assertEquals("Node3 treeindex is not correct", node5.treeIndex() + node3.getId() + sep, node3.treeIndex());
|
236
|
}
|
237
|
|
238
|
@Test //here we may have a test for testing delete of a node and attaching the children
|
239
|
//to its parents, however this depends on the way delete is implemented and therefore needs
|
240
|
//to wait until this is finally done
|
241
|
@DataSet(loadStrategy=RefreshLoadStrategy.class, value="TermNodeServiceImplTest-indexing.xml")
|
242
|
public final void testIndexDeleteNode() {
|
243
|
node2 = termNodeService.load(node2Uuid);
|
244
|
TermNodeDeletionConfigurator config = new TermNodeDeletionConfigurator();
|
245
|
config.setDeleteElement(false);
|
246
|
config.setChildHandling(ChildHandling.MOVE_TO_PARENT);
|
247
|
termNodeService.deleteNode(node2Uuid, config);
|
248
|
commitAndStartNewTransaction(new String[]{"FeatureNode"});
|
249
|
TermTree<Feature> tree1 = termTreeService.load(featureTreeUuid);
|
250
|
assertNotNull(tree1);
|
251
|
node2 = termNodeService.load(node2Uuid);
|
252
|
assertNull(node2);
|
253
|
node3 = termNodeService.load(node3Uuid);
|
254
|
assertNotNull(node3);
|
255
|
TermNode<Feature> node4 = termNodeService.load(node4Uuid);
|
256
|
assertNotNull(node4);
|
257
|
config.setDeleteElement(false);
|
258
|
config.setChildHandling(ChildHandling.DELETE);
|
259
|
termNodeService.deleteNode(node4Uuid, config);
|
260
|
commitAndStartNewTransaction(new String[]{"FeatureNode"});
|
261
|
tree1 = termTreeService.load(featureTreeUuid);
|
262
|
node4 = termNodeService.load(node4Uuid);
|
263
|
assertNull(node4);
|
264
|
TermNode<Feature> node6 = termNodeService.load(node6Uuid);
|
265
|
assertNull(node6);
|
266
|
|
267
|
HibernateProxyHelper.deproxy(tree1, TermTree.class);
|
268
|
TermNode<Feature> rootNode = CdmBase.deproxy(tree1.getRoot());
|
269
|
assertNotNull(tree1);
|
270
|
termTreeService.delete(tree1.getUuid());
|
271
|
commitAndStartNewTransaction(/*new String[]{"TaxonNode"}*/);
|
272
|
tree1 = termTreeService.load(featureTreeUuid);
|
273
|
assertNull(tree1);
|
274
|
}
|
275
|
|
276
|
@Override
|
277
|
public void createTestDataSet() throws FileNotFoundException {}
|
278
|
}
|