\r
import java.sql.ResultSet;\r
import java.sql.SQLException;\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
import java.util.HashSet;\r
+import java.util.List;\r
import java.util.Map;\r
import java.util.Set;\r
+import java.util.SortedSet;\r
+import java.util.TreeSet;\r
+import java.util.UUID;\r
\r
+import org.apache.commons.lang.StringUtils;\r
import org.apache.log4j.Logger;\r
import org.springframework.stereotype.Component;\r
\r
+import eu.etaxonomy.cdm.common.CdmUtils;\r
import eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer;\r
-import eu.etaxonomy.cdm.io.common.ICdmIO;\r
-import eu.etaxonomy.cdm.io.common.IImportConfigurator;\r
-import eu.etaxonomy.cdm.io.common.MapWrapper;\r
+import eu.etaxonomy.cdm.io.berlinModel.in.validation.BerlinModelCommonNamesImportValidator;\r
+import eu.etaxonomy.cdm.io.common.IOValidator;\r
+import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;\r
import eu.etaxonomy.cdm.io.common.Source;\r
+import eu.etaxonomy.cdm.io.common.TdwgAreaProvider;\r
+import eu.etaxonomy.cdm.model.common.Annotation;\r
+import eu.etaxonomy.cdm.model.common.AnnotationType;\r
import eu.etaxonomy.cdm.model.common.CdmBase;\r
-import eu.etaxonomy.cdm.model.description.Distribution;\r
-import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;\r
+import eu.etaxonomy.cdm.model.common.Extension;\r
+import eu.etaxonomy.cdm.model.common.ExtensionType;\r
+import eu.etaxonomy.cdm.model.common.Language;\r
+import eu.etaxonomy.cdm.model.common.Marker;\r
+import eu.etaxonomy.cdm.model.common.MarkerType;\r
+import eu.etaxonomy.cdm.model.common.Representation;\r
+import eu.etaxonomy.cdm.model.description.CommonTaxonName;\r
+import eu.etaxonomy.cdm.model.description.DescriptionElementSource;\r
import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
+import eu.etaxonomy.cdm.model.location.Country;\r
import eu.etaxonomy.cdm.model.location.NamedArea;\r
-import eu.etaxonomy.cdm.model.location.TdwgArea;\r
-import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
+import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
+import eu.etaxonomy.cdm.model.reference.Reference;\r
import eu.etaxonomy.cdm.model.taxon.Taxon;\r
import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
-import eu.etaxonomy.cdm.strategy.exceptions.UnknownCdmTypeException;\r
\r
/**\r
+ * \r
* @author a.mueller\r
* @created 20.03.2008\r
- * @version 1.0\r
*/\r
@Component\r
public class BerlinModelCommonNamesImport extends BerlinModelImportBase {\r
private static final Logger logger = Logger.getLogger(BerlinModelCommonNamesImport.class);\r
\r
- private static int modCount = 10000;\r
+ public static final UUID REFERENCE_LANGUAGE_ISO639_2_UUID = UUID.fromString("40c4f8dd-3d9c-44a4-b77a-76e137a89a5f");\r
+ public static final UUID REFERENCE_LANGUAGE_STRING_UUID = UUID.fromString("2a1b678f-c27d-48c1-b43e-98fd0d426305");\r
+ public static final UUID STATUS_ANNOTATION_UUID = UUID.fromString("e3f7b80a-1286-458d-812c-5e818f731968");\r
+ \r
+ public static final String NAMESPACE = "common name";\r
+ \r
+ \r
+ private static final String pluralString = "common names";\r
+ private static final String dbTableName = "emCommonName";\r
+\r
+\r
+ //map that stores the regions (named areas) and makes them accessible via the regionFk\r
+ private Map<String, NamedArea> regionMap = new HashMap<String, NamedArea>();\r
\r
public BerlinModelCommonNamesImport(){\r
- super();\r
+ super(dbTableName, pluralString);\r
}\r
\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)\r
- */\r
@Override\r
- protected boolean doCheck(IImportConfigurator config){\r
- boolean result = true;\r
- logger.warn("Checking for Occurrence not yet implemented");\r
- //result &= checkArticlesWithoutJournal(bmiConfig);\r
- //result &= checkPartOfJournal(bmiConfig);\r
+ protected String getIdQuery(BerlinModelImportState state) {\r
+ String result = " SELECT CommonNameId FROM emCommonName WHERE (1=1) ";\r
+ if (StringUtils.isNotBlank(state.getConfig().getCommonNameFilter())){\r
+ result += " AND " + state.getConfig().getCommonNameFilter();\r
+ }\r
\r
return result;\r
}\r
\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doInvoke(eu.etaxonomy.cdm.io.common.IImportConfigurator, eu.etaxonomy.cdm.api.application.CdmApplicationController, java.util.Map)\r
+ @Override\r
+ protected String getRecordQuery(BerlinModelImportConfigurator config) {\r
+ String recordQuery = "";\r
+ recordQuery = \r
+ " SELECT cn.CommonNameId, cn.CommonName, PTaxon.RIdentifier AS taxonId, cn.PTNameFk, cn.RefFk AS refId, cn.Status, cn.RegionFks, cn.MisNameRefFk, " +\r
+ " cn.NameInSourceFk, cn.Created_When, cn.Updated_When, cn.Created_Who, cn.Updated_Who, cn.Note AS Notes, languageCommonName.Language, " +\r
+ " languageCommonName.LanguageOriginal, languageCommonName.ISO639_1, languageCommonName.ISO639_2, " +\r
+ " emLanguageReference.RefFk AS languageRefRefFk, emLanguageReference.ReferenceShort, emLanguageReference.ReferenceLong, " +\r
+ " emLanguageReference.LanguageFk, languageReferenceLanguage.Language AS refLanguage, languageReferenceLanguage.ISO639_2 AS refLanguageIso639_2, "+ \r
+ " misappliedTaxon.RIdentifier AS misappliedTaxonId " +\r
+ " FROM PTaxon AS misappliedTaxon RIGHT OUTER JOIN " +\r
+ " emLanguage AS languageReferenceLanguage RIGHT OUTER JOIN " + \r
+ " emLanguageReference ON languageReferenceLanguage.LanguageId = emLanguageReference.LanguageFk RIGHT OUTER JOIN " +\r
+ " emCommonName AS cn INNER JOIN " +\r
+ " PTaxon ON cn.PTNameFk = PTaxon.PTNameFk AND cn.PTRefFk = PTaxon.PTRefFk ON " +\r
+ " emLanguageReference.ReferenceId = cn.LanguageRefFk LEFT OUTER JOIN " +\r
+ " emLanguage AS languageCommonName ON cn.LanguageFk = languageCommonName.LanguageId ON misappliedTaxon.PTNameFk = cn.NameInSourceFk AND " +\r
+ " misappliedTaxon.PTRefFk = cn.MisNameRefFk " +\r
+ " WHERE cn.CommonNameId IN (" + ID_LIST_TOKEN + ")";\r
+ return recordQuery;\r
+ }\r
+ \r
+ @Override\r
+ protected void doInvoke(BerlinModelImportState state) {\r
+ try {\r
+ makeRegions(state);\r
+ } catch (Exception e) {\r
+ logger.error("Error when creating common name regions:" + e.getMessage());\r
+ e.printStackTrace();\r
+ state.setUnsuccessfull();\r
+ }\r
+ super.doInvoke(state);\r
+ return;\r
+ }\r
+ \r
+ /**\r
+ * @param state \r
+ * \r
*/\r
+ private void makeRegions(BerlinModelImportState state) {\r
+ try {\r
+ SortedSet<Integer> regionFks = new TreeSet<Integer>();\r
+ Source source = state.getConfig().getSource();\r
+ \r
+ //fill set with all regionFk from emCommonName.regionFks\r
+ getRegionFks(state, regionFks, source);\r
+ //concat filter string\r
+ String sqlWhere = getSqlWhere(regionFks);\r
+ \r
+ //get E+M - TDWG Mapping\r
+ Map<String, String> emTdwgMap = getEmTdwgMap(source);\r
+ //fill regionMap\r
+ fillRegionMap(state, sqlWhere, emTdwgMap);\r
+ \r
+ return;\r
+ } catch (NumberFormatException e) {\r
+ e.printStackTrace();\r
+ state.setUnsuccessfull();\r
+ return;\r
+ } catch (SQLException e) {\r
+ e.printStackTrace();\r
+ state.setUnsuccessfull();\r
+ return;\r
+ }\r
+ }\r
+\r
+\r
@Override\r
- protected boolean doInvoke(IImportConfigurator config, \r
- Map<String, MapWrapper<? extends CdmBase>> stores){\r
- \r
- MapWrapper<TaxonBase> taxonMap = (MapWrapper<TaxonBase>)stores.get(ICdmIO.TAXON_STORE);\r
- MapWrapper<ReferenceBase> referenceMap = (MapWrapper<ReferenceBase>)stores.get(ICdmIO.REFERENCE_STORE);\r
- BerlinModelImportConfigurator bmiConfig = (BerlinModelImportConfigurator)config;\r
+ public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState state) {\r
+ boolean success = true ;\r
\r
- if (true){\r
- return false;\r
- }\r
+ Set<TaxonBase> taxaToSave = new HashSet<TaxonBase>();\r
+ Map<String, Taxon> taxonMap = (Map<String, Taxon>) partitioner.getObjectMap(BerlinModelTaxonImport.NAMESPACE);\r
+ Map<String, TaxonNameBase> taxonNameMap = (Map<String, TaxonNameBase>) partitioner.getObjectMap(BerlinModelTaxonNameImport.NAMESPACE);\r
\r
- Set<TaxonBase> taxonStore = new HashSet<TaxonBase>();\r
- Source source = bmiConfig.getSource();\r
+ Map<String, Reference> refMap = (Map<String, Reference>) partitioner.getObjectMap(BerlinModelReferenceImport.REFERENCE_NAMESPACE);\r
\r
- String dbAttrName;\r
- String cdmAttrName;\r
+ Map<String, Language> iso6392Map = new HashMap<String, Language>();\r
\r
- logger.info("start make occurrences ...");\r
+ // logger.warn("MisappliedNameRefFk not yet implemented for Common Names");\r
\r
- boolean delete = bmiConfig.isDeleteAll();\r
-\r
- try {\r
- //get data from database\r
- String strQuery = \r
- " SELECT PTaxon.RIdentifier, emOccurrence.OccurrenceId, emOccurSumCat.emOccurSumCatId, emOccurSumCat.Short, emOccurSumCat.Description, " + \r
- " emOccurSumCat.OutputCode, emArea.AreaId, emArea.EMCode, emArea.ISOCode, emArea.TDWGCode, emArea.Unit, " + \r
- " emArea.Status, emArea.OutputOrder, emArea.eur, emArea.EuroMedArea " +\r
- " FROM emOccurrence INNER JOIN " + \r
- " emArea ON emOccurrence.AreaFk = emArea.AreaId INNER JOIN " +\r
- " PTaxon ON emOccurrence.PTNameFk = PTaxon.PTNameFk AND emOccurrence.PTRefFk = PTaxon.PTRefFk LEFT OUTER JOIN " +\r
- " emOccurSumCat ON emOccurrence.SummaryStatus = emOccurSumCat.emOccurSumCatId LEFT OUTER JOIN " + \r
- " emOccurrenceSource ON emOccurrence.OccurrenceId = emOccurrenceSource.OccurrenceFk " + \r
- " WHERE (1=1)";\r
- ResultSet rs = source.getResultSet(strQuery) ;\r
-\r
- int i = 0;\r
- //for each reference\r
+ ResultSet rs = partitioner.getResultSet();\r
+ try{\r
while (rs.next()){\r
+\r
+ //create TaxonName element\r
+ Object commonNameId = rs.getObject("CommonNameId");\r
+ int taxonId = rs.getInt("taxonId");\r
+ Object refId = rs.getObject("refId");\r
+ Object ptNameFk = rs.getObject("PTNameFk");\r
+ String commonNameString = rs.getString("CommonName");\r
+ String iso639_2 = rs.getString("ISO639_2");\r
+ String iso639_1 = rs.getString("ISO639_1");\r
+ String languageString = rs.getString("Language");\r
+ String originalLanguageString = rs.getString("LanguageOriginal");\r
+ Object misNameRefFk = rs.getObject("MisNameRefFk");\r
+ Object languageRefRefFk = rs.getObject("languageRefRefFk");\r
+ String refLanguage = rs.getString("refLanguage");\r
+ String refLanguageIso639_2 = rs.getString("refLanguageIso639_2");\r
+ String status = rs.getString("Status");\r
+ Object nameInSourceFk = rs.getObject("NameInSourceFk");\r
+ Object misappliedTaxonId = rs.getObject("misappliedTaxonId");\r
\r
- if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("Facts handled: " + (i-1));}\r
+ //regions\r
+ String regionFks = rs.getString("RegionFks");\r
+ String[] regionFkSplit = regionFks.split(",");\r
\r
- int occurrenceId = rs.getInt("OccurrenceId");\r
- int taxonId = rs.getInt("RIdentifier");\r
- String tdwgCode = rs.getString("TDWGCode");\r
- Integer emStatusId = (Integer)rs.getObject("emOccurSumCatId");\r
+ //commonNameString\r
+ if (isBlank(commonNameString)){\r
+ String message = "CommonName is empty or null. Do not import record for taxon " + taxonId;\r
+ logger.warn(message);\r
+ continue;\r
+ }\r
\r
+ //taxon\r
+ Taxon taxon = null;\r
+ TaxonBase<?> taxonBase = taxonMap.get(String.valueOf(taxonId));\r
+ if (taxonBase == null){\r
+ logger.warn("Taxon (" + taxonId + ") could not be found. Common name " + commonNameString + "(" + commonNameId + ") not imported");\r
+ continue;\r
+ }else if (! taxonBase.isInstanceOf(Taxon.class)){\r
+ logger.warn("taxon (" + taxonId + ") is not accepted. Can't import common name " + commonNameId);\r
+ continue;\r
+ }else{\r
+ taxon = CdmBase.deproxy(taxonBase, Taxon.class);\r
+ }\r
+ \r
+ //Language\r
+ Language language = getAndHandleLanguage(iso6392Map, iso639_2, iso639_1, languageString, originalLanguageString, state);\r
+ \r
+ //CommonTaxonName\r
+ List<CommonTaxonName> commonTaxonNames = new ArrayList<CommonTaxonName>();\r
+ for (String regionFk : regionFkSplit){ //\r
+ CommonTaxonName commonTaxonName;\r
+ if (commonTaxonNames.size() == 0){\r
+ commonTaxonName = CommonTaxonName.NewInstance(commonNameString, language);\r
+ }else{\r
+ commonTaxonName = (CommonTaxonName)commonTaxonNames.get(0).clone();\r
+ }\r
+ commonTaxonNames.add(commonTaxonName);\r
+ regionFk = regionFk.trim();\r
+ NamedArea area = regionMap.get(regionFk);\r
+ if (area == null){\r
+ if (regionFkSplit.length > 1 && StringUtils.isNotBlank(regionFk)){\r
+ logger.warn("Area for " + regionFk + " not defined in regionMap.");\r
+ }else{\r
+ //no region is defined\r
+ }\r
+ }else{\r
+ commonTaxonName.setArea(area);\r
+ TaxonDescription description = getDescription(taxon);\r
+ description.addElement(commonTaxonName);\r
+ }\r
+ }\r
\r
- TaxonBase taxonBase = taxonMap.get(taxonId);\r
- if (taxonBase != null){\r
- try {\r
- \r
- PresenceAbsenceTermBase<?> status = null;\r
- if (emStatusId != null){\r
- status = BerlinModelTransformer.occStatus2PresenceAbsence(emStatusId);\r
+ //Reference/Source\r
+ String strRefId = String.valueOf(refId);\r
+ String languageRefFk = String.valueOf(languageRefRefFk);\r
+ if (! CdmUtils.nullSafeEqual(strRefId, languageRefFk)){\r
+ //use strRefId if languageRefFk is null\r
+ if (languageRefRefFk == null){\r
+ languageRefFk = strRefId;\r
+ }else{\r
+ logger.warn("CommonName.RefFk (" + CdmUtils.Nz(strRefId) + ") and LanguageReference.RefFk " + CdmUtils.Nz(languageRefFk) + " are not equal. I will import only languageReference.RefFk");\r
+ }\r
+ }\r
+ \r
+ Reference<?> reference = refMap.get(String.valueOf(languageRefRefFk));\r
+ String microCitation = null;\r
+ String originalNameString = null;\r
+ \r
+ TaxonNameBase<?,?> nameUsedInSource = taxonNameMap.get(String.valueOf(nameInSourceFk));\r
+ if (nameInSourceFk != null && nameUsedInSource == null){\r
+ logger.warn("Name used in source (" + nameInSourceFk + ") was not found for common name " + commonNameId);\r
+ }\r
+ DescriptionElementSource source = DescriptionElementSource.NewPrimarySourceInstance(reference, microCitation, nameUsedInSource, originalNameString);\r
+ for (CommonTaxonName commonTaxonName : commonTaxonNames){\r
+ commonTaxonName.addSource(source);\r
+ }\r
+ \r
+ \r
+ //MisNameRef\r
+ if (misNameRefFk != null){\r
+ //Taxon misappliedName = getMisappliedName(biblioRefMap, nomRefMap, misNameRefFk, taxon);\r
+ Taxon misappliedNameTaxon = null;\r
+ if (misappliedTaxonId != null){\r
+ TaxonBase<?> misTaxonBase = taxonMap.get(String.valueOf(misappliedTaxonId));\r
+ if (misTaxonBase == null){\r
+ logger.warn("MisappliedName not found for misappliedTaxonId " + misappliedTaxonId + "; commonNameId: " + commonNameId);\r
+ }else if (misTaxonBase.isInstanceOf(Taxon.class)){\r
+ misappliedNameTaxon = CdmBase.deproxy(misTaxonBase, Taxon.class);\r
+ }else{\r
+ logger.warn("Misapplied name taxon is not of type Taxon but " + misTaxonBase.getClass().getSimpleName());\r
}\r
+ }else{\r
\r
- NamedArea tdwgArea = TdwgArea.getAreaByTdwgLabel(tdwgCode);\r
+ Reference<?> sec = refMap.get(String.valueOf(misNameRefFk));\r
+ if (nameUsedInSource == null || sec == null){\r
+ logger.warn("Taxon name or misapplied name reference is null for common name " + commonNameId);\r
+ }else{\r
+ misappliedNameTaxon = Taxon.NewInstance(nameUsedInSource, sec);\r
+ MarkerType misCommonNameMarker = getMarkerType(state, BerlinModelTransformer.uuidMisappliedCommonName,"Misapplied Common Name in Berlin Model", "Misapplied taxon was automatically created by Berlin Model import for a common name with a misapplied name reference", "MCN");\r
+ Marker marker = Marker.NewInstance(misCommonNameMarker, true);\r
+ misappliedNameTaxon.addMarker(marker);\r
+ taxaToSave.add(misappliedNameTaxon);\r
+ logger.warn("Misapplied name taxon could not be found in database but misapplied name reference exists for common name. " +\r
+ "New misapplied name for misapplied reference common name was added. CommonNameId: " + commonNameId);\r
+ }\r
+ }\r
+ if (misappliedNameTaxon != null){\r
\r
- Taxon taxon;\r
- if ( taxonBase instanceof Taxon ) {\r
- taxon = (Taxon) taxonBase;\r
- }else{\r
- logger.warn("TaxonBase for Occurrence " + occurrenceId + " was not of type Taxon but: " + taxonBase.getClass().getSimpleName());\r
- continue;\r
- }\r
- \r
- if (tdwgArea != null){\r
- Distribution distribution = Distribution.NewInstance(tdwgArea, status);\r
- //TODO only one description per taxon (for all EM distributions)\r
- TaxonDescription taxonDescription = TaxonDescription.NewInstance();\r
- \r
- taxon.addDescription(taxonDescription);\r
- taxonStore.add(taxon);\r
- }\r
- \r
- } catch (UnknownCdmTypeException e) {\r
- // TODO Auto-generated catch block\r
- e.printStackTrace();\r
+ if (! taxon.getMisappliedNames().contains(misappliedNameTaxon)){\r
+ taxon.addMisappliedName(misappliedNameTaxon,state.getTransactionalSourceReference(), null);\r
+ logger.warn("Misapplied name for common name was not found related to the accepted taxon. Created new relationship. CommonNameId: " + commonNameId);\r
}\r
-\r
-// TODO\r
-// sources\r
-// references\r
- \r
- \r
\r
-// //commonNames -> TODO move to separate IO\r
-// String commonNameString;\r
-// if (taxon.getName() != null){\r
-// commonNameString = "Common " + taxon.getName().getTitleCache(); \r
-// }else{\r
-// commonNameString = "Common (null)";\r
-// }\r
-// Language language = bmiConfig.getFactLanguage();\r
-// language = null;\r
-// CommonTaxonName commonName = CommonTaxonName.NewInstance(commonNameString, language);\r
-// taxonDescription.addElement(commonName);\r
- \r
+ TaxonDescription misappliedNameDescription = getDescription(misappliedNameTaxon);\r
+ for (CommonTaxonName commonTaxonName : commonTaxonNames){\r
+ CommonTaxonName commonNameClone = (CommonTaxonName)commonTaxonName.clone();\r
+ misappliedNameDescription.addElement(commonNameClone);\r
+ } \r
+ }else{\r
+ logger.warn("Misapplied name is null for common name " + commonNameId);\r
+ }\r
\r
+ }\r
+ \r
+ \r
+ //reference extensions\r
+ if (reference != null){\r
+ if (StringUtils.isNotBlank(refLanguage)){\r
+ ExtensionType refLanguageExtensionType = getExtensionType( state, REFERENCE_LANGUAGE_STRING_UUID, "reference language","The language of the reference","ref. lang.");\r
+ Extension.NewInstance(reference, refLanguage, refLanguageExtensionType);\r
+ }\r
\r
- }else{\r
- //TODO\r
- logger.warn("Taxon for Fact " + occurrenceId + " does not exist in store");\r
+ if (StringUtils.isNotBlank(refLanguageIso639_2)){\r
+ ExtensionType refLanguageIsoExtensionType = getExtensionType( state, REFERENCE_LANGUAGE_ISO639_2_UUID, "reference language iso 639-2","The iso 639-2 code of the references language","ref. lang. 639-2");\r
+ Extension.NewInstance(reference, refLanguageIso639_2, refLanguageIsoExtensionType);\r
+ }\r
+ }else if (isNotBlank(refLanguage) || isNotBlank(refLanguageIso639_2)){\r
+ logger.warn("Reference is null (" + languageRefRefFk + ") but refLanguage (" + CdmUtils.Nz(refLanguage) + ") or iso639_2 (" + CdmUtils.Nz(refLanguageIso639_2) + ") was not null for common name ("+ commonNameId +")");\r
}\r
- //put\r
+ \r
+ //status\r
+ if (isNotBlank(status)){\r
+ AnnotationType statusAnnotationType = getAnnotationType( state, STATUS_ANNOTATION_UUID, "status","The status of this object","status", null);\r
+ for (CommonTaxonName commonTaxonName : commonTaxonNames){\r
+ Annotation annotation = Annotation.NewInstance(status, statusAnnotationType, Language.DEFAULT());\r
+ commonTaxonName.addAnnotation(annotation);\r
+ }\r
+ }\r
+ \r
+ //Notes\r
+ for (CommonTaxonName commonTaxonName : commonTaxonNames){\r
+ doIdCreatedUpdatedNotes(state, commonTaxonName, rs, String.valueOf(commonNameId), NAMESPACE);\r
+ }\r
+ partitioner.startDoSave();\r
+ taxaToSave.add(taxon);\r
+\r
}\r
- logger.info("Taxa to save: " + taxonStore.size());\r
- getTaxonService().saveTaxonAll(taxonStore); \r
- \r
- logger.info("end make occurrences ...");\r
- return true;\r
} catch (SQLException e) {\r
logger.error("SQLException:" + e);\r
return false;\r
+ } catch (ClassCastException e) {\r
+ e.printStackTrace();\r
+ } \r
+ \r
+ // logger.info( i + " names handled");\r
+ getTaxonService().save(taxaToSave);\r
+ return success;\r
+\r
+ }\r
+\r
+ /**\r
+ * @param iso6392Map\r
+ * @param iso639_2\r
+ * @param languageString\r
+ * @param originalLanguageString\r
+ * @param state \r
+ * @return\r
+ */\r
+ private Language getAndHandleLanguage(Map<String, Language> iso639Map, String iso639_2, String iso639_1, String languageString, String originalLanguageString, BerlinModelImportState state) {\r
+ Language language;\r
+ if (isNotBlank(iso639_2)|| isNotBlank(iso639_1) ){\r
+ //TODO test performance, implement in state\r
+ language = getLanguageFromIsoMap(iso639Map, iso639_2, iso639_1);\r
+ \r
+ if (language == null){\r
+ language = getTermService().getLanguageByIso(iso639_2);\r
+ iso639Map.put(iso639_2, language);\r
+ if (language == null){\r
+ try {\r
+ language = getTermService().getLanguageByIso(iso639_1);\r
+ } catch (Exception e) {\r
+ // TODO Auto-generated catch block\r
+ // TODO remove if problem with duplicate DescElement_Annot id is solved\r
+ e.printStackTrace();\r
+ }\r
+ iso639Map.put(iso639_1, language);\r
+ }\r
+ if (language == null){\r
+ logger.warn("Language for code ISO693-2 '" + iso639_2 + "' and ISO693-1 '" + iso639_1 + "' was not found");\r
+ }\r
+ }\r
+ } else if ("unknown".equals(languageString)){\r
+ language = Language.UNKNOWN_LANGUAGE();\r
+ } else if ("Majorcan".equalsIgnoreCase(languageString)){\r
+ language = getLanguage(state, BerlinModelTransformer.uuidLangMajorcan, "Majorcan", "Majorcan (original 'mallorqu\u00EDn')", null);\r
+ }else{\r
+ logger.warn("language ISO 639_1 and ISO 639_2 were empty for " + languageString);\r
+ language = null;\r
+ }\r
+ addOriginalLanguage(language, originalLanguageString);\r
+ return language;\r
+ }\r
+\r
+\r
+ /**\r
+ * @param iso639Map\r
+ * @param iso639_2\r
+ * @param iso639_1\r
+ * @return\r
+ */\r
+ private Language getLanguageFromIsoMap(Map<String, Language> iso639Map, String iso639_2, String iso639_1) {\r
+ Language language;\r
+ language = iso639Map.get(iso639_2);\r
+ if (language == null){\r
+ language = iso639Map.get(iso639_1);\r
+ }\r
+ return language;\r
+ }\r
+\r
+ /**\r
+ * @param language\r
+ * @param originalLanguageString\r
+ */\r
+ private void addOriginalLanguage(Language language, String originalLanguageString) {\r
+ if (isBlank(originalLanguageString)){\r
+ return;\r
+ }else if (language == null){\r
+ logger.warn("Language could not be defined, but originalLanguageString exists: " + originalLanguageString);\r
+ }else {\r
+ Representation representation = language.getRepresentation(language);\r
+ if (representation == null){\r
+ language.addRepresentation(Representation.NewInstance(originalLanguageString, originalLanguageString, originalLanguageString, language));\r
+ getTermService().saveOrUpdate(language);\r
+ }\r
+ }\r
+ \r
+ }\r
+ \r
+\r
+\r
+ /**\r
+ * Fills the regionFks with all regionFks from emCommonName. Comma separated regionFks will be split.\r
+ * @param state\r
+ * @param regionFks\r
+ * @param source\r
+ * @return\r
+ * @throws SQLException\r
+ * \r
+ */\r
+ private void getRegionFks(BerlinModelImportState state, SortedSet<Integer> regionFks, Source source) throws SQLException {\r
+ String sql = " SELECT DISTINCT RegionFks FROM emCommonName";\r
+ if (state.getConfig().getCommonNameFilter() != null){\r
+ sql += " WHERE " + state.getConfig().getCommonNameFilter(); \r
+ }\r
+ \r
+ ResultSet rs = source.getResultSet(sql);\r
+ while (rs.next()){\r
+ String strRegionFks = rs.getString("RegionFks"); \r
+ if (isBlank(strRegionFks)){\r
+ continue;\r
+ }\r
+ \r
+ String[] regionFkArray = strRegionFks.split(",");\r
+ for (String regionFk: regionFkArray){\r
+ regionFk = regionFk.trim();\r
+ if (! StringUtils.isNumeric(regionFk) || "".equals(regionFk) ){\r
+ state.setUnsuccessfull();\r
+ logger.warn("RegionFk is not numeric: " + regionFk + " ( part of " + strRegionFks + ")");\r
+ }else{\r
+ regionFks.add(Integer.valueOf(regionFk));\r
+ }\r
+ }\r
}\r
+ return;\r
+ }\r
+\r
\r
+\r
+ /**\r
+ * Fills the {@link #regionMap} by all emLanguageRegion regions defined in the sql filter.\r
+ * {@link #regionMap} maps emLanguageRegion.RegionId to named areas.\r
+ * @param state\r
+ * @param sqlWhere\r
+ * @param emTdwgMap\r
+ * @throws SQLException\r
+ */\r
+ private void fillRegionMap(BerlinModelImportState state, String sqlWhere,\r
+ Map<String, String> emTdwgMap) throws SQLException {\r
+ Source source = state.getConfig().getSource();\r
+ String sql;\r
+ ResultSet rs;\r
+ sql = " SELECT RegionId, Region FROM emLanguageRegion WHERE RegionId IN ("+ sqlWhere+ ") ";\r
+ rs = source.getResultSet(sql);\r
+ while (rs.next()){\r
+ Object regionId = rs.getObject("RegionId");\r
+ String region = rs.getString("Region");\r
+ String[] splitRegion = region.split("-");\r
+ if (splitRegion.length <= 1){\r
+ NamedArea newArea = getNamedArea(state, null, region, "Language region '" + region + "'", null, null, null);\r
+// getTermService().save(newArea);\r
+ regionMap.put(String.valueOf(regionId), newArea);\r
+ logger.warn("Found new area: " + region);\r
+ }else if (splitRegion.length == 2){\r
+ String emCode = splitRegion[1].trim();\r
+ String tdwgCode = emTdwgMap.get(emCode);\r
+ if (StringUtils.isNotBlank(tdwgCode) ){\r
+ NamedArea tdwgArea = getNamedArea(state, tdwgCode);\r
+ regionMap.put(String.valueOf(regionId), tdwgArea);\r
+ }else {\r
+ NamedArea area = getOtherAreas(state, emCode, tdwgCode);\r
+ if (area != null){\r
+ regionMap.put(String.valueOf(regionId), area);\r
+ }else{\r
+ logger.warn("emCode did not map to valid tdwgCode: " + CdmUtils.Nz(emCode) + "->" + CdmUtils.Nz(tdwgCode));\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+\r
+ /**\r
+ * Returns the are for a given TDWG code. See {@link #getEmTdwgMap(Source)} for exceptions from\r
+ * the TDWG code\r
+ * @param state \r
+ * @param tdwgCode\r
+ */\r
+ private NamedArea getNamedArea(BerlinModelImportState state, String tdwgCode) {\r
+ NamedArea area;\r
+ if (tdwgCode.equalsIgnoreCase("Ab")){\r
+ area = getNamedArea(state, BerlinModelTransformer.uuidAzerbaijanNakhichevan, "Azerbaijan & Nakhichevan", "Azerbaijan (including Nakhichevan)", "Ab", null, null);\r
+ getTermService().saveOrUpdate(area);\r
+ }else if (tdwgCode.equalsIgnoreCase("Uk")){\r
+ area = getNamedArea(state, BerlinModelTransformer.uuidUkraineAndCrimea , "Ukraine & Crimea", "Ukraine (including Crimea)", "Uk", null, null);\r
+ getTermService().saveOrUpdate(area);\r
+ }else if (tdwgCode.equalsIgnoreCase("Rf")){\r
+ area = Country.RUSSIANFEDERATION();\r
+ }else if (tdwgCode.equalsIgnoreCase("Gg")){\r
+ area = Country.GEORGIA();\r
+ }else{\r
+ area = TdwgAreaProvider.getAreaByTdwgAbbreviation(tdwgCode);\r
+ }\r
+ if (area == null){\r
+ logger.warn("Area is null for " + tdwgCode);\r
+ }\r
+ return area;\r
+ }\r
+\r
+ /**\r
+ * @param regionFks\r
+ * @return\r
+ */\r
+ private String getSqlWhere(SortedSet<Integer> regionFks) {\r
+ String sqlWhere = "";\r
+ for (Integer regionFk : regionFks){\r
+ sqlWhere += regionFk + ","; \r
+ }\r
+ sqlWhere = sqlWhere.substring(0, sqlWhere.length()-1);\r
+ return sqlWhere;\r
+ }\r
+\r
+ /**\r
+ * Returns a map which is filled by the emCode->TdwgCode mapping defined in emArea.\r
+ * Some exceptions are defined for emCode 'Ab','Rf','Uk' and some additional mapping is added \r
+ * for 'Ab / Ab(A)', 'Ga / Ga(F)', 'It / It(I)', 'Ar / Ar(A)','Hs / Hs(S)'\r
+ * @param source\r
+ * @throws SQLException\r
+ */\r
+ private Map<String, String> getEmTdwgMap(Source source) throws SQLException {\r
+ String sql;\r
+ ResultSet rs;\r
+ Map<String, String> emTdwgMap = new HashMap<String, String>();\r
+ sql = " SELECT EmCode, TDWGCode FROM emArea ";\r
+ rs = source.getResultSet(sql);\r
+ while (rs.next()){\r
+ String emCode = rs.getString("EMCode");\r
+ String TDWGCode = rs.getString("TDWGCode");\r
+ if (StringUtils.isNotBlank(emCode) ){\r
+ emCode = emCode.trim();\r
+ if (emCode.equalsIgnoreCase("Ab") || emCode.equalsIgnoreCase("Rf")|| \r
+ emCode.equalsIgnoreCase("Uk") || emCode.equalsIgnoreCase("Gg")){\r
+ emTdwgMap.put(emCode, emCode);\r
+ }else if (StringUtils.isNotBlank(TDWGCode)){\r
+ emTdwgMap.put(emCode, TDWGCode.trim());\r
+ }\r
+ }\r
+ }\r
+ emTdwgMap.put("Ab / Ab(A)", "Ab");\r
+ emTdwgMap.put("Ga / Ga(F)", "FRA-FR");\r
+ emTdwgMap.put("It / It(I)", "ITA");\r
+ emTdwgMap.put("Uk / Uk(U)", "Uk");\r
+ emTdwgMap.put("Ar / Ar(A)", "TCS-AR");\r
+ emTdwgMap.put("Hs / Hs(S)", "SPA-SP");\r
+ \r
+ return emTdwgMap;\r
+ }\r
+\r
+\r
+ /**\r
+ * Returns the first non-image gallery description. Creates a new one if no description exists.\r
+ * @param taxon\r
+ * @return\r
+ */\r
+ private TaxonDescription getDescription(Taxon taxon) {\r
+ TaxonDescription result = null;\r
+ for (TaxonDescription taxonDescription : taxon.getDescriptions()){\r
+ if (! taxonDescription.isImageGallery()){\r
+ result = taxonDescription;\r
+ }\r
+ }\r
+ if (result == null){\r
+ result = TaxonDescription.NewInstance(taxon);\r
+ }\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {\r
+ String nameSpace;\r
+ Class<?> cdmClass;\r
+ Set<String> idSet;\r
+ Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();\r
+ \r
+ String pos = "0";\r
+ try{\r
+ Set<String> taxonIdSet = new HashSet<String>();\r
+ Set<String> nameIdSet = new HashSet<String>();\r
+ Set<String> referenceIdSet = new HashSet<String>();\r
+ while (rs.next()){\r
+ handleForeignKey(rs, taxonIdSet, "taxonId");\r
+ handleForeignKey(rs, taxonIdSet, "misappliedTaxonId");\r
+ handleForeignKey(rs, referenceIdSet, "refId");\r
+ handleForeignKey(rs, referenceIdSet, "languageRefRefFk");\r
+ handleForeignKey(rs, nameIdSet, "NameInSourceFk");\r
+ handleForeignKey(rs, nameIdSet, "PTNameFk");\r
+ handleForeignKey(rs, referenceIdSet, "MisNameRefFk");\r
+ }\r
+ \r
+ //name map\r
+ nameSpace = BerlinModelTaxonNameImport.NAMESPACE;\r
+ cdmClass = TaxonNameBase.class;\r
+ idSet = nameIdSet;\r
+ Map<String, TaxonNameBase<?,?>> nameMap = (Map<String, TaxonNameBase<?,?>>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);\r
+ result.put(nameSpace, nameMap);\r
+ \r
+ //taxon map\r
+ nameSpace = BerlinModelTaxonImport.NAMESPACE;\r
+ cdmClass = TaxonBase.class;\r
+ idSet = taxonIdSet;\r
+ Map<String, TaxonBase<?>> taxonMap = (Map<String, TaxonBase<?>>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);\r
+ result.put(nameSpace, taxonMap);\r
+ \r
+ //reference map\r
+ nameSpace = BerlinModelReferenceImport.REFERENCE_NAMESPACE;\r
+ cdmClass = Reference.class;\r
+ idSet = referenceIdSet;\r
+ Map<String, Reference> referenceMap = (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);\r
+ result.put(nameSpace, referenceMap);\r
+ // TODO remove if problem with duplicate DescElement_Annot id is solved\r
+ } catch (SQLException e) {\r
+ throw new RuntimeException("pos: " +pos, e);\r
+ } catch (NullPointerException nep){\r
+ logger.error("NullPointerException in getRelatedObjectsForPartition()");\r
+ }\r
+ return result;\r
+ }\r
+ \r
+\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)\r
+ */\r
+ @Override\r
+ protected boolean doCheck(BerlinModelImportState state){\r
+ IOValidator<BerlinModelImportState> validator = new BerlinModelCommonNamesImportValidator();\r
+ return validator.validate(state);\r
}\r
\r
/* (non-Javadoc)\r
* @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)\r
*/\r
- protected boolean isIgnore(IImportConfigurator config){\r
- return ! config.isDoOccurrence();\r
+ protected boolean isIgnore(BerlinModelImportState state){\r
+ return ! state.getConfig().isDoCommonNames();\r
}\r
- \r
+\r
}\r