Project

General

Profile

Download (9.73 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.berlinModel.in;
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.commons.lang.StringUtils;
20
import org.apache.log4j.Logger;
21
import org.springframework.stereotype.Component;
22

    
23
import eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer;
24
import eu.etaxonomy.cdm.io.berlinModel.in.validation.BerlinModelNameStatusImportValidator;
25
import eu.etaxonomy.cdm.io.common.IImportConfigurator;
26
import eu.etaxonomy.cdm.io.common.IOValidator;
27
import eu.etaxonomy.cdm.io.common.ImportHelper;
28
import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
29
import eu.etaxonomy.cdm.model.agent.Person;
30
import eu.etaxonomy.cdm.model.common.CdmBase;
31
import eu.etaxonomy.cdm.model.common.Marker;
32
import eu.etaxonomy.cdm.model.common.MarkerType;
33
import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;
34
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
35
import eu.etaxonomy.cdm.model.reference.Reference;
36
import eu.etaxonomy.cdm.strategy.exceptions.UnknownCdmTypeException;
37

    
38
/**
39
 * @author a.mueller
40
 * @created 20.03.2008
41
 * @version 1.0
42
 */
43
@Component
44
public class BerlinModelNameStatusImport extends BerlinModelImportBase {
45
	private static final Logger logger = Logger.getLogger(BerlinModelNameStatusImport.class);
46

    
47
	private int modCount = 5000;
48
	private static final String pluralString = "nomenclatural status";
49
	private static final String dbTableName = "NomStatusRel";
50

    
51

    
52
	public BerlinModelNameStatusImport(){
53
		super(dbTableName, pluralString);
54
	}
55

    
56

    
57

    
58
	/* (non-Javadoc)
59
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getIdQuery()
60
	 */
61
	@Override
62
	protected String getIdQuery(BerlinModelImportState state) {
63
		String result =  " SELECT RIdentifier FROM " + getTableName();
64

    
65
		if (StringUtils.isNotEmpty(state.getConfig().getNameIdTable())){
66
			result += " WHERE nameFk IN (SELECT NameId FROM " + state.getConfig().getNameIdTable() + ")";
67
		}
68
		return result;
69
	}
70

    
71

    
72

    
73
	/* (non-Javadoc)
74
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)
75
	 */
76
	@Override
77
	protected String getRecordQuery(BerlinModelImportConfigurator config) {
78
		String strQuery =
79
			" SELECT NomStatusRel.*, NomStatus.NomStatus, RefDetail.Details " +
80
			" FROM NomStatusRel INNER JOIN " +
81
              	" NomStatus ON NomStatusRel.NomStatusFk = NomStatus.NomStatusId " +
82
              	" LEFT OUTER JOIN RefDetail ON NomStatusRel.NomStatusRefDetailFk = RefDetail.RefDetailId AND " +
83
              	" NomStatusRel.NomStatusRefFk = RefDetail.RefFk " +
84
            " WHERE (RIdentifier IN (" + ID_LIST_TOKEN + "))";
85
		return strQuery;
86
	}
87

    
88
	/* (non-Javadoc)
89
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)
90
	 */
91
	@Override
92
    public boolean doPartition(ResultSetPartitioner partitioner,BerlinModelImportState state) {
93
		boolean success = true;
94
		String dbAttrName;
95
		String cdmAttrName;
96

    
97
		Set<TaxonNameBase> namesToSave = new HashSet<TaxonNameBase>();
98
		BerlinModelImportConfigurator config = state.getConfig();
99
		Map<String, TaxonNameBase> nameMap = partitioner.getObjectMap(BerlinModelTaxonNameImport.NAMESPACE);
100

    
101
		ResultSet rs = partitioner.getResultSet();
102
		try {
103
			//get data from database
104

    
105
			int i = 0;
106
			//for each reference
107
			while (rs.next()){
108

    
109
				if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("NomStatus handled: " + (i-1));}
110

    
111
				int nomStatusRelId;
112
				try {
113
					nomStatusRelId = rs.getInt("RIdentifier");
114
				} catch (Exception e) {  //RIdentifier does not exist in BM database
115
					nomStatusRelId = -1;
116
				}
117
				int nomStatusFk = rs.getInt("NomStatusFk");
118
				int nameId = rs.getInt("nameFk");
119

    
120
				boolean doubtful = rs.getBoolean("DoubtfulFlag");
121
				String nomStatusLabel = rs.getString("NomStatus");
122

    
123
				TaxonNameBase taxonName = nameMap.get(String.valueOf(nameId));
124
				//TODO doubtful
125

    
126
				if (taxonName != null ){
127
					try{
128
						NomenclaturalStatus nomStatus = BerlinModelTransformer.nomStatusFkToNomStatus(nomStatusFk, nomStatusLabel);
129
						if (nomStatus == null){
130
							String message = "Nomenclatural status could not be defined for %s ; %s";
131
							message = String.format(message, nomStatusFk, nomStatusLabel);
132
							logger.warn(message);
133
							success = false;
134
							continue;
135
						}else{
136
							if (nomStatus.getType() == null){
137
								String message = "Nomenclatural status type could not be defined for %s ; %s";
138
								message = String.format(message, nomStatusFk, nomStatusLabel);
139
								logger.warn(message);
140
								success = false;
141
								continue;
142
							}else if(nomStatus.getType().getId() == 0){
143
								getTermService().save(nomStatus.getType());
144
							}
145
						}
146

    
147
						//reference
148
						makeReference(config, nomStatus, nameId, rs, partitioner);
149

    
150
						//Details
151
						dbAttrName = "details";
152
						cdmAttrName = "citationMicroReference";
153
						success &= ImportHelper.addStringValue(rs, nomStatus, dbAttrName, cdmAttrName, true);
154

    
155
						//doubtful
156
						if (doubtful){
157
							nomStatus.addMarker(Marker.NewInstance(MarkerType.IS_DOUBTFUL(), true));
158
						}
159
						taxonName.addStatus(nomStatus);
160
						namesToSave.add(taxonName);
161
					}catch (UnknownCdmTypeException e) {
162
						logger.warn("NomStatusType " + nomStatusFk + " not yet implemented");
163
						success = false;
164
					}
165
					//TODO
166
					//ID
167
					//etc.
168
				}else{
169
					logger.warn("TaxonName for NomStatusRel (" + nomStatusRelId + ") does not exist in store");
170
					success = false;
171
				}
172
			}
173
			logger.info("TaxonNames to save: " + namesToSave.size());
174
			getNameService().save(namesToSave);
175

    
176
			return success;
177
		} catch (SQLException e) {
178
			logger.error("SQLException:" +  e);
179
			return false;
180
		}
181

    
182
	}
183

    
184
	@Override
185
	public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs, BerlinModelImportState state) {
186
		String nameSpace;
187
		Class<?> cdmClass;
188
		Set<String> idSet;
189
		Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
190

    
191
		try{
192
			Set<String> nameIdSet = new HashSet<String>();
193
			Set<String> referenceIdSet = new HashSet<String>();
194
			Set<String> refDetailIdSet = new HashSet<String>();
195
			while (rs.next()){
196
				handleForeignKey(rs, nameIdSet, "nameFk");
197
				handleForeignKey(rs, referenceIdSet, "NomStatusRefFk");
198
				handleForeignKey(rs, refDetailIdSet, "NomStatusRefDetailFk");
199
			}
200

    
201
			//name map
202
			nameSpace = BerlinModelTaxonNameImport.NAMESPACE;
203
			cdmClass = TaxonNameBase.class;
204
			idSet = nameIdSet;
205
			Map<String, Person> nameMap = (Map<String, Person>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
206
			result.put(nameSpace, nameMap);
207

    
208
			//reference map
209
			nameSpace = BerlinModelReferenceImport.REFERENCE_NAMESPACE;
210
			cdmClass = Reference.class;
211
			idSet = referenceIdSet;
212
			Map<String, Reference> referenceMap = (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
213
			result.put(nameSpace, referenceMap);
214

    
215
			//refDetail map
216
			nameSpace = BerlinModelRefDetailImport.REFDETAIL_NAMESPACE;
217
			cdmClass = Reference.class;
218
			idSet = refDetailIdSet;
219
			Map<String, Reference> refDetailMap= (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
220
			result.put(nameSpace, refDetailMap);
221

    
222
		} catch (SQLException e) {
223
			throw new RuntimeException(e);
224
		}
225
		return result;
226
	}
227

    
228
	private boolean makeReference(IImportConfigurator config, NomenclaturalStatus nomStatus,
229
			int nameId, ResultSet rs, ResultSetPartitioner partitioner)
230
			throws SQLException{
231

    
232
		Map<String, Reference> refMap = partitioner.getObjectMap(BerlinModelReferenceImport.REFERENCE_NAMESPACE);
233
		Map<String, Reference> refDetailMap = partitioner.getObjectMap(BerlinModelRefDetailImport.REFDETAIL_NAMESPACE);
234

    
235
		Object nomRefFkObj = rs.getObject("NomStatusRefFk");
236
		Object nomRefDetailFkObj = rs.getObject("NomStatusRefDetailFk");
237
		//TODO
238
//		boolean refDetailPrelim = rs.getBoolean("RefDetailPrelim");
239

    
240
		boolean success = true;
241
		//nomenclatural Reference
242
		if (refMap != null){
243
			if (nomRefFkObj != null){
244
				String nomRefFk = String.valueOf(nomRefFkObj);
245
				String nomRefDetailFk = String.valueOf(nomRefDetailFkObj);
246
				Reference ref = getReferenceFromMaps(refDetailMap, refMap, nomRefDetailFk, nomRefFk);
247

    
248
				//setRef
249
				if (ref == null ){
250
					//TODO
251
					if (! config.isIgnoreNull()){logger.warn("Reference (refFk = " + nomRefFk + ") for NomStatus of TaxonName (nameId = " + nameId + ")"+
252
						" was not found in reference store. Nomenclatural status reference was not set!!");}
253
				}else{
254
					nomStatus.setCitation(ref);
255
				}
256
			}
257
		}
258
		return success;
259
	}
260

    
261
	/* (non-Javadoc)
262
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
263
	 */
264
	@Override
265
	protected boolean doCheck(BerlinModelImportState state){
266
		IOValidator<BerlinModelImportState> validator = new BerlinModelNameStatusImportValidator();
267
		return validator.validate(state);
268
	}
269

    
270

    
271
	/* (non-Javadoc)
272
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
273
	 */
274
	@Override
275
    protected boolean isIgnore(BerlinModelImportState state){
276
		return ! state.getConfig().isDoNameStatus();
277
	}
278

    
279

    
280
}
(9-9/21)