Revision 59174ab0
Added by Andreas Müller over 3 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; |
|
37 | 38 |
import eu.etaxonomy.cdm.api.service.config.TaxonDeletionConfigurator; |
38 | 39 |
import eu.etaxonomy.cdm.api.service.dto.EntityDTO; |
39 | 40 |
import eu.etaxonomy.cdm.api.service.dto.GroupedTaxonDTO; |
... | ... | |
47 | 48 |
import eu.etaxonomy.cdm.exception.FilterException; |
48 | 49 |
import eu.etaxonomy.cdm.exception.UnpublishedException; |
49 | 50 |
import eu.etaxonomy.cdm.hibernate.HHH_9751_Util; |
50 |
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper; |
|
51 | 51 |
import eu.etaxonomy.cdm.model.common.CdmBase; |
52 | 52 |
import eu.etaxonomy.cdm.model.common.ITreeNode; |
53 | 53 |
import eu.etaxonomy.cdm.model.common.MarkerType; |
... | ... | |
68 | 68 |
import eu.etaxonomy.cdm.model.taxon.Taxon; |
69 | 69 |
import eu.etaxonomy.cdm.model.taxon.TaxonBase; |
70 | 70 |
import eu.etaxonomy.cdm.model.taxon.TaxonNode; |
71 |
import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
|
|
71 |
import eu.etaxonomy.cdm.model.taxon.TaxonRelationship; |
|
72 | 72 |
import eu.etaxonomy.cdm.model.term.DefinedTermBase; |
73 | 73 |
import eu.etaxonomy.cdm.persistence.dao.initializer.IBeanInitializer; |
74 | 74 |
import eu.etaxonomy.cdm.persistence.dao.taxon.IClassificationDao; |
... | ... | |
104 | 104 |
@Autowired |
105 | 105 |
private ITaxonNodeService taxonNodeService; |
106 | 106 |
|
107 |
@Autowired |
|
108 |
private IReferenceService referenceService; |
|
109 |
|
|
107 | 110 |
@Autowired |
108 | 111 |
private IDefinedTermDao termDao; |
109 | 112 |
|
... | ... | |
137 | 140 |
|
138 | 141 |
@Override |
139 | 142 |
@Transactional(readOnly = false) |
140 |
public UpdateResult cloneClassification(UUID classificationUuid, |
|
141 |
String name, Reference sec, TaxonRelationshipType relationshipType) { |
|
143 |
public UpdateResult cloneClassification(SubtreeCloneConfigurator config) { |
|
142 | 144 |
UpdateResult result = new UpdateResult(); |
143 |
Classification classification = load(classificationUuid); |
|
144 |
Classification clone = Classification.NewInstance(name); |
|
145 |
clone.setReference(sec); |
|
145 |
|
|
146 |
if (config.getSubTreeUuids().isEmpty()){ |
|
147 |
return result; |
|
148 |
} |
|
149 |
|
|
150 |
//TODO error handling |
|
151 |
Reference taxonSecundum = config.isReuseTaxa() || config.isReuseTaxonSecundum() || config.getTaxonSecundumUuid() == null ? |
|
152 |
null : referenceService.find(config.getTaxonSecundumUuid()); |
|
153 |
config.setTaxonSecundum(taxonSecundum); |
|
154 |
|
|
155 |
Reference parentChildReference = config.isReuseParentChildReference() || config.getParentChildReferenceUuid() == null ? |
|
156 |
null : referenceService.find(config.getParentChildReferenceUuid()); |
|
157 |
config.setParentChildReference(parentChildReference); |
|
158 |
|
|
159 |
Reference taxonRelationshipReference = config.getRelationTypeToOldTaxon() == null ? |
|
160 |
null : referenceService.find(config.getRelationshipReferenceUuid()); |
|
161 |
config.setRelationshipReference(taxonRelationshipReference); |
|
162 |
|
|
163 |
Classification classificationClone = Classification.NewInstance(config.getClassificationName()); |
|
164 |
|
|
165 |
if (config.isReuseClassificationReference()){ |
|
166 |
TaxonNode anyNode = taxonNodeDao.findByUuid(config.getSubTreeUuids().iterator().next()); |
|
167 |
if (anyNode != null){ |
|
168 |
Reference oldClassificationRef = anyNode.getClassification().getReference(); |
|
169 |
classificationClone.setReference(oldClassificationRef); |
|
170 |
} |
|
171 |
}else if (config.getClassificationReferenceUuid() != null) { |
|
172 |
Reference classificationReference = referenceService.find(config.getClassificationReferenceUuid()); |
|
173 |
classificationClone.setReference(classificationReference); |
|
174 |
} |
|
146 | 175 |
|
147 | 176 |
//clone taxa and taxon nodes |
148 |
List<TaxonNode> childNodes = classification.getRootNode().getChildNodes(); |
|
149 |
for (TaxonNode taxonNode : childNodes) { |
|
150 |
addChildTaxa(taxonNode, null, clone, relationshipType); |
|
177 |
// List<Integer> childNodeIds = taxonNodeService.idList(taxonNodeFilter); |
|
178 |
// List<TaxonNode> childNodes = taxonNodeService.loadByIds(childNodeIds, null); |
|
179 |
List<TaxonNode> rootNodes = taxonNodeService.find(config.getSubTreeUuids()); |
|
180 |
for (TaxonNode taxonNode : rootNodes) { |
|
181 |
addChildTaxaToClone(taxonNode, classificationClone.getRootNode(), config); |
|
151 | 182 |
} |
152 |
dao.saveOrUpdate(clone); |
|
153 |
result.setCdmEntity(clone); |
|
183 |
dao.saveOrUpdate(classificationClone);
|
|
184 |
result.setCdmEntity(classificationClone);
|
|
154 | 185 |
return result; |
155 | 186 |
} |
156 | 187 |
|
157 |
private void addChildTaxa(TaxonNode originalParentNode, TaxonNode cloneParentNode, Classification classification, TaxonRelationshipType relationshipType){ |
|
158 |
Reference reference = classification.getReference(); |
|
159 |
Taxon cloneTaxon = (Taxon) HibernateProxyHelper.deproxy(originalParentNode.getTaxon(), Taxon.class).clone(); |
|
160 |
cloneTaxon.setSec(reference); |
|
161 |
String microReference = null; |
|
162 |
List<TaxonNode> originalChildNodes = originalParentNode.getChildNodes(); |
|
163 |
HHH_9751_Util.removeAllNull(originalChildNodes); |
|
164 |
|
|
165 |
//add relation between taxa |
|
166 |
if (relationshipType != null){ |
|
167 |
cloneTaxon.addTaxonRelation(originalParentNode.getTaxon(), relationshipType, reference, microReference); |
|
168 |
} |
|
188 |
private void addChildTaxaToClone(TaxonNode originalParentNode, TaxonNode parentNodeClone, |
|
189 |
SubtreeCloneConfigurator config){ |
|
169 | 190 |
|
170 |
TaxonNode cloneChildNode = null; |
|
171 |
//add taxon node to either parent node or classification (no parent node) |
|
172 |
if(cloneParentNode==null){ |
|
173 |
cloneChildNode = classification.addChildTaxon(cloneTaxon, reference, microReference); |
|
174 |
} |
|
175 |
else{ |
|
176 |
cloneChildNode = cloneParentNode.addChildTaxon(cloneTaxon, reference, microReference); |
|
177 |
} |
|
178 |
taxonNodeDao.saveOrUpdate(cloneChildNode); |
|
179 |
//add children |
|
180 |
for (TaxonNode originalChildNode : originalChildNodes) { |
|
181 |
addChildTaxa(originalChildNode, cloneChildNode, classification, relationshipType); |
|
182 |
} |
|
191 |
Taxon originalTaxon = CdmBase.deproxy(originalParentNode.getTaxon()); |
|
192 |
if (originalTaxon == null){ |
|
193 |
for (TaxonNode originalChildChildNode : originalParentNode.getChildNodes()) { |
|
194 |
addChildTaxaToClone(originalChildChildNode, parentNodeClone, config); |
|
195 |
} |
|
196 |
}else{ |
|
197 |
TaxonNode childNodeClone; |
|
198 |
String microReference = null; |
|
199 |
if (config.isReuseTaxa()){ |
|
200 |
childNodeClone = parentNodeClone.addChildTaxon(originalTaxon, config.getParentChildReference(), microReference); |
|
201 |
}else{ |
|
202 |
Taxon cloneTaxon = originalTaxon.clone(config.isCloneSynonyms(), config.isCloneTaxonRelationships(), |
|
203 |
config.isCloneDescriptiveData(), config.isCloneMedia()); |
|
204 |
// xxx KonzeptClone MAN, ppSyns; |
|
205 |
if (!config.isReuseTaxonSecundum()){ |
|
206 |
cloneTaxon.setSec(config.getTaxonSecundum()); |
|
207 |
} |
|
208 |
|
|
209 |
//add relation between taxa |
|
210 |
if (config.getRelationTypeToOldTaxon() != null){ |
|
211 |
TaxonRelationship rel = cloneTaxon.addTaxonRelation(originalParentNode.getTaxon(), config.getRelationTypeToOldTaxon(), |
|
212 |
config.getRelationshipReference(), microReference); |
|
213 |
rel.setDoubtful(config.isRelationDoubtful()); |
|
214 |
} |
|
215 |
childNodeClone = parentNodeClone.addChildTaxon(cloneTaxon, config.getParentChildReference(), microReference); |
|
216 |
} |
|
217 |
|
|
218 |
//TODO necessary? |
|
219 |
taxonNodeDao.saveOrUpdate(childNodeClone); |
|
220 |
//add children |
|
221 |
List<TaxonNode> originalChildNodes = originalParentNode.getChildNodes(); |
|
222 |
HHH_9751_Util.removeAllNull(originalChildNodes); |
|
223 |
|
|
224 |
for (TaxonNode originalChildNode : originalChildNodes) { |
|
225 |
addChildTaxaToClone(originalChildNode, childNodeClone, config); |
|
226 |
} |
|
227 |
} |
|
183 | 228 |
} |
184 | 229 |
|
185 | 230 |
@Override |
... | ... | |
253 | 298 |
return loadTreeBranch(taxonNode, null, baseRank, includeUnpublished, propertyPaths); |
254 | 299 |
} |
255 | 300 |
|
256 |
/** |
|
257 |
* {@inheritDoc} |
|
258 |
*/ |
|
259 | 301 |
@Override |
260 | 302 |
public List<TaxonNode> loadTreeBranch(TaxonNode taxonNode, TaxonNode subtree, Rank baseRank, |
261 | 303 |
boolean includeUnpublished, List<String> propertyPaths) throws UnpublishedException{ |
Also available in: Unified diff
ref #4866, ref #9228 implement subtree clone in branch