Revision c5bb8419
Added by Andreas Müller over 2 years ago
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ClassificationServiceImpl.java | ||
---|---|---|
34 | 34 |
|
35 | 35 |
import eu.etaxonomy.cdm.api.service.config.CreateHierarchyForClassificationConfigurator; |
36 | 36 |
import eu.etaxonomy.cdm.api.service.config.NodeDeletionConfigurator.ChildHandling; |
37 |
import eu.etaxonomy.cdm.api.service.config.SubtreeCloneConfigurator; |
|
38 | 37 |
import eu.etaxonomy.cdm.api.service.config.TaxonDeletionConfigurator; |
39 | 38 |
import eu.etaxonomy.cdm.api.service.dto.EntityDTO; |
40 | 39 |
import eu.etaxonomy.cdm.api.service.dto.GroupedTaxonDTO; |
... | ... | |
47 | 46 |
import eu.etaxonomy.cdm.common.monitor.IProgressMonitor; |
48 | 47 |
import eu.etaxonomy.cdm.exception.FilterException; |
49 | 48 |
import eu.etaxonomy.cdm.exception.UnpublishedException; |
50 |
import eu.etaxonomy.cdm.hibernate.HHH_9751_Util; |
|
51 | 49 |
import eu.etaxonomy.cdm.model.common.CdmBase; |
52 | 50 |
import eu.etaxonomy.cdm.model.common.ITreeNode; |
53 | 51 |
import eu.etaxonomy.cdm.model.common.MarkerType; |
... | ... | |
60 | 58 |
import eu.etaxonomy.cdm.model.name.INonViralName; |
61 | 59 |
import eu.etaxonomy.cdm.model.name.Rank; |
62 | 60 |
import eu.etaxonomy.cdm.model.name.TaxonName; |
63 |
import eu.etaxonomy.cdm.model.reference.Reference; |
|
64 | 61 |
import eu.etaxonomy.cdm.model.taxon.Classification; |
65 | 62 |
import eu.etaxonomy.cdm.model.taxon.ITaxonNodeComparator; |
66 | 63 |
import eu.etaxonomy.cdm.model.taxon.ITaxonTreeNode; |
... | ... | |
68 | 65 |
import eu.etaxonomy.cdm.model.taxon.Taxon; |
69 | 66 |
import eu.etaxonomy.cdm.model.taxon.TaxonBase; |
70 | 67 |
import eu.etaxonomy.cdm.model.taxon.TaxonNode; |
71 |
import eu.etaxonomy.cdm.model.taxon.TaxonRelationship; |
|
72 | 68 |
import eu.etaxonomy.cdm.model.term.DefinedTermBase; |
73 | 69 |
import eu.etaxonomy.cdm.persistence.dao.initializer.IBeanInitializer; |
74 |
import eu.etaxonomy.cdm.persistence.dao.reference.IReferenceDao; |
|
75 | 70 |
import eu.etaxonomy.cdm.persistence.dao.taxon.IClassificationDao; |
76 | 71 |
import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao; |
77 | 72 |
import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonNodeDao; |
... | ... | |
105 | 100 |
@Autowired |
106 | 101 |
private ITaxonNodeService taxonNodeService; |
107 | 102 |
|
108 |
@Autowired |
|
109 |
private IReferenceDao referenceDao; |
|
110 |
|
|
111 | 103 |
@Autowired |
112 | 104 |
private IDefinedTermDao termDao; |
113 | 105 |
|
... | ... | |
139 | 131 |
return taxonNodeDao.load(taxonNodeUuid, propertyPaths); |
140 | 132 |
} |
141 | 133 |
|
142 |
@Override |
|
143 |
@Transactional(readOnly = false) |
|
144 |
public UpdateResult cloneClassification(SubtreeCloneConfigurator config) { |
|
145 |
UpdateResult result = new UpdateResult(); |
|
146 |
|
|
147 |
if (config.getSubTreeUuids().isEmpty()){ |
|
148 |
return result; |
|
149 |
} |
|
150 |
|
|
151 |
//TODO error handling |
|
152 |
Reference taxonSecundum = config.isReuseTaxa() || config.isReuseTaxonSecundum() || config.getTaxonSecundumUuid() == null ? |
|
153 |
null : referenceDao.findByUuid(config.getTaxonSecundumUuid()); |
|
154 |
config.setTaxonSecundum(taxonSecundum); |
|
155 |
|
|
156 |
Reference parentChildReference = config.isReuseParentChildReference() || config.getParentChildReferenceUuid() == null ? |
|
157 |
null : referenceDao.findByUuid(config.getParentChildReferenceUuid()); |
|
158 |
config.setParentChildReference(parentChildReference); |
|
159 |
|
|
160 |
Reference taxonRelationshipReference = config.getRelationTypeToOldTaxon() == null ? |
|
161 |
null : referenceDao.findByUuid(config.getRelationshipReferenceUuid()); |
|
162 |
config.setRelationshipReference(taxonRelationshipReference); |
|
163 |
|
|
164 |
Classification classificationClone = Classification.NewInstance(config.getClassificationName()); |
|
165 |
|
|
166 |
if (config.isReuseClassificationReference()){ |
|
167 |
TaxonNode anyNode = taxonNodeDao.findByUuid(config.getSubTreeUuids().iterator().next()); |
|
168 |
if (anyNode != null){ |
|
169 |
Reference oldClassificationRef = anyNode.getClassification().getReference(); |
|
170 |
classificationClone.setReference(oldClassificationRef); |
|
171 |
} |
|
172 |
}else if (config.getClassificationReferenceUuid() != null) { |
|
173 |
Reference classificationReference = referenceDao.findByUuid(config.getClassificationReferenceUuid()); |
|
174 |
classificationClone.setReference(classificationReference); |
|
175 |
} |
|
176 |
|
|
177 |
//clone taxa and taxon nodes |
|
178 |
// List<Integer> childNodeIds = taxonNodeService.idList(taxonNodeFilter); |
|
179 |
// List<TaxonNode> childNodes = taxonNodeService.loadByIds(childNodeIds, null); |
|
180 |
List<TaxonNode> rootNodes = taxonNodeService.find(config.getSubTreeUuids()); |
|
181 |
for (TaxonNode taxonNode : rootNodes) { |
|
182 |
addChildTaxaToClone(taxonNode, classificationClone.getRootNode(), config); |
|
183 |
} |
|
184 |
dao.saveOrUpdate(classificationClone); |
|
185 |
result.setCdmEntity(classificationClone); |
|
186 |
return result; |
|
187 |
} |
|
188 |
|
|
189 |
private void addChildTaxaToClone(TaxonNode originalParentNode, TaxonNode parentNodeClone, |
|
190 |
SubtreeCloneConfigurator config){ |
|
191 |
|
|
192 |
Taxon originalTaxon = CdmBase.deproxy(originalParentNode.getTaxon()); |
|
193 |
if (originalTaxon == null){ |
|
194 |
for (TaxonNode originalChildChildNode : originalParentNode.getChildNodes()) { |
|
195 |
addChildTaxaToClone(originalChildChildNode, parentNodeClone, config); |
|
196 |
} |
|
197 |
}else{ |
|
198 |
TaxonNode childNodeClone; |
|
199 |
String microReference = null; |
|
200 |
if (config.isReuseTaxa()){ |
|
201 |
childNodeClone = parentNodeClone.addChildTaxon(originalTaxon, config.getParentChildReference(), microReference); |
|
202 |
}else{ |
|
203 |
Taxon cloneTaxon = originalTaxon.clone(config.isIncludeSynonymsIncludingManAndProParte(), |
|
204 |
config.isIncludeTaxonRelationshipsExcludingManAndProParte(), |
|
205 |
config.isIncludeDescriptiveData(), config.isIncludeMedia()); |
|
206 |
|
|
207 |
//name |
|
208 |
if (!config.isReuseNames()){ |
|
209 |
cloneTaxon.setName(cloneTaxon.getName().clone()); |
|
210 |
} |
|
211 |
|
|
212 |
if (!config.isReuseTaxonSecundum()){ |
|
213 |
cloneTaxon.setSec(config.getTaxonSecundum()); |
|
214 |
} |
|
215 |
|
|
216 |
//add relation between taxa |
|
217 |
if (config.getRelationTypeToOldTaxon() != null){ |
|
218 |
TaxonRelationship rel = cloneTaxon.addTaxonRelation(originalParentNode.getTaxon(), config.getRelationTypeToOldTaxon(), |
|
219 |
config.getRelationshipReference(), microReference); |
|
220 |
rel.setDoubtful(config.isRelationDoubtful()); |
|
221 |
} |
|
222 |
childNodeClone = parentNodeClone.addChildTaxon(cloneTaxon, config.getParentChildReference(), microReference); |
|
223 |
} |
|
224 |
|
|
225 |
//probably necessary as taxon nodes do not cascade |
|
226 |
taxonNodeDao.saveOrUpdate(childNodeClone); |
|
227 |
//add children |
|
228 |
List<TaxonNode> originalChildNodes = originalParentNode.getChildNodes(); |
|
229 |
HHH_9751_Util.removeAllNull(originalChildNodes); |
|
230 |
|
|
231 |
for (TaxonNode originalChildNode : originalChildNodes) { |
|
232 |
addChildTaxaToClone(originalChildNode, childNodeClone, config); |
|
233 |
} |
|
234 |
} |
|
235 |
} |
|
236 |
|
|
237 | 134 |
@Override |
238 | 135 |
public List<TaxonNode> listRankSpecificRootNodes(Classification classification, |
239 | 136 |
TaxonNode subtree, Rank rank, |
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IClassificationService.java | ||
---|---|---|
15 | 15 |
import java.util.UUID; |
16 | 16 |
|
17 | 17 |
import eu.etaxonomy.cdm.api.service.config.CreateHierarchyForClassificationConfigurator; |
18 |
import eu.etaxonomy.cdm.api.service.config.SubtreeCloneConfigurator; |
|
19 | 18 |
import eu.etaxonomy.cdm.api.service.config.TaxonDeletionConfigurator; |
20 | 19 |
import eu.etaxonomy.cdm.api.service.dto.GroupedTaxonDTO; |
21 | 20 |
import eu.etaxonomy.cdm.api.service.dto.TaxonInContextDTO; |
... | ... | |
52 | 51 |
|
53 | 52 |
public UUID getTaxonNodeUuidByTaxonUuid(UUID classificationUuid, UUID taxonUuid); |
54 | 53 |
|
55 |
/** |
|
56 |
* Clones an existing classification including all taxa and taxon nodes. |
|
57 |
|
|
58 |
* @param config the configurator for the cloning |
|
59 |
*/ |
|
60 |
public UpdateResult cloneClassification(SubtreeCloneConfigurator config); |
|
61 |
|
|
62 |
/** |
|
63 |
* |
|
64 |
* @param limit |
|
65 |
* @param start |
|
66 |
* @param orderHints |
|
67 |
* @param propertyPaths |
|
68 |
* @return |
|
69 |
*/ |
|
70 | 54 |
public List<Classification> listClassifications(Integer limit, Integer start, List<OrderHint> orderHints, List<String> propertyPaths); |
71 | 55 |
|
72 | 56 |
/** |
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ITaxonNodeService.java | ||
---|---|---|
19 | 19 |
|
20 | 20 |
import eu.etaxonomy.cdm.api.service.config.PublishForSubtreeConfigurator; |
21 | 21 |
import eu.etaxonomy.cdm.api.service.config.SecundumForSubtreeConfigurator; |
22 |
import eu.etaxonomy.cdm.api.service.config.SubtreeCloneConfigurator; |
|
22 | 23 |
import eu.etaxonomy.cdm.api.service.config.TaxonDeletionConfigurator; |
23 | 24 |
import eu.etaxonomy.cdm.api.service.dto.CreateTaxonDTO; |
24 | 25 |
import eu.etaxonomy.cdm.api.service.dto.TaxonDistributionDTO; |
... | ... | |
275 | 276 |
public List<TaxonDistributionDTO> getTaxonDistributionDTO(List<UUID> nodeUuids, List<String> propertyPaths, |
276 | 277 |
Authentication authentication, boolean openChildren); |
277 | 278 |
|
279 |
public List<TaxonDistributionDTO> getTaxonDistributionDTO(List<UUID> nodeUuids, List<String> propertyPaths, boolean openChildren); |
|
280 |
|
|
278 | 281 |
/** |
279 |
* @param nodeUuids
|
|
280 |
* @param propertyPaths |
|
281 |
* @return
|
|
282 |
* Clones a subtree including all taxa and taxon nodes.
|
|
283 |
|
|
284 |
* @param config the configurator for the cloning
|
|
282 | 285 |
*/ |
283 |
List<TaxonDistributionDTO> getTaxonDistributionDTO(List<UUID> nodeUuids, List<String> propertyPaths, boolean openChildren);
|
|
286 |
public UpdateResult cloneSubtree(SubtreeCloneConfigurator config);
|
|
284 | 287 |
} |
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TaxonNodeServiceImpl.java | ||
---|---|---|
33 | 33 |
import eu.etaxonomy.cdm.api.service.config.NodeDeletionConfigurator.ChildHandling; |
34 | 34 |
import eu.etaxonomy.cdm.api.service.config.PublishForSubtreeConfigurator; |
35 | 35 |
import eu.etaxonomy.cdm.api.service.config.SecundumForSubtreeConfigurator; |
36 |
import eu.etaxonomy.cdm.api.service.config.SubtreeCloneConfigurator; |
|
36 | 37 |
import eu.etaxonomy.cdm.api.service.config.TaxonDeletionConfigurator; |
37 | 38 |
import eu.etaxonomy.cdm.api.service.config.TaxonNodeDeletionConfigurator; |
38 | 39 |
import eu.etaxonomy.cdm.api.service.dto.CdmEntityIdentifier; |
... | ... | |
78 | 79 |
import eu.etaxonomy.cdm.persistence.dao.common.Restriction; |
79 | 80 |
import eu.etaxonomy.cdm.persistence.dao.initializer.IBeanInitializer; |
80 | 81 |
import eu.etaxonomy.cdm.persistence.dao.reference.IOriginalSourceDao; |
82 |
import eu.etaxonomy.cdm.persistence.dao.reference.IReferenceDao; |
|
83 |
import eu.etaxonomy.cdm.persistence.dao.taxon.IClassificationDao; |
|
81 | 84 |
import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonNodeDao; |
82 | 85 |
import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonNodeFilterDao; |
83 | 86 |
import eu.etaxonomy.cdm.persistence.dto.MergeResult; |
... | ... | |
121 | 124 |
@Autowired |
122 | 125 |
private ITaxonNodeFilterDao nodeFilterDao; |
123 | 126 |
|
127 |
@Autowired |
|
128 |
private IReferenceDao referenceDao; |
|
129 |
|
|
130 |
@Autowired |
|
131 |
private IClassificationDao classificationDao; |
|
132 |
|
|
124 | 133 |
@Autowired |
125 | 134 |
IProgressMonitorService progressMonitorService; |
126 | 135 |
|
... | ... | |
1236 | 1245 |
List<String> propertyPaths, boolean openChildren) { |
1237 | 1246 |
return getTaxonDistributionDTO(nodeUuids, propertyPaths, null, openChildren); |
1238 | 1247 |
} |
1248 |
|
|
1249 |
|
|
1250 |
@Override |
|
1251 |
@Transactional(readOnly = false) |
|
1252 |
public UpdateResult cloneSubtree(SubtreeCloneConfigurator config) { |
|
1253 |
UpdateResult result = new UpdateResult(); |
|
1254 |
|
|
1255 |
if (config.getSubTreeUuids().isEmpty()){ |
|
1256 |
return result; |
|
1257 |
} |
|
1258 |
|
|
1259 |
//TODO error handling |
|
1260 |
Reference taxonSecundum = config.isReuseTaxa() || config.isReuseTaxonSecundum() || config.getTaxonSecundumUuid() == null ? |
|
1261 |
null : referenceDao.findByUuid(config.getTaxonSecundumUuid()); |
|
1262 |
config.setTaxonSecundum(taxonSecundum); |
|
1263 |
|
|
1264 |
Reference parentChildReference = config.isReuseParentChildReference() || config.getParentChildReferenceUuid() == null ? |
|
1265 |
null : referenceDao.findByUuid(config.getParentChildReferenceUuid()); |
|
1266 |
config.setParentChildReference(parentChildReference); |
|
1267 |
|
|
1268 |
Reference taxonRelationshipReference = config.getRelationTypeToOldTaxon() == null ? |
|
1269 |
null : referenceDao.findByUuid(config.getRelationshipReferenceUuid()); |
|
1270 |
config.setRelationshipReference(taxonRelationshipReference); |
|
1271 |
|
|
1272 |
Classification classificationClone = Classification.NewInstance(config.getClassificationName()); |
|
1273 |
|
|
1274 |
if (config.isReuseClassificationReference()){ |
|
1275 |
TaxonNode anyNode = dao.findByUuid(config.getSubTreeUuids().iterator().next()); |
|
1276 |
if (anyNode != null){ |
|
1277 |
Reference oldClassificationRef = anyNode.getClassification().getReference(); |
|
1278 |
classificationClone.setReference(oldClassificationRef); |
|
1279 |
} |
|
1280 |
}else if (config.getClassificationReferenceUuid() != null) { |
|
1281 |
Reference classificationReference = referenceDao.findByUuid(config.getClassificationReferenceUuid()); |
|
1282 |
classificationClone.setReference(classificationReference); |
|
1283 |
} |
|
1284 |
|
|
1285 |
//clone taxa and taxon nodes |
|
1286 |
// List<Integer> childNodeIds = taxonNodeService.idList(taxonNodeFilter); |
|
1287 |
// List<TaxonNode> childNodes = taxonNodeService.loadByIds(childNodeIds, null); |
|
1288 |
List<TaxonNode> rootNodes = this.find(config.getSubTreeUuids()); |
|
1289 |
for (TaxonNode taxonNode : rootNodes) { |
|
1290 |
addChildTaxaToClone(taxonNode, classificationClone.getRootNode(), config); |
|
1291 |
} |
|
1292 |
classificationDao.saveOrUpdate(classificationClone); |
|
1293 |
result.setCdmEntity(classificationClone); |
|
1294 |
return result; |
|
1295 |
} |
|
1296 |
|
|
1297 |
private void addChildTaxaToClone(TaxonNode originalParentNode, TaxonNode parentNodeClone, |
|
1298 |
SubtreeCloneConfigurator config){ |
|
1299 |
|
|
1300 |
Taxon originalTaxon = CdmBase.deproxy(originalParentNode.getTaxon()); |
|
1301 |
if (originalTaxon == null){ |
|
1302 |
for (TaxonNode originalChildChildNode : originalParentNode.getChildNodes()) { |
|
1303 |
addChildTaxaToClone(originalChildChildNode, parentNodeClone, config); |
|
1304 |
} |
|
1305 |
}else{ |
|
1306 |
TaxonNode childNodeClone; |
|
1307 |
String microReference = null; |
|
1308 |
if (config.isReuseTaxa()){ |
|
1309 |
childNodeClone = parentNodeClone.addChildTaxon(originalTaxon, config.getParentChildReference(), microReference); |
|
1310 |
}else{ |
|
1311 |
Taxon cloneTaxon = originalTaxon.clone(config.isIncludeSynonymsIncludingManAndProParte(), |
|
1312 |
config.isIncludeTaxonRelationshipsExcludingManAndProParte(), |
|
1313 |
config.isIncludeDescriptiveData(), config.isIncludeMedia()); |
|
1314 |
|
|
1315 |
//name |
|
1316 |
if (!config.isReuseNames()){ |
|
1317 |
cloneTaxon.setName(cloneTaxon.getName().clone()); |
|
1318 |
//TODO needs further handling for name relationships etc., see #9349 |
|
1319 |
cloneTaxon.getSynonyms().forEach(syn -> |
|
1320 |
syn.setName(syn.getName() == null ? null : syn.getName().clone())); |
|
1321 |
} |
|
1322 |
|
|
1323 |
if (!config.isReuseTaxonSecundum()){ |
|
1324 |
cloneTaxon.setSec(config.getTaxonSecundum()); |
|
1325 |
} |
|
1326 |
|
|
1327 |
//add relation between taxa |
|
1328 |
if (config.getRelationTypeToOldTaxon() != null){ |
|
1329 |
TaxonRelationship rel = cloneTaxon.addTaxonRelation(originalParentNode.getTaxon(), config.getRelationTypeToOldTaxon(), |
|
1330 |
config.getRelationshipReference(), microReference); |
|
1331 |
rel.setDoubtful(config.isRelationDoubtful()); |
|
1332 |
} |
|
1333 |
childNodeClone = parentNodeClone.addChildTaxon(cloneTaxon, config.getParentChildReference(), microReference); |
|
1334 |
} |
|
1335 |
|
|
1336 |
//probably necessary as taxon nodes do not cascade |
|
1337 |
dao.saveOrUpdate(childNodeClone); |
|
1338 |
//add children |
|
1339 |
List<TaxonNode> originalChildNodes = originalParentNode.getChildNodes(); |
|
1340 |
HHH_9751_Util.removeAllNull(originalChildNodes); |
|
1341 |
|
|
1342 |
for (TaxonNode originalChildNode : originalChildNodes) { |
|
1343 |
addChildTaxaToClone(originalChildNode, childNodeClone, config); |
|
1344 |
} |
|
1345 |
} |
|
1346 |
} |
|
1347 |
|
|
1239 | 1348 |
} |
cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/service/ClassificationServiceImplTest.java | ||
---|---|---|
9 | 9 |
|
10 | 10 |
package eu.etaxonomy.cdm.api.service; |
11 | 11 |
|
12 |
import static org.junit.Assert.assertEquals; |
|
13 |
import static org.junit.Assert.assertNotNull; |
|
14 |
import static org.junit.Assert.assertNull; |
|
15 |
import static org.junit.Assert.assertTrue; |
|
16 |
|
|
17 | 12 |
import java.io.FileNotFoundException; |
18 | 13 |
import java.util.ArrayList; |
19 | 14 |
import java.util.Arrays; |
20 | 15 |
import java.util.Collections; |
21 | 16 |
import java.util.Comparator; |
22 | 17 |
import java.util.List; |
23 |
import java.util.Set; |
|
24 | 18 |
import java.util.UUID; |
25 |
import java.util.stream.Collectors; |
|
26 | 19 |
|
27 | 20 |
import org.apache.commons.lang.StringUtils; |
28 | 21 |
import org.apache.log4j.Logger; |
... | ... | |
32 | 25 |
import org.unitils.dbunit.annotation.DataSet; |
33 | 26 |
import org.unitils.spring.annotation.SpringBeanByType; |
34 | 27 |
|
35 |
import eu.etaxonomy.cdm.api.service.config.SubtreeCloneConfigurator; |
|
36 | 28 |
import eu.etaxonomy.cdm.api.service.dto.GroupedTaxonDTO; |
37 | 29 |
import eu.etaxonomy.cdm.model.name.IBotanicalName; |
38 | 30 |
import eu.etaxonomy.cdm.model.name.Rank; |
... | ... | |
43 | 35 |
import eu.etaxonomy.cdm.model.taxon.Taxon; |
44 | 36 |
import eu.etaxonomy.cdm.model.taxon.TaxonNode; |
45 | 37 |
import eu.etaxonomy.cdm.model.taxon.TaxonNodeByNameComparator; |
46 |
import eu.etaxonomy.cdm.model.taxon.TaxonRelationship; |
|
47 |
import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType; |
|
48 | 38 |
import eu.etaxonomy.cdm.persistence.dao.reference.IReferenceDao; |
49 | 39 |
import eu.etaxonomy.cdm.persistence.dao.taxon.IClassificationDao; |
50 | 40 |
import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest; |
... | ... | |
83 | 73 |
"taxon.name.*" |
84 | 74 |
}); |
85 | 75 |
|
86 |
private static final UUID CLASSIFICATION_UUID = UUID.fromString("6c2bc8d9-ee62-4222-be89-4a8e31770878");
|
|
76 |
public static final UUID CLASSIFICATION_UUID = UUID.fromString("6c2bc8d9-ee62-4222-be89-4a8e31770878");
|
|
87 | 77 |
|
88 | 78 |
private Comparator<? super TaxonNode> taxonNodeComparator; |
89 | 79 |
|
... | ... | |
278 | 268 |
Assert.assertFalse(StringUtils.isBlank(result.get(2).getGroupTaxonName())); |
279 | 269 |
} |
280 | 270 |
|
281 |
@Test |
|
282 |
@DataSet |
|
283 |
public final void testCloneClassification(){ |
|
284 |
|
|
285 |
Classification originalClassification = classificationDao.load(CLASSIFICATION_UUID); |
|
286 |
|
|
287 |
SubtreeCloneConfigurator config = SubtreeCloneConfigurator.NewBaseInstance( |
|
288 |
originalClassification.getRootNode().getUuid(), "Cloned classification"); |
|
289 |
|
|
290 |
Classification classificatonClone = (Classification) classificationService.cloneClassification(config).getCdmEntity(); |
|
291 |
|
|
292 |
assertEquals("# of direct children does not match", originalClassification.getChildNodes().size(), classificatonClone.getChildNodes().size()); |
|
293 |
assertEquals("# of all nodes does not match", originalClassification.getAllNodes().size(), classificatonClone.getAllNodes().size()); |
|
294 |
|
|
295 |
Set<UUID> originalTaxonSecUuids = originalClassification.getAllNodes().stream().map(tn -> tn.getTaxon().getSec().getUuid()).collect(Collectors.toSet()); |
|
296 |
for (TaxonNode clonedTaxonNode : classificatonClone.getChildNodes()) { |
|
297 |
//test no reuse of taxon |
|
298 |
Taxon clonedTaxon = clonedTaxonNode.getTaxon(); |
|
299 |
TaxonNode originalNode = originalClassification.getNode(clonedTaxon); |
|
300 |
assertNull(originalNode); |
|
301 |
|
|
302 |
//check relationship |
|
303 |
assertEquals(0, clonedTaxon.getRelationsFromThisTaxon().size()); |
|
304 |
|
|
305 |
//test taxon sec |
|
306 |
assertTrue(originalTaxonSecUuids.contains(clonedTaxon.getSec().getUuid())); |
|
307 |
} |
|
308 |
commitAndStartNewTransaction(); |
|
309 |
|
|
310 |
//test reuse taxon |
|
311 |
config.setReuseTaxa(true); |
|
312 |
classificatonClone = (Classification) classificationService.cloneClassification(config).getCdmEntity(); |
|
313 |
assertEquals("# of direct children does not match", originalClassification.getChildNodes().size(), classificatonClone.getChildNodes().size()); |
|
314 |
originalTaxonSecUuids = originalClassification.getAllNodes().stream().map(tn -> tn.getTaxon().getSec().getUuid()).collect(Collectors.toSet()); |
|
315 |
for (TaxonNode taxonNode : classificatonClone.getChildNodes()) { |
|
316 |
//test no reuse of taxon |
|
317 |
Taxon clonedTaxon = taxonNode.getTaxon(); |
|
318 |
TaxonNode originalNode = originalClassification.getNode(clonedTaxon); |
|
319 |
assertNotNull(originalNode); |
|
320 |
Taxon originalTaxon = originalNode.getTaxon(); |
|
321 |
assertNotNull(originalTaxon); |
|
322 |
|
|
323 |
//check relationship |
|
324 |
assertEquals(0, clonedTaxon.getRelationsFromThisTaxon().size()); |
|
325 |
|
|
326 |
//test taxon sec |
|
327 |
assertEquals(originalTaxon.getSec().getUuid(), clonedTaxon.getSec().getUuid()); |
|
328 |
} |
|
329 |
commitAndStartNewTransaction(); |
|
330 |
|
|
331 |
config.setReuseTaxa(false); //reset |
|
332 |
config.setRelationTypeToOldTaxon(TaxonRelationshipType.CONGRUENT_TO()); |
|
333 |
Reference sec = referenceDao.findByUuid(UUID.fromString("719d136b-409e-40d0-9561-46f6999465b4")); |
|
334 |
config.setTaxonSecundumUuid(sec.getUuid()); |
|
335 |
classificatonClone = (Classification) classificationService.cloneClassification(config).getCdmEntity(); |
|
336 |
originalTaxonSecUuids = originalClassification.getAllNodes().stream().map(tn -> tn.getTaxon().getSec().getUuid()).collect(Collectors.toSet()); |
|
337 |
for (TaxonNode taxonNode : classificatonClone.getChildNodes()) { |
|
338 |
//test no reuse of taxon |
|
339 |
Taxon clonedTaxon = taxonNode.getTaxon(); |
|
340 |
TaxonNode originalNode = originalClassification.getNode(clonedTaxon); |
|
341 |
assertNull(originalNode); |
|
342 |
|
|
343 |
//check relationship |
|
344 |
TaxonRelationship relShip = clonedTaxon.getRelationsFromThisTaxon().iterator().next(); |
|
345 |
Taxon relatedTaxon = relShip.getToTaxon(); |
|
346 |
Taxon relatedOriginalTaxon = originalClassification.getNode(relatedTaxon).getTaxon(); |
|
347 |
assertEquals(relatedOriginalTaxon.getName(), clonedTaxon.getName()); |
|
348 |
assertTrue(relShip.getType().equals(TaxonRelationshipType.CONGRUENT_TO())); |
|
349 |
|
|
350 |
//test taxon sec |
|
351 |
assertEquals(relatedOriginalTaxon.getSec().getUuid(), clonedTaxon.getSec().getUuid()); |
|
352 |
} |
|
353 |
commitAndStartNewTransaction(); |
|
354 |
|
|
355 |
} |
|
356 |
|
|
357 | 271 |
private UUID acacia_acicularis_uuid = UUID.fromString("90ad2d8f-19a9-4a10-bab3-7d1de5ce1968"); |
358 | 272 |
private UUID acacia_cuspidifolia_uuid = UUID.fromString("94123e4d-da49-4ed0-9d59-f52a9f7a3618"); |
359 | 273 |
private UUID acacia_sect_botrycephalae_uuid = UUID.fromString("2c73a166-35d1-483d-b8e8-209214cb6193"); |
cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/service/TaxonNodeServiceImplTest.java | ||
---|---|---|
22 | 22 |
import java.util.List; |
23 | 23 |
import java.util.Set; |
24 | 24 |
import java.util.UUID; |
25 |
import java.util.stream.Collectors; |
|
25 | 26 |
|
26 | 27 |
import org.junit.Assert; |
27 | 28 |
import org.junit.Before; |
... | ... | |
32 | 33 |
|
33 | 34 |
import eu.etaxonomy.cdm.api.service.config.PublishForSubtreeConfigurator; |
34 | 35 |
import eu.etaxonomy.cdm.api.service.config.SecundumForSubtreeConfigurator; |
36 |
import eu.etaxonomy.cdm.api.service.config.SubtreeCloneConfigurator; |
|
35 | 37 |
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper; |
36 | 38 |
import eu.etaxonomy.cdm.model.agent.Person; |
37 | 39 |
import eu.etaxonomy.cdm.model.common.CdmBase; |
... | ... | |
51 | 53 |
import eu.etaxonomy.cdm.model.taxon.TaxonBase; |
52 | 54 |
import eu.etaxonomy.cdm.model.taxon.TaxonNaturalComparator; |
53 | 55 |
import eu.etaxonomy.cdm.model.taxon.TaxonNode; |
56 |
import eu.etaxonomy.cdm.model.taxon.TaxonRelationship; |
|
54 | 57 |
import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType; |
58 |
import eu.etaxonomy.cdm.persistence.dao.reference.IReferenceDao; |
|
59 |
import eu.etaxonomy.cdm.persistence.dao.taxon.IClassificationDao; |
|
55 | 60 |
import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDto; |
56 | 61 |
import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest; |
57 | 62 |
import eu.etaxonomy.cdm.test.unitils.CleanSweepInsertLoadStrategy; |
... | ... | |
84 | 89 |
@SpringBeanByType |
85 | 90 |
private ITaxonService taxonService; |
86 | 91 |
|
92 |
@SpringBeanByType |
|
93 |
private IClassificationDao classificationDao; |
|
94 |
|
|
95 |
@SpringBeanByType |
|
96 |
private IReferenceDao referenceDao; |
|
97 |
|
|
87 | 98 |
@SpringBeanByType |
88 | 99 |
private IPolytomousKeyService polKeyService; |
89 | 100 |
|
... | ... | |
1244 | 1255 |
taxonNodeService.saveNewTaxonNode(newTaxonNode); |
1245 | 1256 |
} |
1246 | 1257 |
|
1258 |
|
|
1259 |
@Test |
|
1260 |
@DataSet("ClassificationServiceImplTest.xml") |
|
1261 |
public final void testCloneClassification(){ |
|
1262 |
|
|
1263 |
Classification originalClassification = classificationDao.load(ClassificationServiceImplTest.CLASSIFICATION_UUID); |
|
1264 |
|
|
1265 |
SubtreeCloneConfigurator config = SubtreeCloneConfigurator.NewBaseInstance( |
|
1266 |
originalClassification.getRootNode().getUuid(), "Cloned classification"); |
|
1267 |
|
|
1268 |
Classification classificatonClone = (Classification) taxonNodeService.cloneSubtree(config).getCdmEntity(); |
|
1269 |
|
|
1270 |
assertEquals("# of direct children does not match", originalClassification.getChildNodes().size(), classificatonClone.getChildNodes().size()); |
|
1271 |
assertEquals("# of all nodes does not match", originalClassification.getAllNodes().size(), classificatonClone.getAllNodes().size()); |
|
1272 |
|
|
1273 |
Set<UUID> originalTaxonSecUuids = originalClassification.getAllNodes().stream().map(tn -> tn.getTaxon().getSec().getUuid()).collect(Collectors.toSet()); |
|
1274 |
for (TaxonNode clonedTaxonNode : classificatonClone.getChildNodes()) { |
|
1275 |
//test no reuse of taxon |
|
1276 |
Taxon clonedTaxon = clonedTaxonNode.getTaxon(); |
|
1277 |
TaxonNode originalNode = originalClassification.getNode(clonedTaxon); |
|
1278 |
assertNull(originalNode); |
|
1279 |
|
|
1280 |
//check relationship |
|
1281 |
assertEquals(0, clonedTaxon.getRelationsFromThisTaxon().size()); |
|
1282 |
|
|
1283 |
//test taxon sec |
|
1284 |
assertTrue(originalTaxonSecUuids.contains(clonedTaxon.getSec().getUuid())); |
|
1285 |
} |
|
1286 |
commitAndStartNewTransaction(); |
|
1287 |
|
|
1288 |
//test reuse taxon |
|
1289 |
config.setReuseTaxa(true); |
|
1290 |
classificatonClone = (Classification) taxonNodeService.cloneSubtree(config).getCdmEntity(); |
|
1291 |
assertEquals("# of direct children does not match", originalClassification.getChildNodes().size(), classificatonClone.getChildNodes().size()); |
|
1292 |
originalTaxonSecUuids = originalClassification.getAllNodes().stream().map(tn -> tn.getTaxon().getSec().getUuid()).collect(Collectors.toSet()); |
|
1293 |
for (TaxonNode taxonNode : classificatonClone.getChildNodes()) { |
|
1294 |
//test no reuse of taxon |
|
1295 |
Taxon clonedTaxon = taxonNode.getTaxon(); |
|
1296 |
TaxonNode originalNode = originalClassification.getNode(clonedTaxon); |
|
1297 |
assertNotNull(originalNode); |
|
1298 |
Taxon originalTaxon = originalNode.getTaxon(); |
|
1299 |
assertNotNull(originalTaxon); |
|
1300 |
|
|
1301 |
//check relationship |
|
1302 |
assertEquals(0, clonedTaxon.getRelationsFromThisTaxon().size()); |
|
1303 |
|
|
1304 |
//test taxon sec |
|
1305 |
assertEquals(originalTaxon.getSec().getUuid(), clonedTaxon.getSec().getUuid()); |
|
1306 |
} |
|
1307 |
commitAndStartNewTransaction(); |
|
1308 |
|
|
1309 |
config.setReuseTaxa(false); //reset |
|
1310 |
config.setRelationTypeToOldTaxon(TaxonRelationshipType.CONGRUENT_TO()); |
|
1311 |
Reference sec = referenceDao.findByUuid(UUID.fromString("719d136b-409e-40d0-9561-46f6999465b4")); |
|
1312 |
config.setTaxonSecundumUuid(sec.getUuid()); |
|
1313 |
classificatonClone = (Classification) taxonNodeService.cloneSubtree(config).getCdmEntity(); |
|
1314 |
originalTaxonSecUuids = originalClassification.getAllNodes().stream().map(tn -> tn.getTaxon().getSec().getUuid()).collect(Collectors.toSet()); |
|
1315 |
for (TaxonNode taxonNode : classificatonClone.getChildNodes()) { |
|
1316 |
//test no reuse of taxon |
|
1317 |
Taxon clonedTaxon = taxonNode.getTaxon(); |
|
1318 |
TaxonNode originalNode = originalClassification.getNode(clonedTaxon); |
|
1319 |
assertNull(originalNode); |
|
1320 |
|
|
1321 |
//check relationship |
|
1322 |
TaxonRelationship relShip = clonedTaxon.getRelationsFromThisTaxon().iterator().next(); |
|
1323 |
Taxon relatedTaxon = relShip.getToTaxon(); |
|
1324 |
Taxon relatedOriginalTaxon = originalClassification.getNode(relatedTaxon).getTaxon(); |
|
1325 |
assertEquals(relatedOriginalTaxon.getName(), clonedTaxon.getName()); |
|
1326 |
assertTrue(relShip.getType().equals(TaxonRelationshipType.CONGRUENT_TO())); |
|
1327 |
|
|
1328 |
//test taxon sec |
|
1329 |
assertEquals(relatedOriginalTaxon.getSec().getUuid(), clonedTaxon.getSec().getUuid()); |
|
1330 |
} |
|
1331 |
commitAndStartNewTransaction(); |
|
1332 |
} |
|
1333 |
|
|
1247 | 1334 |
@Override |
1248 | 1335 |
// @Test |
1249 | 1336 |
public void createTestDataSet() throws FileNotFoundException { |
Also available in: Unified diff
ref #9349 move cloneSubtree to taxonNodeService