import org.springframework.security.authentication.AuthenticationManager;\r
import org.springframework.security.core.Authentication;\r
import org.springframework.stereotype.Component;\r
+import org.springframework.transaction.TransactionStatus;\r
\r
import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade;\r
import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade.DerivedUnitType;\r
import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
import eu.etaxonomy.cdm.model.occurrence.Collection;\r
import eu.etaxonomy.cdm.model.occurrence.DerivedUnitBase;\r
+import eu.etaxonomy.cdm.model.occurrence.FieldObservation;\r
import eu.etaxonomy.cdm.model.occurrence.Specimen;\r
import eu.etaxonomy.cdm.model.reference.IArticle;\r
import eu.etaxonomy.cdm.model.reference.IJournal;\r
* \r
*/\r
@Component\r
-public class MarkupDocumentImport extends MarkupImportBase implements\r
- ICdmIO<MarkupImportState> {\r
- private static final String TO_COUPLET = "toCouplet";\r
-\r
- private static final String TO_TAXON = "toTaxon";\r
-\r
- private static final String TO_KEY = "toKey";\r
-\r
- private static final String TEXT = "text";\r
-\r
- private static final String QUESTION = "question";\r
-\r
- private static final String COUPLET = "couplet";\r
-\r
- private static final String KEYNOTES = "keynotes";\r
-\r
- private static final String KEY_TITLE = "keyTitle";\r
-\r
- private static final String IS_SPOTCHARACTERS = "isSpotcharacters";\r
+public class MarkupDocumentImport extends MarkupImportBase implements ICdmIO<MarkupImportState> {\r
+ private static final String FREQUENCY = "frequency";\r
\r
- private static final String REF_NUM = "refNum";\r
+ private static final String TAXONTYPE = "taxontype";\r
\r
- private static final String SERIALS_ABBREVIATIONS = "serialsAbbreviations";\r
+ private static final String DEDICATION = "dedication";\r
\r
- private static final String BIBLIOGRAPHY = "bibliography";\r
+ private static final String QUOTE = "quote";\r
\r
- private static final String HABITAT = "habitat";\r
-\r
- private static final String LIFE_CYCLE_PERIODS = "lifeCyclePeriods";\r
-\r
- private static final String DISTRIBUTION_LOCALITY = "distributionLocality";\r
-\r
- private static final String REFERENCE = "reference";\r
-\r
- private static final Logger logger = Logger\r
- .getLogger(MarkupDocumentImport.class);\r
+ private static final Logger logger = Logger.getLogger(MarkupDocumentImport.class);\r
\r
private static final boolean CREATE_NEW = true;\r
private static final boolean IS_IMAGE_GALLERY = true;\r
private static final String ALTITUDE = "altitude";\r
private static final String ANNOTATION = "annotation";\r
private static final String AUTHOR = "author";\r
+ private static final String BIBLIOGRAPHY = "bibliography";\r
private static final String BIOGRAPHIES = "biographies";\r
private static final String BOLD = "bold";\r
private static final String BR = "br";\r
private static final String CHAR = "char";\r
private static final String CITATION = "citation";\r
- private static final String COLLECTION = "collection";\r
private static final String COLLECTION_TYPE_STATUS = "collectionTypeStatus";\r
private static final String COLLECTOR = "collector";\r
private static final String COORDINATES = "coordinates";\r
+ private static final String COUPLET = "couplet";\r
private static final String DATES = "dates";\r
private static final String DEFAULT_MEDIA_URL = "defaultMediaUrl";\r
private static final String DESTROYED = "destroyed";\r
private static final String DETAILS = "details";\r
private static final String DISTRIBUTION_LIST = "distributionList";\r
+ private static final String DISTRIBUTION_LOCALITY = "distributionLocality";\r
private static final String EDITION = "edition";\r
private static final String EDITORS = "editors";\r
private static final String FEATURE = "feature";\r
private static final String FIELD_NUM = "fieldNum";\r
private static final String FULL_NAME = "fullName";\r
private static final String FULL_TYPE = "fullType";\r
+ private static final String GATHERING = "gathering";\r
private static final String HEADING = "heading";\r
+ private static final String HABITAT = "habitat";\r
private static final String HABITAT_LIST = "habitatList";\r
private static final String HOMONYM = "homonym";\r
private static final String HOMOTYPES = "homotypes";\r
private static final String INFRANK = "infrank";\r
private static final String INFRAUT = "infraut";\r
private static final String INFRPARAUT = "infrparaut";\r
+ private static final String IS_SPOTCHARACTERS = "isSpotcharacters";\r
private static final String ISSUE = "issue";\r
private static final String ITALICS = "italics";\r
private static final String KEY = "key";\r
+ private static final String KEY_TITLE = "keyTitle";\r
+ private static final String KEYNOTES = "keynotes";\r
+ private static final String LIFE_CYCLE_PERIODS = "lifeCyclePeriods";\r
private static final String LOCALITY = "locality";\r
private static final String LOST = "lost";\r
private static final String META_DATA = "metaData";\r
private static final String PUBNAME = "pubname";\r
private static final String PUBTITLE = "pubtitle";\r
private static final String PUBTYPE = "pubtype";\r
+ private static final String QUESTION = "question";\r
private static final String RANK = "rank";\r
private static final String REF = "ref";\r
+ private static final String REF_NUM = "refNum";\r
private static final String REF_PART = "refPart";\r
+ private static final String REFERENCE = "reference";\r
private static final String REFERENCES = "references";\r
private static final String TAXON = "taxon";\r
private static final String TAXONTITLE = "taxontitle";\r
+ private static final String TEXT = "text";\r
private static final String TEXT_SECTION = "textSection";\r
+ private static final String TO_COUPLET = "toCouplet";\r
+ private static final String TO_KEY = "toKey";\r
+ private static final String TO_TAXON = "toTaxon";\r
private static final String TYPE = "type";\r
private static final String TYPE_STATUS = "typeStatus";\r
private static final String TREATMENT = "treatment";\r
+ private static final String SERIALS_ABBREVIATIONS = "serialsAbbreviations";\r
private static final String SPECIMEN_TYPE = "specimenType";\r
private static final String STATUS = "status";\r
private static final String STRING = "string";\r
}\r
\r
@Override\r
- public void doInvoke(MarkupImportState state) {\r
- fireProgressEvent("Start import markup document",\r
- "Before start of document");\r
- fireWarningEvent("Test a warning", "At start", 17);\r
-\r
+ public void doInvoke(MarkupImportState state) { \r
+ fireProgressEvent("Start import markup document", "Before start of document");\r
+ \r
Queue<CdmBase> outputStream = new LinkedList<CdmBase>();\r
\r
+ TransactionStatus tx = startTransaction();\r
// FIXME reset state\r
doAllTheOldOtherStuff(state);\r
\r
// publication\r
String elName = PUBLICATION;\r
boolean hasPublication = false;\r
+ \r
while (reader.hasNext()) {\r
XMLEvent nextEvent = reader.nextEvent();\r
if (isStartingElement(nextEvent, elName)) {\r
fireSchemaConflictEventExpectedStartTag(elName, reader);\r
}\r
}\r
+ commitTransaction(tx);\r
\r
// //SAX\r
// ImportHandlerBase handler= new PublicationHandler(this);\r
// parseSAX(state, handler);\r
\r
} catch (FactoryConfigurationError e1) {\r
- fireWarningEvent(\r
- "Some error occurred while setting up xml factory. Data can't be imported",\r
- "Start", 16);\r
+ fireWarningEvent("Some error occurred while setting up xml factory. Data can't be imported", "Start", 16);\r
state.setUnsuccessfull();\r
} catch (XMLStreamException e1) {\r
- fireWarningEvent(\r
- "An XMLStreamException occurred while parsing. Data can't be imported",\r
- "Start", 16);\r
+ fireWarningEvent("An XMLStreamException occurred while parsing. Data can't be imported", "Start", 16);\r
state.setUnsuccessfull();\r
// } catch (ParserConfigurationException e) {\r
// fireWarningEvent("A ParserConfigurationException occurred while parsing. Data can't be imported",\r
keySet.add(key);\r
}\r
save(keySet, state);\r
+ //unmatched key leads\r
+ UnmatchedLeads unmatched = state.getUnmatchedLeads();\r
+ if (unmatched.size() > 0){\r
+ String message = "The following key leads are unmatched: %s";\r
+ message = String.format(message, state.getUnmatchedLeads().toString());\r
+ fireWarningEvent(message, next, 6);\r
+ }\r
// save(keyNodesToSave, state);\r
\r
return;\r
private void doTaxonRelation(MarkupImportState state, Taxon taxon,\r
Taxon lastTaxon, Location dataLocation) {\r
\r
- Classification tree = makeTree(state);\r
+ Classification tree = makeTree(state, dataLocation);\r
if (lastTaxon == null) {\r
tree.addChildTaxon(taxon, null, null, null);\r
return;\r
\r
/**\r
* @param state\r
+ * @param dataLocation \r
* @return\r
*/\r
- private Classification makeTree(MarkupImportState state) {\r
+ private Classification makeTree(MarkupImportState state, Location dataLocation) {\r
Classification result = state.getTree(null);\r
if (result == null) {\r
UUID uuid = state.getConfig().getClassificationUuid();\r
if (uuid == null) {\r
- logger.warn("No classification uuid is defined");\r
+ String message = "No classification uuid is defined";\r
+ fireWarningEvent(message, makeLocationStr(dataLocation), 6);\r
result = createNewClassification(state);\r
} else {\r
result = getClassificationService().find(uuid);\r
return result;\r
}\r
\r
- private Taxon handleTaxon(MarkupImportState state, XMLEventReader reader,\r
- StartElement parentEvent) throws XMLStreamException {\r
+ private Taxon handleTaxon(MarkupImportState state, XMLEventReader reader, StartElement parentEvent) throws XMLStreamException {\r
// TODO progress monitoring\r
Map<String, Attribute> attributes = getAttributes(parentEvent);\r
Taxon taxon = createTaxonAndName(state, attributes);\r
checkMandatoryElement(hasNomenclature, parentEvent, NOMENCLATURE);\r
handleUnexpectedAttributes(parentEvent.getLocation(),attributes);\r
\r
- makeKeyNodes(state, parentEvent);\r
+ makeKeyNodes(state, parentEvent, taxonTitle);\r
state.setCurrentTaxon(null);\r
state.setCurrentTaxonNum(null);\r
save(taxon, state);\r
throw new IllegalStateException("<Taxon> has no closing tag");\r
}\r
\r
- private void makeKeyNodes(MarkupImportState state, XMLEvent event) {\r
+ private void makeKeyNodes(MarkupImportState state, XMLEvent event, String taxonTitle) {\r
Taxon taxon = state.getCurrentTaxon();\r
String num = state.getCurrentTaxonNum();\r
\r
String nameString = CdmBase.deproxy(taxon.getName(), NonViralName.class).getNameCache();\r
+// String nameString = taxonTitle;\r
\r
//try to find matching lead nodes \r
UnmatchedLeadsKey leadsKey = UnmatchedLeadsKey.NewInstance(num, nameString);\r
Set<PolytomousKeyNode> matchingNodes = handleMatchingNodes(state, taxon, leadsKey);\r
- //same without using the num\r
- if (num != null){\r
+ \r
+ if (num != null){//same without using the num\r
UnmatchedLeadsKey noNumLeadsKey = UnmatchedLeadsKey.NewInstance("", nameString);\r
- //TODO inform about differences\r
- handleMatchingNodes(state, taxon, noNumLeadsKey);\r
+ Set<PolytomousKeyNode> noNumMatchingNodes = handleMatchingNodes(state, taxon, noNumLeadsKey);\r
+ if(noNumMatchingNodes.size() > 0){\r
+ String message ="Taxon matches additional key node when not considering <num> attribute in taxontitle. This may be correct but may also indicate an error.";\r
+ fireWarningEvent(message, event, 1);\r
+ }\r
}\r
+ //report missing match, if num exists\r
if (matchingNodes.isEmpty() && num != null){\r
- String message = "Taxon has num in taxontitle but no matching nodes exist: %s, Key: %s";\r
+ String message = "Taxon has <num> attribute in taxontitle but no matching key nodes exist: %s, Key: %s";\r
message = String.format(message, num, leadsKey.toString());\r
fireWarningEvent(message, event, 1);\r
}\r
String isSpotcharacters = getAndRemoveAttributeValue(attributes, IS_SPOTCHARACTERS);\r
if (isNotBlank(isSpotcharacters) ) {\r
//TODO isSpotcharacters\r
- String message = "isSpotcharacters not yet implemented for <key>";\r
+ String message = "Attribute isSpotcharacters not yet implemented for <key>";\r
fireWarningEvent(message, parentEvent, 4);\r
}\r
\r
return;\r
} else if (isEndingElement(next, KEYNOTES)){\r
popUnimplemented(next.asEndElement());\r
- } else if (next.isStartElement()) {\r
- if (isStartingElement(next, KEY_TITLE)) {\r
+ } else if (isStartingElement(next, KEY_TITLE)) {\r
handleKeyTitle(state, reader, next);\r
- } else if (isStartingElement(next, KEYNOTES)) {\r
- //TODO\r
- handleNotYetImplementedElement(next);\r
- } else if (isStartingElement(next, COUPLET)) {\r
- PolytomousKeyNode node = null;\r
- if (isFirstCouplet){\r
- node = key.getRoot();\r
- isFirstCouplet = false;\r
- }\r
- handleCouplet(state, reader, next, node);\r
- } else {\r
- handleUnexpectedStartElement(next.asStartElement());\r
+ } else if (isStartingElement(next, KEYNOTES)) {\r
+ //TODO\r
+ handleNotYetImplementedElement(next);\r
+ } else if (isStartingElement(next, COUPLET)) {\r
+ PolytomousKeyNode node = null;\r
+ if (isFirstCouplet){\r
+ node = key.getRoot();\r
+ isFirstCouplet = false;\r
}\r
+ handleCouplet(state, reader, next, node);\r
} else {\r
handleUnexpectedElement(next);\r
}\r
}\r
throw new IllegalStateException("<key> has no closing tag");\r
- \r
-\r
}\r
\r
/**\r
if (isMyEndingElement(next, parentEvent)) {\r
completeCouplet(state, parentEvent, parentNode, num, childList);\r
return;\r
- } else if (isEndingElement(next, KEYNOTES)){\r
- popUnimplemented(next.asEndElement());\r
} else if (isStartingElement(next, QUESTION)) {\r
handleQuestion(state, reader, next, childList);\r
} else if (isStartingElement(next, KEYNOTES)) {\r
//TODO\r
handleNotYetImplementedElement(next);\r
+ } else if (isEndingElement(next, KEYNOTES)) {\r
+ //TODO\r
+ popUnimplemented(next.asEndElement());\r
} else {\r
handleUnexpectedElement(next);\r
}\r
XMLEvent next = readNoWhitespace(reader);\r
if (isMyEndingElement(next, parentEvent)) {\r
return;\r
- } else if (isEndingElement(next, TO_KEY)){\r
- //TODO\r
- popUnimplemented(next.asEndElement());\r
- } else if (isEndingElement(next, KEYNOTES)){\r
- //TODO\r
- popUnimplemented(next.asEndElement());\r
- \r
} else if (isStartingElement(next, TEXT)) {\r
String text = getCData(state, reader, next);\r
KeyStatement statement = KeyStatement.NewInstance(text);\r
handleToCouplet(state, reader, next, myNode);\r
} else if (isStartingElement(next, TO_TAXON)) {\r
handleToTaxon(state, reader, next, myNode);\r
+ \r
} else if (isStartingElement(next, TO_KEY)) {\r
//TODO\r
handleNotYetImplementedElement(next);\r
+ } else if (isEndingElement(next, TO_KEY)){\r
+ //TODO\r
+ popUnimplemented(next.asEndElement());\r
} else if (isStartingElement(next, KEYNOTES)) {\r
//TODO\r
handleNotYetImplementedElement(next);\r
+ } else if (isEndingElement(next, KEYNOTES)){\r
+ //TODO\r
+ popUnimplemented(next.asEndElement());\r
} else {\r
handleUnexpectedElement(next);\r
}\r
private void handleToCouplet(MarkupImportState state, XMLEventReader reader, XMLEvent next, PolytomousKeyNode node) throws XMLStreamException {\r
String num = getOnlyAttribute(next, NUM, true);\r
String cData = getCData(state, reader, next, false);\r
- if (isNotBlank(cData)){\r
- String message = "CData ('%s') not handled";\r
+ if (isNotBlank(cData) && ! cData.equals(num)){\r
+ String message = "CData ('%s') not handled in <toCouplet>";\r
message = String.format(message, cData);\r
fireWarningEvent(message, next, 4);\r
}\r
if (strGoto == null){\r
return "";\r
}\r
- String strGenusName = CdmBase.deproxy(taxon.getName(), NonViralName.class).getGenusOrUninomial();\r
+ \r
+ NonViralName<?> name = CdmBase.deproxy(taxon.getName(), NonViralName.class);\r
+ String strGenusName = name.getGenusOrUninomial();\r
+ \r
+ \r
strGoto = strGoto.replaceAll("\\([^\\(\\)]*\\)", ""); //replace all brackets\r
strGoto = strGoto.replaceAll("\\s+", " "); //replace multiple whitespaces by exactly one whitespace\r
\r
if (isGenusAbbrev(single, strGenusName)){\r
split[i] = strGenusName;\r
}\r
-// if (isInfraSpecificMarker(single)){\r
-// String strSpeciesName = CdmBase.deproxy(taxon.getName(), NonViralName.class).getSpecificEpithet();\r
-// split[i] = strGenusName + " " + strSpeciesName + " ";\r
-// }\r
+ if (isInfraSpecificMarker(single)){\r
+ String strSpeciesEpi = name.getSpecificEpithet();\r
+ if (isBlank(result)){\r
+ result += strGenusName + " " + strSpeciesEpi;\r
+ }\r
+ }\r
result = (result + " " + split[i]).trim();\r
}\r
return result;\r
}\r
\r
+\r
+ private boolean isInfraSpecificMarker(String single) {\r
+ try {\r
+ if (Rank.getRankByAbbreviation(single).isInfraSpecific()){\r
+ return true;\r
+ }else{\r
+ return false;\r
+ }\r
+ } catch (UnknownCdmTypeException e) {\r
+ return false;\r
+ }\r
+ }\r
+ \r
private boolean isGenusAbbrev(String single, String strGenusName) {\r
if (! single.matches("[A-Z]\\.?")) {\r
return false;\r
* @throws XMLStreamException\r
*/\r
private String makeNotesString(MarkupImportState state, XMLEventReader reader, String text, XMLEvent next) throws XMLStreamException {\r
- Map<String, String> stringMap = handleString(state, reader, next);\r
+ Map<String, String> stringMap = handleString(state, reader, next, null);\r
if (stringMap.size() == 0){\r
String message = "No text available in <notes>";\r
fireWarningEvent(message, next, 4);\r
// TODO handle attributes\r
while (reader.hasNext()) {\r
XMLEvent next = readNoWhitespace(reader);\r
- if (next.isEndElement()) {\r
- if (isMyEndingElement(next, parentEvent)) {\r
- text = CdmUtils.removeBrackets(text);\r
- if (checkMandatoryText(text, parentEvent)) {\r
- text = normalize(text);\r
- dataHolder.writer = text;\r
- dataHolder.footnotes = footnotes;\r
-\r
- // Extension\r
- UUID uuidWriterExtension = MarkupTransformer.uuidWriterExtension;\r
- ExtensionType writerExtensionType = this\r
- .getExtensionType(state, uuidWriterExtension,\r
- "Writer", "writer", "writer");\r
- Extension extension = Extension.NewInstance();\r
- extension.setType(writerExtensionType);\r
- extension.setValue(text);\r
- dataHolder.extension = extension;\r
-\r
- // Annotation\r
- UUID uuidWriterAnnotation = MarkupTransformer.uuidWriterAnnotation;\r
- AnnotationType writerAnnotationType = this\r
- .getAnnotationType(state, uuidWriterAnnotation,\r
- "Writer", "writer", "writer", null);\r
- Annotation annotation = Annotation.NewInstance(text,\r
- writerAnnotationType, Language.DEFAULT());\r
- dataHolder.annotation = annotation;\r
-\r
- return dataHolder;\r
- } else {\r
- return null;\r
- }\r
+ if (isMyEndingElement(next, parentEvent)) {\r
+ text = CdmUtils.removeBrackets(text);\r
+ if (checkMandatoryText(text, parentEvent)) {\r
+ text = normalize(text);\r
+ dataHolder.writer = text;\r
+ dataHolder.footnotes = footnotes;\r
+\r
+ // Extension\r
+ UUID uuidWriterExtension = MarkupTransformer.uuidWriterExtension;\r
+ ExtensionType writerExtensionType = this\r
+ .getExtensionType(state, uuidWriterExtension,\r
+ "Writer", "writer", "writer");\r
+ Extension extension = Extension.NewInstance();\r
+ extension.setType(writerExtensionType);\r
+ extension.setValue(text);\r
+ dataHolder.extension = extension;\r
+\r
+ // Annotation\r
+ UUID uuidWriterAnnotation = MarkupTransformer.uuidWriterAnnotation;\r
+ AnnotationType writerAnnotationType = this.getAnnotationType(state, uuidWriterAnnotation, "Writer", "writer", "writer", null);\r
+ Annotation annotation = Annotation.NewInstance(text, writerAnnotationType, Language.DEFAULT());\r
+ dataHolder.annotation = annotation;\r
+\r
+ return dataHolder;\r
} else {\r
- if (isEndingElement(next, FOOTNOTE)) {\r
- // NOT YET IMPLEMENTED\r
- popUnimplemented(next.asEndElement());\r
- } else {\r
- handleUnexpectedEndElement(next.asEndElement());\r
- state.setUnsuccessfull();\r
- }\r
+ return null;\r
}\r
- } else if (next.isStartElement()) {\r
- if (isStartingElement(next, FOOTNOTE_REF)) {\r
- FootnoteDataHolder footNote = handleFootnoteRef(state,\r
- reader, next);\r
- if (footNote.isRef()) {\r
- footnotes.add(footNote);\r
- } else {\r
- logger.warn("Non ref footnotes not yet impelemnted");\r
- }\r
+ } else if (isStartingElement(next, FOOTNOTE_REF)) {\r
+ FootnoteDataHolder footNote = handleFootnoteRef(state, reader, next);\r
+ if (footNote.isRef()) {\r
+ footnotes.add(footNote);\r
} else {\r
- handleUnexpectedStartElement(next);\r
- state.setUnsuccessfull();\r
+ logger.warn("Non ref footnotes not yet impelemnted");\r
}\r
} else if (next.isCharacters()) {\r
text += next.asCharacters().getData();\r
state.setUnsuccessfull();\r
}\r
}\r
- return null;\r
+ throw new IllegalStateException("<writer> has no end tag");\r
}\r
\r
private void registerFootnotes(MarkupImportState state,\r
throw new IllegalStateException("<figureRef> has no end tag");\r
}\r
\r
- private FootnoteDataHolder handleFootnote(MarkupImportState state,\r
- XMLEventReader reader, XMLEvent parentEvent)\r
- throws XMLStreamException {\r
+ private FootnoteDataHolder handleFootnote(MarkupImportState state, XMLEventReader reader, XMLEvent parentEvent) throws XMLStreamException {\r
FootnoteDataHolder result = new FootnoteDataHolder();\r
Map<String, Attribute> attributes = getAttributes(parentEvent);\r
result.id = getAndRemoveAttributeValue(attributes, ID);\r
return;\r
}\r
\r
- private String handleFootnoteString(MarkupImportState state,\r
- XMLEventReader reader, XMLEvent parentEvent)\r
- throws XMLStreamException {\r
+ private String handleFootnoteString(MarkupImportState state, XMLEventReader reader, XMLEvent parentEvent) throws XMLStreamException {\r
boolean isTextMode = true;\r
String text = "";\r
while (reader.hasNext()) {\r
} else if (next.isEndElement()) {\r
if (isEndingElement(next, FULL_NAME)) {\r
popUnimplemented(next.asEndElement());\r
- } else if (isEndingElement(next, COLLECTION)) {\r
- popUnimplemented(next.asEndElement());\r
} else if (isEndingElement(next, BR)) {\r
isTextMode = true;\r
} else if (isHtml(next)) {\r
} else if (next.isStartElement()) {\r
if (isStartingElement(next, FULL_NAME)) {\r
handleNotYetImplementedElement(next);\r
- } else if (isStartingElement(next, COLLECTION)) {\r
- handleNotYetImplementedElement(next);\r
+ } else if (isStartingElement(next, GATHERING)) {\r
+ text += handleInLineGathering(state, reader, next);\r
} else if (isStartingElement(next, REFERENCES)) {\r
text += " " + handleInLineReferences(state, reader, next)+ " ";\r
} else if (isStartingElement(next, BR)) {\r
String message = "footnoteString is not in text mode";\r
fireWarningEvent(message, next, 6);\r
} else {\r
- text += next.asCharacters().getData().trim(); // getCData(state,\r
- // reader,\r
- // next);\r
- // does not\r
- // work as\r
- // we have\r
- // inner\r
- // tags like\r
- // <references>\r
+ text += next.asCharacters().getData().trim(); \r
+ // getCData(state, reader, next); does not work as we have inner tags like <references>\r
}\r
} else {\r
handleUnexpectedEndElement(next.asEndElement());\r
\r
}\r
\r
+ private String handleInLineGathering(MarkupImportState state, XMLEventReader reader, XMLEvent parentEvent) throws XMLStreamException {\r
+ DerivedUnitFacade facade = DerivedUnitFacade.NewInstance(DerivedUnitType.DerivedUnit.FieldObservation);\r
+ handleGathering(state, reader, parentEvent, null, facade);\r
+ FieldObservation fieldObservation = facade.innerFieldObservation();\r
+ String result = "<cdm:specimen uuid='%s'>%s</specimen>";\r
+ result = String.format(result, fieldObservation.getUuid(), fieldObservation.getTitleCache());\r
+ save(fieldObservation, state);\r
+ return result; \r
+ }\r
+\r
private String handleInLineReferences(MarkupImportState state,\r
XMLEventReader reader, XMLEvent parentEvent)\r
throws XMLStreamException {\r
handleUnexpectedElement(next);\r
}\r
}\r
- // TODO handle missing end element\r
throw new IllegalStateException("<References> has no closing tag");\r
}\r
\r
- private String handleInLineReference(MarkupImportState state,\r
- XMLEventReader reader, XMLEvent parentEvent)\r
- throws XMLStreamException {\r
+ private String handleInLineReference(MarkupImportState state,XMLEventReader reader, XMLEvent parentEvent)throws XMLStreamException {\r
Reference<?> reference = handleReference(state, reader, parentEvent);\r
- String result = "<ref uuid='%s'>%s</ref>";\r
- result = String.format(result, reference.getUuid(),\r
- reference.getTitleCache());\r
+ String result = "<cdm:ref uuid='%s'>%s</ref>";\r
+ result = String.format(result, reference.getUuid(), reference.getTitleCache());\r
+ save(reference, state);\r
return result;\r
}\r
\r
- private Reference<?> handleReference(MarkupImportState state,\r
- XMLEventReader reader, XMLEvent parentEvent)\r
- throws XMLStreamException {\r
+ private Reference<?> handleReference(MarkupImportState state,XMLEventReader reader, XMLEvent parentEvent)throws XMLStreamException {\r
checkNoAttributes(parentEvent);\r
\r
boolean hasRefPart = false;\r
// homotypicalGroup);\r
} else if (isStartingElement(next, TYPE_STATUS)) {\r
handleNotYetImplementedElement(next);\r
- } else if (isStartingElement(next, COLLECTION)) {\r
- handleCollection(state, reader, next, homotypicalGroup,\r
- facade);\r
+ } else if (isStartingElement(next, GATHERING)) {\r
+ handleGathering(state, reader, next, homotypicalGroup, facade);\r
} else if (isStartingElement(next, ORIGINAL_DETERMINATION)) {\r
handleNotYetImplementedElement(next);\r
} else if (isStartingElement(next, SPECIMEN_TYPE)) {\r
}\r
\r
\r
- private void handleCollection(MarkupImportState state, XMLEventReader reader, XMLEvent parentEvent, HomotypicalGroup homotypicalGroup, DerivedUnitFacade facade)\r
- throws XMLStreamException {\r
+ private void handleGathering(MarkupImportState state, XMLEventReader reader, XMLEvent parentEvent, HomotypicalGroup homotypicalGroup, DerivedUnitFacade facade) throws XMLStreamException {\r
checkNoAttributes(parentEvent);\r
boolean hasCollector = false;\r
boolean hasFieldNum = false;\r
\r
}\r
\r
- private void handleLocality(MarkupImportState state, XMLEventReader reader,\r
- XMLEvent parentEvent, DerivedUnitFacade facade)\r
- throws XMLStreamException {\r
+ private void handleLocality(MarkupImportState state, XMLEventReader reader,XMLEvent parentEvent, DerivedUnitFacade facade)throws XMLStreamException {\r
String classValue = getClassOnlyAttribute(parentEvent);\r
boolean isLocality = false;\r
NamedAreaLevel areaLevel = null;\r
* @return\r
* @throws XMLStreamException\r
*/\r
- private NonViralName<?> handleNom(MarkupImportState state,\r
- XMLEventReader reader, XMLEvent parentEvent,\r
+ private NonViralName<?> handleNom(MarkupImportState state, XMLEventReader reader, XMLEvent parentEvent,\r
HomotypicalGroup homotypicalGroup) throws XMLStreamException {\r
boolean isSynonym = false;\r
boolean isNameType = state.isNameType();\r
makeRankDecision(state, nameMap, name, event, infrank);\r
\r
// test consistency of rank and authors\r
- testRankAuthorConsistency(name, event, authorStr, paraut, infrParAut,\r
- infrAut);\r
+ testRankAuthorConsistency(name, event, authorStr, paraut, infrParAut,infrAut);\r
\r
// authors\r
- makeNomenclaturalAuthors(name, event, authorStr, paraut, infrParAut,\r
- infrAut);\r
+ makeNomenclaturalAuthors(name, event, authorStr, paraut, infrParAut,infrAut);\r
\r
// status\r
// TODO handle pro parte, pro syn. etc.\r
* @param infrAut\r
*/\r
private void makeNomenclaturalAuthors(NonViralName name, XMLEvent event,\r
- String authorStr, String paraut, String infrParAut, String infrAut) {\r
- if (name.getRank().isInfraSpecific()) {\r
+ String authorStr, String paraut, String infrParAut, String infrAut) {\r
+ if (name.getRank() != null && name.getRank().isInfraSpecific()) {\r
if (StringUtils.isNotBlank(infrAut)) {\r
INomenclaturalAuthor[] authorAndEx = authorAndEx(infrAut, event);\r
name.setCombinationAuthorTeam(authorAndEx[0]);\r
name.setExCombinationAuthorTeam(authorAndEx[1]);\r
}\r
if (StringUtils.isNotBlank(infrParAut)) {\r
- INomenclaturalAuthor[] authorAndEx = authorAndEx(infrParAut,\r
- event);\r
+ INomenclaturalAuthor[] authorAndEx = authorAndEx(infrParAut, event);\r
name.setBasionymAuthorTeam(authorAndEx[0]);\r
name.setExBasionymAuthorTeam(authorAndEx[1]);\r
}\r
} else {\r
+ if (name.getRank() == null){\r
+ String message = "No rank defined. Check correct usage of authors!";\r
+ fireWarningEvent(message, event, 4);\r
+ if (isNotBlank(infrParAut) || isNotBlank(infrAut)){\r
+ authorStr = infrAut;\r
+ paraut = infrParAut;\r
+ }\r
+ }\r
if (StringUtils.isNotBlank(authorStr)) {\r
- INomenclaturalAuthor[] authorAndEx = authorAndEx(authorStr,\r
- event);\r
+ INomenclaturalAuthor[] authorAndEx = authorAndEx(authorStr, event);\r
name.setCombinationAuthorTeam(authorAndEx[0]);\r
name.setExCombinationAuthorTeam(authorAndEx[1]);\r
}\r
}\r
\r
/**\r
+ * Tests if the names rank is consistent with the given author strings.\r
* @param name\r
* @param event\r
* @param authorStr\r
* @param infrAut\r
*/\r
private void testRankAuthorConsistency(NonViralName name, XMLEvent event,\r
- String authorStr, String paraut, String infrParAut, String infrAut) {\r
+ String authorStr, String paraut, String infrParAut, String infrAut) {\r
+ if (name.getRank() == null){\r
+ return;\r
+ }\r
if (name.getRank().isInfraSpecific()) {\r
if (StringUtils.isBlank(infrParAut)\r
&& StringUtils.isNotBlank(infrAut)\r
- && (StringUtils.isNotBlank(paraut) || StringUtils\r
- .isNotBlank(authorStr))) {\r
+ && (StringUtils.isNotBlank(paraut) || StringUtils.isNotBlank(authorStr))) {\r
String message = "Rank is infraspecicific but has only specific or higher author(s)";\r
fireWarningEvent(message, event, 4);\r
}\r
} else {\r
// is not infraspecific\r
- if (StringUtils.isNotBlank(infrParAut)\r
- || StringUtils.isNotBlank(infrAut)) {\r
+ if (StringUtils.isNotBlank(infrParAut) || StringUtils.isNotBlank(infrAut)) {\r
String message = "Rank is not infraspecicific but name has infra author(s)";\r
fireWarningEvent(message, event, 4);\r
}\r
\r
}\r
\r
- private void handleRefPart(MarkupImportState state, XMLEventReader reader,\r
- XMLEvent parentEvent, Map<String, String> refMap)\r
- throws XMLStreamException {\r
+ private void handleRefPart(MarkupImportState state, XMLEventReader reader,XMLEvent parentEvent, Map<String, String> refMap) throws XMLStreamException {\r
String classValue = getClassOnlyAttribute(parentEvent);\r
\r
String text = "";\r
\r
}\r
\r
- private Reference createReference(MarkupImportState state,\r
- Map<String, String> refMap, XMLEvent parentEvent) {\r
+ private Reference createReference(MarkupImportState state, Map<String, String> refMap, XMLEvent parentEvent) {\r
// TODO\r
Reference reference;\r
\r
reference.setDatePublished(TimePeriod.parseString(year));\r
\r
// TODO\r
- // ALTERNATEPUBTITLE\r
- // ISSUE\r
- // NOTES\r
+ String[] unhandledList = new String[]{ALTERNATEPUBTITLE, ISSUE, NOTES, STATUS};\r
+ for (String unhandled : unhandledList){\r
+ String value = getAndRemoveMapKey(refMap, unhandled);\r
+ if (isNotBlank(value)){\r
+ this.handleNotYetImplementedAttributeValue(parentEvent, CLASS, unhandled);\r
+ }\r
+ }\r
+ \r
for (String key : refMap.keySet()) {\r
if (!DETAILS.equalsIgnoreCase(key)) {\r
this.fireUnexpectedAttributeValue(parentEvent, CLASS, key);\r
}\r
}\r
\r
- private void handleFeature(MarkupImportState state, XMLEventReader reader,\r
- XMLEvent parentEvent) throws XMLStreamException {\r
+ private void handleFeature(MarkupImportState state, XMLEventReader reader, XMLEvent parentEvent) throws XMLStreamException {\r
String classValue = getClassOnlyAttribute(parentEvent);\r
Feature feature = makeFeature(classValue, state, parentEvent);\r
Taxon taxon = state.getCurrentTaxon();\r
- TaxonDescription taxonDescription = getTaxonDescription(taxon, state\r
- .getConfig().getSourceReference(), NO_IMAGE_GALLERY, CREATE_NEW);\r
+ TaxonDescription taxonDescription = getTaxonDescription(taxon, state.getConfig().getSourceReference(), NO_IMAGE_GALLERY, CREATE_NEW);\r
// TextData figureHolderTextData = null; //for use with one TextData for\r
// all figure only\r
\r
boolean isDescription = feature.equals(Feature.DESCRIPTION());\r
DescriptionElementBase lastDescriptionElement = null;\r
+ \r
while (reader.hasNext()) {\r
XMLEvent next = readNoWhitespace(reader);\r
- if (next.isEndElement()) {\r
- if (isMyEndingElement(next, parentEvent)) {\r
- return;\r
- } else {\r
- if (isEndingElement(next, DISTRIBUTION_LIST)\r
- || isEndingElement(next, HABITAT_LIST)) {\r
- // only handle list elements\r
- } else {\r
- handleUnexpectedEndElement(next.asEndElement());\r
- }\r
+ if (isMyEndingElement(next, parentEvent)) {\r
+ return;\r
+ } else if (isEndingElement(next, DISTRIBUTION_LIST) || isEndingElement(next, HABITAT_LIST)) { \r
+ // only handle list elements\r
+ } else if (isStartingElement(next, HEADING)) {\r
+ makeFeatureHeading(state, reader, classValue, feature, next);\r
+ } else if (isStartingElement(next, WRITER)) {\r
+ makeFeatureWriter(state, reader, feature, taxon, next);\r
+// } else if (isStartingElement(next, DISTRIBUTION_LOCALITY)) {\r
+// if (!feature.equals(Feature.DISTRIBUTION())) {\r
+// String message = "Distribution locality only allowed for feature of type 'distribution'";\r
+// fireWarningEvent(message, next, 4);\r
+// }\r
+// handleDistributionLocality(state, reader, next);\r
+ } else if (isStartingElement(next, DISTRIBUTION_LIST) || isStartingElement(next, HABITAT_LIST)) {\r
+ // only handle single list elements\r
+ } else if (isStartingElement(next, HABITAT)) {\r
+ if (!(feature.equals(Feature.HABITAT())\r
+ || feature.equals(Feature.HABITAT_ECOLOGY()) \r
+ || feature.equals(Feature.ECOLOGY()))) {\r
+ String message = "Habitat only allowed for feature of type 'habitat','habitat ecology' or 'ecology'";\r
+ fireWarningEvent(message, next, 4);\r
}\r
- } else if (next.isStartElement()) {\r
- if (isStartingElement(next, HEADING)) {\r
- makeFeatureHeading(state, reader, classValue, feature, next);\r
- } else if (isStartingElement(next, WRITER)) {\r
- makeFeatureWriter(state, reader, feature, taxon, next);\r
- } else if (isStartingElement(next, DISTRIBUTION_LOCALITY)) {\r
- if (!feature.equals(Feature.DISTRIBUTION())) {\r
- String message = "Distribution locality only allowed for feature of type 'distribution'";\r
- fireWarningEvent(message, next, 4);\r
- }\r
- handleDistributionLocality(state, reader, next);\r
- } else if (isStartingElement(next, DISTRIBUTION_LIST)\r
- || isStartingElement(next, HABITAT_LIST)) {\r
- // only handle single list elements\r
- } else if (isStartingElement(next, HABITAT)) {\r
- if (!(feature.equals(Feature.HABITAT())\r
- || feature.equals(Feature.HABITAT_ECOLOGY()) || feature\r
- .equals(Feature.ECOLOGY()))) {\r
- String message = "Habitat only allowed for feature of type 'habitat','habitat ecology' or 'ecology'";\r
- fireWarningEvent(message, next, 4);\r
- }\r
- handleHabitat(state, reader, next);\r
- } else if (isStartingElement(next, CHAR)) {\r
- TextData textData = handleChar(state, reader, next);\r
- taxonDescription.addElement(textData);\r
- } else if (isStartingElement(next, STRING)) {\r
- lastDescriptionElement = makeFeatureString(state, reader,feature, taxonDescription, lastDescriptionElement,next);\r
- } else if (isStartingElement(next, FIGURE_REF)) {\r
- lastDescriptionElement = makeFeatureFigureRef(state, reader, taxonDescription, isDescription, lastDescriptionElement, next);\r
- } else if (isStartingElement(next, REFERENCES)) {\r
- // TODO details/microcitation ??\r
-\r
- List<Reference<?>> refs = handleReferences(state, reader, next);\r
- if (!refs.isEmpty()) {\r
- // TODO\r
- Reference<?> descriptionRef = state.getConfig().getSourceReference();\r
- TaxonDescription description = getTaxonDescription(taxon, descriptionRef, false, true);\r
- TextData featurePlaceholder = getFeaturePlaceholder(state, description, feature, true);\r
- for (Reference<?> citation : refs) {\r
- featurePlaceholder.addSource(null, null, citation, null);\r
- }\r
- } else {\r
- String message = "No reference found in references";\r
- fireWarningEvent(message, next, 6);\r
+ handleHabitat(state, reader, next);\r
+ } else if (isStartingElement(next, CHAR)) {\r
+ TextData textData = handleChar(state, reader, next);\r
+ taxonDescription.addElement(textData);\r
+ } else if (isStartingElement(next, STRING)) {\r
+ lastDescriptionElement = makeFeatureString(state, reader,feature, taxonDescription, lastDescriptionElement,next);\r
+ } else if (isStartingElement(next, FIGURE_REF)) {\r
+ lastDescriptionElement = makeFeatureFigureRef(state, reader, taxonDescription, isDescription, lastDescriptionElement, next);\r
+ } else if (isStartingElement(next, REFERENCES)) {\r
+ // TODO details/microcitation ??\r
+\r
+ List<Reference<?>> refs = handleReferences(state, reader, next);\r
+ if (!refs.isEmpty()) {\r
+ // TODO\r
+ Reference<?> descriptionRef = state.getConfig().getSourceReference();\r
+ TaxonDescription description = getTaxonDescription(taxon, descriptionRef, false, true);\r
+ TextData featurePlaceholder = getFeaturePlaceholder(state, description, feature, true);\r
+ for (Reference<?> citation : refs) {\r
+ featurePlaceholder.addSource(null, null, citation, null);\r
}\r
} else {\r
- handleUnexpectedStartElement(next);\r
+ String message = "No reference found in references";\r
+ fireWarningEvent(message, next, 6);\r
}\r
+ } else if (isStartingElement(next, NUM)) {\r
+ //TODO\r
+ handleNotYetImplementedElement(next);\r
+ } else if (isEndingElement(next, NUM)) {\r
+ //TODO\r
+ popUnimplemented(next.asEndElement());\r
} else {\r
handleUnexpectedElement(next);\r
}\r
}\r
- // TODO handle missing end element\r
- throw new IllegalStateException("Feature has no closing tag");\r
+ throw new IllegalStateException("<Feature> has no closing tag");\r
}\r
\r
/**\r
* @return\r
* @throws XMLStreamException\r
*/\r
- private DescriptionElementBase makeFeatureFigureRef(\r
- MarkupImportState state, XMLEventReader reader,\r
- TaxonDescription taxonDescription, boolean isDescription,\r
- DescriptionElementBase lastDescriptionElement, XMLEvent next)\r
- throws XMLStreamException {\r
+ private DescriptionElementBase makeFeatureFigureRef(MarkupImportState state, XMLEventReader reader,TaxonDescription taxonDescription, \r
+ boolean isDescription, DescriptionElementBase lastDescriptionElement, XMLEvent next)throws XMLStreamException {\r
FigureDataHolder figureHolder = handleFigureRef(state, reader, next);\r
- Feature figureFeature = getFeature(state,\r
- MarkupTransformer.uuidFigures, "Figures", "Figures", "Fig.",\r
- null);\r
+ Feature figureFeature = getFeature(state,MarkupTransformer.uuidFigures, "Figures", "Figures", "Fig.",null);\r
if (isDescription) {\r
TextData figureHolderTextData = null;\r
// if (figureHolderTextData == null){\r
figureHolderTextData.addAnnotation(annotation);\r
}\r
if (StringUtils.isNotBlank(figureHolder.figurePart)) {\r
- String annotationText = "<figurePart>"\r
- + figureHolder.figurePart.trim() + "</figurePart>";\r
- Annotation annotation = Annotation.NewInstance(annotationText,\r
- AnnotationType.EDITORIAL(), Language.DEFAULT());\r
+ String annotationText = "<figurePart>"+ figureHolder.figurePart.trim() + "</figurePart>";\r
+ Annotation annotation = Annotation.NewInstance(annotationText,AnnotationType.EDITORIAL(), Language.DEFAULT());\r
figureHolderTextData.addAnnotation(annotation);\r
}\r
// if (StringUtils.isNotBlank(figureText)){\r
* @param feature\r
* @param taxonDescription\r
* @param lastDescriptionElement\r
+ * @param distributionList \r
* @param next\r
* @return\r
* @throws XMLStreamException\r
*/\r
- private DescriptionElementBase makeFeatureString(MarkupImportState state,XMLEventReader reader, Feature feature,\r
- TaxonDescription taxonDescription, DescriptionElementBase lastDescriptionElement, XMLEvent next)\r
- throws XMLStreamException {\r
- Map<String, String> subheadingMap = handleString(state, reader, next);\r
+ private DescriptionElementBase makeFeatureString(MarkupImportState state,XMLEventReader reader, Feature feature, \r
+ TaxonDescription taxonDescription, DescriptionElementBase lastDescriptionElement, XMLEvent next) throws XMLStreamException {\r
+ Map<String, String> subheadingMap = handleString(state, reader, next, feature);\r
for (String subheading : subheadingMap.keySet()) {\r
Feature subheadingFeature = feature;\r
if (StringUtils.isNotBlank(subheading) && subheadingMap.size() > 1) {\r
* @param next\r
* @throws XMLStreamException\r
*/\r
- private void makeFeatureWriter(MarkupImportState state,\r
- XMLEventReader reader, Feature feature, Taxon taxon, XMLEvent next)\r
- throws XMLStreamException {\r
+ private void makeFeatureWriter(MarkupImportState state,XMLEventReader reader, Feature feature, Taxon taxon, XMLEvent next) throws XMLStreamException {\r
WriterDataHolder writer = handleWriter(state, reader, next);\r
if (isNotBlank(writer.writer)) {\r
// TODO\r
* @param next\r
* @throws XMLStreamException\r
*/\r
- private void makeFeatureHeading(MarkupImportState state,\r
- XMLEventReader reader, String classValue, Feature feature,\r
- XMLEvent next) throws XMLStreamException {\r
+ private void makeFeatureHeading(MarkupImportState state, XMLEventReader reader, String classValue, Feature feature, XMLEvent next) throws XMLStreamException {\r
String heading = handleHeading(state, reader, next);\r
if (StringUtils.isNotBlank(heading)) {\r
if (!heading.equalsIgnoreCase(classValue)) {\r
}\r
}\r
\r
- private List<Reference<?>> handleReferences(MarkupImportState state, XMLEventReader reader, XMLEvent parentEvent)\r
- throws XMLStreamException {\r
+ private List<Reference<?>> handleReferences(MarkupImportState state, XMLEventReader reader, XMLEvent parentEvent) throws XMLStreamException {\r
// attributes\r
Map<String, Attribute> attributes = getAttributes(parentEvent);\r
String bibliography = getAndRemoveAttributeValue(attributes,\r
throw new IllegalStateException("<References> has no closing tag");\r
}\r
\r
- private void handleHabitat(MarkupImportState state, XMLEventReader reader,\r
- XMLEvent parentEvent) throws XMLStreamException {\r
+ private void handleHabitat(MarkupImportState state, XMLEventReader reader, XMLEvent parentEvent) throws XMLStreamException {\r
checkNoAttributes(parentEvent);\r
Taxon taxon = state.getCurrentTaxon();\r
// TODO which ref to take?\r
throw new IllegalStateException("<Habitat> has no closing tag");\r
}\r
\r
- private String getTaggedCData(MarkupImportState state,\r
- XMLEventReader reader, XMLEvent parentEvent)\r
- throws XMLStreamException {\r
+ private String getTaggedCData(MarkupImportState state, XMLEventReader reader, XMLEvent parentEvent) throws XMLStreamException {\r
checkNoAttributes(parentEvent);\r
\r
String text = getXmlTag(parentEvent);\r
\r
}\r
\r
- private void handleDistributionLocality(MarkupImportState state,\r
- XMLEventReader reader, XMLEvent parentEvent)\r
- throws XMLStreamException {\r
- String classValue = getClassOnlyAttribute(parentEvent);\r
+ private void handleDistributionLocality(MarkupImportState state,XMLEventReader reader, XMLEvent parentEvent)throws XMLStreamException {\r
+ Map<String, Attribute> attributes = getAttributes(parentEvent);\r
+ String classValue = getAndRemoveRequiredAttributeValue(parentEvent, attributes, CLASS);\r
+ String statusValue =getAndRemoveAttributeValue(attributes, STATUS);\r
+ String frequencyValue =getAndRemoveAttributeValue(attributes, FREQUENCY);\r
+ \r
\r
Taxon taxon = state.getCurrentTaxon();\r
// TODO which ref to take?\r
- Reference ref = state.getConfig().getSourceReference();\r
+ Reference<?> ref = state.getConfig().getSourceReference();\r
\r
String text = "";\r
while (reader.hasNext()) {\r
XMLEvent next = readNoWhitespace(reader);\r
if (isMyEndingElement(next, parentEvent)) {\r
if (StringUtils.isNotBlank(text)) {\r
- TaxonDescription description = getTaxonDescription(taxon,\r
- ref, false, true);\r
- NamedAreaLevel level = makeNamedAreaLevel(state,\r
- classValue, next);\r
+ TaxonDescription description = getTaxonDescription(taxon, ref, false, true);\r
+ NamedAreaLevel level = makeNamedAreaLevel(state,classValue, next);\r
NamedArea area = createArea(text, level, state);\r
\r
PresenceAbsenceTermBase<?> status = null;\r
- Distribution distribution = Distribution.NewInstance(area,\r
- status);\r
+ try {\r
+ status = state.getTransformer().getPresenceTermByKey(statusValue);\r
+ } catch (UndefinedTransformerMethodException e) {\r
+ throw new RuntimeException(e);\r
+ }\r
+ Distribution distribution = Distribution.NewInstance(area,status);\r
description.addElement(distribution);\r
+ if (isNotBlank(frequencyValue)){\r
+ String message = "The frequency attribute is currently not yet available in CDM";\r
+ fireWarningEvent(message, parentEvent, 6);\r
+ }\r
} else {\r
String message = "Empty distribution locality";\r
fireWarningEvent(message, next, 4);\r
}\r
return;\r
- } else if (next.isStartElement()) {\r
- if (isStartingElement(next, COORDINATES)) {\r
- handleNotYetImplementedElement(next);\r
- } else {\r
- handleUnexpectedStartElement(next.asStartElement());\r
- }\r
+ } else if (isStartingElement(next, COORDINATES)) {\r
+ //TODO\r
+ handleNotYetImplementedElement(next);\r
+ } else if (isEndingElement(next, COORDINATES)) {\r
+ //TODO\r
+ popUnimplemented(next.asEndElement());\r
} else if (next.isCharacters()) {\r
text += next.asCharacters().getData();\r
} else {\r
handleUnexpectedEndElement(next.asEndElement());\r
}\r
}\r
- throw new IllegalStateException(\r
- "<DistributionLocality> has no closing tag");\r
+ throw new IllegalStateException("<DistributionLocality> has no closing tag");\r
}\r
\r
/**\r
try {\r
level = state.getTransformer().getNamedAreaLevelByKey(levelString);\r
if (level == null) {\r
- UUID levelUuid = state.getTransformer().getNamedAreaLevelUuid(\r
- levelString);\r
+ UUID levelUuid = state.getTransformer().getNamedAreaLevelUuid(levelString);\r
if (levelUuid == null) {\r
String message = "Unknown distribution locality class (named area level): %s. Create new level instead.";\r
message = String.format(message, levelString);\r
return level;\r
}\r
\r
- private String handleHeading(MarkupImportState state,\r
- XMLEventReader reader, XMLEvent parentEvent)\r
- throws XMLStreamException {\r
+ private String handleHeading(MarkupImportState state,XMLEventReader reader, XMLEvent parentEvent)throws XMLStreamException {\r
checkNoAttributes(parentEvent);\r
\r
String text = "";\r
\r
}\r
\r
- private Map<String, String> handleString(MarkupImportState state,\r
- XMLEventReader reader, XMLEvent parentEvent)\r
- throws XMLStreamException {\r
+ /**\r
+ * Handle string\r
+ * @param state\r
+ * @param reader\r
+ * @param parentEvent\r
+ * @param feature only needed for distributionLocalities\r
+ * @return\r
+ * @throws XMLStreamException\r
+ */\r
+ private Map<String, String> handleString(MarkupImportState state, XMLEventReader reader, XMLEvent parentEvent, Feature feature)throws XMLStreamException {\r
// attributes\r
String classValue = getClassOnlyAttribute(parentEvent, false);\r
if (StringUtils.isNotBlank(classValue)) {\r
text = putCurrentSubheading(subHeadingMap,currentSubheading, text);\r
// TODO footnotes\r
currentSubheading = getCData(state, reader, next).trim();\r
+ } else if (isStartingElement(next, DISTRIBUTION_LOCALITY)) {\r
+ if (feature != null && !feature.equals(Feature.DISTRIBUTION())) {\r
+ String message = "Distribution locality only allowed for feature of type 'distribution'";\r
+ fireWarningEvent(message, next, 4);\r
+ }\r
+ handleDistributionLocality(state, reader, next);\r
+ \r
} else if (next.isCharacters()) {\r
if (!isTextMode) {\r
String message = "String is not in text mode";\r
} else {\r
text += next.asCharacters().getData();\r
}\r
- } else if (isStartingElement(next, COLLECTION)) {\r
+ } else if (isStartingElement(next, HEADING)) {\r
+ //TODO\r
+ handleNotYetImplementedElement(next);\r
+ } else if (isEndingElement(next, HEADING)) {\r
+ //TODO\r
+ popUnimplemented(next.asEndElement());\r
+ } else if (isStartingElement(next, QUOTE)) {\r
+ //TODO\r
+ handleNotYetImplementedElement(next);\r
+ } else if (isEndingElement(next, QUOTE)) {\r
+ //TODO\r
+ popUnimplemented(next.asEndElement());\r
+ } else if (isStartingElement(next, DEDICATION)) {\r
+ //TODO\r
+ handleNotYetImplementedElement(next);\r
+ } else if (isEndingElement(next, DEDICATION)) {\r
+ //TODO\r
+ popUnimplemented(next.asEndElement());\r
+ } else if (isStartingElement(next, TAXONTYPE)) {\r
+ //TODO\r
+ handleNotYetImplementedElement(next);\r
+ } else if (isEndingElement(next, TAXONTYPE)) {\r
+ //TODO\r
+ popUnimplemented(next.asEndElement());\r
+ } else if (isStartingElement(next, FULL_NAME)) {\r
+ //TODO\r
+ handleNotYetImplementedElement(next);\r
+ } else if (isEndingElement(next, FULL_NAME)) {\r
+ //TODO\r
+ popUnimplemented(next.asEndElement());\r
+ }else if (isStartingElement(next, REFERENCES)) {\r
+ //TODO\r
+ handleNotYetImplementedElement(next);\r
+ } else if (isEndingElement(next, REFERENCES)) {\r
+ //TODO\r
+ popUnimplemented(next.asEndElement());\r
+ } else if (isStartingElement(next, GATHERING)) {\r
//TODO\r
handleNotYetImplementedElement(next);\r
- } else if (isEndingElement(next, COLLECTION)) {\r
+ } else if (isEndingElement(next, GATHERING)) {\r
//TODO\r
popUnimplemented(next.asEndElement());\r
} else if (isStartingElement(next, ANNOTATION)) {\r
} else if (isEndingElement(next, ANNOTATION)) {\r
//TODO\r
popUnimplemented(next.asEndElement());\r
+ } else if (isStartingElement(next, HABITAT)) {\r
+ //TODO\r
+ handleNotYetImplementedElement(next);\r
+ } else if (isEndingElement(next, HABITAT)) {\r
+ //TODO\r
+ popUnimplemented(next.asEndElement());\r
+ } else if (isStartingElement(next, FIGURE_REF)) {\r
+ //TODO\r
+ handleNotYetImplementedElement(next);\r
+ } else if (isEndingElement(next, FIGURE_REF)) {\r
+ //TODO\r
+ popUnimplemented(next.asEndElement());\r
+ } else if (isStartingElement(next, FIGURE)) {\r
+ //TODO\r
+ handleNotYetImplementedElement(next);\r
+ } else if (isEndingElement(next, FIGURE)) {\r
+ //TODO\r
+ popUnimplemented(next.asEndElement());\r
+ } else if (isStartingElement(next, FOOTNOTE_REF)) {\r
+ //TODO\r
+ handleNotYetImplementedElement(next);\r
+ } else if (isEndingElement(next, FOOTNOTE_REF)) {\r
+ //TODO\r
+ popUnimplemented(next.asEndElement());\r
+ } else if (isStartingElement(next, FOOTNOTE)) {\r
+ //TODO\r
+ handleNotYetImplementedElement(next);\r
+ } else if (isEndingElement(next, FOOTNOTE)) {\r
+ //TODO\r
+ popUnimplemented(next.asEndElement());\r
+ } else if (isStartingElement(next, WRITER)) {\r
+ //TODO\r
+ handleNotYetImplementedElement(next);\r
+ } else if (isEndingElement(next, WRITER)) {\r
+ //TODO\r
+ popUnimplemented(next.asEndElement());\r
+ } else if (isStartingElement(next, DATES)) {\r
+ //TODO\r
+ handleNotYetImplementedElement(next);\r
+ } else if (isEndingElement(next, DATES)) {\r
+ //TODO\r
+ popUnimplemented(next.asEndElement());\r
} else {\r
handleUnexpectedElement(next);\r
}\r
TextData textData = TextData.NewInstance(feature);\r
textData.putText(Language.DEFAULT(), text);\r
return textData;\r
+ } else if (isStartingElement(next, FIGURE_REF)) {\r
+ //TODO\r
+ handleNotYetImplementedElement(next);\r
+ } else if (isEndingElement(next, FIGURE_REF)) {\r
+ //TODO\r
+ popUnimplemented(next.asEndElement());\r
} else if (next.isStartElement()) {\r
if (isStartingElement(next, ANNOTATION)) {\r
handleNotYetImplementedElement(next);\r
* @return\r
* @throws UndefinedTransformerMethodException\r
*/\r
- private Feature makeFeature(String classValue, MarkupImportState state,\r
- XMLEvent parentEvent) {\r
+ private Feature makeFeature(String classValue, MarkupImportState state, XMLEvent parentEvent) {\r
UUID uuid;\r
try {\r
- Feature feature = state.getTransformer()\r
- .getFeatureByKey(classValue);\r
+ Feature feature = state.getTransformer().getFeatureByKey(classValue);\r
if (feature != null) {\r
return feature;\r
}\r
uuid = state.getTransformer().getFeatureUuid(classValue);\r
if (uuid == null) {\r
// TODO\r
- logger.warn("Uuid is null for " + classValue);\r
+ String message = "Uuid is not defined for %s";\r
+ message = String.format(message, classValue);\r
+ fireWarningEvent(message, parentEvent, 8);\r
}\r
String featureText = StringUtils.capitalize(classValue);\r
\r
// TODO eFlora vocabulary\r
TermVocabulary<Feature> voc = null;\r
- feature = getFeature(state, uuid, featureText, featureText,\r
- classValue, voc);\r
+ feature = getFeature(state, uuid, featureText, featureText, classValue, voc);\r
if (feature == null) {\r
- throw new NullPointerException(classValue\r
- + " not recognized as a feature");\r
+ throw new NullPointerException(classValue + " not recognized as a feature");\r
}\r
return feature;\r
} catch (Exception e) {\r