Project

General

Profile

Download (10.6 KB) Statistics
| Branch: | Revision:
1
/**
2
 * Copyright (C) 2007 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

    
10
package eu.etaxonomy.cdm.io.redlist.gefaesspflanzen;
11

    
12
import java.sql.ResultSet;
13
import java.sql.SQLException;
14
import java.util.HashMap;
15
import java.util.HashSet;
16
import java.util.Map;
17
import java.util.Set;
18

    
19
import org.apache.log4j.Logger;
20
import org.springframework.stereotype.Component;
21

    
22
import eu.etaxonomy.cdm.common.CdmUtils;
23
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
24
import eu.etaxonomy.cdm.io.common.DbImportBase;
25
import eu.etaxonomy.cdm.io.common.IPartitionedIO;
26
import eu.etaxonomy.cdm.io.common.ImportHelper;
27
import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
28
import eu.etaxonomy.cdm.io.common.mapping.UndefinedTransformerMethodException;
29
import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
30
import eu.etaxonomy.cdm.model.common.CdmBase;
31
import eu.etaxonomy.cdm.model.name.BotanicalName;
32
import eu.etaxonomy.cdm.model.name.Rank;
33
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
34

    
35
/**
36
 *
37
 * @author pplitzner
38
 * @date Mar 1, 2016
39
 *
40
 */
41

    
42
@Component
43
@SuppressWarnings("serial")
44
public class RedListGefaesspflanzenImportNames extends DbImportBase<RedListGefaesspflanzenImportState, RedListGefaesspflanzenImportConfigurator> {
45
    /**
46
     *
47
     */
48
    private static final String EX = " ex ";
49

    
50
    private static final Logger logger = Logger.getLogger(RedListGefaesspflanzenImportNames.class);
51

    
52
    private static final String tableName = "Rote Liste Gefäßpflanzen";
53

    
54
    private static final String pluralString = "names";
55

    
56
    private static final String NAME_NAMESPACE = "name";
57

    
58
    public RedListGefaesspflanzenImportNames() {
59
        super(tableName, pluralString);
60
    }
61

    
62
    @Override
63
    protected String getIdQuery(RedListGefaesspflanzenImportState state) {
64
        return "SELECT NAMNR "
65
                + "FROM V_TAXATLAS_D20_EXPORT t "
66
                + " ORDER BY NAMNR";
67
    }
68

    
69
    @Override
70
    protected String getRecordQuery(RedListGefaesspflanzenImportConfigurator config) {
71
        String result = " SELECT * "
72
                + " FROM V_TAXATLAS_D20_EXPORT t "
73
                + " WHERE t.NAMNR IN (@IDSET)";
74
        result = result.replace("@IDSET", IPartitionedIO.ID_LIST_TOKEN);
75
        return result;
76
    }
77

    
78
    @Override
79
    protected void doInvoke(RedListGefaesspflanzenImportState state) {
80
        super.doInvoke(state);
81
    }
82

    
83

    
84
    @Override
85
    public boolean doPartition(ResultSetPartitioner partitioner, RedListGefaesspflanzenImportState state) {
86
        ResultSet rs = partitioner.getResultSet();
87
        Set<TaxonNameBase> namesToSave = new HashSet<TaxonNameBase>();
88
        try {
89
            while (rs.next()){
90
                makeSingleName(state, rs, namesToSave);
91

    
92
            }
93
        } catch (SQLException e) {
94
            e.printStackTrace();
95
        }
96

    
97
        getNameService().saveOrUpdate(namesToSave);
98
        return true;
99
    }
100

    
101
    private void makeSingleName(RedListGefaesspflanzenImportState state, ResultSet rs, Set<TaxonNameBase> namesToSave)
102
            throws SQLException {
103
        long id = rs.getLong("NAMNR");
104
        String taxNameString = rs.getString("TAXNAME");
105
        String rangString = rs.getString("RANG");
106
        String ep1String = rs.getString("EPI1");
107
        String ep2String = rs.getString("EPI2");
108
        String ep3String = rs.getString("EPI3");
109
        String nomZusatzString = rs.getString("NOM_ZUSATZ");
110
        String zusatzString = rs.getString("ZUSATZ");
111
        String authorKombString = rs.getString("AUTOR_KOMB");
112
        String authorBasiString = rs.getString("AUTOR_BASI");
113

    
114
        if(CdmUtils.isBlank(taxNameString) && CdmUtils.isBlank(ep1String)){
115
            logger.error("NAMNR: "+id+" No name found!");
116
        }
117

    
118
        Rank rank = makeRank(state, rangString);
119
        if(rank==null){
120
            logger.error("NAMNR: "+id+" Rank could not be resolved.");
121
            return;
122
        }
123
        BotanicalName name = BotanicalName.NewInstance(rank);
124

    
125
        //ep1 should always be present
126
        if(CdmUtils.isBlank(ep1String)){
127
            logger.error("NAMNR: "+id+" EPI1 is empty!");
128
        }
129
        name.setGenusOrUninomial(ep1String);
130
//        if(CdmUtils.isBlank(ep2String)){
131
//            name.setSpecificEpithet(ep2String);
132
//        }
133
//        if(CdmUtils.isBlank(ep3String)){
134
//        }
135
        if(rank.isSpecies()){
136
            if(!CdmUtils.isBlank(ep2String)){
137
                name.setSpecificEpithet(ep2String);
138
            }
139
        }
140
        else if(rank.isLower(Rank.SPECIES())){
141
            if(!CdmUtils.isBlank(ep3String)){
142
                name.setSpecificEpithet(ep3String);
143
            }
144
        }
145

    
146
        //--- AUTHORS ---
147
        //combination author
148
        if(authorKombString.contains(EX)){
149
            //TODO: what happens with multiple ex authors??
150
            String[] kombSplit = authorKombString.split(EX);
151
            for (int i = 0; i < kombSplit.length; i++) {
152
                if(i==0){
153
                    //first author is ex author
154
                    TeamOrPersonBase authorKomb = HibernateProxyHelper.deproxy(getAgentService().load(state.getAuthorMap().get(kombSplit[i])), TeamOrPersonBase.class);
155
                    name.setExCombinationAuthorship(authorKomb);
156
                }
157
                else{
158
                    TeamOrPersonBase authorKomb = HibernateProxyHelper.deproxy(getAgentService().load(state.getAuthorMap().get(kombSplit[i])), TeamOrPersonBase.class);
159
                    name.setCombinationAuthorship(authorKomb);
160
                }
161
            }
162
        }
163
        else if(!CdmUtils.isBlank(authorKombString)){
164
            TeamOrPersonBase authorKomb = HibernateProxyHelper.deproxy(getAgentService().load(state.getAuthorMap().get(authorKombString)), TeamOrPersonBase.class);
165
            name.setCombinationAuthorship(authorKomb);
166
        }
167
        //basionym author
168
        if(authorBasiString.contains(EX)){
169
            String[] basiSplit = authorBasiString.split(EX);
170
            for (int i = 0; i < basiSplit.length; i++) {
171
                if(i==0){
172
                    TeamOrPersonBase authorBasi = HibernateProxyHelper.deproxy(getAgentService().load(state.getAuthorMap().get(basiSplit[i])), TeamOrPersonBase.class);
173
                    name.setExBasionymAuthorship(authorBasi);
174
                }
175
                else{
176
                    TeamOrPersonBase authorBasi = HibernateProxyHelper.deproxy(getAgentService().load(state.getAuthorMap().get(basiSplit[i])), TeamOrPersonBase.class);
177
                    name.setBasionymAuthorship(authorBasi);
178
                }
179
            }
180
        }
181
        else if(!CdmUtils.isBlank(authorBasiString)){
182
            TeamOrPersonBase authorBasi = HibernateProxyHelper.deproxy(getAgentService().load(state.getAuthorMap().get(authorBasiString)), TeamOrPersonBase.class);
183
            name.setBasionymAuthorship(authorBasi);
184
        }
185

    
186
        //check authorship consistency
187
        String authorString = rs.getString("AUTOR");
188
        String authorshipCache = name.getAuthorshipCache();
189

    
190
        if(!CdmUtils.isBlank(zusatzString)){
191
            authorString = authorString.replace(", "+zusatzString, "");
192
        }
193
        if(CdmUtils.isBlank(authorKombString) && !CdmUtils.isBlank(authorBasiString)){
194
            authorString = "("+authorString+")";
195
        }
196
        if(!authorString.equals(authorshipCache)){
197
            logger.warn("NAMNR: "+id+" Authorship inconsistent! name.authorhshipCache <-> Column AUTOR: "+authorshipCache+" <-> "+authorString);
198
        }
199

    
200
        //id
201
        ImportHelper.setOriginalSource(name, state.getTransactionalSourceReference(), id, NAME_NAMESPACE);
202

    
203
        namesToSave.add(name);
204
    }
205

    
206
    private Rank makeRank(RedListGefaesspflanzenImportState state, String rankStr) {
207
        Rank rank = null;
208
        try {
209
            rank = state.getTransformer().getRankByKey(rankStr);
210
        } catch (UndefinedTransformerMethodException e) {
211
            e.printStackTrace();
212
        }
213
        if(rank==null){
214
            logger.error(rankStr+" could not be associated to a known rank.");
215
        }
216
        return rank;
217
    }
218

    
219

    
220

    
221
    @Override
222
    public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs,
223
            RedListGefaesspflanzenImportState state) {
224
        Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<>();
225
//        Map<Long, AgentBase<?>> authorKombMap = new HashMap<>();
226
//        Map<Long, AgentBase<?>> authorBasiMap = new HashMap<>();
227
//
228
//        //load authors
229
//        for(Entry<Long, UUID> entry:state.getAuthorKombMap().entrySet()){
230
//            authorKombMap.put(entry.getKey(), getAgentService().load(entry.getValue()));
231
//        }
232
//        for(Entry<Long, UUID> entry:state.getAuthorBasiMap().entrySet()){
233
//            authorBasiMap.put(entry.getKey(), getAgentService().load(entry.getValue()));
234
//        }
235
//        try {
236
//            while (rs.next()){
237
//                long id = rs.getLong("NAMNR");
238
//            }
239
//        } catch (SQLException e) {
240
//            e.printStackTrace();
241
//        }
242
//
243
//        //Authors
244
//        Set<UUID> uuidSet = new HashSet<>();
245
//        for (String authorStr : authorKombSet){
246
//            UUID uuid = state.getAuthorUuid(authorStr);
247
//            uuidSet.add(uuid);
248
//        }
249
//        List<TeamOrPersonBase<?>> authors = (List)getAgentService().find(uuidSet);
250
//        Map<UUID, TeamOrPersonBase<?>> authorUuidMap = new HashMap<>();
251
//        for (TeamOrPersonBase<?> author : authors){
252
//            authorUuidMap.put(author.getUuid(), author);
253
//        }
254
//
255
//        for (String authorStr : authorKombSet){
256
//            UUID uuid = state.getAuthorUuid(authorStr);
257
//            TeamOrPersonBase<?> author = authorUuidMap.get(uuid);
258
//            authorMap.put(authorStr, author);
259
//        }
260
//        result.put(AUTHOR_NAMESPACE, authorMap);
261
//
262
//        //reference map
263
//        String nameSpace = REFERENCE_NAMESPACE;
264
//        Class<?> cdmClass = Reference.class;
265
//        Set<String> idSet = referenceIdSet;
266
//        Map<String, Reference<?>> referenceMap = (Map<String, Reference<?>>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
267
//        result.put(nameSpace, referenceMap);
268
//
269
//        //secundum
270
//        UUID secUuid = state.getConfig().getSecUuid();
271
//        Reference<?> secRef = getReferenceService().find(secUuid);
272
//        referenceMap.put(secUuid.toString(), secRef);
273

    
274
        return result;
275
    }
276

    
277
    @Override
278
    protected boolean doCheck(RedListGefaesspflanzenImportState state) {
279
        return false;
280
    }
281

    
282
    @Override
283
    protected boolean isIgnore(RedListGefaesspflanzenImportState state) {
284
        return false;
285
    }
286

    
287
}
(3-3/6)