Project

General

Profile

Download (7.88 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.api.service.pager.impl.DefaultPagerImpl;
28
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
29
import eu.etaxonomy.cdm.model.common.User;
30
import eu.etaxonomy.cdm.model.name.Registration;
31
import eu.etaxonomy.cdm.model.name.RegistrationStatus;
32
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
33
import eu.etaxonomy.cdm.model.name.TypeDesignationBase;
34
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
35
import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
36
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
37
import eu.etaxonomy.cdm.model.reference.Reference;
38
import eu.etaxonomy.cdm.persistence.dao.initializer.IBeanInitializer;
39
import eu.etaxonomy.cdm.vaadin.model.registration.RegistrationWorkingSet;
40
import eu.etaxonomy.cdm.vaadin.view.registration.RegistrationDTO;
41
import eu.etaxonomy.cdm.vaadin.view.registration.RegistrationValidationException;
42

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

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

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

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

    
101
    /**
102
     *
103
     */
104
    private static final int PAGE_SIZE = 50;
105

    
106
    private static final Logger logger = Logger.getLogger(RegistrationWorkingSetService.class);
107

    
108
    @Autowired
109
    @Qualifier("cdmRepository")
110
    private CdmRepository repo;
111

    
112
    @Autowired
113
    protected IBeanInitializer defaultBeanInitializer;
114

    
115
    public RegistrationWorkingSetService() {
116

    
117
    }
118

    
119

    
120
    /**
121
     * @param id the Registration entity id
122
     * @return
123
     */
124
    @Override
125
    public RegistrationDTO loadDtoById(Integer id) {
126
        Registration reg = repo.getRegistrationService().load(id, REGISTRATION_INIT_STRATEGY);
127
        inititializeSpecimen(reg);
128
        return new RegistrationDTO(reg);
129
    }
130

    
131

    
132
    @Override
133
    public Pager<RegistrationDTO> pageDTOs(Integer pageSize, Integer pageIndex) {
134

    
135
        return pageDTOs(null, null, null, null, pageSize, pageIndex);
136
    }
137

    
138
    /**
139
     * {@inheritDoc}
140
     */
141
    @Override
142
    public Pager<RegistrationDTO> pageDTOs(User submitter, Collection<RegistrationStatus> includedStatus,
143
            String identifierFilterPattern, String taxonNameFilterPattern,
144
            Integer pageSize, Integer pageIndex) {
145

    
146
        if(pageSize == null){
147
            pageSize = PAGE_SIZE;
148
        }
149

    
150
        Pager<Registration> pager = repo.getRegistrationService().page(submitter, includedStatus,
151
                identifierFilterPattern, taxonNameFilterPattern,
152
                PAGE_SIZE, 0, null, REGISTRATION_INIT_STRATEGY);
153
        List<Registration> registrations = pager.getRecords();
154
        Pager<RegistrationDTO> dtoPager = new DefaultPagerImpl(pager.getCurrentIndex(), pager.getCount(), pager.getPageSize(), makeDTOs(registrations));
155
        return dtoPager;
156
    }
157

    
158
    /**
159
     * {@inheritDoc}
160
     * @throws RegistrationValidationException
161
     */
162
    @Override
163
    public RegistrationWorkingSet loadWorkingSetByReferenceID(Integer referenceID) throws RegistrationValidationException {
164

    
165
        Reference reference = repo.getReferenceService().find(referenceID);
166
        Pager<Registration> pager = repo.getRegistrationService().page(Optional.of(reference), null, null, null, REGISTRATION_INIT_STRATEGY);
167
        return new RegistrationWorkingSet(makeDTOs(pager.getRecords()));
168
    }
169

    
170
    /**
171
     * @param regs
172
     * @return
173
     */
174
    private List<RegistrationDTO> makeDTOs(List<Registration> regs) {
175
        initializeSpecimens(regs);
176
        List<RegistrationDTO> dtos = new ArrayList<>(regs.size());
177
        regs.forEach(reg -> {dtos.add(new RegistrationDTO(reg));});
178
        return dtos;
179
    }
180

    
181

    
182
    /**
183
     * @param regs
184
     */
185
    private void initializeSpecimens(List<Registration> regs) {
186
        for(Registration reg : regs){
187
            inititializeSpecimen(reg);
188
        }
189

    
190
    }
191

    
192

    
193
    /**
194
     * @param reg
195
     */
196
    protected void inititializeSpecimen(Registration reg) {
197

    
198
        for(TypeDesignationBase<?> td : reg.getTypeDesignations()){
199
            if(td instanceof SpecimenTypeDesignation){
200

    
201
                DerivedUnit derivedUnit = ((SpecimenTypeDesignation) td).getTypeSpecimen();
202
                @SuppressWarnings("rawtypes")
203
                Set<SpecimenOrObservationBase> sobs = new HashSet<>();
204
                sobs.add(HibernateProxyHelper.deproxy(derivedUnit));
205

    
206
                while(sobs != null && !sobs.isEmpty()){
207
                    @SuppressWarnings("rawtypes")
208
                    Set<SpecimenOrObservationBase> nextSobs = null;
209
                    for(@SuppressWarnings("rawtypes") SpecimenOrObservationBase sob : sobs){
210
                        sob = HibernateProxyHelper.deproxy(sob);
211
                        if(sob == null){
212
                            continue;
213
                        }
214
                        if(DerivedUnit.class.isAssignableFrom(sob.getClass())) {
215
                            defaultBeanInitializer.initialize(sob, DERIVEDUNIT_INIT_STRATEGY);
216
                            nextSobs = ((DerivedUnit)sob).getOriginals();
217
                        }
218
                        if(sob instanceof FieldUnit){
219
                            defaultBeanInitializer.initialize(sob, FIELDUNIT_INIT_STRATEGY);
220
                        }
221
                    }
222
                    sobs = nextSobs;
223
                }
224
            }
225
        }
226
    }
227

    
228

    
229

    
230

    
231

    
232

    
233
}
(6-6/7)