3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
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.
11 package eu
.etaxonomy
.cdm
.api
.service
;
13 import java
.util
.ArrayList
;
14 import java
.util
.Collection
;
15 import java
.util
.Collections
;
16 import java
.util
.Comparator
;
17 import java
.util
.HashSet
;
18 import java
.util
.List
;
20 import java
.util
.UUID
;
22 import org
.apache
.log4j
.Logger
;
23 import org
.springframework
.beans
.factory
.annotation
.Autowired
;
24 import org
.springframework
.stereotype
.Service
;
25 import org
.springframework
.transaction
.annotation
.Transactional
;
27 import eu
.etaxonomy
.cdm
.api
.service
.UpdateResult
.Status
;
28 import eu
.etaxonomy
.cdm
.api
.service
.config
.NodeDeletionConfigurator
.ChildHandling
;
29 import eu
.etaxonomy
.cdm
.api
.service
.config
.TaxonDeletionConfigurator
;
30 import eu
.etaxonomy
.cdm
.api
.service
.config
.TaxonNodeDeletionConfigurator
;
31 import eu
.etaxonomy
.cdm
.api
.service
.dto
.CdmEntityIdentifier
;
32 import eu
.etaxonomy
.cdm
.api
.service
.pager
.Pager
;
33 import eu
.etaxonomy
.cdm
.api
.service
.pager
.PagerUtils
;
34 import eu
.etaxonomy
.cdm
.api
.service
.pager
.impl
.DefaultPagerImpl
;
35 import eu
.etaxonomy
.cdm
.hibernate
.HHH_9751_Util
;
36 import eu
.etaxonomy
.cdm
.hibernate
.HibernateProxyHelper
;
37 import eu
.etaxonomy
.cdm
.model
.agent
.TeamOrPersonBase
;
38 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
39 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTerm
;
40 import eu
.etaxonomy
.cdm
.model
.description
.TaxonDescription
;
41 import eu
.etaxonomy
.cdm
.model
.name
.HomotypicalGroup
;
42 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
43 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
44 import eu
.etaxonomy
.cdm
.model
.taxon
.Classification
;
45 import eu
.etaxonomy
.cdm
.model
.taxon
.HomotypicGroupTaxonComparator
;
46 import eu
.etaxonomy
.cdm
.model
.taxon
.Synonym
;
47 import eu
.etaxonomy
.cdm
.model
.taxon
.SynonymRelationship
;
48 import eu
.etaxonomy
.cdm
.model
.taxon
.SynonymRelationshipType
;
49 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
50 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonNode
;
51 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonNodeAgentRelation
;
52 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonRelationship
;
53 import eu
.etaxonomy
.cdm
.persistence
.dao
.initializer
.IBeanInitializer
;
54 import eu
.etaxonomy
.cdm
.persistence
.dao
.taxon
.ITaxonNodeDao
;
55 import eu
.etaxonomy
.cdm
.persistence
.dto
.TaxonNodeDto
;
59 * @created Apr 9, 2010
63 @Transactional(readOnly
= true)
64 public class TaxonNodeServiceImpl
extends AnnotatableServiceBase
<TaxonNode
, ITaxonNodeDao
> implements ITaxonNodeService
{
65 private static final Logger logger
= Logger
.getLogger(TaxonNodeServiceImpl
.class);
68 private IBeanInitializer defaultBeanInitializer
;
71 private ITaxonService taxonService
;
74 private IAgentService agentService
;
77 public List
<TaxonNode
> loadChildNodesOfTaxonNode(TaxonNode taxonNode
,
78 List
<String
> propertyPaths
, boolean recursive
, NodeSortMode sortMode
) {
80 getSession().refresh(taxonNode
);
81 List
<TaxonNode
> childNodes
;
82 if (recursive
== true){
83 childNodes
= dao
.listChildrenOf(taxonNode
, null, null, null, recursive
);
85 childNodes
= new ArrayList
<TaxonNode
>(taxonNode
.getChildNodes());
88 HHH_9751_Util
.removeAllNull(childNodes
);
90 if (sortMode
!= null){
91 Comparator
<TaxonNode
> comparator
= sortMode
.newComparator();
92 Collections
.sort(childNodes
, comparator
);
94 defaultBeanInitializer
.initializeAll(childNodes
, propertyPaths
);
102 public Pager
<TaxonNodeDto
> pageChildNodesDTOs(UUID taxonNodeUuid
, boolean recursive
,
103 boolean doSynonyms
, NodeSortMode sortMode
,
104 Integer pageSize
, Integer pageIndex
) {
106 TaxonNode parentNode
= dao
.load(taxonNodeUuid
);
108 List
<CdmBase
> allRecords
= new ArrayList
<>();
111 List
<TaxonNode
> childNodes
= loadChildNodesOfTaxonNode(parentNode
, null, recursive
, sortMode
);
112 allRecords
.addAll(childNodes
);
114 //add synonyms if pager is not yet full synonyms
115 List
<Synonym
> synList
= new ArrayList
<>(parentNode
.getTaxon().getSynonyms());
116 Collections
.sort(synList
, new HomotypicGroupTaxonComparator(null));
119 allRecords
.addAll(synList
);
122 List
<TaxonNodeDto
> dtos
= new ArrayList
<>(pageSize
);
123 int start
= PagerUtils
.startFor(pageSize
, pageIndex
);
124 int limit
= PagerUtils
.limitFor(pageSize
);
125 Long totalCount
= Long
.valueOf(allRecords
.size());
127 if(PagerUtils
.hasResultsInRange(totalCount
, pageIndex
, pageSize
)) {
128 TaxonNameBase
<?
,?
> parentName
= null;
130 for(int i
= start
; i
< Math
.min(totalCount
, start
+ limit
); i
++) {
131 CdmBase record
= allRecords
.get(i
);
133 if (record
.isInstanceOf(TaxonNode
.class)){
134 dtos
.add(new TaxonNodeDto(CdmBase
.deproxy(record
, TaxonNode
.class)));
135 }else if (record
.isInstanceOf(Synonym
.class)){
136 Synonym synonym
= CdmBase
.deproxy(record
, Synonym
.class);
137 parentName
= parentName
== null? parentNode
.getTaxon().getName(): parentName
;
138 boolean isHomotypic
= synonym
.getName().isHomotypic(parentName
);
139 dtos
.add(new TaxonNodeDto(synonym
, isHomotypic
));
144 return new DefaultPagerImpl
<TaxonNodeDto
>(pageIndex
, totalCount
, pageSize
, dtos
);
148 public TaxonNodeDto
parentDto(UUID taxonNodeUuid
) {
149 TaxonNode taxonNode
= dao
.load(taxonNodeUuid
);
150 if(taxonNode
.getParent() != null) {
151 return new TaxonNodeDto(taxonNode
.getParent());
158 protected void setDao(ITaxonNodeDao dao
) {
163 @Transactional(readOnly
= false)
164 public DeleteResult
makeTaxonNodeASynonymOfAnotherTaxonNode(TaxonNode oldTaxonNode
, TaxonNode newAcceptedTaxonNode
, SynonymRelationshipType synonymRelationshipType
, Reference citation
, String citationMicroReference
) {
167 // TODO at the moment this method only moves synonym-, concept relations and descriptions to the new accepted taxon
168 // in a future version we also want to move cdm data like annotations, marker, so., but we will need a policy for that
169 if (oldTaxonNode
== null || newAcceptedTaxonNode
== null || oldTaxonNode
.getTaxon().getName() == null){
170 throw new IllegalArgumentException("A mandatory parameter was null.");
173 if(oldTaxonNode
.equals(newAcceptedTaxonNode
)){
174 throw new IllegalArgumentException("Taxon can not be made synonym of its own.");
178 Classification classification
= oldTaxonNode
.getClassification();
179 Taxon oldTaxon
= HibernateProxyHelper
.deproxy(oldTaxonNode
.getTaxon());
180 Taxon newAcceptedTaxon
= (Taxon
)this.taxonService
.load(newAcceptedTaxonNode
.getTaxon().getUuid());
181 // Move oldTaxon to newTaxon
182 //TaxonNameBase<?,?> synonymName = oldTaxon.getName();
183 TaxonNameBase
<?
,?
> synonymName
= HibernateProxyHelper
.deproxy(oldTaxon
.getName());
184 HomotypicalGroup group
= synonymName
.getHomotypicalGroup();
185 group
= HibernateProxyHelper
.deproxy(group
, HomotypicalGroup
.class);
186 if (synonymRelationshipType
== null){
187 if (synonymName
.isHomotypic(newAcceptedTaxon
.getName())){
188 synonymRelationshipType
= SynonymRelationshipType
.HOMOTYPIC_SYNONYM_OF();
190 synonymRelationshipType
= SynonymRelationshipType
.HETEROTYPIC_SYNONYM_OF();
194 //set homotypic group
195 HomotypicalGroup newAcceptedTaxonHomotypicalgroup
= newAcceptedTaxon
.getHomotypicGroup();
196 newAcceptedTaxonHomotypicalgroup
= HibernateProxyHelper
.deproxy(newAcceptedTaxonHomotypicalgroup
, HomotypicalGroup
.class);
197 TaxonNameBase newAcceptedTaxonName
= HibernateProxyHelper
.deproxy(newAcceptedTaxon
.getName(), TaxonNameBase
.class);
198 // Move Synonym Relations to new Taxon
199 SynonymRelationship synonmyRelationship
= newAcceptedTaxon
.addSynonymName(synonymName
,
200 synonymRelationshipType
, citation
, citationMicroReference
);
201 HomotypicalGroup homotypicalGroupAcceptedTaxon
= synonmyRelationship
.getSynonym().getHomotypicGroup();
202 // Move Synonym Relations to new Taxon
203 // From ticket 3163 we can move taxon with accepted name having homotypic synonyms
204 List
<Synonym
> synonymsInHomotypicalGroup
= null;
206 //the synonyms of the homotypical group of the old taxon
207 if (synonymRelationshipType
.equals(SynonymRelationshipType
.HOMOTYPIC_SYNONYM_OF())){
208 synonymsInHomotypicalGroup
= oldTaxon
.getSynonymsInGroup(group
);
211 for(SynonymRelationship synRelation
: oldTaxon
.getSynonymRelations()){
212 SynonymRelationshipType srt
;
213 if(synRelation
.getSynonym().getName().getHomotypicalGroup()!= null
214 && synRelation
.getSynonym().getName().getHomotypicalGroup().equals(newAcceptedTaxonName
.getHomotypicalGroup())) {
215 srt
= SynonymRelationshipType
.HOMOTYPIC_SYNONYM_OF();
216 } else if(synRelation
.getType() != null && synRelation
.getType().equals(SynonymRelationshipType
.HOMOTYPIC_SYNONYM_OF())) {
217 if (synonymRelationshipType
.equals(SynonymRelationshipType
.HOMOTYPIC_SYNONYM_OF())){
218 srt
= SynonymRelationshipType
.HOMOTYPIC_SYNONYM_OF();
220 srt
= SynonymRelationshipType
.HETEROTYPIC_SYNONYM_OF();
223 srt
= synRelation
.getType();
227 newAcceptedTaxon
.addSynonym(synRelation
.getSynonym(),
229 synRelation
.getCitation(),
230 synRelation
.getCitationMicroReference());
232 /*if (synonymsInHomotypicalGroup.contains(synRelation.getSynonym()) && srt.equals(SynonymRelationshipType.HETEROTYPIC_SYNONYM_OF())){
233 homotypicalGroupAcceptedTaxon.addTypifiedName(synRelation.getSynonym().getName());
243 if(oldTaxonNode
.getChildNodes() != null && oldTaxonNode
.getChildNodes().size() != 0){
244 List
<TaxonNode
> childNodes
= new ArrayList
<TaxonNode
>();
245 for (TaxonNode childNode
: oldTaxonNode
.getChildNodes()){
246 childNodes
.add(childNode
);
248 for(TaxonNode childNode
:childNodes
){
249 newAcceptedTaxonNode
.addChildNode(childNode
, childNode
.getReference(), childNode
.getMicroReference()); // childNode.getSynonymToBeUsed()
253 //Move Taxon RelationShips to new Taxon
254 Set
<TaxonRelationship
> obsoleteTaxonRelationships
= new HashSet
<TaxonRelationship
>();
255 for(TaxonRelationship taxonRelationship
: oldTaxon
.getTaxonRelations()){
256 Taxon fromTaxon
= HibernateProxyHelper
.deproxy(taxonRelationship
.getFromTaxon());
257 Taxon toTaxon
= HibernateProxyHelper
.deproxy(taxonRelationship
.getToTaxon());
258 if (fromTaxon
== oldTaxon
){
259 newAcceptedTaxon
.addTaxonRelation(taxonRelationship
.getToTaxon(), taxonRelationship
.getType(),
260 taxonRelationship
.getCitation(), taxonRelationship
.getCitationMicroReference());
262 }else if(toTaxon
== oldTaxon
){
263 fromTaxon
.addTaxonRelation(newAcceptedTaxon
, taxonRelationship
.getType(),
264 taxonRelationship
.getCitation(), taxonRelationship
.getCitationMicroReference());
265 taxonService
.saveOrUpdate(fromTaxon
);
268 logger
.warn("Taxon is not part of its own Taxonrelationship");
270 // Remove old relationships
272 fromTaxon
.removeTaxonRelation(taxonRelationship
);
273 toTaxon
.removeTaxonRelation(taxonRelationship
);
274 taxonRelationship
.setToTaxon(null);
275 taxonRelationship
.setFromTaxon(null);
279 //Move descriptions to new taxon
280 List
<TaxonDescription
> descriptions
= new ArrayList
<TaxonDescription
>( oldTaxon
.getDescriptions()); //to avoid concurrent modification errors (newAcceptedTaxon.addDescription() modifies also oldtaxon.descritpions())
281 for(TaxonDescription description
: descriptions
){
282 String message
= "Description copied from former accepted taxon: %s (Old title: %s)";
283 message
= String
.format(message
, oldTaxon
.getTitleCache(), description
.getTitleCache());
284 description
.setTitleCache(message
, true);
285 //oldTaxon.removeDescription(description, false);
286 newAcceptedTaxon
.addDescription(description
);
288 oldTaxon
.clearDescriptions();
290 taxonService
.update(newAcceptedTaxon
);
292 taxonService
.update(oldTaxon
);
294 TaxonDeletionConfigurator conf
= new TaxonDeletionConfigurator();
295 conf
.setDeleteSynonymsIfPossible(false);
296 DeleteResult result
= taxonService
.isDeletable(oldTaxon
, conf
);
297 conf
.setDeleteNameIfPossible(false);
300 result
= taxonService
.deleteTaxon(oldTaxon
.getUuid(), conf
, classification
.getUuid());
302 result
.setStatus(Status
.OK
);
303 TaxonNodeDeletionConfigurator config
= new TaxonNodeDeletionConfigurator();
304 config
.setDeleteElement(false);
305 conf
.setTaxonNodeConfig(config
);
306 result
.includeResult(deleteTaxonNode(oldTaxonNode
, conf
));
308 result
.addUpdatedObject(newAcceptedTaxon
);
309 result
.addUpdatedObject(oldTaxon
);
311 //oldTaxonNode.delete();
318 * @see eu.etaxonomy.cdm.api.service.ITaxonNodeService#makeTaxonNodeASynonymOfAnotherTaxonNode(java.util.UUID, java.util.UUID, java.util.UUID, java.util.UUID, java.lang.String)
321 @Transactional(readOnly
= false)
322 public UpdateResult
makeTaxonNodeASynonymOfAnotherTaxonNode(UUID oldTaxonNodeUuid
,
323 UUID newAcceptedTaxonNodeUUID
,
324 SynonymRelationshipType synonymRelationshipType
,
326 String citationMicroReference
) {
328 TaxonNode oldTaxonNode
= dao
.load(oldTaxonNodeUuid
);
329 TaxonNode oldTaxonParentNode
= oldTaxonNode
.getParent();
330 TaxonNode newTaxonNode
= dao
.load(newAcceptedTaxonNodeUUID
);
332 UpdateResult result
= makeTaxonNodeASynonymOfAnotherTaxonNode(oldTaxonNode
,
334 synonymRelationshipType
,
336 citationMicroReference
);
337 result
.addUpdatedCdmId(new CdmEntityIdentifier(oldTaxonParentNode
.getId(), TaxonNode
.class));
338 result
.addUpdatedCdmId(new CdmEntityIdentifier(newTaxonNode
.getId(), TaxonNode
.class));
339 result
.setCdmEntity(oldTaxonParentNode
);
344 * @see eu.etaxonomy.cdm.api.service.ITaxonNodeService#deleteTaxonNodes(java.util.List)
347 @Transactional(readOnly
= false)
348 public DeleteResult
deleteTaxonNodes(List
<TaxonNode
> list
, TaxonDeletionConfigurator config
) {
351 config
= new TaxonDeletionConfigurator();
353 DeleteResult result
= new DeleteResult();
354 List
<UUID
> deletedUUIDs
= new ArrayList
<UUID
>();
355 Classification classification
= null;
356 List
<TaxonNode
> taxonNodes
= new ArrayList
<TaxonNode
>(list
);
357 for (TaxonNode treeNode
:taxonNodes
){
358 if (treeNode
!= null){
361 taxonNode
= HibernateProxyHelper
.deproxy(treeNode
, TaxonNode
.class);
362 TaxonNode parent
= taxonNode
.getParent();
363 //check whether the node has children or the children are already deleted
364 if(taxonNode
.hasChildNodes()) {
365 List
<TaxonNode
> children
= new ArrayList
<TaxonNode
> ();
366 List
<TaxonNode
> childNodesList
= taxonNode
.getChildNodes();
367 children
.addAll(childNodesList
);
368 int compare
= config
.getTaxonNodeConfig().getChildHandling().compareTo(ChildHandling
.DELETE
);
369 boolean childHandling
= (compare
== 0)?
true: false;
371 boolean changeDeleteTaxon
= false;
372 if (!config
.getTaxonNodeConfig().isDeleteTaxon()){
373 config
.getTaxonNodeConfig().setDeleteTaxon(true);
374 changeDeleteTaxon
= true;
376 DeleteResult resultNodes
= deleteTaxonNodes(children
, config
);
377 if (!resultNodes
.isOk()){
378 result
.addExceptions(resultNodes
.getExceptions());
379 result
.setStatus(resultNodes
.getStatus());
381 if (changeDeleteTaxon
){
382 config
.getTaxonNodeConfig().setDeleteTaxon(false);
386 //move the children to the parent
388 for (TaxonNode child
: childNodesList
){
389 parent
.addChildNode(child
, child
.getReference(), child
.getMicroReference());
395 classification
= taxonNode
.getClassification();
397 if (classification
.getRootNode().equals(taxonNode
)){
398 classification
.removeRootNode();
399 classification
= null;
400 }else if (classification
.getChildNodes().contains(taxonNode
)){
401 Taxon taxon
= taxonNode
.getTaxon();
402 classification
.deleteChildNode(taxonNode
);
407 if (config
.getTaxonNodeConfig().isDeleteTaxon()){
408 taxonService
.saveOrUpdate(taxon
);
409 saveOrUpdate(taxonNode
);
411 TaxonDeletionConfigurator configNew
= new TaxonDeletionConfigurator();
412 DeleteResult resultTaxon
= taxonService
.deleteTaxon(taxon
.getUuid(), configNew
, classification
.getUuid());
413 if (!resultTaxon
.isOk()){
414 result
.addExceptions(resultTaxon
.getExceptions());
415 result
.setStatus(resultTaxon
.getStatus());
420 classification
= null;
423 classification
= null;
424 Taxon taxon
= taxonNode
.getTaxon();
425 taxon
= HibernateProxyHelper
.deproxy(taxon
, Taxon
.class);
427 taxon
.removeTaxonNode(taxonNode
);
428 if (config
.getTaxonNodeConfig().isDeleteTaxon()){
429 TaxonDeletionConfigurator configNew
= new TaxonDeletionConfigurator();
430 saveOrUpdate(taxonNode
);
431 taxonService
.saveOrUpdate(taxon
);
432 DeleteResult resultTaxon
= taxonService
.deleteTaxon(taxon
.getUuid(), configNew
, null);
434 if (!resultTaxon
.isOk()){
435 result
.addExceptions(resultTaxon
.getExceptions());
436 result
.setStatus(resultTaxon
.getStatus());
443 result
.addUpdatedObject(parent
);
444 if(result
.getCdmEntity() == null){
445 result
.setCdmEntity(taxonNode
);
447 UUID uuid
= dao
.delete(taxonNode
);
448 logger
.debug("Deleted node " +uuid
.toString());
452 /*if (classification != null){
453 result.addUpdatedObject(classification);
454 DeleteResult resultClassification = classService.delete(classification);
455 if (!resultClassification.isOk()){
456 result.addExceptions(resultClassification.getExceptions());
457 result.setStatus(resultClassification.getStatus());
466 @Transactional(readOnly
= false)
467 public DeleteResult
deleteTaxonNodes(Collection
<UUID
> nodeUuids
, TaxonDeletionConfigurator config
) {
468 List
<TaxonNode
> nodes
= new ArrayList
<TaxonNode
>();
469 for(UUID nodeUuid
: nodeUuids
) {
470 nodes
.add(dao
.load(nodeUuid
));
472 return deleteTaxonNodes(nodes
, config
);
478 @Transactional(readOnly
= false)
479 public DeleteResult
deleteTaxonNode(UUID nodeUUID
, TaxonDeletionConfigurator config
) {
481 TaxonNode node
= HibernateProxyHelper
.deproxy(dao
.load(nodeUUID
), TaxonNode
.class);
482 return deleteTaxonNode(node
, config
);
486 @Transactional(readOnly
= false)
487 public DeleteResult
deleteTaxonNode(TaxonNode node
, TaxonDeletionConfigurator config
) {
488 DeleteResult result
= new DeleteResult();
491 result
.addException(new Exception("The TaxonNode was already deleted."));
496 taxon
= HibernateProxyHelper
.deproxy(node
.getTaxon());
497 }catch(NullPointerException e
){
499 result
.addException(new Exception("The Taxon was already deleted."));
502 TaxonNode parent
= HibernateProxyHelper
.deproxy(node
.getParent(), TaxonNode
.class);
504 config
= new TaxonDeletionConfigurator();
509 if (config
.getTaxonNodeConfig().getChildHandling().equals(ChildHandling
.MOVE_TO_PARENT
)){
510 Object
[] children
= node
.getChildNodes().toArray();
512 for (Object child
: children
){
513 childNode
= (TaxonNode
) child
;
514 parent
.addChildNode(childNode
, childNode
.getReference(), childNode
.getMicroReference());
517 deleteTaxonNodes(node
.getChildNodes(), config
);
521 if (config
.getTaxonNodeConfig().isDeleteTaxon() && (config
.isDeleteInAllClassifications() || taxon
.getTaxonNodes().size() == 1)){
522 result
= taxonService
.deleteTaxon(taxon
.getUuid(), config
, node
.getClassification().getUuid());
523 result
.addUpdatedObject(parent
);
528 result
.addUpdatedObject(taxon
);
531 result
.setCdmEntity(node
);
532 boolean success
= taxon
.removeTaxonNode(node
);
534 taxonService
.saveOrUpdate(taxon
);
535 result
.addUpdatedObject(parent
);
538 result
.setStatus(Status
.OK
);
539 parent
= HibernateProxyHelper
.deproxy(parent
, TaxonNode
.class);
540 int index
= parent
.getChildNodes().indexOf(node
);
542 parent
.removeChild(index
);
544 if (!dao
.delete(node
, config
.getTaxonNodeConfig().getChildHandling().equals(ChildHandling
.DELETE
)).equals(null)){
551 if (dao
.findByUuid(node
.getUuid()) != null){
553 result
.addException(new Exception("The node can not be removed from the taxon."));
564 * @see eu.etaxonomy.cdm.api.service.ITaxonNodeService#listAllNodesForClassification(eu.etaxonomy.cdm.model.taxon.Classification, int, int)
567 public List
<TaxonNode
> listAllNodesForClassification(Classification classification
, Integer start
, Integer end
) {
568 return dao
.getTaxonOfAcceptedTaxaByClassification(classification
, start
, end
);
572 public int countAllNodesForClassification(Classification classification
) {
573 return dao
.countTaxonOfAcceptedTaxaByClassification(classification
);
578 public UpdateResult
moveTaxonNode(UUID taxonNodeUuid
, UUID targetNodeUuid
, int movingType
){
579 TaxonNode taxonNode
= HibernateProxyHelper
.deproxy(dao
.load(taxonNodeUuid
), TaxonNode
.class);
580 TaxonNode targetNode
= HibernateProxyHelper
.deproxy(dao
.load(targetNodeUuid
), TaxonNode
.class);
581 return moveTaxonNode(taxonNode
, targetNode
, movingType
);
586 public UpdateResult
moveTaxonNode(TaxonNode taxonNode
, TaxonNode newParent
, int movingType
){
587 UpdateResult result
= new UpdateResult();
589 TaxonNode parentParent
= HibernateProxyHelper
.deproxy(newParent
.getParent(), TaxonNode
.class);
591 Integer sortIndex
= -1;
592 if (movingType
== 0){
594 }else if (movingType
== 1){
595 sortIndex
= newParent
.getSortIndex();
596 newParent
= parentParent
;
597 } else if (movingType
== 2){
598 sortIndex
= newParent
.getSortIndex() +1;
599 newParent
= parentParent
;
602 result
.addException(new Exception("The moving type "+ movingType
+" is not supported."));
604 result
.addUpdatedObject(newParent
);
605 result
.addUpdatedObject(taxonNode
.getParent());
606 result
.setCdmEntity(taxonNode
);
608 newParent
.addChildNode(taxonNode
, sortIndex
, taxonNode
.getReference(), taxonNode
.getMicroReference());
610 dao
.saveOrUpdate(newParent
);
619 public UpdateResult
moveTaxonNodes(Set
<UUID
> taxonNodeUuids
, UUID newParentNodeUuid
, int movingType
){
620 UpdateResult result
= new UpdateResult();
621 TaxonNode targetNode
= dao
.load(newParentNodeUuid
);
622 for (UUID taxonNodeUuid
: taxonNodeUuids
){
623 TaxonNode taxonNode
= dao
.load(taxonNodeUuid
);
624 result
.includeResult(moveTaxonNode(taxonNode
,targetNode
, movingType
));
630 public Pager
<TaxonNodeAgentRelation
> pageTaxonNodeAgentRelations(UUID taxonUuid
, UUID classificationUuid
,
631 UUID agentUuid
, UUID rankUuid
, UUID relTypeUuid
, Integer pageSize
, Integer pageIndex
, List
<String
> propertyPaths
) {
634 List
<TaxonNodeAgentRelation
> records
= null;
636 long count
= dao
.countTaxonNodeAgentRelations(taxonUuid
, classificationUuid
, agentUuid
, rankUuid
, relTypeUuid
);
637 if(PagerUtils
.hasResultsInRange(count
, pageIndex
, pageSize
)) {
638 records
= dao
.listTaxonNodeAgentRelations(taxonUuid
, classificationUuid
,
639 agentUuid
, rankUuid
, relTypeUuid
, PagerUtils
.startFor(pageSize
, pageIndex
), PagerUtils
.limitFor(pageSize
), propertyPaths
);
642 Pager
<TaxonNodeAgentRelation
> pager
= new DefaultPagerImpl
<TaxonNodeAgentRelation
>(pageIndex
, count
, pageSize
, records
);
648 public UpdateResult
createNewTaxonNode(UUID parentNodeUuid
, Taxon newTaxon
, Reference ref
, String microref
){
649 UpdateResult result
= new UpdateResult();
651 UUID taxonUUID
= taxonService
.saveOrUpdate(newTaxon
);
652 newTaxon
= (Taxon
) taxonService
.load(taxonUUID
);
654 TaxonNode parent
= dao
.load(parentNodeUuid
);
655 TaxonNode child
= null;
657 child
= parent
.addChildTaxon(newTaxon
, parent
.getReference(), parent
.getMicroReference());
659 result
.addException(e
);
663 // child = dao.save(child);
665 dao
.saveOrUpdate(parent
);
666 result
.addUpdatedObject(parent
);
668 result
.setCdmEntity(child
);
675 public UpdateResult
createNewTaxonNode(UUID parentNodeUuid
, UUID taxonUuid
, Reference ref
, String microref
){
676 UpdateResult result
= new UpdateResult();
677 TaxonNode parent
= dao
.load(parentNodeUuid
);
678 Taxon taxon
= (Taxon
) taxonService
.load(taxonUuid
);
679 TaxonNode child
= null;
681 child
= parent
.addChildTaxon(taxon
, parent
.getReference(), parent
.getMicroReference());
683 result
.addException(e
);
687 // child = dao.save(child);
689 dao
.saveOrUpdate(parent
);
690 result
.addUpdatedObject(parent
);
692 result
.setCdmEntity(child
);
700 public UpdateResult
addTaxonNodeAgentRelation(UUID taxonNodeUUID
, UUID agentUUID
, DefinedTerm relationshipType
){
701 UpdateResult result
= new UpdateResult();
702 TaxonNode node
= dao
.load(taxonNodeUUID
);
703 TeamOrPersonBase agent
= (TeamOrPersonBase
) agentService
.load(agentUUID
);
704 node
.addAgentRelation(relationshipType
, agent
);
706 dao
.merge(node
, true);
707 }catch (Exception e
){
709 result
.addException(e
);
711 result
.setCdmEntity(node
);