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.BerlinModelTypesImportValidator;
24  import eu.etaxonomy.cdm.io.common.IOValidator;
25  import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
26  import eu.etaxonomy.cdm.io.common.Source;
27  import eu.etaxonomy.cdm.model.agent.Person;
28  import eu.etaxonomy.cdm.model.common.Annotation;
29  import eu.etaxonomy.cdm.model.common.CdmBase;
30  import eu.etaxonomy.cdm.model.common.Language;
31  import eu.etaxonomy.cdm.model.media.ImageFile;
32  import eu.etaxonomy.cdm.model.media.Media;
33  import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
34  import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus;
35  import eu.etaxonomy.cdm.model.name.TaxonNameBase;
36  import eu.etaxonomy.cdm.model.occurrence.Specimen;
37  import eu.etaxonomy.cdm.model.reference.ReferenceBase;
38  import eu.etaxonomy.cdm.strategy.exceptions.UnknownCdmTypeException;
39  
40  /**
41   * @author a.mueller
42   * @created 20.03.2008
43   * @version 1.0
44   */
45  @Component
46  public class BerlinModelTypesImport extends BerlinModelImportBase /*implements IIO<BerlinModelImportConfigurator>*/ {
47  	private static final Logger logger = Logger.getLogger(BerlinModelTypesImport.class);
48  
49  	private static int modCount = 10000;
50  	private static final String pluralString = "types";
51  	private static final String dbTableName = "TypeDesignation";
52  
53  	
54  	public BerlinModelTypesImport(){
55  		super();
56  	}
57  
58  
59  	/* (non-Javadoc)
60  	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)
61  	 */
62  	@Override
63  	protected String getRecordQuery(BerlinModelImportConfigurator config) {
64  		String strRecordQuery = 
65  			" SELECT TypeDesignation.*, TypeStatus.Status " + 
66  			" FROM TypeDesignation LEFT OUTER JOIN " +
67  			" TypeStatus ON TypeDesignation.TypeStatusFk = TypeStatus.TypeStatusId " + 
68  			" WHERE (TypeDesignationId IN ("+ ID_LIST_TOKEN + ") )";
69  		return strRecordQuery;
70  	}
71  
72  	/* (non-Javadoc)
73  	 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)
74  	 */
75  	public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState state) {
76  		boolean result = true;
77  		Set<TaxonNameBase> namesToSave = new HashSet<TaxonNameBase>();
78  		Map<Integer, Specimen> typeMap = new HashMap<Integer, Specimen>();
79  		
80  		Map<String, TaxonNameBase> nameMap = (Map<String, TaxonNameBase>) partitioner.getObjectMap(BerlinModelTaxonNameImport.NAMESPACE);
81  		Map<String, ReferenceBase> biblioRefMap = partitioner.getObjectMap(BerlinModelReferenceImport.BIBLIO_REFERENCE_NAMESPACE);
82  		Map<String, ReferenceBase> nomRefMap = partitioner.getObjectMap(BerlinModelReferenceImport.NOM_REFERENCE_NAMESPACE);
83  
84  		BerlinModelImportConfigurator config = state.getConfig();
85  		Source source = config.getSource();
86  		
87  		ResultSet rs = partitioner.getResultSet();
88  
89  		try {
90  
91  			int i = 0;
92  			//for each reference
93  			while (rs.next()){
94  				
95  				if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("Types handled: " + (i-1));}
96  				
97  				int typeDesignationId = rs.getInt("typeDesignationId");
98  				int nameId = rs.getInt("nameFk");
99  				int typeStatusFk = rs.getInt("typeStatusFk");
100 				Object refFkObj = rs.getObject("refFk");
101 				String refDetail = rs.getString("refDetail");
102 				String status = rs.getString("Status");
103 				String typePhrase = rs.getString("typePhrase");
104 				String notes = rs.getString("notes");
105 				
106 				//TODO 
107 				boolean isNotDesignated = false;
108 				
109 				
110 				//TODO
111 				//TypeCache leer
112 				//RejectedFlag false
113 				//PublishFlag xxx
114 				
115 				TaxonNameBase<?,?> taxonNameBase = nameMap.get(String.valueOf(nameId));
116 				
117 				if (taxonNameBase != null){
118 					try{
119 						SpecimenTypeDesignationStatus typeDesignationStatus = BerlinModelTransformer.typeStatusId2TypeStatus(typeStatusFk);
120 						ReferenceBase<?> citation = null;
121 						if (refFkObj != null){
122 							String relRefFk = String.valueOf(refFkObj);
123 							//get nomRef
124 							citation = getReferenceOnlyFromMaps(biblioRefMap, nomRefMap, relRefFk);
125 							}
126 						
127 						Specimen specimen = Specimen.NewInstance();
128 						specimen.addDefinition(typePhrase, Language.DEFAULT());
129 						if (typePhrase.length()> 255){
130 							typePhrase = typePhrase.substring(0, 255);
131 						}
132 						specimen.setTitleCache(typePhrase, true);
133 						boolean addToAllNames = true;
134 						String originalNameString = null;
135 						SpecimenTypeDesignation type = taxonNameBase.addSpecimenTypeDesignation(specimen, typeDesignationStatus, citation, refDetail, originalNameString, isNotDesignated, addToAllNames);
136 						this.doNotes(type, notes);
137 						
138 						typeMap.put(typeDesignationId, specimen);
139 						namesToSave.add(taxonNameBase);
140 
141 					}catch (UnknownCdmTypeException e) {
142 						logger.warn("TypeStatus '" + status + "' not yet implemented");
143 						result = false;
144 					}
145 				}else{
146 					//TODO
147 					logger.warn("TaxonName for TypeDesignation " + typeDesignationId + " does not exist in store");
148 					result = false;
149 				}
150 				//put
151 			}
152 			
153 			result &= makeFigures(typeMap, source);
154 			logger.info("Names to save: " + namesToSave.size());
155 			getNameService().save(namesToSave);	
156 			return result;
157 		} catch (SQLException e) {
158 			logger.error("SQLException:" +  e);
159 			return false;
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 			while (rs.next()){
176 				handleForeignKey(rs, nameIdSet, "NameFk");
177 				handleForeignKey(rs, referenceIdSet, "RefFk");
178 	}
179 	
180 			//name map
181 			nameSpace = BerlinModelTaxonNameImport.NAMESPACE;
182 			cdmClass = TaxonNameBase.class;
183 			idSet = nameIdSet;
184 			Map<String, Person> objectMap = (Map<String, Person>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
185 			result.put(nameSpace, objectMap);
186 
187 			//nom reference map
188 			nameSpace = BerlinModelReferenceImport.NOM_REFERENCE_NAMESPACE;
189 			cdmClass = ReferenceBase.class;
190 			idSet = referenceIdSet;
191 			Map<String, ReferenceBase> nomReferenceMap = (Map<String, ReferenceBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
192 			result.put(nameSpace, nomReferenceMap);
193 
194 			//biblio reference map
195 			nameSpace = BerlinModelReferenceImport.BIBLIO_REFERENCE_NAMESPACE;
196 			cdmClass = ReferenceBase.class;
197 			idSet = referenceIdSet;
198 			Map<String, ReferenceBase> biblioReferenceMap = (Map<String, ReferenceBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
199 			result.put(nameSpace, biblioReferenceMap);
200 			
201 		} catch (SQLException e) {
202 			throw new RuntimeException(e);
203 		}
204 		return result;
205 	}
206 
207 	
208 	private static boolean makeFigures(Map<Integer, Specimen> typeMap, Source source){
209 		boolean success = true;
210 		try {
211 			//get data from database
212 			String strQuery = 
213 					" SELECT * " +
214 					" FROM TypeFigure " + 
215                     " WHERE (1=1) ";
216 			ResultSet rs = source.getResultSet(strQuery) ;
217 
218 			int i = 0;
219 			//for each reference
220 			while (rs.next()){
221 				
222 				if ((i++ % modCount) == 0){ logger.info("TypesFigures handled: " + (i-1));}
223 				
224 				Integer typeFigureId = rs.getInt("typeFigureId");
225 				Integer typeDesignationFk = rs.getInt("typeDesignationFk");
226 				Integer collectionFk = rs.getInt("collectionFk");
227 				String filename = rs.getString("filename");
228 				String figurePhrase = rs.getString("figurePhrase");
229 				
230 				String mimeType = null; //"image/jpg";
231 				String suffix = null; //"jpg";
232 				Media media = ImageFile.NewMediaInstance(null, null, filename, mimeType, suffix, null, null, null);
233 				if (figurePhrase != null) {
234 					media.addAnnotation(Annotation.NewDefaultLanguageInstance(figurePhrase));
235 				}
236 				Specimen typeSpecimen = typeMap.get(typeDesignationFk);
237 				if (typeSpecimen != null) {
238 					typeSpecimen.addMedia(media);
239 				}
240 				
241 				//mimeType + suffix
242 				//TODO
243 				//RefFk
244 				//RefDetail
245 				//VerifiedBy
246 				//VerifiedWhen
247 				//PrefFigureFlag
248 				//PublishedFlag
249 				//etc.
250 			}
251 		} catch (SQLException e) {
252 			logger.error("SQLException:" +  e);
253 			return false;
254 		}
255 			
256 		return success;
257 	}
258 	
259 	/* (non-Javadoc)
260 	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
261 	 */
262 	@Override
263 	protected boolean doCheck(BerlinModelImportState state){
264 		IOValidator<BerlinModelImportState> validator = new BerlinModelTypesImportValidator();
265 		return validator.validate(state);
266 	}
267 	
268 	
269 	/* (non-Javadoc)
270 	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getTableName()
271 	 */
272 	@Override
273 	protected String getTableName() {
274 		return dbTableName;
275 	}
276 	
277 	/* (non-Javadoc)
278 	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getPluralString()
279 	 */
280 	@Override
281 	public String getPluralString() {
282 		return pluralString;
283 	}
284 	
285 	/* (non-Javadoc)
286 	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
287 	 */
288 	protected boolean isIgnore(BerlinModelImportState state){
289 		return ! state.getConfig().isDoTypes();
290 	}
291 
292 }