Project

General

Profile

« Previous | Next » 

Revision c5bb8419

Added by Andreas Müller over 3 years ago

ref #9349 move cloneSubtree to taxonNodeService

View differences:

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