bugfix for wrong http anchor replacement
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / berlinModel / in / BerlinModelTaxonNameRelationImport.java
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 static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_HAS_SAME_TYPE_AS;
13 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_ALTERNATIVE_NAME_FOR;
14 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_BASIONYM_FOR;
15 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_CONSERVED_TYPE_OF;
16 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_FEMALE_PARENT_OF;
17 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_FIRST_PARENT_OF;
18 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_LATER_HOMONYM_OF;
19 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_LATER_VALIDATION_OF;
20 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_LECTOTYPE_OF;
21 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_MALE_PARENT_OF;
22 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_ORTHOGRAPHIC_VARIANT_OF;
23 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_REJECTED_TYPE_OF;
24 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_REPLACED_SYNONYM_FOR;
25 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_SECOND_PARENT_OF;
26 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_TYPE_OF;
27 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_VALIDATION_OF;
28 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_TYPE_NOT_DESIGNATED;
29 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.NAME_REL_IS_TREATED_AS_LATER_HOMONYM_OF;
30
31 import java.lang.reflect.Method;
32 import java.sql.ResultSet;
33 import java.sql.SQLException;
34 import java.util.HashMap;
35 import java.util.HashSet;
36 import java.util.Map;
37 import java.util.Set;
38
39 import org.apache.commons.lang.StringUtils;
40 import org.apache.log4j.Logger;
41 import org.springframework.stereotype.Component;
42
43 import eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer;
44 import eu.etaxonomy.cdm.io.berlinModel.in.validation.BerlinModelTaxonNameRelationImportValidator;
45 import eu.etaxonomy.cdm.io.common.IOValidator;
46 import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
47 import eu.etaxonomy.cdm.model.agent.Person;
48 import eu.etaxonomy.cdm.model.common.AnnotatableEntity;
49 import eu.etaxonomy.cdm.model.common.CdmBase;
50 import eu.etaxonomy.cdm.model.name.BotanicalName;
51 import eu.etaxonomy.cdm.model.name.HybridRelationshipType;
52 import eu.etaxonomy.cdm.model.name.NameRelationshipType;
53 import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;
54 import eu.etaxonomy.cdm.model.name.NonViralName;
55 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
56 import eu.etaxonomy.cdm.model.reference.Reference;
57 import eu.etaxonomy.cdm.strategy.exceptions.UnknownCdmTypeException;
58
59 /**
60 * @author a.mueller
61 * @created 20.03.2008
62 * @version 1.0
63 */
64 @Component
65 public class BerlinModelTaxonNameRelationImport extends BerlinModelImportBase {
66 private static final Logger logger = Logger.getLogger(BerlinModelTaxonNameRelationImport.class);
67
68 private static int modCount = 5000;
69 private static final String pluralString = "name relations";
70 private static final String dbTableName = "RelName";
71
72
73 public BerlinModelTaxonNameRelationImport(){
74 super();
75 }
76
77
78
79 @Override
80 protected String getIdQuery(BerlinModelImportState state) {
81 if (StringUtils.isNotBlank(state.getConfig().getNameIdTable())){
82 String result = super.getIdQuery(state);
83 result += " WHERE nameFk1 IN (SELECT NameId FROM %s) OR ";
84 result += " nameFk2 IN (SELECT NameId FROM %s)";
85 result = String.format(result, state.getConfig().getNameIdTable(),state.getConfig().getNameIdTable() );
86 return result;
87 }else{
88 return super.getIdQuery(state);
89 }
90 }
91
92
93 /* (non-Javadoc)
94 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)
95 */
96 @Override
97 protected String getRecordQuery(BerlinModelImportConfigurator config) {
98 String strQuery =
99 " SELECT RelName.*, FromName.nameId as name1Id, ToName.nameId as name2Id, RefDetail.Details " +
100 " FROM Name as FromName INNER JOIN " +
101 " RelName ON FromName.NameId = RelName.NameFk1 INNER JOIN " +
102 " Name AS ToName ON RelName.NameFk2 = ToName.NameId LEFT OUTER JOIN "+
103 " RefDetail ON RelName.RefDetailFK = RefDetail.RefDetailId " +
104 " WHERE (RelNameId IN ("+ID_LIST_TOKEN +"))";
105 return strQuery;
106 }
107
108 /* (non-Javadoc)
109 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)
110 */
111 public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState state) {
112 boolean success = true ;
113 BerlinModelImportConfigurator config = state.getConfig();
114 Set<TaxonNameBase> nameToSave = new HashSet<TaxonNameBase>();
115 Map<String, TaxonNameBase> nameMap = (Map<String, TaxonNameBase>) partitioner.getObjectMap(BerlinModelTaxonNameImport.NAMESPACE);
116 Map<String, Reference> biblioRefMap = partitioner.getObjectMap(BerlinModelReferenceImport.BIBLIO_REFERENCE_NAMESPACE);
117 Map<String, Reference> nomRefMap = partitioner.getObjectMap(BerlinModelReferenceImport.NOM_REFERENCE_NAMESPACE);
118
119
120 ResultSet rs = partitioner.getResultSet();
121 try {
122
123 int i = 0;
124 //for each name relation
125 while (rs.next()){
126
127 if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("RelName handled: " + (i-1));}
128
129 int relNameId = rs.getInt("RelNameId");
130 int name1Id = rs.getInt("name1Id");
131 int name2Id = rs.getInt("name2Id");
132 Object relRefFkObj = rs.getObject("refFk");
133 String details = rs.getString("details");
134 int relQualifierFk = rs.getInt("relNameQualifierFk");
135 String notes = rs.getString("notes");
136
137 TaxonNameBase<?,?> nameFrom = nameMap.get(String.valueOf(name1Id));
138 TaxonNameBase<?,?> nameTo = nameMap.get(String.valueOf(name2Id));
139
140
141 Reference<?> citation = null;
142 if (relRefFkObj != null){
143 String relRefFk = String.valueOf(relRefFkObj);
144 //get nomRef
145 citation = getReferenceOnlyFromMaps(biblioRefMap, nomRefMap,
146 relRefFk);
147 }
148
149 //TODO (preliminaryFlag = true testen
150 String microcitation = details;
151 String rule = null;
152
153 if (nameFrom != null && nameTo != null){
154 success = handleNameRelationship(success, config, name1Id, name2Id, relQualifierFk,
155 notes, nameFrom, nameTo, citation, microcitation, rule);
156
157 if (! nameFrom.isProtectedTitleCache()){
158 nameFrom.setTitleCache(null);
159 nameFrom.getTitleCache();
160 }
161 if (! nameTo.isProtectedTitleCache()){
162 nameTo.setTitleCache(null);
163 nameTo.getTitleCache();
164 }
165 nameToSave.add(nameFrom);
166
167 //TODO
168 //ID
169 //etc.
170 }else{
171 //TODO
172 if (nameFrom == null){
173 logger.warn("from TaxonName " + name1Id + " for RelName (" + relNameId + " , type: " + relQualifierFk + ") does not exist in store. ToName is: " + (nameTo == null ? "" : nameTo.getTitleCache()));
174 }
175 if (nameTo == null){
176 logger.warn("to TaxonName " + name2Id + " for RelName (" + relNameId + " , type: " + relQualifierFk + ") does not exist in store. FromName is: " + (nameFrom == null ? "" : nameFrom.getTitleCache()));
177 }
178 success = false;
179 }
180 }
181
182
183 partitioner.startDoSave();
184 getNameService().save(nameToSave);
185
186 return success;
187 } catch (SQLException e) {
188 logger.error("SQLException:" + e);
189 return false;
190 }
191 }
192
193 /**
194 * @param success
195 * @param config
196 * @param name1Id
197 * @param name2Id
198 * @param relQualifierFk
199 * @param notes
200 * @param nameFrom
201 * @param nameTo
202 * @param citation
203 * @param microcitation
204 * @param rule
205 * @return
206 */
207 private boolean handleNameRelationship(boolean success,
208 BerlinModelImportConfigurator config, int name1Id, int name2Id,
209 int relQualifierFk, String notes, TaxonNameBase nameFrom,
210 TaxonNameBase nameTo, Reference<?> citation,
211 String microcitation, String rule) {
212 AnnotatableEntity nameRelationship = null;
213 if (relQualifierFk == NAME_REL_IS_BASIONYM_FOR){
214 nameRelationship = nameTo.addBasionym(nameFrom, citation, microcitation, rule);
215 }else if (relQualifierFk == NAME_REL_IS_LATER_HOMONYM_OF){
216 nameRelationship = nameFrom.addRelationshipToName(nameTo, NameRelationshipType.LATER_HOMONYM(), citation, microcitation, rule) ;
217 }else if (relQualifierFk == NAME_REL_IS_TREATED_AS_LATER_HOMONYM_OF){
218 nameRelationship = nameFrom.addRelationshipToName(nameTo, NameRelationshipType.LATER_HOMONYM(), citation, microcitation, rule) ;
219 }else if (relQualifierFk == NAME_REL_IS_REPLACED_SYNONYM_FOR){
220 nameRelationship = nameFrom.addRelationshipToName(nameTo, NameRelationshipType.REPLACED_SYNONYM(), citation, microcitation, rule) ;
221 }else if (relQualifierFk == NAME_REL_HAS_SAME_TYPE_AS){
222 nameTo.getHomotypicalGroup().merge(nameFrom.getHomotypicalGroup());
223 }else if (relQualifierFk == NAME_REL_IS_VALIDATION_OF){
224 nameRelationship = nameTo.addRelationshipToName(nameFrom, NameRelationshipType.VALIDATED_BY_NAME(), citation, microcitation, rule) ;
225 }else if (relQualifierFk == NAME_REL_IS_LATER_VALIDATION_OF){
226 nameRelationship = nameTo.addRelationshipToName(nameFrom, NameRelationshipType.LATER_VALIDATED_BY_NAME(), citation, microcitation, rule) ;
227 }else if (relQualifierFk == NAME_REL_IS_TYPE_OF || relQualifierFk == NAME_REL_IS_REJECTED_TYPE_OF || relQualifierFk == NAME_REL_IS_CONSERVED_TYPE_OF || relQualifierFk == NAME_REL_IS_LECTOTYPE_OF || relQualifierFk == NAME_REL_TYPE_NOT_DESIGNATED ){
228 boolean isRejectedType = (relQualifierFk == NAME_REL_IS_REJECTED_TYPE_OF);
229 boolean isConservedType = (relQualifierFk == NAME_REL_IS_CONSERVED_TYPE_OF);
230 boolean isLectoType = (relQualifierFk == NAME_REL_IS_LECTOTYPE_OF);
231 boolean isNotDesignated = (relQualifierFk == NAME_REL_TYPE_NOT_DESIGNATED);
232
233 NameTypeDesignationStatus status = null;
234 String originalNameString = null;
235 //TODO addToAllNames true or false?
236 boolean addToAllNames = false;
237 if (config.getNameTypeDesignationStatusMethod() != null){
238 Method method = config.getNameTypeDesignationStatusMethod();
239 method.setAccessible(true);
240 try {
241 status = (NameTypeDesignationStatus)method.invoke(null, notes);
242 nameRelationship = nameTo.addNameTypeDesignation(nameFrom, citation, microcitation, originalNameString, status, addToAllNames);
243 } catch (Exception e) {
244 throw new RuntimeException(e);
245 }
246 }else{
247 if (isLectoType){
248 status = NameTypeDesignationStatus.LECTOTYPE();
249 }
250 nameRelationship = nameTo.addNameTypeDesignation(nameFrom, citation, microcitation, originalNameString, status, isRejectedType, isConservedType, /*isLectoType,*/ isNotDesignated, addToAllNames);
251 }
252
253 }else if (relQualifierFk == NAME_REL_IS_ORTHOGRAPHIC_VARIANT_OF){
254 nameRelationship = nameFrom.addRelationshipToName(nameTo, NameRelationshipType.ORTHOGRAPHIC_VARIANT(), citation, microcitation, rule) ;
255 }else if (relQualifierFk == NAME_REL_IS_ALTERNATIVE_NAME_FOR){
256 nameRelationship = nameFrom.addRelationshipToName(nameTo, NameRelationshipType.ALTERNATIVE_NAME(), citation, microcitation, rule) ;
257 }else if (relQualifierFk == NAME_REL_IS_FIRST_PARENT_OF || relQualifierFk == NAME_REL_IS_SECOND_PARENT_OF || relQualifierFk == NAME_REL_IS_FEMALE_PARENT_OF || relQualifierFk == NAME_REL_IS_MALE_PARENT_OF){
258 //HybridRelationships
259 if (! (nameTo instanceof NonViralName ) || ! (nameFrom instanceof NonViralName)){
260 logger.warn("HybridrelationshipNames ("+name1Id +"," + name2Id +") must be of type NonViralNameName but are not");
261 success = false;
262 }
263 try {
264 HybridRelationshipType hybridRelType = BerlinModelTransformer.relNameId2HybridRel(relQualifierFk);
265 BotanicalName parent = (BotanicalName)nameFrom;
266 BotanicalName child = (BotanicalName)nameTo;
267
268 nameRelationship = parent.addHybridChild(child, hybridRelType, rule);
269
270 } catch (UnknownCdmTypeException e) {
271 logger.warn(e);
272 success = false;
273 }
274 }else {
275 //TODO
276 Method method = config.getNamerelationshipTypeMethod();
277 if (method != null){
278 try {
279 method.invoke(null, relQualifierFk, nameTo, nameFrom);
280 } catch (Exception e) {
281 logger.error(e.getMessage());
282 logger.warn("NameRelationship could not be imported");
283 success = false;
284 }
285 }else{
286 logger.warn("NameRelationShipType " + relQualifierFk + " not yet implemented");
287 success = false;
288 }
289 }
290 doNotes(nameRelationship, notes);
291 return success;
292 }
293
294 /* (non-Javadoc)
295 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)
296 */
297 public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {
298 String nameSpace;
299 Class cdmClass;
300 Set<String> idSet;
301 Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
302
303 try{
304 Set<String> nameIdSet = new HashSet<String>();
305 Set<String> referenceIdSet = new HashSet<String>();
306 Set<String> refDetailIdSet = new HashSet<String>();
307 while (rs.next()){
308 handleForeignKey(rs, nameIdSet, "name1Id");
309 handleForeignKey(rs, nameIdSet, "name2Id");
310 handleForeignKey(rs, referenceIdSet, "RefFk");
311 handleForeignKey(rs, refDetailIdSet, "RefDetailFk");
312 }
313
314 //name map
315 nameSpace = BerlinModelTaxonNameImport.NAMESPACE;
316 cdmClass = TaxonNameBase.class;
317 idSet = nameIdSet;
318 Map<String, Person> objectMap = (Map<String, Person>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
319 result.put(nameSpace, objectMap);
320
321 //nom reference map
322 nameSpace = BerlinModelReferenceImport.NOM_REFERENCE_NAMESPACE;
323 cdmClass = Reference.class;
324 idSet = referenceIdSet;
325 Map<String, Reference> nomReferenceMap = (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
326 result.put(nameSpace, nomReferenceMap);
327
328 //biblio reference map
329 nameSpace = BerlinModelReferenceImport.BIBLIO_REFERENCE_NAMESPACE;
330 cdmClass = Reference.class;
331 idSet = referenceIdSet;
332 Map<String, Reference> biblioReferenceMap = (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
333 result.put(nameSpace, biblioReferenceMap);
334
335 //nom refDetail map
336 nameSpace = BerlinModelRefDetailImport.NOM_REFDETAIL_NAMESPACE;
337 cdmClass = Reference.class;
338 idSet = refDetailIdSet;
339 Map<String, Reference> nomRefDetailMap= (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
340 result.put(nameSpace, nomRefDetailMap);
341
342 //biblio refDetail map
343 nameSpace = BerlinModelRefDetailImport.BIBLIO_REFDETAIL_NAMESPACE;
344 cdmClass = Reference.class;
345 idSet = refDetailIdSet;
346 Map<String, Reference> biblioRefDetailMap= (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
347 result.put(nameSpace, biblioRefDetailMap);
348
349 } catch (SQLException e) {
350 throw new RuntimeException(e);
351 }
352 return result;
353 }
354
355 /* (non-Javadoc)
356 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)
357 */
358 @Override
359 protected boolean doCheck(BerlinModelImportState state){
360 IOValidator<BerlinModelImportState> validator = new BerlinModelTaxonNameRelationImportValidator();
361 return validator.validate(state);
362 }
363
364 /* (non-Javadoc)
365 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getTableName()
366 */
367 @Override
368 protected String getTableName() {
369 return dbTableName;
370 }
371
372
373 /* (non-Javadoc)
374 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getPluralString()
375 */
376 @Override
377 public String getPluralString() {
378 return pluralString;
379 }
380
381 /* (non-Javadoc)
382 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
383 */
384 protected boolean isIgnore(BerlinModelImportState state){
385 return ! state.getConfig().isDoRelNames();
386 }
387
388
389 }