View Javadoc

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.log4j.Logger;
20  import org.springframework.stereotype.Component;
21  
22  import eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer;
23  import eu.etaxonomy.cdm.io.berlinModel.in.validation.BerlinModelNameStatusImportValidator;
24  import eu.etaxonomy.cdm.io.common.IImportConfigurator;
25  import eu.etaxonomy.cdm.io.common.IOValidator;
26  import eu.etaxonomy.cdm.io.common.ImportHelper;
27  import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
28  import eu.etaxonomy.cdm.model.agent.Person;
29  import eu.etaxonomy.cdm.model.common.CdmBase;
30  import eu.etaxonomy.cdm.model.common.Marker;
31  import eu.etaxonomy.cdm.model.common.MarkerType;
32  import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;
33  import eu.etaxonomy.cdm.model.name.TaxonNameBase;
34  import eu.etaxonomy.cdm.model.reference.ReferenceBase;
35  import eu.etaxonomy.cdm.strategy.exceptions.UnknownCdmTypeException;
36  
37  /**
38   * @author a.mueller
39   * @created 20.03.2008
40   * @version 1.0
41   */
42  @Component
43  public class BerlinModelNameStatusImport extends BerlinModelImportBase {
44  	private static final Logger logger = Logger.getLogger(BerlinModelNameStatusImport.class);
45  
46  	private int modCount = 5000;
47  	private static final String pluralString = "nomenclatural status";
48  	private static final String dbTableName = "NomStatusRel";
49  
50  	
51  	public BerlinModelNameStatusImport(){
52  		super();
53  	}
54  
55  
56  	
57  	/* (non-Javadoc)
58  	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getIdQuery()
59  	 */
60  	@Override
61  	protected String getIdQuery() {
62  		return " SELECT RIdentifier FROM " + getTableName();
63  	}
64  
65  
66  
67  	/* (non-Javadoc)
68  	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)
69  	 */
70  	@Override
71  	protected String getRecordQuery(BerlinModelImportConfigurator config) {
72  		String strQuery = 
73  			" SELECT NomStatusRel.*, NomStatus.NomStatus, RefDetail.Details " + 
74  			" FROM NomStatusRel INNER JOIN " +
75                	" NomStatus ON NomStatusRel.NomStatusFk = NomStatus.NomStatusId " +
76                	" LEFT OUTER JOIN RefDetail ON NomStatusRel.NomStatusRefDetailFk = RefDetail.RefDetailId AND " + 
77                	" NomStatusRel.NomStatusRefFk = RefDetail.RefFk " +
78              " WHERE (RIdentifier IN (" + ID_LIST_TOKEN + "))";
79  		return strQuery;
80  	}
81  
82  	/* (non-Javadoc)
83  	 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)
84  	 */
85  	public boolean doPartition(ResultSetPartitioner partitioner,BerlinModelImportState state) {
86  		boolean success = true;	
87  		String dbAttrName;
88  		String cdmAttrName;
89  		
90  		Set<TaxonNameBase> namesToSave = new HashSet<TaxonNameBase>();
91  		BerlinModelImportConfigurator config = state.getConfig();
92  		Map<String, TaxonNameBase> nameMap = (Map<String, TaxonNameBase>) partitioner.getObjectMap(BerlinModelTaxonNameImport.NAMESPACE);
93  
94  		ResultSet rs = partitioner.getResultSet();
95  		try {
96  			//get data from database
97  			
98  			int i = 0;
99  			//for each reference
100 			while (rs.next()){
101 				
102 				if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("NomStatus handled: " + (i-1));}
103 				
104 				int nomStatusRelId;
105 				try {
106 					nomStatusRelId = rs.getInt("RIdentifier");
107 				} catch (Exception e) {  //RIdentifier does not exist in BM database
108 					nomStatusRelId = -1;
109 				}
110 				int nomStatusFk = rs.getInt("NomStatusFk");
111 				int nameId = rs.getInt("nameFk");
112 				
113 				boolean doubtful = rs.getBoolean("DoubtfulFlag");
114 				String nomStatusLabel = rs.getString("NomStatus");
115 				
116 				TaxonNameBase taxonName = nameMap.get(String.valueOf(nameId));
117 				//TODO doubtful
118 				
119 				if (taxonName != null ){
120 					try{
121 						NomenclaturalStatus nomStatus = BerlinModelTransformer.nomStatusFkToNomStatus(nomStatusFk, nomStatusLabel);
122 						if (nomStatus.getType().getId() == 0){
123 							getTermService().save(nomStatus.getType());
124 						}
125 						
126 						//reference
127 						makeReference(config, nomStatus, nameId, rs, partitioner);
128 						
129 						//Details
130 						dbAttrName = "details";
131 						cdmAttrName = "citationMicroReference";
132 						success &= ImportHelper.addStringValue(rs, nomStatus, dbAttrName, cdmAttrName);
133 						
134 						//doubtful
135 						if (doubtful){
136 							nomStatus.addMarker(Marker.NewInstance(MarkerType.IS_DOUBTFUL(), true));
137 						}
138 						taxonName.addStatus(nomStatus);
139 						namesToSave.add(taxonName);
140 					}catch (UnknownCdmTypeException e) {
141 						logger.warn("NomStatusType " + nomStatusFk + " not yet implemented");
142 						success = false;
143 					}
144 					//TODO
145 					//ID
146 					//etc.
147 				}else{
148 					logger.warn("TaxonName for NomStatus (" + nomStatusRelId + ") does not exist in store");
149 					success = false;
150 				}
151 			}
152 			logger.info("TaxonNames to save: " + namesToSave.size());
153 			getNameService().save(namesToSave);
154 			
155 			return success;
156 		} catch (SQLException e) {
157 			logger.error("SQLException:" +  e);
158 			return false;
159 		}
160 
161 	}
162 
163 	/* (non-Javadoc)
164 	 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)
165 	 */
166 	public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {
167 		String nameSpace;
168 		Class cdmClass;
169 		Set<String> idSet;
170 		Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
171 	
172 		try{
173 			Set<String> nameIdSet = new HashSet<String>();
174 			Set<String> referenceIdSet = new HashSet<String>();
175 			Set<String> refDetailIdSet = new HashSet<String>();
176 			while (rs.next()){
177 				handleForeignKey(rs, nameIdSet, "nameFk");
178 				handleForeignKey(rs, referenceIdSet, "NomStatusRefFk");
179 				handleForeignKey(rs, refDetailIdSet, "NomStatusRefDetailFk");
180 			}
181 			
182 			//name map
183 			nameSpace = BerlinModelTaxonNameImport.NAMESPACE;
184 			cdmClass = TaxonNameBase.class;
185 			idSet = nameIdSet;
186 			Map<String, Person> nameMap = (Map<String, Person>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
187 			result.put(nameSpace, nameMap);
188 
189 			//nom reference map
190 			nameSpace = BerlinModelReferenceImport.NOM_REFERENCE_NAMESPACE;
191 			cdmClass = ReferenceBase.class;
192 			idSet = referenceIdSet;
193 			Map<String, ReferenceBase> nomReferenceMap = (Map<String, ReferenceBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
194 			result.put(nameSpace, nomReferenceMap);
195 
196 			//biblio reference map
197 			nameSpace = BerlinModelReferenceImport.BIBLIO_REFERENCE_NAMESPACE;
198 			cdmClass = ReferenceBase.class;
199 			idSet = referenceIdSet;
200 			Map<String, ReferenceBase> biblioReferenceMap = (Map<String, ReferenceBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
201 			result.put(nameSpace, biblioReferenceMap);
202 			
203 			//nom refDetail map
204 			nameSpace = BerlinModelRefDetailImport.NOM_REFDETAIL_NAMESPACE;
205 			cdmClass = ReferenceBase.class;
206 			idSet = refDetailIdSet;
207 			Map<String, ReferenceBase> nomRefDetailMap= (Map<String, ReferenceBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
208 			result.put(nameSpace, nomRefDetailMap);
209 			
210 			//biblio refDetail map
211 			nameSpace = BerlinModelRefDetailImport.BIBLIO_REFDETAIL_NAMESPACE;
212 			cdmClass = ReferenceBase.class;
213 			idSet = refDetailIdSet;
214 			Map<String, ReferenceBase> biblioRefDetailMap= (Map<String, ReferenceBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
215 			result.put(nameSpace, biblioRefDetailMap);
216 
217 
218 		} catch (SQLException e) {
219 			throw new RuntimeException(e);
220 		}
221 		return result;
222 	}
223 	
224 	private boolean makeReference(IImportConfigurator config, NomenclaturalStatus nomStatus, 
225 			int nameId, ResultSet rs, ResultSetPartitioner partitioner) 
226 			throws SQLException{
227 		
228 		Map<String, ReferenceBase> biblioRefMap = partitioner.getObjectMap(BerlinModelReferenceImport.BIBLIO_REFERENCE_NAMESPACE);
229 		Map<String, ReferenceBase> nomRefMap = partitioner.getObjectMap(BerlinModelReferenceImport.NOM_REFERENCE_NAMESPACE);
230 		Map<String, ReferenceBase> biblioDetailMap = partitioner.getObjectMap(BerlinModelRefDetailImport.BIBLIO_REFDETAIL_NAMESPACE);
231 		Map<String, ReferenceBase> nomRefDetailMap = partitioner.getObjectMap(BerlinModelRefDetailImport.NOM_REFDETAIL_NAMESPACE);
232 		
233 		Object nomRefFkObj = rs.getObject("NomStatusRefFk");
234 		Object nomRefDetailFkObj = rs.getObject("NomStatusRefDetailFk");
235 		//TODO
236 //		boolean refDetailPrelim = rs.getBoolean("RefDetailPrelim");
237 		
238 		boolean success = true;
239 		//nomenclatural Reference
240 		if (biblioRefMap != null){
241 			if (nomRefFkObj != null){
242 				String nomRefFk = String.valueOf(nomRefFkObj);
243 				String nomRefDetailFk = String.valueOf(nomRefDetailFkObj);
244 				ReferenceBase ref = getReferenceFromMaps(biblioRefMap,
245 						nomRefMap, biblioDetailMap, nomRefDetailMap,
246 						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 reference was not set!!");}
253 				}else{
254 					nomStatus.setCitation(ref);
255 				}
256 			}
257 		}
258 		return success;
259 	}
260 
261 
262 
263 	
264 	/* (non-Javadoc)
265 	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
266 	 */
267 	@Override
268 	protected boolean doCheck(BerlinModelImportState state){
269 		IOValidator<BerlinModelImportState> validator = new BerlinModelNameStatusImportValidator();
270 		return validator.validate(state);
271 	}
272 	
273 	/* (non-Javadoc)
274 	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getTableName()
275 	 */
276 	@Override
277 	protected String getTableName() {
278 		return dbTableName;
279 	}
280 	
281 	/* (non-Javadoc)
282 	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getPluralString()
283 	 */
284 	@Override
285 	public String getPluralString() {
286 		return pluralString;
287 	}
288 
289 	
290 	/* (non-Javadoc)
291 	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
292 	 */
293 	protected boolean isIgnore(BerlinModelImportState state){
294 		return ! state.getConfig().isDoNameStatus();
295 	}
296 
297 
298 }