\r
package eu.etaxonomy.cdm.io.cyprus;\r
\r
-import java.util.Arrays;\r
+import java.util.ArrayList;\r
import java.util.HashMap;\r
import java.util.HashSet;\r
import java.util.Iterator;\r
+import java.util.List;\r
import java.util.Map;\r
import java.util.Set;\r
import java.util.UUID;\r
import org.apache.log4j.Logger;\r
import org.springframework.stereotype.Component;\r
\r
+import eu.etaxonomy.cdm.api.service.pager.Pager;\r
import eu.etaxonomy.cdm.common.CdmUtils;\r
import eu.etaxonomy.cdm.io.common.mapping.IInputTransformer;\r
import eu.etaxonomy.cdm.io.common.mapping.UndefinedTransformerMethodException;\r
import eu.etaxonomy.cdm.io.excel.common.ExcelImporterBase;\r
import eu.etaxonomy.cdm.model.common.CdmBase;\r
import eu.etaxonomy.cdm.model.common.TermVocabulary;\r
+import eu.etaxonomy.cdm.model.description.DescriptionBase;\r
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
import eu.etaxonomy.cdm.model.description.Distribution;\r
import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;\r
import eu.etaxonomy.cdm.model.location.NamedArea;\r
import eu.etaxonomy.cdm.model.location.NamedAreaLevel;\r
import eu.etaxonomy.cdm.model.location.NamedAreaType;\r
+import eu.etaxonomy.cdm.model.location.TdwgArea;\r
+import eu.etaxonomy.cdm.model.location.WaterbodyOrCountry;\r
import eu.etaxonomy.cdm.model.name.BotanicalName;\r
-import eu.etaxonomy.cdm.model.name.Rank;\r
-import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
import eu.etaxonomy.cdm.model.reference.Reference;\r
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;\r
import eu.etaxonomy.cdm.model.taxon.Taxon;\r
-import eu.etaxonomy.cdm.strategy.parser.INonViralNameParser;\r
-import eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl;\r
\r
/**\r
* @author a.babadshanjan\r
public class CyprusDistributionImport extends ExcelImporterBase<CyprusImportState> {\r
private static final Logger logger = Logger.getLogger(CyprusDistributionImport.class);\r
\r
- public static Set<String> validMarkers = new HashSet<String>(Arrays.asList(new String[]{"", "valid", "accepted", "a", "v", "t"}));\r
- public static Set<String> synonymMarkers = new HashSet<String>(Arrays.asList(new String[]{"", "invalid", "synonym", "s", "i"}));\r
- \r
/* (non-Javadoc)\r
* @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)\r
*/\r
\r
private Reference refMeikle1977 = ReferenceFactory.newGeneric();\r
private Reference refMeikle1985 = ReferenceFactory.newGeneric();\r
-\r
- \r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.io.excel.common.ExcelImporterBase#analyzeRecord(java.util.HashMap, eu.etaxonomy.cdm.io.excel.common.ExcelImportState)\r
- */\r
- @Override\r
- protected boolean analyzeRecord(HashMap<String, String> record, CyprusImportState state) {\r
- \r
- boolean success = true;\r
- Set<String> keys = record.keySet();\r
- \r
- CyprusDistributionRow cyprusDistributionRow = new CyprusDistributionRow();\r
- state.setCyprusDistributionRow(cyprusDistributionRow);\r
- \r
- for (String originalKey: keys) {\r
- Integer index = 0;\r
- String indexedKey = CdmUtils.removeDuplicateWhitespace(originalKey.trim()).toString();\r
- String[] split = indexedKey.split("_");\r
- String key = split[0];\r
- if (split.length > 1){\r
- String indexString = split[1];\r
- try {\r
- index = Integer.valueOf(indexString);\r
- } catch (NumberFormatException e) {\r
- String message = "Index must be integer";\r
- logger.error(message);\r
- continue;\r
- }\r
- }\r
- \r
- String value = (String) record.get(indexedKey);\r
- if (! StringUtils.isBlank(value)) {\r
- if (logger.isDebugEnabled()) { logger.debug(key + ": " + value); }\r
- value = CdmUtils.removeDuplicateWhitespace(value.trim()).toString();\r
- }else{\r
- continue;\r
- }\r
- \r
- \r
- if (key.equalsIgnoreCase(SPECIES_COLUMN)) {\r
- cyprusDistributionRow.setSpecies(value);\r
- \r
- } else if(key.equalsIgnoreCase(DISTRIBUTION_COLUMN)) {\r
- cyprusDistributionRow.setDistribution(value);\r
- \r
- } else if(key.equalsIgnoreCase(REFERENCE_COLUMN)) {\r
- cyprusDistributionRow.setReference(value);\r
- \r
- } else {\r
- success = false;\r
- logger.error("Unexpected column header " + key);\r
- }\r
- }\r
- return success;\r
- }\r
- \r
- private static INonViralNameParser nameParser = NonViralNameParserImpl.NewInstance();\r
\r
+ private Map<String, Taxon> taxonWithAuthorStore = new HashMap<String, Taxon>(); \r
+ private Map<String, Taxon> taxonNameOnlyStore = new HashMap<String, Taxon>();\r
+\r
+\r
private boolean areasCreated = false;\r
private Map<String, NamedArea> divisions = new HashMap<String, NamedArea>();\r
\r
\r
try {\r
//divisions\r
+ makeNewDivisions(state, transformer);\r
\r
+ loadReferences();\r
+ loadStatus();\r
+ loadTaxa();\r
\r
- NamedAreaType areaType = NamedAreaType.NATURAL_AREA();\r
- NamedAreaLevel areaLevel = NamedAreaLevel.NewInstance("Cyprus Division", "Cyprus Division", null);\r
- getTermService().save(areaLevel);\r
- \r
- TermVocabulary areaVocabulary = TermVocabulary.NewInstance("Cyprus devisions", "Cyprus divisions", null, null);\r
- areaVocabulary.setUuid(CyprusTransformer.uuidCyprusDivisionsVocabulary);\r
- getVocabularyService().save(areaVocabulary);\r
- \r
- for(int i = 1; i <= 8; i++){\r
- UUID divisionUuid = transformer.getNamedAreaUuid(String.valueOf(i));\r
- NamedArea division = this.getNamedArea(state, divisionUuid, "Division " + i, "Cyprus: Division " + i, String.valueOf(i), areaType, areaLevel, areaVocabulary);\r
- divisions.put(String.valueOf(i), division);\r
- getTermService().save(division);\r
- }\r
- \r
-// refMeikle1977 = getReferenceService().findByTitle(Reference.class, "Meikle 1977", null, null, null, null, null, null);\r
-// refMeikle1985 = getReferenceService().findByTitle(Reference.class, "Meikle 1977", null, null, null, null, null, null);\r
-\r
areasCreated = true;\r
- indigenousStatus = (PresenceTerm)getTermService().find(CyprusTransformer.indigenousUuid);\r
- casualStatus = (PresenceTerm)getTermService().find(CyprusTransformer.casualUuid);\r
- nonInvasiveStatus = (PresenceTerm)getTermService().find(CyprusTransformer.nonInvasiveUuid);\r
- invasiveStatus = (PresenceTerm)getTermService().find(CyprusTransformer.invasiveUuid);\r
- questionableStatus = (PresenceTerm)getTermService().find(CyprusTransformer.questionableUuid);\r
\r
return true;\r
- } catch (UndefinedTransformerMethodException e) {\r
+\r
+ } catch (Exception e) {\r
e.printStackTrace();\r
return false;\r
}\r
return true;\r
\r
}\r
- \r
+\r
/** \r
* Stores taxa records in DB\r
*/\r
protected boolean firstPass(CyprusImportState state) {\r
\r
boolean success = true;\r
- makeAreasAndReference(state);\r
- CyprusDistributionRow taxonLight = state.getCyprusDistributionRow();\r
+ success &= makeAreasAndReference(state);\r
\r
+ CyprusDistributionRow taxonLight = state.getCyprusDistributionRow();\r
//species name\r
String taxonStr = taxonLight.getSpecies();\r
+ if ("#entfällt#".equalsIgnoreCase(taxonStr)){\r
+ logger.warn("entfällt");\r
+ return success;\r
+ }\r
Taxon taxon = getTaxon(state, taxonStr);\r
Reference ref = getReference(taxonLight.getReference());\r
- makeDistribution(state, taxon, taxonLight.getDistribution(), ref);\r
- \r
+ if (taxon != null){\r
+ makeDistribution(state, taxon, taxonLight.getDistribution(), ref);\r
+ getTaxonService().save(taxon);\r
+ } \r
\r
- getTaxonService().save(taxon);\r
return success;\r
}\r
\r
protected static final boolean IMAGE_GALLERY = false;\r
\r
private void makeDistribution(CyprusImportState state, Taxon taxon, String distributionStr, Reference ref) {\r
- TaxonDescription description = getTaxonDescription(taxon, NO_IMAGE_GALLERY, CREATE);\r
+ \r
+// TaxonDescription description = getTaxonDescription(taxon, NO_IMAGE_GALLERY, CREATE);\r
+ TaxonDescription description = getNewDescription(state, taxon);\r
+ PresenceAbsenceTermBase<?> status = getStatus(taxon);\r
+ status = removeDoubtfulStatus(status);\r
+ removeDistributions(taxon);\r
+ \r
for (int i = 1; i <= 8; i++){\r
if (distributionStr.contains(String.valueOf(i))){\r
NamedArea area = this.divisions.get(String.valueOf(i));\r
- PresenceAbsenceTermBase<?> status = getStatus(taxon);\r
- status = removeDoubtfulStatus(status);\r
- removeDistributions(taxon);\r
Distribution distribution = Distribution.NewInstance(area, status);\r
distribution.addSource(null, null, ref, null);\r
description.addElement(distribution);\r
}\r
}\r
}\r
+ \r
+ private TaxonDescription getNewDescription(CyprusImportState state, Taxon taxon) {\r
+ Reference excelRef = state.getConfig().getSourceReference();\r
+ TaxonDescription desc = TaxonDescription.NewInstance(taxon, false);\r
+ desc.setTitleCache(excelRef.getTitleCache() + " for " + taxon.getTitleCache(), true);\r
+ desc.addSource(null, null, excelRef, null);\r
+ return desc;\r
+ }\r
\r
private PresenceAbsenceTermBase<?> indigenousStatus;\r
private PresenceAbsenceTermBase<?> casualStatus;\r
private PresenceAbsenceTermBase<?> questionableStatus;\r
\r
private PresenceAbsenceTermBase<?> removeDoubtfulStatus(PresenceAbsenceTermBase<?> status) {\r
+ if (status == null){\r
+ return null;\r
+ }\r
if (status.getUuid().equals(CyprusTransformer.indigenousDoubtfulUuid)){\r
status = indigenousStatus;\r
}else if (status.getUuid().equals(CyprusTransformer.casualDoubtfulUuid)){\r
* @param taxon\r
* @param statusSet\r
*/\r
- private Set<Distribution> removeDistributions(Taxon taxon) {\r
- Set<Distribution> result = new HashSet<Distribution>();\r
+ private void removeDistributions(Taxon taxon) {\r
+ Set<Distribution> toRemove = new HashSet<Distribution>();\r
for (TaxonDescription desc : taxon.getDescriptions()){\r
if (desc.isImageGallery() == NO_IMAGE_GALLERY ){\r
Iterator<DescriptionElementBase> iterator = desc.getElements().iterator();\r
while (iterator.hasNext()){\r
DescriptionElementBase element = iterator.next();\r
if (element.isInstanceOf(Distribution.class)){\r
- iterator.remove();\r
+ toRemove.add(CdmBase.deproxy(element, Distribution.class));\r
+// iterator.remove();\r
}\r
}\r
}\r
}\r
- return result;\r
+ for (Distribution distribution : toRemove){\r
+ DescriptionBase desc = distribution.getInDescription();\r
+ desc.removeElement(distribution);\r
+ getDescriptionService().saveOrUpdate(desc);\r
+ }\r
+ return;\r
}\r
\r
/**\r
return result;\r
}\r
\r
- Map<String, Taxon> taxonStore = new HashMap<String, Taxon>();\r
-\r
-\r
private Taxon getTaxon(CyprusImportState state, String taxonStr) {\r
Taxon result;\r
\r
- if (taxonStore.get(taxonStr) != null){\r
- result = taxonStore.get(taxonStr);\r
- }else{\r
+ if (taxonWithAuthorStore.get(taxonStr) != null){\r
+ result = taxonWithAuthorStore.get(taxonStr);\r
+ }else if(taxonNameOnlyStore.get(taxonStr) != null){\r
+ result = taxonNameOnlyStore.get(taxonStr);\r
+ }else {\r
// result = getTaxonService().findBestMatchingTaxon(taxonStr);\r
- TaxonNameBase name = BotanicalName.NewInstance(Rank.SPECIES());\r
- name.setTitleCache(taxonStr, true);\r
- \r
- result = Taxon.NewInstance(name, null);\r
- if (result == null){\r
+// TaxonNameBase name = BotanicalName.NewInstance(Rank.SPECIES());\r
+// name.setTitleCache(taxonStr, true);\r
+// \r
+// result = Taxon.NewInstance(name, null);\r
+// if (result == null){\r
logger.warn("Taxon not found: " + taxonStr);\r
- }else{\r
- taxonStore.put(taxonStr, result);\r
- }\r
+// }else{\r
+// taxonStore.put(taxonStr, result);\r
+// }\r
+ result = null;\r
}\r
return result;\r
}\r
\r
+ \r
\r
+ /**\r
+ * \r
+ */\r
+ private void loadTaxa() {\r
+ List<String> propertyPaths = new ArrayList();\r
+ propertyPaths.add("*.name");\r
+ List<Taxon> taxonList = (List)getTaxonService().list(Taxon.class, null, null, null, propertyPaths);\r
+ for (Taxon taxon: taxonList){\r
+ if (taxon.getTaxonNodes().size() == 0){\r
+ continue;\r
+ }\r
+ String nameTitle = taxon.getName().getTitleCache();\r
+ String nameCache = CdmBase.deproxy(taxon.getName(), BotanicalName.class).getNameCache();\r
+ Taxon returnValue = taxonWithAuthorStore.put(nameTitle, taxon);\r
+ if (returnValue != null){\r
+ logger.warn("Duplicate titleCache entry for taxon: " + nameTitle);\r
+ }\r
+ returnValue = taxonNameOnlyStore.put(nameCache, taxon);\r
+ if (returnValue != null){\r
+ logger.warn("Duplicate nameCache entry for taxon: " + nameCache);\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * @param meikle1977List\r
+ */\r
+ private void loadReferences() {\r
+ Pager<Reference> meikle1977List = getReferenceService().findByTitle(Reference.class, "R. D. Meikle, Flora of Cyprus 1. 1977", null, null, null, null, null, null);\r
+ \r
+ if (meikle1977List.getCount() != 1){\r
+ logger.error("There is not exactly 1 Meikle 1977 reference");\r
+ }else{\r
+ refMeikle1977 = meikle1977List.getRecords().iterator().next();\r
+ }\r
+ \r
+ Pager<Reference> meikle1985List = getReferenceService().findByTitle(Reference.class, "R. D. Meikle, Flora of Cyprus 2. 1985", null, null, null, null, null, null);\r
+ if (meikle1985List.getCount() != 1){\r
+ logger.error("There is not exactly 1 Meikle 1985 reference");\r
+ }else{\r
+ refMeikle1985 = meikle1977List.getRecords().iterator().next();\r
+ }\r
+ }\r
+\r
+ /**\r
+ * \r
+ */\r
+ private void loadStatus() {\r
+ indigenousStatus = (PresenceTerm)getTermService().find(CyprusTransformer.indigenousUuid);\r
+ casualStatus = (PresenceTerm)getTermService().find(CyprusTransformer.casualUuid);\r
+ nonInvasiveStatus = (PresenceTerm)getTermService().find(CyprusTransformer.nonInvasiveUuid);\r
+ invasiveStatus = (PresenceTerm)getTermService().find(CyprusTransformer.invasiveUuid);\r
+ questionableStatus = (PresenceTerm)getTermService().find(CyprusTransformer.questionableUuid);\r
+ }\r
+\r
+ /**\r
+ * @param state\r
+ * @param transformer\r
+ * @throws UndefinedTransformerMethodException\r
+ */\r
+ private void makeNewDivisions(CyprusImportState state,\r
+ IInputTransformer transformer)\r
+ throws UndefinedTransformerMethodException {\r
+ NamedAreaType areaType = NamedAreaType.NATURAL_AREA();\r
+ NamedAreaLevel areaLevel = (NamedAreaLevel)getTermService().find(CyprusTransformer.uuidCyprusDivisionsAreaLevel);\r
+ if (areaLevel == null){\r
+ areaLevel = NamedAreaLevel.NewInstance("Cyprus Division", "Cyprus Division", null);\r
+ getTermService().save(areaLevel);\r
+ }\r
+ \r
+ TermVocabulary areaVocabulary = getVocabulary(CyprusTransformer.uuidCyprusDivisionsVocabulary, "Cyprus devisions", "Cyprus divisions", null, null, true);\r
+ TdwgArea tdwg4Cyprus = (TdwgArea)getTermService().find(UUID.fromString("9d447b51-e363-4dde-ae40-84c55679983c"));\r
+ WaterbodyOrCountry isoCountryCyprus = (WaterbodyOrCountry)getTermService().find(UUID.fromString("4b13d6b8-7eca-4d42-8172-f2018051ca19"));\r
+ \r
+ for(int i = 1; i <= 8; i++){\r
+ UUID divisionUuid = transformer.getNamedAreaUuid(String.valueOf(i));\r
+ NamedArea division = this.getNamedArea(state, divisionUuid, "Division " + i, "Cyprus: Division " + i, String.valueOf(i), areaType, areaLevel, areaVocabulary);\r
+ divisions.put(String.valueOf(i), division);\r
+ tdwg4Cyprus.addIncludes(division);\r
+ isoCountryCyprus.addIncludes(division);\r
+ getTermService().save(division);\r
+ }\r
+ }\r
+\r
+ \r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.cdm.io.excel.common.ExcelImporterBase#analyzeRecord(java.util.HashMap, eu.etaxonomy.cdm.io.excel.common.ExcelImportState)\r
+ */\r
+ @Override\r
+ protected boolean analyzeRecord(HashMap<String, String> record, CyprusImportState state) {\r
+ \r
+ boolean success = true;\r
+ Set<String> keys = record.keySet();\r
+ \r
+ CyprusDistributionRow cyprusDistributionRow = new CyprusDistributionRow();\r
+ state.setCyprusDistributionRow(cyprusDistributionRow);\r
+ \r
+ for (String originalKey: keys) {\r
+ String indexedKey = CdmUtils.removeDuplicateWhitespace(originalKey.trim()).toString();\r
+ String[] split = indexedKey.split("_");\r
+ String key = split[0];\r
+ if (split.length > 1){\r
+ String indexString = split[1];\r
+ try {\r
+ Integer.valueOf(indexString);\r
+ } catch (NumberFormatException e) {\r
+ String message = "Index must be integer";\r
+ logger.error(message);\r
+ continue;\r
+ }\r
+ }\r
+ \r
+ String value = (String) record.get(indexedKey);\r
+ if (! StringUtils.isBlank(value)) {\r
+ if (logger.isDebugEnabled()) { logger.debug(key + ": " + value); }\r
+ value = CdmUtils.removeDuplicateWhitespace(value.trim()).toString();\r
+ }else{\r
+ continue;\r
+ }\r
+ \r
+ \r
+ if (key.equalsIgnoreCase(SPECIES_COLUMN)) {\r
+ cyprusDistributionRow.setSpecies(value);\r
+ \r
+ } else if(key.equalsIgnoreCase(DISTRIBUTION_COLUMN)) {\r
+ cyprusDistributionRow.setDistribution(value);\r
+ \r
+ } else if(key.equalsIgnoreCase(REFERENCE_COLUMN)) {\r
+ cyprusDistributionRow.setReference(value);\r
+ \r
+ } else {\r
+ success = false;\r
+ logger.error("Unexpected column header " + key);\r
+ }\r
+ }\r
+ return success;\r
+ }\r
+ \r
+ \r
/** \r
* \r
*/\r