Project

General

Profile

Download (9.24 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
        Pager<Registration> pager = repo.getRegistrationService().page(Optional.of(reference), null, null, null, REGISTRATION_INIT_STRATEGY);
190
        return new RegistrationWorkingSet(makeDTOs(pager.getRecords()));
191
    }
192

    
193
    @Override
194
    public Set<RegistrationDTO> loadBlockingRegistrations(Integer blockedRegistrationId){
195

    
196
        Registration registration = repo.getRegistrationService().load(blockedRegistrationId, BLOCKING_REGISTRATION_INIT_STRATEGY);
197
        Set<Registration> registrations = registration.getBlockedBy();
198

    
199
        Set<RegistrationDTO> blockingSet = new HashSet<>();
200
        for(Registration reg : registrations){
201
            blockingSet.add(new RegistrationDTO(reg));
202
        }
203
        return blockingSet;
204
    }
205

    
206
    /**
207
     * @param regs
208
     * @return
209
     */
210
    private List<RegistrationDTO> makeDTOs(List<Registration> regs) {
211
        initializeSpecimens(regs);
212
        List<RegistrationDTO> dtos = new ArrayList<>(regs.size());
213
        regs.forEach(reg -> {dtos.add(new RegistrationDTO(reg));});
214
        return dtos;
215
    }
216

    
217

    
218

    
219
    /**
220
     * @param regs
221
     */
222
    private void initializeSpecimens(List<Registration> regs) {
223
        for(Registration reg : regs){
224
            inititializeSpecimen(reg);
225
        }
226

    
227
    }
228

    
229

    
230
    /**
231
     * @param reg
232
     */
233
    protected void inititializeSpecimen(Registration reg) {
234

    
235
        for(TypeDesignationBase<?> td : reg.getTypeDesignations()){
236
            if(td instanceof SpecimenTypeDesignation){
237

    
238
                DerivedUnit derivedUnit = ((SpecimenTypeDesignation) td).getTypeSpecimen();
239
                @SuppressWarnings("rawtypes")
240
                Set<SpecimenOrObservationBase> sobs = new HashSet<>();
241
                sobs.add(HibernateProxyHelper.deproxy(derivedUnit));
242

    
243
                while(sobs != null && !sobs.isEmpty()){
244
                    @SuppressWarnings("rawtypes")
245
                    Set<SpecimenOrObservationBase> nextSobs = null;
246
                    for(@SuppressWarnings("rawtypes") SpecimenOrObservationBase sob : sobs){
247
                        sob = HibernateProxyHelper.deproxy(sob);
248
                        if(sob == null){
249
                            continue;
250
                        }
251
                        if(DerivedUnit.class.isAssignableFrom(sob.getClass())) {
252
                            defaultBeanInitializer.initialize(sob, DERIVEDUNIT_INIT_STRATEGY);
253
                            nextSobs = ((DerivedUnit)sob).getOriginals();
254
                        }
255
                        if(sob instanceof FieldUnit){
256
                            defaultBeanInitializer.initialize(sob, FIELDUNIT_INIT_STRATEGY);
257
                        }
258
                    }
259
                    sobs = nextSobs;
260
                }
261
            }
262
        }
263
    }
264

    
265

    
266

    
267

    
268

    
269

    
270
}
(6-6/7)