Project

General

Profile

Download (9.9 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
  public static final List<String> BLOCKING_REGISTRATION_INIT_STRATEGY = Arrays.asList(new String []{
102

    
103
          "blockedBy.blockedBy",
104
          // typeDesignation
105
          "blockedBy.typeDesignations.typeStatus",
106
//          "typeDesignations.typifiedNames.typeDesignations", // important !!
107
//          "typeDesignations.typeSpecimen",
108
//          "typeDesignations.typeName.$",
109
//          "typeDesignations.citation",
110
//          "typeDesignations.citation.authorship.$",
111
          // name
112
//          "blockedBy.name.$",
113
          "blockedBy.name.nomenclaturalReference.authorship",
114
          "blockedBy.name.nomenclaturalReference.inReference",
115
          "blockedBy.name.rank",
116
//          "name.homotypicalGroup.typifiedNames",
117
//          "name.status.type",
118
//          "name.typeDesignations",
119
          // institution
120
          "blockedBy.institution",
121
          }
122
  );
123

    
124
    /**
125
     *
126
     */
127
    private static final int PAGE_SIZE = 50;
128

    
129
    private static final Logger logger = Logger.getLogger(RegistrationWorkingSetService.class);
130

    
131
    @Autowired
132
    @Qualifier("cdmRepository")
133
    private CdmRepository repo;
134

    
135
    @Autowired
136
    protected IBeanInitializer defaultBeanInitializer;
137

    
138
    public RegistrationWorkingSetService() {
139

    
140
    }
141

    
142

    
143
    /**
144
     * @param id the Registration entity id
145
     * @return
146
     */
147
    @Override
148
    public RegistrationDTO loadDtoById(Integer id) {
149
        Registration reg = repo.getRegistrationService().load(id, REGISTRATION_INIT_STRATEGY);
150
        inititializeSpecimen(reg);
151
        return new RegistrationDTO(reg);
152
    }
153

    
154

    
155
    @Override
156
    public Pager<RegistrationDTO> pageDTOs(Integer pageSize, Integer pageIndex) {
157

    
158
        return pageDTOs(null, null, null, null, pageSize, pageIndex);
159
    }
160

    
161
    /**
162
     * {@inheritDoc}
163
     */
164
    @Override
165
    public Pager<RegistrationDTO> pageDTOs(User submitter, Collection<RegistrationStatus> includedStatus,
166
            String identifierFilterPattern, String taxonNameFilterPattern,
167
            Integer pageSize, Integer pageIndex) {
168

    
169
        if(pageSize == null){
170
            pageSize = PAGE_SIZE;
171
        }
172

    
173
        Pager<Registration> pager = repo.getRegistrationService().page(submitter, includedStatus,
174
                identifierFilterPattern, taxonNameFilterPattern,
175
                PAGE_SIZE, 0, null, REGISTRATION_INIT_STRATEGY);
176
        List<Registration> registrations = pager.getRecords();
177
        Pager<RegistrationDTO> dtoPager = new DefaultPagerImpl(pager.getCurrentIndex(), pager.getCount(), pager.getPageSize(), makeDTOs(registrations));
178
        return dtoPager;
179
    }
180

    
181
    /**
182
     * {@inheritDoc}
183
     * @throws RegistrationValidationException
184
     */
185
    @Override
186
    public RegistrationWorkingSet loadWorkingSetByReferenceID(Integer referenceID) throws RegistrationValidationException {
187

    
188
        Reference reference = repo.getReferenceService().find(referenceID);
189
        repo.getReferenceService().load(reference.getUuid()); // needed to avoid the problem described in #7331
190

    
191
        Pager<Registration> pager = repo.getRegistrationService().page(Optional.of(reference), null, null, null, REGISTRATION_INIT_STRATEGY);
192

    
193
        /* for debugging https://dev.e-taxonomy.eu/redmine/issues/7331
194
        for(Registration reg : pager.getRecords()){
195
            if(reg.getName() != null && reg.getName().getNomenclaturalReference().getAuthorship() != null){
196
                Reference ref = (Reference) reg.getName().getNomenclaturalReference();
197
                if(!Hibernate.isInitialized(ref.getAuthorship())){
198
                    logger.error("UNINITIALIZED");
199
                }
200
            } else {
201
                logger.debug("NO AUTHORS");
202
            }
203
        }
204
        */
205
        return new RegistrationWorkingSet(makeDTOs(pager.getRecords()));
206
    }
207

    
208
    @Override
209
    public Set<RegistrationDTO> loadBlockingRegistrations(Integer blockedRegistrationId){
210

    
211
        Registration registration = repo.getRegistrationService().load(blockedRegistrationId, BLOCKING_REGISTRATION_INIT_STRATEGY);
212
        Set<Registration> registrations = registration.getBlockedBy();
213

    
214
        Set<RegistrationDTO> blockingSet = new HashSet<>();
215
        for(Registration reg : registrations){
216
            blockingSet.add(new RegistrationDTO(reg));
217
        }
218
        return blockingSet;
219
    }
220

    
221
    /**
222
     * @param regs
223
     * @return
224
     */
225
    private List<RegistrationDTO> makeDTOs(List<Registration> regs) {
226
        initializeSpecimens(regs);
227
        List<RegistrationDTO> dtos = new ArrayList<>(regs.size());
228
        regs.forEach(reg -> {dtos.add(new RegistrationDTO(reg));});
229
        return dtos;
230
    }
231

    
232

    
233

    
234
    /**
235
     * @param regs
236
     */
237
    private void initializeSpecimens(List<Registration> regs) {
238
        for(Registration reg : regs){
239
            inititializeSpecimen(reg);
240
        }
241

    
242
    }
243

    
244

    
245
    /**
246
     * @param reg
247
     */
248
    protected void inititializeSpecimen(Registration reg) {
249

    
250
        for(TypeDesignationBase<?> td : reg.getTypeDesignations()){
251
            if(td instanceof SpecimenTypeDesignation){
252

    
253
                DerivedUnit derivedUnit = ((SpecimenTypeDesignation) td).getTypeSpecimen();
254
                @SuppressWarnings("rawtypes")
255
                Set<SpecimenOrObservationBase> sobs = new HashSet<>();
256
                sobs.add(HibernateProxyHelper.deproxy(derivedUnit));
257

    
258
                while(sobs != null && !sobs.isEmpty()){
259
                    @SuppressWarnings("rawtypes")
260
                    Set<SpecimenOrObservationBase> nextSobs = null;
261
                    for(@SuppressWarnings("rawtypes") SpecimenOrObservationBase sob : sobs){
262
                        sob = HibernateProxyHelper.deproxy(sob);
263
                        if(sob == null){
264
                            continue;
265
                        }
266
                        if(DerivedUnit.class.isAssignableFrom(sob.getClass())) {
267
                            defaultBeanInitializer.initialize(sob, DERIVEDUNIT_INIT_STRATEGY);
268
                            nextSobs = ((DerivedUnit)sob).getOriginals();
269
                        }
270
                        if(sob instanceof FieldUnit){
271
                            defaultBeanInitializer.initialize(sob, FIELDUNIT_INIT_STRATEGY);
272
                        }
273
                    }
274
                    sobs = nextSobs;
275
                }
276
            }
277
        }
278
    }
279

    
280

    
281

    
282

    
283

    
284

    
285
}
(6-6/7)