import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
+import eu.etaxonomy.cdm.api.service.ITermService;
import eu.etaxonomy.cdm.common.CdmUtils;
import eu.etaxonomy.cdm.ext.geo.GeoServiceArea;
import eu.etaxonomy.cdm.ext.geo.GeoServiceAreaAnnotatedMapping;
import eu.etaxonomy.cdm.model.description.CategoricalData;
import eu.etaxonomy.cdm.model.description.Distribution;
import eu.etaxonomy.cdm.model.description.Feature;
+import eu.etaxonomy.cdm.model.description.FeatureNode;
+import eu.etaxonomy.cdm.model.description.FeatureTree;
import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
import eu.etaxonomy.cdm.model.description.State;
import eu.etaxonomy.cdm.model.description.TaxonDescription;
private OrderedTermVocabulary<State> habitatVoc;
private Map<String, State> lifeformMap = new HashMap<>();
+ private OrderedTermVocabulary<PresenceAbsenceTerm> statusVoc;
+ private PresenceAbsenceTerm rangeRestricted;
+ private PresenceAbsenceTerm doubtfullyRangeRestricted;
+
+
private OrderedTermVocabulary<State> chorologicalVoc;
+ private Map<String, State> chorologyMap = new HashMap<>();
private static List<String> expectedKeys= Arrays.asList(new String[]{
STATUS,CHOROLOGICAL_CATEGOGY,LIFE_FORM,"A","C","G","H","M","P","R","W", "Taxon"
});
- private String lastFamily;
private String lastGenus;
private String lastSpecies;
private NonViralNameParserImpl parser = NonViralNameParserImpl.NewInstance();
initLifeformVocabulary(state);
initHabitatVocabulary(state);
initChorologicalVocabulary(state);
+ initStatusVocabulary(state);
+ makeFeatureTree(state);
String line = state.getCurrentLine() + ": ";
HashMap<String, String> record = state.getOriginalRecord();
}
String noStr = getValue(record, "Unique ID");
- Integer id = noStr == null? null : Integer.valueOf(noStr);
Taxon taxon = makeTaxon(state, line, record, noStr);
//Distribution
state.putTaxon(noStr, taxon);
}
+ boolean hasFeatureTree = false;
+ /**
+ * @param state
+ */
+ private void makeFeatureTree(SimpleExcelTaxonImportState<CONFIG> state) {
+ if (hasFeatureTree ){
+ return;
+ }
+ if (getFeatureTreeService().find(state.getConfig().getUuidFeatureTree()) != null){
+ hasFeatureTree = true;
+ return;
+ }
+ FeatureTree result = FeatureTree.NewInstance(state.getConfig().getUuidFeatureTree());
+ result.setTitleCache(state.getConfig().getFeatureTreeTitle(), true);
+ FeatureNode root = result.getRoot();
+ FeatureNode newNode;
+
+ ITermService service = getTermService();
+ Feature newFeature = (Feature)service.find(Feature.DISTRIBUTION().getUuid());
+ newNode = FeatureNode.NewInstance(newFeature);
+ root.addChild(newNode);
+
+ newFeature = (Feature)service.find(FloraHellenicaTransformer.uuidFloraHellenicaChorologyFeature);
+ newNode = FeatureNode.NewInstance(newFeature);
+ root.addChild(newNode);
+
+ newFeature = (Feature)service.find(Feature.LIFEFORM().getUuid());
+ newNode = FeatureNode.NewInstance(newFeature);
+ root.addChild(newNode);
+
+ newFeature = (Feature)service.find(Feature.HABITAT().getUuid());
+ newNode = FeatureNode.NewInstance(newFeature);
+ root.addChild(newNode);
+
+
+ newFeature = (Feature)service.find(Feature.NOTES().getUuid());
+ newNode = FeatureNode.NewInstance(newFeature);
+ root.addChild(newNode);
+
+ getFeatureTreeService().saveOrUpdate(result);
+ hasFeatureTree = true;
+
+ }
+
/**
* @param state
* @param line
TaxonDescription desc) {
HashMap<String, String> record = state.getOriginalRecord();
- String value = getValue(record, CHOROLOGICAL_CATEGOGY);
- //TODO
+ String valueStr = getValue(record, CHOROLOGICAL_CATEGOGY);
+ String value = valueStr;
+ if (value == null){
+ return;
+ }
+ Feature choroFeature = getFeature(state, FloraHellenicaTransformer.uuidFloraHellenicaChorologyFeature,
+ "Chorology", "The Chorological Category", "Choro", null);
+ CategoricalData catData = CategoricalData.NewInstance(choroFeature);
+
+ String[] splits = value.split(" & ");
+ replaceDirection(splits, line);
+ for (String split: splits){
+ String[] splitsA = split.split("/");
+ for (String splitA : splitsA){
+ String[] splitsB = splitA.split(", ");
+ for (String splitB : splitsB){
+ splitB = normalizeChorology(splitB);
+ State choroTerm = chorologyMap.get(splitB);
+ if (choroTerm == null){
+ logger.warn(line + "Some chorology could not be recognized in: " + value + "; Term was: " +splitB);
+ }else{
+ catData.addStateData(choroTerm);
+ }
+ }
+ }
+ }
+ desc.addElement(catData);
+ }
+ /**
+ * @param splitB
+ * @return
+ */
+ private String normalizeChorology(String choroStr) {
+ choroStr = choroStr.trim()
+ .replace("BK", "Bk")
+ .replace("Austral.", "Austr.")
+ .replace("trop.As.", "trop. As.");
+ if (choroStr.startsWith("[") && !choroStr.endsWith("]")){
+ choroStr += "]";
+ }else if (!choroStr.startsWith("[") && choroStr.endsWith("]")){
+ choroStr = "[" + choroStr;
+ }
+ return choroStr;
+ }
+ /**
+ * @param splits
+ * @param line
+ */
+ private void replaceDirection(String[] splits, String line) {
+ if (splits.length > 1){
+ String[] divs = splits[1].split("-");
+ if (divs.length == 2){
+ splits[0] = splits[0] + "-" + divs[1];
+ }else{
+ logger.warn(line + "Splits[1] has not expected format: " + splits[1]);
+ }
+ }
}
/**
TaxonDescription desc, String key, UUID uuid, String line, String id) {
HashMap<String, String> record = state.getOriginalRecord();
String value = getValue(record, key);
- if (value != null){
- NamedArea area = getNamedArea(state, uuid, null, null, null, null, null);
- Distribution dist;
+ NamedArea area = getNamedArea(state, uuid, null, null, null, null, null);
+ Distribution dist;
+ if (value == null || ".".equals(value) ){
+ dist = Distribution.NewInstance(area, PresenceAbsenceTerm.NATIVE());
if (".".equals(value)){
- dist = Distribution.NewInstance(area, PresenceAbsenceTerm.ABSENT());
logger.warn(line + "'.' Should not exist anmore as a distribution status: '" + value + "' for " + key);
- }else if ("Range-restricted".equals(value)){
- dist = Distribution.NewInstance(area, PresenceAbsenceTerm.ENDEMIC_FOR_THE_RELEVANT_AREA());
- }else if ("?Range-restricted".equals(value)){
- dist = Distribution.NewInstance(area, PresenceAbsenceTerm.ENDEMIC_FOR_THE_RELEVANT_AREA());
- }else if ("Xenophyte".equals(value)){
- dist = Distribution.NewInstance(area, PresenceAbsenceTerm.INTRODUCED());
- }else if ("?Xenophyte".equals(value)){
- dist = Distribution.NewInstance(area, PresenceAbsenceTerm.INTRODUCED_DOUBTFULLY_INTRODUCED());
- }else {
- logger.warn(line + "Not matching status. This should not happpen '" + value + "' for " + key);
- return;
}
- desc.addElement(dist);
- dist.addImportSource(id, getWorksheetName(), getSourceCitation(state), line);
+ }else if ("Range-restricted".equals(value)){
+ dist = Distribution.NewInstance(area, rangeRestricted);
+ }else if ("?Range-restricted".equals(value)){
+ dist = Distribution.NewInstance(area, doubtfullyRangeRestricted);
+ }else if ("Xenophyte".equals(value)){
+ dist = Distribution.NewInstance(area, PresenceAbsenceTerm.INTRODUCED());
+ }else if ("?Xenophyte".equals(value)){
+ dist = Distribution.NewInstance(area, PresenceAbsenceTerm.INTRODUCED_DOUBTFULLY_INTRODUCED());
+ }else {
+ logger.warn(line + "Not matching status. This should not happpen '" + value + "' for " + key);
+ return;
}
+ desc.addElement(dist);
+ dist.addImportSource(id, getWorksheetName(), getSourceCitation(state), line);
}
@SuppressWarnings("unchecked")
description, label, null, termSourceUri);
chorologicalVoc.setUuid(vocUuid);
- addChorological(state, "Bk", "Balkan", "", FloraHellenicaTransformer.uuidChorologicalBk);
- addChorological(state, "BI", "Balkan-Italy", "", FloraHellenicaTransformer.uuidChorologicalBI);
- addChorological(state, "BA", "Balkan-Anatolia", "", FloraHellenicaTransformer.uuidChorologicalBA);
- addChorological(state, "BC", "Balkan-Central Europe", "", FloraHellenicaTransformer.uuidChorologicalBC);
- addChorological(state, "EM", "East Mediterranean", "", FloraHellenicaTransformer.uuidChorologicalEM);
- addChorological(state, "Me", "Mediterranean", "", FloraHellenicaTransformer.uuidChorologicalMe);
- addChorological(state, "MA", "Mediterranean-Atlantic", "", FloraHellenicaTransformer.uuidChorologicalMA);
- addChorological(state, "ME", "Mediterranean-European", "", FloraHellenicaTransformer.uuidChorologicalME);
- addChorological(state, "MS", "Mediterranean-SW Asian", "", FloraHellenicaTransformer.uuidChorologicalMS);
- addChorological(state, "EA", "European-SW Asian", "", FloraHellenicaTransformer.uuidChorologicalEA);
- addChorological(state, "ES", "Euro-Siberian", "", FloraHellenicaTransformer.uuidChorologicalES);
- addChorological(state, "Eu", "European", "", FloraHellenicaTransformer.uuidChorologicalEu);
- addChorological(state, "Pt", "Paleotemperate", "", FloraHellenicaTransformer.uuidChorologicalPt);
- addChorological(state, "Ct", "Circumtemperate", "", FloraHellenicaTransformer.uuidChorologicalCt);
- addChorological(state, "IT", "Irano-Turanian", "", FloraHellenicaTransformer.uuidChorologicalIT);
- addChorological(state, "SS", "Saharo-Sindian", "", FloraHellenicaTransformer.uuidChorologicalSS);
- addChorological(state, "ST", "Subtropical-tropical", "", FloraHellenicaTransformer.uuidChorologicalST);
- addChorological(state, "Bo", "(Circum-) Boreal", "", FloraHellenicaTransformer.uuidChorologicalBo);
- addChorological(state, "AA", "Arctic-Alpine", "", FloraHellenicaTransformer.uuidChorologicalAA);
- addChorological(state, "Co", "Cosmopolitan", "", FloraHellenicaTransformer.uuidChorologicalCo);
addChorological(state, "*", "Greek endemic", "Greek endemics (incl. single-island and single-mountain endemics)", FloraHellenicaTransformer.uuidChorologicalStar);
+ addChorological(state, "Bk", "Balkan", "Taxa restricted to Balkan countries, occasionally extending to adjacent parts of SE Europe", FloraHellenicaTransformer.uuidChorologicalBk);
+ addChorological(state, "BI", "Balkan-Italy", "Taxa restricted to Balkan countries and Italy (amphi-Adreatic)", FloraHellenicaTransformer.uuidChorologicalBI);
+ addChorological(state, "BA", "Balkan-Anatolia", "Taxa restricted to Balkan countries and to Asia minor (Anatolia), occasionally extending to S Ukraine (Crimea), adjacent Caucasian countries (Georgia, Armenia) or N Iraq", FloraHellenicaTransformer.uuidChorologicalBA);
+ addChorological(state, "BC", "Balkan-Central Europe", "Taxa distributed in the Balkans, Carpathians, Alps and adjacent areas (mainly in the mountains)", FloraHellenicaTransformer.uuidChorologicalBC);
+ addChorological(state, "EM", "East Mediterranean", "Taxa restricted to the E Mediterranean, occasionally extending to S Italy or adjacent Caucasian countries", FloraHellenicaTransformer.uuidChorologicalEM);
+ addChorological(state, "Me", "Mediterranean", "Taxa with a circum-Mediterranean distribution including Portugal, occasionally extending to the Caucasus area and N Iran", FloraHellenicaTransformer.uuidChorologicalMe);
+ addChorological(state, "MA", "Mediterranean-Atlantic", "Taxa restricted to maritime W Europe and the Mediterranean", FloraHellenicaTransformer.uuidChorologicalMA);
+ addChorological(state, "ME", "Mediterranean-European", "Taxa restricted to the Mediterranean and temperate Europe, occasionally extending to NW Africa and the Caucasus area", FloraHellenicaTransformer.uuidChorologicalME);
+ addChorological(state, "MS", "Mediterranean-SW Asian", "Taxa distributed in one or more Mediterranean countries and extending to SW and C Asia", FloraHellenicaTransformer.uuidChorologicalMS);
+ addChorological(state, "EA", "European-SW Asian", "Eruopean taxa (occasionally reachin N Africa) with a distribution extending to SW Asia, occasionally reaching C Asia", FloraHellenicaTransformer.uuidChorologicalEA);
+ addChorological(state, "ES", "Euro-Siberian", "Taxa with main distribution in temperate Eurasia (occasionally reaching the Caucasus area)", FloraHellenicaTransformer.uuidChorologicalES);
+ addChorological(state, "Eu", "European", "Taxa with a distribution all over Europe. In S European countries this category in fact represents the C European element", FloraHellenicaTransformer.uuidChorologicalEu);
+ addChorological(state, "Pt", "Paleotemperate", "Taxa of extratropical Eurasia including the Himalaya and E Asia, not (or at most marginally) extending to North America", FloraHellenicaTransformer.uuidChorologicalPt);
+ addChorological(state, "Ct", "Circumtemperate", "Taxa of both extratropical Eurasia and North America", FloraHellenicaTransformer.uuidChorologicalCt);
+ addChorological(state, "IT", "Irano-Turanian", "Taxa with main distribution in arid SW and C Asia, extrazonally extending to the Mediterranean", FloraHellenicaTransformer.uuidChorologicalIT);
+ addChorological(state, "SS", "Saharo-Sindian", "Taxa with main distribution in arid N Africa and SQ Asia, extrazonally extending to the Mediterranean", FloraHellenicaTransformer.uuidChorologicalSS);
+ addChorological(state, "ST", "Subtropical-tropical", "Taxa widespread in the warmer regions of both hemispheres", FloraHellenicaTransformer.uuidChorologicalST);
+ addChorological(state, "Bo", "(Circum-)Boreal", "Taxa with main distribution in N and high-montane Eurasia (occasionally extending to North America)", FloraHellenicaTransformer.uuidChorologicalBo);
+ addChorological(state, "AA", "Arctic-Alpine", "Taxa with main distribution beyound the N and aove the high-montane timerlines o fEurasia (occasionally extending to North America)", FloraHellenicaTransformer.uuidChorologicalAA);
+ addChorological(state, "Co", "Cosmopolitan", "Taxa distributed in all continents, i.e. beyond the N hemisphere. This category may be given in brackets after the known or supposed native distribution in cases of taxa that have been spread worldwide by humans", FloraHellenicaTransformer.uuidChorologicalCo);
+
+ addChorological(state, "[trop.]", "[tropical]", "", FloraHellenicaTransformer.uuidChorologicaltrop);
+ addChorological(state, "[subtrop.]", "[subtropical]", "", FloraHellenicaTransformer.uuidChorologicalsubtrop);
+ addChorological(state, "[paleotrop.]", "[paleotropical]", "", FloraHellenicaTransformer.uuidChorologicalpaleotrop);
+ addChorological(state, "[neotrop.]", "[neotropical]", "", FloraHellenicaTransformer.uuidChorologicalneotrop);
+ addChorological(state, "[pantrop.]", "[pantropical]", "", FloraHellenicaTransformer.uuidChorologicalpantrop);
+ addChorological(state, "[N-Am.]", "[North American]", "", FloraHellenicaTransformer.uuidChorologicalN_Am);
+ addChorological(state, "[S-Am.]", "[South American]", "", FloraHellenicaTransformer.uuidChorologicalS_Am);
+ addChorological(state, "[E-As.]", "[East Asian]", "", FloraHellenicaTransformer.uuidChorologicalE_As);
+ addChorological(state, "[SE-As.", "[South East Asian]", "", FloraHellenicaTransformer.uuidChorologicalSE_As);
+ addChorological(state, "[S-Afr.]", "[South African]", "", FloraHellenicaTransformer.uuidChorologicalS_Afr);
+ addChorological(state, "[Arab.]", "[Arabian]", "", FloraHellenicaTransformer.uuidChorologicalArab);
+ addChorological(state, "[Arab. NE-Afr.]", "[Arabian and North East African]", "", FloraHellenicaTransformer.uuidChorologicalArab_NE_Afr);
+ addChorological(state, "[Caucas.]", "[Caucasian]", "", FloraHellenicaTransformer.uuidChorologicalCaucas);
+ addChorological(state, "[Pontic]", "[Pontic]", "", FloraHellenicaTransformer.uuidChorologicalPontic);
+ addChorological(state, "[Europ.]", "[European]", "", FloraHellenicaTransformer.uuidChorologicalEurop);
+ addChorological(state, "[Austr.]", "[Australian]", "", FloraHellenicaTransformer.uuidChorologicalAustral);
+
+ addChorological(state, "[W-Med.]", "[West Mediterranean]", "", FloraHellenicaTransformer.uuidChorologicalW_Med);
+ addChorological(state, "[C-Med.]", "[Central Mediterranean]", "", FloraHellenicaTransformer.uuidChorologicalC_Med);
+ addChorological(state, "[W-Eur.]", "[West European]", "", FloraHellenicaTransformer.uuidChorologicalW_Eur);
+ addChorological(state, "[S-Eur.]", "[South European]", "", FloraHellenicaTransformer.uuidChorologicalS_Eur);
+ addChorological(state, "[C-Am.]", "[Central American]", "", FloraHellenicaTransformer.uuidChorologicalC_Am);
+ addChorological(state, "[C-As.]", "[Central Asian]", "", FloraHellenicaTransformer.uuidChorologicalC_As);
+ addChorological(state, "[SW-As.]", "[South West Asian]", "", FloraHellenicaTransformer.uuidChorologicalSW_As);
+ addChorological(state, "[unknown]", "[unknown]", "", FloraHellenicaTransformer.uuidChorologicalUnknown);
+ addChorological(state, "[N-Afr.]", "[North African]", "", FloraHellenicaTransformer.uuidChorologicalN_Afr);
+ addChorological(state, "[Am.]", "[American]", "", FloraHellenicaTransformer.uuidChorologicalAm);
+ addChorological(state, "[paleosubtrop.]", "[paleosubtropical]", "", FloraHellenicaTransformer.uuidChorologicalPaleosubtrop);
+ addChorological(state, "[SW-Eur.]", "[South West European]", "", FloraHellenicaTransformer.uuidChorologicalSW_Eur);
+
+ addChorological(state, "[S-As.]", "[South Asian]", "", FloraHellenicaTransformer.uuidChorologicalS_As);
+ addChorological(state, "[NE-Afr.]", "[North East African]", "", FloraHellenicaTransformer.uuidChorologicalNE_Afr);
+ addChorological(state, "[NW-Afr.]", "[North West African]", "", FloraHellenicaTransformer.uuidChorologicalNW_Afr);
+ addChorological(state, "[trop. Afr.]", "[tropical African]", "", FloraHellenicaTransformer.uuidChorologicalTrop_Afr);
+ addChorological(state, "[Afr.]", "[Arican]", "", FloraHellenicaTransformer.uuidChorologicalAfr);
+ addChorological(state, "[As.]", "[Asian]", "", FloraHellenicaTransformer.uuidChorologicalAs);
+ addChorological(state, "[W-As.]", "[West Asian]", "", FloraHellenicaTransformer.uuidChorologicalW_As);
+ addChorological(state, "[C-Eur.]", "[Central European]", "", FloraHellenicaTransformer.uuidChorologicalC_Eur);
+ addChorological(state, "[E-Afr.]", "[East African]", "", FloraHellenicaTransformer.uuidChorologicalE_Afr);
+ addChorological(state, "[W-Austr.]", "[West Australian]", "", FloraHellenicaTransformer.uuidChorologicalW_Austr);
+ addChorological(state, "[trop. As.]", "[tropical Asian]", "", FloraHellenicaTransformer.uuidChorologicaltrop_As);
+
+ addChorological(state, "[Co]", "[Cosmopolitan]", "Taxa distributed in all continents, i.e. beyond the N hemisphere. This category may be given in brackets after the known or supposed native distribution in cases of taxa that have been spread worldwide by humans", FloraHellenicaTransformer.uuidChorological__Co_);
this.getVocabularyService().save(chorologicalVoc);
return;
* @param uuidchorologicalstar
*/
private void addChorological(SimpleExcelTaxonImportState<CONFIG> state, String abbrevLabel, String label,
- String string3, UUID uuidChorological) {
- State chorological = addState(state, abbrevLabel, label, label, uuidChorological, chorologicalVoc);
-
-
+ String desc, UUID uuidChorological) {
+ desc = isBlank(desc)? label : desc;
+ State chorologyTerm = addState(state, abbrevLabel, label, desc, uuidChorological, chorologicalVoc);
+ chorologyMap.put(abbrevLabel, chorologyTerm);
}
/**
description, stateLabel, abbrev);
newState.setUuid(uuid);
newState.setIdInVocabulary(abbrev);
- newState.setIdInVocabulary(abbrev);
voc.addTerm(newState);
return newState;
}
+ private PresenceAbsenceTerm addStatus(SimpleExcelTaxonImportState<CONFIG> state,
+ String abbrev, String stateLabel, String description, UUID uuid, OrderedTermVocabulary<PresenceAbsenceTerm> voc) {
+ PresenceAbsenceTerm newStatus = PresenceAbsenceTerm.NewPresenceInstance(
+ description, stateLabel, abbrev);
+ newStatus.setUuid(uuid);
+ newStatus.setIdInVocabulary(abbrev);
+ newStatus.setSymbol(abbrev);
+ voc.addTerm(newStatus);
+ return newStatus;
+ }
+
private void initHabitatVocabulary(SimpleExcelTaxonImportState<CONFIG> state) {
if (habitatVoc == null){
UUID uuid = FloraHellenicaTransformer.uuidFloraHellenicaHabitatVoc;
}
}
+ private void initStatusVocabulary(SimpleExcelTaxonImportState<CONFIG> state) {
+ if (statusVoc == null){
+ UUID uuid = FloraHellenicaTransformer.uuidFloraHellenicaStatusVoc;
+ statusVoc = (OrderedTermVocabulary<PresenceAbsenceTerm>)this.getVocabularyService().find(uuid);
+ if (statusVoc == null){
+ createStatusVoc(state, uuid);
+ }
+ }
+ }
+
+ /**
+ * @param state
+ */
+ private void createStatusVoc(SimpleExcelTaxonImportState<CONFIG> state, UUID vocUuid) {
+ //voc
+ URI termSourceUri = null;
+ String label = "Checklist of Greece Status";
+ String description = "Status as used in the Checklist of Greece";
+ statusVoc = OrderedTermVocabulary.NewInstance(TermType.PresenceAbsenceTerm,
+ description, label, null, termSourceUri);
+ statusVoc.setUuid(vocUuid);
+
+ rangeRestricted = addStatus(state, "RR", "Range-restricted", "", FloraHellenicaTransformer.uuidStatusRangeRestricted, statusVoc);
+ doubtfullyRangeRestricted = addStatus(state, "?RR", "?Range-restricted", "", FloraHellenicaTransformer.uuidStatusRangeRestrictedDoubtfully, statusVoc);
+
+ this.getVocabularyService().save(statusVoc);
+ return;
+ }
+
/**
* @param state
//greece country
String countryLabel = "Greece";
- greece = NamedArea.NewInstance(
- countryLabel, countryLabel, null);
+ greece = NamedArea.NewInstance(countryLabel, countryLabel, "GR");
greece.setUuid(FloraHellenicaTransformer.uuidAreaGreece);
+ greece.setIdInVocabulary("GR");
+ greece.setSymbol("GR");
areasVoc.addTerm(greece);
//FIXME
// addMapping(greece, xx "mex_adm0", "iso", "MEX");