Project

General

Profile

Download (7.2 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.mock;
10

    
11
import java.util.ArrayList;
12
import java.util.Collection;
13
import java.util.HashMap;
14
import java.util.HashSet;
15
import java.util.List;
16
import java.util.Map;
17
import java.util.UUID;
18

    
19
import org.apache.log4j.Logger;
20
import org.joda.time.DateTime;
21
import org.springframework.beans.factory.annotation.Autowired;
22
import org.springframework.beans.factory.annotation.Qualifier;
23
import org.springframework.stereotype.Service;
24
import org.springframework.transaction.TransactionStatus;
25
import org.springframework.transaction.annotation.Transactional;
26

    
27
import eu.etaxonomy.cdm.api.application.CdmRepository;
28
import eu.etaxonomy.cdm.model.common.CdmBase;
29
import eu.etaxonomy.cdm.model.name.Rank;
30
import eu.etaxonomy.cdm.model.name.Registration;
31
import eu.etaxonomy.cdm.model.name.RegistrationStatus;
32
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
33
import eu.etaxonomy.cdm.vaadin.model.registration.RegistrationWorkingSet;
34
import eu.etaxonomy.cdm.vaadin.view.registration.RegistrationDTO;
35
import eu.etaxonomy.cdm.vaadin.view.registration.RegistrationValidationException;
36

    
37
/**
38
 * Mock service which creates Registration on the fly.
39
 * Registrations are never persisted they are only kept in memory.
40
 *
41
 * @author a.kohlbecker
42
 * @since Mar 10, 2017
43
 *
44
 */
45
@Service("registrationServiceMock")
46
@Transactional(readOnly=true)
47
public class RegistrationService implements IRegistrationWorkingSetService {
48

    
49
    private static final int SIZE = 50; // FIXME test performance with 50 !!!!!
50

    
51
    private static final Logger logger = Logger.getLogger(RegistrationService.class);
52

    
53
    @Autowired
54
    @Qualifier("cdmRepository")
55
    private CdmRepository repo;
56

    
57
    private Map<UUID, Registration> registrationsByUUID = new HashMap<>();
58
    private Map<Integer, Registration> registrationsByRegID = new HashMap<>();
59
    private Map<Integer, RegistrationDTO> registrationDTOsById = new HashMap<>();
60
    private Map<String, RegistrationDTO> registrationDTOsByIdentifier = new HashMap<>();
61
    private Map<Integer, List<RegistrationDTO>> registrationDTOsByCitationId = new HashMap<>();
62

    
63
    private Collection<CdmBase> cdmEntities = new HashSet<>();
64

    
65
    int autoincrementId = 100000;
66

    
67
    public RegistrationService() {
68
    }
69

    
70

    
71
    int minTypeDesignationCount = 1;
72

    
73
    protected void init(){
74
        if(isCleanSweep()){
75
            autoincrementId = 100000;
76
            registrationsByUUID = new HashMap<>();
77
            registrationsByRegID = new HashMap<>();
78
            registrationDTOsById = new HashMap<>();
79
            registrationDTOsByIdentifier = new HashMap<>();
80
            registrationDTOsByCitationId = new HashMap<>();
81
        }
82
        if(registrationsByUUID.size() == 0){
83
            TransactionStatus tx = repo.startTransaction(true);
84
            int pageIndex = 0;
85
            while(registrationsByUUID.size() < SIZE){
86
                List<TaxonNameBase> names = repo.getNameService().list(TaxonNameBase.class, 100, pageIndex++, null, null);
87
                if(names.isEmpty()){
88
                    break;
89
                }
90
                for(TaxonNameBase name : names){
91
                    if(name != null && name.getRank() != null && name.getRank().isLower(Rank.SUBFAMILY()) && name.getNomenclaturalReference() != null){
92
                        if(name.getTypeDesignations().size() > minTypeDesignationCount - 1) {
93

    
94
                            // name
95
                            logger.debug("creating Registration for " + name.getTitleCache());
96
                            Registration reg = newMockRegistration();
97
                            reg.setName(name);
98
                            cdmEntities.add(name);
99

    
100
                            // typedesignation
101
                            reg.setTypeDesignations(name.getTypeDesignations());
102
                            cdmEntities.addAll(name.getTypeDesignations());
103

    
104
                            put(new RegistrationDTO(reg));
105
                            logger.debug("\t\t\tdone");
106
                        }
107
                    }
108
                }
109
            }
110
            repo.commitTransaction(tx);
111
        }
112
    }
113

    
114
    /**
115
     * @return
116
     */
117
    private Registration newMockRegistration() {
118
        Registration reg = Registration.NewInstance();
119
        reg.setId(autoincrementId);
120
        reg.setSpecificIdentifier(String.valueOf(autoincrementId));
121
        reg.setIdentifier("http://phycobank/" + reg.getSpecificIdentifier());
122
        autoincrementId++;
123
        reg.setStatus(RegistrationStatus.values()[(int) (Math.random() * RegistrationStatus.values().length)]);
124
        reg.setRegistrationDate(DateTime.now());
125
        return reg;
126
    }
127

    
128
    /**
129
     * @return
130
     */
131
    private boolean isCleanSweep() {
132

    
133
        return false;
134
    }
135

    
136
    /**
137
     * @param reg
138
     */
139
    private void put(RegistrationDTO dto) {
140
        logger.debug("putting DTO " + dto.getSummary());
141
        Registration reg = dto.registration();
142
        registrationsByUUID.put(dto.getUuid(), reg);
143
        registrationsByRegID.put(reg.getId(), reg);
144

    
145
        registrationDTOsById.put(reg.getId(), dto);
146
        registrationDTOsByIdentifier.put(reg.getIdentifier(), dto);
147

    
148
        if(! registrationDTOsByCitationId.containsKey(dto.getCitationID())){
149
            registrationDTOsByCitationId.put(dto.getCitationID(), new ArrayList<RegistrationDTO>());
150
        }
151
        registrationDTOsByCitationId.get(dto.getCitationID()).add(dto);
152
    }
153

    
154
    private void mergeBack(){
155
        cdmEntities.forEach(e -> repo.getNameService().getSession().merge(e));
156
    }
157

    
158
    /**
159
     * {@inheritDoc}
160
     */
161
    public Registration load(UUID uuid) {
162
        init();
163
        return registrationsByUUID.get(uuid);
164
    }
165

    
166

    
167
    public Collection<Registration> list(){
168
        init();
169
        return registrationsByUUID.values();
170
    }
171

    
172
    @Override
173
    public Collection<RegistrationDTO> listDTOs() {
174
        init();
175
        return registrationDTOsById.values();
176
    }
177

    
178
    public Map<Integer, List<RegistrationDTO>> listDTOsByWorkingSet() {
179
        init();
180
        return registrationDTOsByCitationId;
181
    }
182

    
183
    /**
184
     * @param  id the CDM Entity id
185
     * @return
186
     */
187
    public Registration loadByRegistrationID(Integer id) {
188
        init();
189
        return registrationsByRegID.get(id);
190
    }
191

    
192
    /**
193
     * @param identifier the Registration Identifier String
194
     * @return
195
     */
196
    public RegistrationDTO loadDtoByIdentifier(String identifier) {
197
        init();
198
        return registrationDTOsById.get(identifier);
199
    }
200

    
201
    /**
202
     * @param id the CDM Entity id
203
     * @return
204
     */
205
    @Override
206
    public RegistrationDTO loadDtoById(Integer id) {
207
        init();
208
        return registrationDTOsById.get(id);
209
    }
210

    
211
    /**
212
     * @param  id the CDM Entity id
213
     * @return
214
     * @throws RegistrationValidationException
215
     */
216
    @Override
217
    public RegistrationWorkingSet loadWorkingSetByRegistrationID(Integer id) throws RegistrationValidationException {
218
        init();
219
        RegistrationDTO dto = registrationDTOsById.get(id);
220

    
221
        return new RegistrationWorkingSet(registrationDTOsByCitationId.get(dto.getCitationID()));
222
    }
223

    
224

    
225
}
(3-3/4)