Revision 4d68581f
Added by Katja Luther over 3 years ago
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TermNodeServiceImpl.java | ||
---|---|---|
10 | 10 |
package eu.etaxonomy.cdm.api.service; |
11 | 11 |
|
12 | 12 |
import java.util.ArrayList; |
13 |
import java.util.HashSet; |
|
13 | 14 |
import java.util.Iterator; |
14 | 15 |
import java.util.List; |
15 | 16 |
import java.util.Set; |
... | ... | |
25 | 26 |
import eu.etaxonomy.cdm.api.service.exception.ReferencedObjectUndeletableException; |
26 | 27 |
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper; |
27 | 28 |
import eu.etaxonomy.cdm.model.common.CdmBase; |
29 |
import eu.etaxonomy.cdm.model.description.Character; |
|
28 | 30 |
import eu.etaxonomy.cdm.model.description.Feature; |
31 |
import eu.etaxonomy.cdm.model.description.MeasurementUnit; |
|
32 |
import eu.etaxonomy.cdm.model.description.StatisticalMeasure; |
|
33 |
import eu.etaxonomy.cdm.model.term.DefinedTerm; |
|
29 | 34 |
import eu.etaxonomy.cdm.model.term.DefinedTermBase; |
35 |
import eu.etaxonomy.cdm.model.term.Representation; |
|
30 | 36 |
import eu.etaxonomy.cdm.model.term.TermNode; |
31 | 37 |
import eu.etaxonomy.cdm.model.term.TermTree; |
32 | 38 |
import eu.etaxonomy.cdm.model.term.TermType; |
33 | 39 |
import eu.etaxonomy.cdm.model.term.TermVocabulary; |
34 | 40 |
import eu.etaxonomy.cdm.persistence.dao.term.ITermNodeDao; |
41 |
import eu.etaxonomy.cdm.persistence.dto.CharacterDto; |
|
42 |
import eu.etaxonomy.cdm.persistence.dto.CharacterNodeDto; |
|
43 |
import eu.etaxonomy.cdm.persistence.dto.MergeResult; |
|
44 |
import eu.etaxonomy.cdm.persistence.dto.TermDto; |
|
35 | 45 |
import eu.etaxonomy.cdm.persistence.dto.TermNodeDto; |
46 |
import eu.etaxonomy.cdm.persistence.dto.TermVocabularyDto; |
|
36 | 47 |
import eu.etaxonomy.cdm.persistence.query.OrderHint; |
37 | 48 |
|
38 | 49 |
/** |
... | ... | |
219 | 230 |
@Override |
220 | 231 |
public UpdateResult saveTermNodeDtoList(List<TermNodeDto> dtos){ |
221 | 232 |
UpdateResult result = new UpdateResult(); |
233 |
MergeResult<TermNode> mergeResult; |
|
222 | 234 |
List<UUID> uuids = new ArrayList<>(); |
223 | 235 |
dtos.stream().forEach(dto -> uuids.add(dto.getUuid())); |
224 | 236 |
List<TermNode> nodes = dao.list(uuids, null, 0, null, null); |
225 | 237 |
//check all attributes for changes and adapt |
226 |
Iterator<TermNodeDto> dtoIterator = dtos.iterator(); |
|
238 |
// Iterator<TermNodeDto> dtoIterator = dtos.iterator();
|
|
227 | 239 |
for (TermNode node: nodes){ |
228 |
TermNodeDto dto = dtoIterator.next(); |
|
229 |
if (dto.getUuid().equals(node.getUuid())){ |
|
230 |
// only node changes, everything else will be handled by the operations/service methods |
|
231 |
if (!dto.getInapplicableIf().equals(node.getInapplicableIf())){ |
|
232 |
node.getInapplicableIf().clear(); |
|
233 |
node.getInapplicableIf().addAll(dto.getInapplicableIf()); |
|
240 |
for (TermNodeDto dto: dtos){ |
|
241 |
// TermNodeDto dto = dtoIterator.next(); |
|
242 |
if (dto.getUuid().equals(node.getUuid())){ |
|
243 |
// only node changes, everything else will be handled by the operations/service methods |
|
244 |
if (!dto.getInapplicableIf().equals(node.getInapplicableIf())){ |
|
245 |
node.getInapplicableIf().clear(); |
|
246 |
node.getInapplicableIf().addAll(dto.getInapplicableIf()); |
|
247 |
} |
|
248 |
if (!dto.getOnlyApplicableIf().equals(node.getOnlyApplicableIf())){ |
|
249 |
node.getOnlyApplicableIf().clear(); |
|
250 |
node.getOnlyApplicableIf().addAll(dto.getOnlyApplicableIf()); |
|
251 |
} |
|
234 | 252 |
} |
235 |
if (!dto.getOnlyApplicableIf().equals(node.getOnlyApplicableIf())){ |
|
236 |
node.getOnlyApplicableIf().clear(); |
|
237 |
node.getOnlyApplicableIf().addAll(dto.getOnlyApplicableIf()); |
|
253 |
mergeResult = dao.merge(node, true); |
|
254 |
result.addUpdatedObject(mergeResult.getMergedEntity()); |
|
255 |
} |
|
256 |
} |
|
257 |
|
|
258 |
//saveOrUpdate all nodes |
|
259 |
return result; |
|
260 |
} |
|
261 |
|
|
262 |
@Override |
|
263 |
public UpdateResult saveCharacterNodeDtoList(List<CharacterNodeDto> dtos){ |
|
264 |
MergeResult<TermNode> mergeResult; |
|
265 |
UpdateResult result = new UpdateResult(); |
|
266 |
List<UUID> nodeUuids = new ArrayList<>(); |
|
267 |
|
|
268 |
dtos.stream().forEach(dto -> nodeUuids.add(dto.getUuid())); |
|
269 |
List<TermNode> nodes = dao.list(nodeUuids, null, 0, null, null); |
|
270 |
//check all attributes for changes and adapt |
|
271 |
Iterator<CharacterNodeDto> dtoIterator = dtos.iterator(); |
|
272 |
for (TermNode<Character> node: nodes){ |
|
273 |
for (CharacterNodeDto dto: dtos){ |
|
274 |
// TermNodeDto dto = dtoIterator.next(); |
|
275 |
if (dto.getUuid().equals(node.getUuid())){ |
|
276 |
// only node changes, everything else will be handled by the operations/service methods |
|
277 |
if (!dto.getInapplicableIf().equals(node.getInapplicableIf())){ |
|
278 |
node.getInapplicableIf().clear(); |
|
279 |
node.getInapplicableIf().addAll(dto.getInapplicableIf()); |
|
280 |
} |
|
281 |
if (!dto.getOnlyApplicableIf().equals(node.getOnlyApplicableIf())){ |
|
282 |
node.getOnlyApplicableIf().clear(); |
|
283 |
node.getOnlyApplicableIf().addAll(dto.getOnlyApplicableIf()); |
|
284 |
} |
|
285 |
|
|
286 |
Character character = null; |
|
287 |
CharacterDto characterDto = (CharacterDto) dto.getTerm(); |
|
288 |
character = HibernateProxyHelper.deproxy(node.getTerm(), Character.class); |
|
289 |
// representations |
|
290 |
for (Representation rep: dto.getTerm().getRepresentations()){ |
|
291 |
Representation oldRep = character.getRepresentation(rep.getLanguage()); |
|
292 |
if (oldRep == null){ |
|
293 |
oldRep = new Representation(); |
|
294 |
oldRep.setLanguage(rep.getLanguage()); |
|
295 |
character.addRepresentation(oldRep); |
|
296 |
} |
|
297 |
oldRep.setLabel(rep.getLabel()); |
|
298 |
oldRep.setAbbreviatedLabel(rep.getAbbreviatedLabel()); |
|
299 |
oldRep.setText(rep.getText()); |
|
300 |
} |
|
301 |
Set<Representation> deleteRepresentations = new HashSet<>(); |
|
302 |
if (character.getRepresentations().size() > dto.getTerm().getRepresentations().size()){ |
|
303 |
for (Representation rep: character.getRepresentations()){ |
|
304 |
if(dto.getTerm().getRepresentation(rep.getLanguage()) == null){ |
|
305 |
deleteRepresentations.add(rep); |
|
306 |
} |
|
307 |
} |
|
308 |
} |
|
309 |
|
|
310 |
if (!deleteRepresentations.isEmpty()){ |
|
311 |
for (Representation rep: deleteRepresentations){ |
|
312 |
character.removeRepresentation(rep); |
|
313 |
} |
|
314 |
|
|
315 |
} |
|
316 |
|
|
317 |
// structural modifier |
|
318 |
if (characterDto.getStructureModifier() != null){ |
|
319 |
DefinedTerm structureModifier = (DefinedTerm) termService.load(characterDto.getStructureModifier().getUuid()); |
|
320 |
character.setStructureModifier(structureModifier); |
|
321 |
} |
|
322 |
|
|
323 |
|
|
324 |
// supports quantitative data |
|
325 |
character.setSupportsQuantitativeData(characterDto.isSupportsQuantitativeData()); |
|
326 |
// recommended measurement units |
|
327 |
character.getRecommendedMeasurementUnits().clear(); |
|
328 |
List<UUID> uuids = new ArrayList<>(); |
|
329 |
for (TermDto termDto: characterDto.getRecommendedMeasurementUnits()){ |
|
330 |
uuids.add(termDto.getUuid()); |
|
331 |
} |
|
332 |
List<DefinedTermBase> terms; |
|
333 |
if (!uuids.isEmpty()){ |
|
334 |
terms = termService.load(uuids, null); |
|
335 |
Set<MeasurementUnit> measurementUnits = new HashSet<>(); |
|
336 |
for (DefinedTermBase term: terms){ |
|
337 |
if (term instanceof MeasurementUnit){ |
|
338 |
measurementUnits.add((MeasurementUnit)term); |
|
339 |
} |
|
340 |
} |
|
341 |
character.getRecommendedMeasurementUnits().addAll(measurementUnits); |
|
342 |
} |
|
343 |
|
|
344 |
|
|
345 |
|
|
346 |
// statistical measures |
|
347 |
character.getRecommendedStatisticalMeasures().clear(); |
|
348 |
uuids = new ArrayList<>(); |
|
349 |
for (TermDto termDto: characterDto.getRecommendedStatisticalMeasures()){ |
|
350 |
uuids.add(termDto.getUuid()); |
|
351 |
} |
|
352 |
if (!uuids.isEmpty()){ |
|
353 |
terms = termService.load(uuids, null); |
|
354 |
Set<StatisticalMeasure> statisticalMeasures = new HashSet<>(); |
|
355 |
for (DefinedTermBase term: terms){ |
|
356 |
if (term instanceof StatisticalMeasure){ |
|
357 |
statisticalMeasures.add((StatisticalMeasure)term); |
|
358 |
} |
|
359 |
} |
|
360 |
character.getRecommendedStatisticalMeasures().addAll(statisticalMeasures); |
|
361 |
} |
|
362 |
|
|
363 |
// recommended mod. vocabularies |
|
364 |
character.getRecommendedModifierEnumeration().clear(); |
|
365 |
uuids = new ArrayList<>(); |
|
366 |
for (TermVocabularyDto termDto: characterDto.getRecommendedModifierEnumeration()){ |
|
367 |
uuids.add(termDto.getUuid()); |
|
368 |
} |
|
369 |
List<TermVocabulary> termVocs; |
|
370 |
if (!uuids.isEmpty()){ |
|
371 |
termVocs = vocabularyService.load(uuids, null); |
|
372 |
for (TermVocabulary voc: termVocs){ |
|
373 |
character.addRecommendedModifierEnumeration(voc); |
|
374 |
} |
|
375 |
} |
|
376 |
|
|
377 |
|
|
378 |
// supports categorical data |
|
379 |
character.setSupportsCategoricalData(characterDto.isSupportsCategoricalData()); |
|
380 |
// supported state vocabularies |
|
381 |
character.getSupportedCategoricalEnumerations().clear(); |
|
382 |
uuids = new ArrayList<>(); |
|
383 |
for (TermVocabularyDto termDto: characterDto.getSupportedCategoricalEnumerations()){ |
|
384 |
uuids.add(termDto.getUuid()); |
|
385 |
} |
|
386 |
if (!uuids.isEmpty()){ |
|
387 |
termVocs = vocabularyService.load(uuids, null); |
|
388 |
|
|
389 |
for (TermVocabulary voc: termVocs){ |
|
390 |
character.addSupportedCategoricalEnumeration(voc); |
|
391 |
} |
|
392 |
} |
|
393 |
node.setTerm(character); |
|
394 |
UUID uuid = dao.saveOrUpdate(node); |
|
395 |
result.addUpdatedObject(load(uuid)); |
|
396 |
|
|
397 |
// result.addUpdatedObject(termService.merge(character, true).getMergedEntity()); |
|
238 | 398 |
} |
399 |
|
|
239 | 400 |
} |
240 | 401 |
|
241 | 402 |
} |
242 |
dao.saveOrUpdateAll(nodes); |
|
243 |
//saveOrUpdate all nodes |
|
244 | 403 |
return result; |
245 | 404 |
} |
246 | 405 |
|
406 |
|
|
247 | 407 |
} |
Also available in: Unified diff
ref #8774: further implementations for using term dtos in editor