Project

General

Profile

Download (11.1 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
import java.util.UUID;
19

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

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

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

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

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

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

    
103
  public static final List<String> BLOCKING_REGISTRATION_INIT_STRATEGY = Arrays.asList(new String []{
104

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

    
126
    /**
127
     *
128
     */
129
    private static final int PAGE_SIZE = 50;
130

    
131
    private static final Logger logger = Logger.getLogger(RegistrationWorkingSetService.class);
132

    
133
    @Autowired
134
    @Qualifier("cdmRepository")
135
    private CdmRepository repo;
136

    
137
    @Autowired
138
    protected IBeanInitializer defaultBeanInitializer;
139

    
140
    public RegistrationWorkingSetService() {
141

    
142
    }
143

    
144

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

    
156

    
157
    /**
158
     * @param id the Registration entity id
159
     * @return
160
     */
161
    @Override
162
    public RegistrationDTO loadDtoByUuid(UUID uuid) {
163
        Registration reg = repo.getRegistrationService().load(uuid, REGISTRATION_INIT_STRATEGY);
164
        inititializeSpecimen(reg);
165
        return new RegistrationDTO(reg);
166
    }
167

    
168

    
169
    @Override
170
    public Pager<RegistrationDTO> pageDTOs(Integer pageSize, Integer pageIndex) {
171

    
172
        return pageDTOs(null, null, null, null, pageSize, pageIndex);
173
    }
174

    
175
    /**
176
     * {@inheritDoc}
177
     */
178
    @Override
179
    public Pager<RegistrationDTO> pageDTOs(User submitter, Collection<RegistrationStatus> includedStatus,
180
            String identifierFilterPattern, String taxonNameFilterPattern,
181
            Integer pageSize, Integer pageIndex) {
182

    
183
        if(pageSize == null){
184
            pageSize = PAGE_SIZE;
185
        }
186

    
187
        Pager<Registration> pager = repo.getRegistrationService().page(submitter, includedStatus,
188
                identifierFilterPattern, taxonNameFilterPattern,
189
                PAGE_SIZE, 0, null, REGISTRATION_INIT_STRATEGY);
190
        List<Registration> registrations = pager.getRecords();
191
        Pager<RegistrationDTO> dtoPager = new DefaultPagerImpl(pager.getCurrentIndex(), pager.getCount(), pager.getPageSize(), makeDTOs(registrations));
192
        return dtoPager;
193
    }
194

    
195
    /**
196
     * {@inheritDoc}
197
     * @throws RegistrationValidationException
198
     */
199
    @Override
200
    public RegistrationWorkingSet loadWorkingSetByReferenceUuid(UUID referenceUuid) throws RegistrationValidationException {
201

    
202
        Reference reference = repo.getReferenceService().find(referenceUuid);
203
        repo.getReferenceService().load(reference.getUuid()); // needed to avoid the problem described in #7331
204

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

    
207
        /* for debugging https://dev.e-taxonomy.eu/redmine/issues/7331 */
208
        // debugIssue7331(pager);
209
        return new RegistrationWorkingSet(makeDTOs(pager.getRecords()));
210
    }
211

    
212
    /**
213
     * {@inheritDoc}
214
     * @throws RegistrationValidationException
215
     */
216
    @Override
217
    public RegistrationWorkingSet loadWorkingSetByReferenceID(Integer referenceID) throws RegistrationValidationException {
218

    
219
        Reference reference = repo.getReferenceService().find(referenceID);
220
        repo.getReferenceService().load(reference.getUuid()); // needed to avoid the problem described in #7331
221

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

    
224
        /* for debugging https://dev.e-taxonomy.eu/redmine/issues/7331 */
225
        // debugIssue7331(pager);
226

    
227
        return new RegistrationWorkingSet(makeDTOs(pager.getRecords()));
228
    }
229

    
230

    
231
    /**
232
     * @param pager
233
     */
234
    @SuppressWarnings("unused")
235
    private void debugIssue7331(Pager<Registration> pager) {
236
        for(Registration reg : pager.getRecords()){
237
            if(reg.getName() != null && reg.getName().getNomenclaturalReference().getAuthorship() != null){
238
                Reference ref = (Reference) reg.getName().getNomenclaturalReference();
239
                if(!Hibernate.isInitialized(ref.getAuthorship())){
240
                    logger.error("UNINITIALIZED");
241
                }
242
            } else {
243
                logger.debug("NO AUTHORS");
244
            }
245
        }
246
    }
247

    
248
    @Override
249
    public Set<RegistrationDTO> loadBlockingRegistrations(UUID blockedRegistrationUuid){
250

    
251
        Registration registration = repo.getRegistrationService().load(blockedRegistrationUuid, BLOCKING_REGISTRATION_INIT_STRATEGY);
252
        Set<Registration> registrations = registration.getBlockedBy();
253

    
254
        Set<RegistrationDTO> blockingSet = new HashSet<>();
255
        for(Registration reg : registrations){
256
            blockingSet.add(new RegistrationDTO(reg));
257
        }
258
        return blockingSet;
259
    }
260

    
261
    /**
262
     * @param regs
263
     * @return
264
     */
265
    private List<RegistrationDTO> makeDTOs(List<Registration> regs) {
266
        initializeSpecimens(regs);
267
        List<RegistrationDTO> dtos = new ArrayList<>(regs.size());
268
        regs.forEach(reg -> {dtos.add(new RegistrationDTO(reg));});
269
        return dtos;
270
    }
271

    
272

    
273

    
274
    /**
275
     * @param regs
276
     */
277
    private void initializeSpecimens(List<Registration> regs) {
278
        for(Registration reg : regs){
279
            inititializeSpecimen(reg);
280
        }
281

    
282
    }
283

    
284

    
285
    /**
286
     * @param reg
287
     */
288
    protected void inititializeSpecimen(Registration reg) {
289

    
290
        for(TypeDesignationBase<?> td : reg.getTypeDesignations()){
291
            if(td instanceof SpecimenTypeDesignation){
292

    
293
                DerivedUnit derivedUnit = ((SpecimenTypeDesignation) td).getTypeSpecimen();
294
                @SuppressWarnings("rawtypes")
295
                Set<SpecimenOrObservationBase> sobs = new HashSet<>();
296
                sobs.add(HibernateProxyHelper.deproxy(derivedUnit));
297

    
298
                while(sobs != null && !sobs.isEmpty()){
299
                    @SuppressWarnings("rawtypes")
300
                    Set<SpecimenOrObservationBase> nextSobs = null;
301
                    for(@SuppressWarnings("rawtypes") SpecimenOrObservationBase sob : sobs){
302
                        sob = HibernateProxyHelper.deproxy(sob);
303
                        if(sob == null){
304
                            continue;
305
                        }
306
                        if(DerivedUnit.class.isAssignableFrom(sob.getClass())) {
307
                            defaultBeanInitializer.initialize(sob, DERIVEDUNIT_INIT_STRATEGY);
308
                            nextSobs = ((DerivedUnit)sob).getOriginals();
309
                        }
310
                        if(sob instanceof FieldUnit){
311
                            defaultBeanInitializer.initialize(sob, FIELDUNIT_INIT_STRATEGY);
312
                        }
313
                    }
314
                    sobs = nextSobs;
315
                }
316
            }
317
        }
318
    }
319

    
320

    
321

    
322

    
323

    
324

    
325
}
(6-6/7)