Project

General

Profile

Download (9.61 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.dataInserter;
10

    
11
import java.io.IOException;
12
import java.util.ArrayList;
13
import java.util.HashMap;
14
import java.util.HashSet;
15
import java.util.List;
16
import java.util.Map;
17
import java.util.Set;
18
import java.util.UUID;
19

    
20
import org.apache.log4j.Logger;
21
import org.joda.time.DateTime;
22
import org.joda.time.format.DateTimeFormatter;
23
import org.springframework.beans.factory.annotation.Autowired;
24
import org.springframework.beans.factory.annotation.Qualifier;
25
import org.springframework.context.ApplicationListener;
26
import org.springframework.context.event.ContextRefreshedEvent;
27
import org.springframework.transaction.TransactionStatus;
28
import org.springframework.transaction.annotation.Transactional;
29

    
30
import com.fasterxml.jackson.core.JsonParseException;
31
import com.fasterxml.jackson.databind.JsonMappingException;
32
import com.fasterxml.jackson.databind.ObjectMapper;
33
import com.vaadin.spring.annotation.SpringComponent;
34

    
35
import eu.etaxonomy.cdm.api.application.CdmRepository;
36
import eu.etaxonomy.cdm.api.service.pager.Pager;
37
import eu.etaxonomy.cdm.model.agent.AgentBase;
38
import eu.etaxonomy.cdm.model.agent.Institution;
39
import eu.etaxonomy.cdm.model.common.ExtensionType;
40
import eu.etaxonomy.cdm.model.name.Registration;
41
import eu.etaxonomy.cdm.model.name.RegistrationStatus;
42
import eu.etaxonomy.cdm.model.name.TaxonName;
43
import eu.etaxonomy.cdm.model.name.TypeDesignationBase;
44
import eu.etaxonomy.cdm.persistence.hibernate.permission.Role;
45
import eu.etaxonomy.cdm.persistence.query.MatchMode;
46
import eu.etaxonomy.cdm.vaadin.model.registration.DerivationEventTypes;
47
import eu.etaxonomy.cdm.vaadin.security.RolesAndPermissions;
48

    
49
/**
50
 * @author a.kohlbecker
51
 * @since May 9, 2017
52
 *
53
 */
54
@SpringComponent
55
@Transactional(readOnly=true)
56
public class RegistrationRequiredDataInserter implements ApplicationListener<ContextRefreshedEvent>{
57

    
58
    protected static final String PARAM_NAME_CREATE = "registrationCreate";
59

    
60
    protected static final String PARAM_NAME_WIPEOUT = "registrationWipeout";
61

    
62
    private static final Logger logger = Logger.getLogger(RegistrationRequiredDataInserter.class);
63

    
64
    private ExtensionType extensionTypeIAPTRegData;
65

    
66
    Map<String, Institution> instituteMap = new HashMap<>();
67

    
68
    public static boolean commandsExecuted = false;
69

    
70
    @Autowired
71
    @Qualifier("cdmRepository")
72
    private CdmRepository repo;
73

    
74
 // ==================== Registration creation ======================= //
75

    
76
    /**
77
     * {@inheritDoc}
78
     */
79
    @Override
80
    public void onApplicationEvent(ContextRefreshedEvent event) {
81
        insertRequiredData();
82
        executeSuppliedCommands();
83
    }
84

    
85
    /**
86
 *
87
 */
88
private void insertRequiredData() {
89
    Role roleCuration = RolesAndPermissions.ROLE_CURATION;
90
    if(repo.getGrantedAuthorityService().find(roleCuration.getUuid()) == null){
91
        repo.getGrantedAuthorityService().saveOrUpdate(roleCuration.asNewGrantedAuthority());
92
        repo.getGrantedAuthorityService().getSession().flush();
93
    }
94
    if(repo.getTermService().find(DerivationEventTypes.PUBLISHED_IMAGE().getUuid()) == null){
95
        repo.getTermService().save(DerivationEventTypes.PUBLISHED_IMAGE());
96
    }
97
    if(repo.getTermService().find(DerivationEventTypes.UNPUBLISHED_IMAGE().getUuid()) == null){
98
        repo.getTermService().save(DerivationEventTypes.UNPUBLISHED_IMAGE());
99
    }
100

    
101
}
102

    
103
    /**
104
     *
105
     */
106

    
107
    private void executeSuppliedCommands() {
108

    
109
        if(commandsExecuted){
110
            // do not run twice
111
            // a second run could take place during initialization of the web context
112
            return;
113
        }
114
        commandsExecuted  = true;
115

    
116
        String wipeoutCmd = System.getProperty(PARAM_NAME_WIPEOUT);
117
        String createCmd = System.getProperty(PARAM_NAME_CREATE);
118

    
119
        // ============ DELETE
120
        if(wipeoutCmd != null && wipeoutCmd.matches("iapt|all")){
121

    
122
            boolean onlyIapt = wipeoutCmd.equals("iapt");
123
            List<UUID> deleteCandidates = new ArrayList<UUID>();
124

    
125
            TransactionStatus tx = repo.startTransaction(true);
126
            List<Registration> allRegs = repo.getRegistrationService().list(null, null, null, null, null);
127
            for(Registration reg : allRegs){
128
                if(onlyIapt){
129
                    try {
130
                        @SuppressWarnings("unchecked")
131
                        Set<String> extensions = reg.getName().getExtensions(getExtensionTypeIAPTRegData());
132
                        deleteCandidates.add(reg.getUuid());
133
                    } catch(NullPointerException e){
134
                        // IGNORE
135
                    }
136
                } else {
137
                    deleteCandidates.add(reg.getUuid());
138
                }
139
            }
140
            repo.commitTransaction(tx);
141
            repo.getRegistrationService().delete(deleteCandidates);
142
        }
143

    
144
        // ============ CREATE
145
        int pageIndex = 0;
146
        if(createCmd != null && createCmd.equals("iapt")){
147

    
148
            DateTimeFormatter dateFormat = org.joda.time.format.DateTimeFormat.forPattern("dd.MM.yy").withPivotYear(1950);
149

    
150
            TransactionStatus tx = repo.startTransaction(false);
151
            while(true) {
152
                Pager<TaxonName> pager = repo.getNameService().page(null, 1000, pageIndex, null, null);
153
                if(pager.getRecords().isEmpty()){
154
                    break;
155
                }
156
                List<Registration> newRegs = new ArrayList<>(pager.getRecords().size());
157
                for(TaxonName name : pager.getRecords()){
158

    
159
                    Set<String> extensionValues = name.getExtensions(getExtensionTypeIAPTRegData());
160

    
161
                    // there is for sure only one
162
                    if(extensionValues.isEmpty()){
163
                        continue;
164
                    }
165
                    String iaptJson = extensionValues.iterator().next();
166
                    try {
167

    
168
                        IAPTRegData iaptData = new ObjectMapper().readValue(iaptJson, IAPTRegData.class);
169

    
170
                        if(iaptData.getRegId() == null){
171
                            continue;
172
                        }
173

    
174
                        DateTime regDate = null;
175
                        if(iaptData.getDate() != null){
176
                            try {
177
                                regDate = dateFormat.parseDateTime(iaptData.getDate());
178
                                regDate.getYear();
179
                            } catch (Exception e) {
180
                                logger.error("Error parsing date: " + iaptData.getDate(), e);
181
                                continue;
182
                            }
183
                        }
184

    
185
                        Registration reg = Registration.NewInstance();
186
                        reg.setStatus(RegistrationStatus.PUBLISHED);
187
                        reg.setIdentifier("http://phycobank/" + iaptData.getRegId());
188
                        reg.setSpecificIdentifier(iaptData.getRegId().toString());
189
                        reg.setInstitution(getInstitution(iaptData.getOffice()));
190
                        reg.setName(name);
191
                        if(name.getTypeDesignations() != null && !name.getTypeDesignations().isEmpty()){
192
                            // do not add the collection directly to avoid "Found shared references to a collection" problem
193
                            HashSet<TypeDesignationBase> typeDesignations = new HashSet<>(name.getTypeDesignations().size());
194
                            typeDesignations.addAll(name.getTypeDesignations());
195
                            reg.setTypeDesignations(typeDesignations);
196
                        }
197
                        reg.setRegistrationDate(regDate);
198
                        logger.debug("IAPT Registraion for " + name.getTitleCache());
199
                        newRegs.add(reg);
200

    
201
                    } catch (JsonParseException e) {
202
                        logger.error("Error parsing IAPTRegData from extension", e);
203
                    } catch (JsonMappingException e) {
204
                        logger.error("Error mapping json from extension to IAPTRegData", e);
205
                    } catch (IOException e) {
206
                        logger.error(e);
207
                    }
208

    
209
                }
210
                repo.getRegistrationService().save(newRegs);
211
                repo.getRegistrationService().getSession().flush();
212
                logger.debug("Registrations saved");
213
                pageIndex++;
214
            }
215
            repo.commitTransaction(tx);
216
        }
217
    }
218

    
219

    
220
    /**
221
     * @param office
222
     * @return
223
     */
224
    private Institution getInstitution(String office) {
225
        Institution institution;
226
        if(instituteMap.containsKey(office)){
227
            institution = instituteMap.get(office);
228
        } else {
229

    
230
            Pager<AgentBase> pager = repo.getAgentService().findByTitle(Institution.class, office, MatchMode.EXACT, null, null, null, null, null);
231
            if(!pager.getRecords().isEmpty()){
232
                institution =  (Institution) pager.getRecords().get(0);
233
            } else {
234
                Institution institute = (Institution) repo.getAgentService().save(Institution.NewNamedInstance(office));
235
                institution = institute;
236
            }
237
            instituteMap.put(office, institution);
238
        }
239
        return institution;
240
    }
241

    
242

    
243
    private ExtensionType getExtensionTypeIAPTRegData() {
244
        if(extensionTypeIAPTRegData == null){
245
            extensionTypeIAPTRegData = (ExtensionType) repo.getTermService().load(UUID.fromString("9be1bfe3-6ba0-4560-af15-86971ab96e09"));
246
        }
247
        return extensionTypeIAPTRegData;
248
    }
249

    
250

    
251

    
252
}
(2-2/2)