2 * Copyright (C) 2023 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
9 package eu
.etaxonomy
.cdm
.api
.service
.portal
;
11 import java
.time
.LocalDateTime
;
12 import java
.util
.HashMap
;
13 import java
.util
.HashSet
;
17 import org
.joda
.time
.DateTime
;
19 import eu
.etaxonomy
.cdm
.api
.dto
.portal
.ContainerDto
;
20 import eu
.etaxonomy
.cdm
.api
.dto
.portal
.FactDto
;
21 import eu
.etaxonomy
.cdm
.api
.dto
.portal
.FeatureDto
;
22 import eu
.etaxonomy
.cdm
.api
.dto
.portal
.TaxonPageDto
;
23 import eu
.etaxonomy
.cdm
.api
.dto
.portal
.TypedLabel
;
24 import eu
.etaxonomy
.cdm
.api
.dto
.portal
.config
.TaxonPageDtoConfiguration
;
25 import eu
.etaxonomy
.cdm
.common
.CdmUtils
;
26 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
27 import eu
.etaxonomy
.cdm
.model
.common
.Language
;
28 import eu
.etaxonomy
.cdm
.model
.common
.LanguageString
;
29 import eu
.etaxonomy
.cdm
.model
.common
.VersionableEntity
;
30 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionElementBase
;
31 import eu
.etaxonomy
.cdm
.model
.description
.Feature
;
32 import eu
.etaxonomy
.cdm
.model
.description
.TaxonDescription
;
33 import eu
.etaxonomy
.cdm
.model
.description
.TextData
;
34 import eu
.etaxonomy
.cdm
.model
.name
.TaxonName
;
35 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
38 * Loads the portal dto from a taxon instance.
39 * Maybe later also supports loading from persistence.
44 public class PortalDtoLoader
{
46 public TaxonPageDto
load(Taxon taxon
, TaxonPageDtoConfiguration config
) {
47 TaxonPageDto result
= new TaxonPageDto();
49 TaxonName name
= taxon
.getName();
51 result
.setId(taxon
.getId());
52 result
.setUuid(taxon
.getUuid());
53 result
.setLastUpdated(getLastUpdated(null, taxon
));
54 result
.setNameLabel(name
!= null? name
.getTitleCache() : "");
55 result
.setTaxonLabel(CdmUtils
.Nz(taxon
.getTitleCache()));
57 //TODO load feature tree
58 Map
<Feature
,Set
<DescriptionElementBase
>> featureMap
= new HashMap
<>();
60 for (TaxonDescription taxonDescription
: taxon
.getDescriptions()) {
61 if (taxonDescription
.isImageGallery()) {
64 for (DescriptionElementBase deb
: taxonDescription
.getElements()) {
65 Feature feature
= deb
.getFeature();
66 if (featureMap
.get(feature
) == null) {
67 featureMap
.put(feature
, new HashSet
<>());
69 featureMap
.get(feature
).add(deb
);
74 if (!featureMap
.isEmpty()) {
75 ContainerDto
<FeatureDto
> features
= new ContainerDto
<>();
76 result
.setFactualData(features
);
77 for (Feature feature
: featureMap
.keySet()) {
78 FeatureDto featureDto
= new FeatureDto();
79 featureDto
.setId(feature
.getId());
80 featureDto
.setUuid(feature
.getUuid());
82 featureDto
.setLabel(feature
.getTitleCache());
83 features
.getCollection().add(featureDto
);
86 for (DescriptionElementBase fact
: featureMap
.get(feature
)){
87 handleFact(featureDto
, fact
);
95 private void handleFact(FeatureDto featureDto
, DescriptionElementBase fact
) {
96 if (fact
.isInstanceOf(TextData
.class)) {
97 TextData td
= CdmBase
.deproxy(fact
, TextData
.class);
100 LanguageString ls
= td
.getPreferredLanguageString(lang
);
101 String text
= ls
== null ?
"" : CdmUtils
.Nz(ls
.getText());
103 FactDto factDto
= new FactDto();
104 featureDto
.getFacts().add(factDto
);
105 TypedLabel typedLabel
= new TypedLabel();
106 typedLabel
.setClassAndId(td
);
107 typedLabel
.setLabel(text
);
108 factDto
.getTypedLabel().add(typedLabel
);
116 * Compares an existing last date and the last date of an entity
117 * and returns the resulting last date.
119 private LocalDateTime
getLastUpdated(LocalDateTime existingLastDate
, VersionableEntity dateToAddEntity
) {
121 DateTime dateToAdd
= dateToAddEntity
.getUpdated() != null ? dateToAddEntity
.getUpdated() : dateToAddEntity
.getCreated();
123 LocalDateTime javaLocalDateTimeOfEntity
= dateToAdd
== null ?
null:
124 LocalDateTime
.of(dateToAdd
.getYear(), dateToAdd
.getMonthOfYear(),
125 dateToAdd
.getDayOfMonth(), dateToAdd
.getHourOfDay(),
126 dateToAdd
.getMinuteOfHour(), dateToAdd
.getSecondOfMinute());
128 if (existingLastDate
== null) {
129 return javaLocalDateTimeOfEntity
;
130 }else if (javaLocalDateTimeOfEntity
== null || javaLocalDateTimeOfEntity
.compareTo(existingLastDate
) < 0) {
131 return existingLastDate
;
133 return javaLocalDateTimeOfEntity
;