Project

General

Profile

Download (7.35 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2017 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
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.
8
*/
9
package eu.etaxonomy.cdm.service;
10

    
11
import java.util.ArrayList;
12
import java.util.Arrays;
13
import java.util.Collection;
14
import java.util.HashSet;
15
import java.util.List;
16
import java.util.Optional;
17
import java.util.Set;
18

    
19
import org.apache.log4j.Logger;
20
import org.springframework.beans.factory.annotation.Autowired;
21
import org.springframework.beans.factory.annotation.Qualifier;
22
import org.springframework.stereotype.Service;
23
import org.springframework.transaction.annotation.Transactional;
24

    
25
import eu.etaxonomy.cdm.api.application.CdmRepository;
26
import eu.etaxonomy.cdm.api.service.pager.Pager;
27
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
28
import eu.etaxonomy.cdm.model.common.User;
29
import eu.etaxonomy.cdm.model.name.Registration;
30
import eu.etaxonomy.cdm.model.name.RegistrationStatus;
31
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
32
import eu.etaxonomy.cdm.model.name.TypeDesignationBase;
33
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
34
import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
35
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
36
import eu.etaxonomy.cdm.model.reference.Reference;
37
import eu.etaxonomy.cdm.persistence.dao.initializer.IBeanInitializer;
38
import eu.etaxonomy.cdm.vaadin.model.registration.RegistrationWorkingSet;
39
import eu.etaxonomy.cdm.vaadin.view.registration.RegistrationDTO;
40
import eu.etaxonomy.cdm.vaadin.view.registration.RegistrationValidationException;
41

    
42
/**
43
 * Provides RegistrationDTOs and RegistrationWorkingsets for Registrations in the database.
44
 *
45
 *
46
 * @author a.kohlbecker
47
 * @since Mar 10, 2017
48
 *
49
 */
50
@Service("registrationWorkingSetService")
51
@Transactional(readOnly=true)
52
public class RegistrationWorkingSetService implements IRegistrationWorkingSetService {
53

    
54
    public static final List<String> REGISTRATION_INIT_STRATEGY = Arrays.asList(new String []{
55
            // typeDesignation
56
            "typeDesignations.typeStatus",
57
            "typeDesignations.typifiedNames.typeDesignations", // important !!
58
            "typeDesignations.typeSpecimen",
59
            "typeDesignations.typeName",
60
            "typeDesignations.citation",
61
            "typeDesignations.citation.authorship.$",
62
            // name
63
            "name.$",
64
            "name.nomenclaturalReference.authorship",
65
            "name.nomenclaturalReference.inReference",
66
            "name.rank",
67
            "name.status.type",
68
            "name.typeDesignations", // important !!"
69
            // institution
70
            "institution",
71
            }
72
    );
73

    
74
   /**
75
    *
76
    */
77
   private  List<String> DERIVEDUNIT_INIT_STRATEGY = Arrays.asList(new String[]{
78
           "*", // initialize all related entities to allow DerivedUnit conversion, see DerivedUnitConverter.copyPropertiesTo()
79
           "derivedFrom.$",
80
           "derivedFrom.type",
81
           "derivedFrom.originals.derivationEvents", // important!!
82
           "specimenTypeDesignations.typifiedNames.typeDesignations", // important!!
83
           "mediaSpecimen.sources"
84
   });
85

    
86
   /**
87
   *
88
   */
89
  private List<String> FIELDUNIT_INIT_STRATEGY = Arrays.asList(new String[]{
90
          "$",
91
          "gatheringEvent.$",
92
          "gatheringEvent.country",
93
          "gatheringEvent.collectingAreas",
94
          "gatheringEvent.actor",
95
          "derivationEvents.derivatives" // important, otherwise the DerivedUnits are not included into the graph of initialized entities!!!
96
  });
97

    
98
    /**
99
     *
100
     */
101
    private static final int PAGE_SIZE = 50;
102

    
103
    private static final Logger logger = Logger.getLogger(RegistrationWorkingSetService.class);
104

    
105
    @Autowired
106
    @Qualifier("cdmRepository")
107
    private CdmRepository repo;
108

    
109
    @Autowired
110
    protected IBeanInitializer defaultBeanInitializer;
111

    
112
    public RegistrationWorkingSetService() {
113

    
114
    }
115

    
116

    
117
    /**
118
     * @param id the Registration entity id
119
     * @return
120
     */
121
    @Override
122
    public RegistrationDTO loadDtoById(Integer id) {
123
        Registration reg = repo.getRegistrationService().find(id);
124
        inititializeSpecimen(reg);
125
        return new RegistrationDTO(reg);
126
    }
127

    
128

    
129
    @Override
130
    public Collection<RegistrationDTO> listDTOs() {
131

    
132
        List<Registration> regs = repo.getRegistrationService().list(null, PAGE_SIZE, 0, null, REGISTRATION_INIT_STRATEGY);
133

    
134
        List<RegistrationDTO> dtos = makeDTOs(regs);
135
        return dtos;
136
    }
137

    
138
    /**
139
     * {@inheritDoc}
140
     */
141
    @Override
142
    public Collection<RegistrationDTO> listDTOs(User submitter, Collection<RegistrationStatus> includedStatus) {
143

    
144
        Pager<Registration> pager = repo.getRegistrationService().page(submitter, includedStatus, PAGE_SIZE, 0, null, REGISTRATION_INIT_STRATEGY);
145
        List<Registration> registrations = pager.getRecords();
146
        return makeDTOs(registrations);
147
    }
148

    
149
    /**
150
     * {@inheritDoc}
151
     * @throws RegistrationValidationException
152
     */
153
    @Override
154
    public RegistrationWorkingSet loadWorkingSetByReferenceID(Integer referenceID) throws RegistrationValidationException {
155

    
156
        Reference reference = repo.getReferenceService().find(referenceID);
157
        Pager<Registration> pager = repo.getRegistrationService().page(Optional.of(reference), null, null, null, REGISTRATION_INIT_STRATEGY);
158
        return new RegistrationWorkingSet(makeDTOs(pager.getRecords()));
159
    }
160

    
161
    /**
162
     * @param regs
163
     * @return
164
     */
165
    private List<RegistrationDTO> makeDTOs(List<Registration> regs) {
166
        initializeSpecimens(regs);
167
        List<RegistrationDTO> dtos = new ArrayList<>(regs.size());
168
        regs.forEach(reg -> {dtos.add(new RegistrationDTO(reg));});
169
        return dtos;
170
    }
171

    
172

    
173
    /**
174
     * @param regs
175
     */
176
    private void initializeSpecimens(List<Registration> regs) {
177
        for(Registration reg : regs){
178
            inititializeSpecimen(reg);
179
        }
180

    
181
    }
182

    
183

    
184
    /**
185
     * @param reg
186
     */
187
    protected void inititializeSpecimen(Registration reg) {
188

    
189
        for(TypeDesignationBase<?> td : reg.getTypeDesignations()){
190
            if(td instanceof SpecimenTypeDesignation){
191

    
192
                DerivedUnit derivedUnit = ((SpecimenTypeDesignation) td).getTypeSpecimen();
193
                @SuppressWarnings("rawtypes")
194
                Set<SpecimenOrObservationBase> sobs = new HashSet<>();
195
                sobs.add(derivedUnit);
196

    
197
                while(sobs != null && !sobs.isEmpty()){
198
                    @SuppressWarnings("rawtypes")
199
                    Set<SpecimenOrObservationBase> nextSobs = null;
200
                    for(@SuppressWarnings("rawtypes") SpecimenOrObservationBase sob : sobs){
201
                        sob = HibernateProxyHelper.deproxy(sob);
202
                        if(sob == null){
203
                            continue;
204
                        }
205
                        if(DerivedUnit.class.isAssignableFrom(sob.getClass())) {
206
                            defaultBeanInitializer.initialize(sob, DERIVEDUNIT_INIT_STRATEGY);
207
                            nextSobs = ((DerivedUnit)sob).getOriginals();
208
                        }
209
                        if(sob instanceof FieldUnit){
210
                            defaultBeanInitializer.initialize(sob, FIELDUNIT_INIT_STRATEGY);
211
                        }
212
                    }
213
                    sobs = nextSobs;
214
                }
215
            }
216
        }
217
    }
218

    
219

    
220

    
221

    
222

    
223

    
224
}
(6-6/7)