Project

General

Profile

« Previous | Next » 

Revision 4d68581f

Added by Katja Luther over 3 years ago

ref #8774: further implementations for using term dtos in editor

View differences:

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