package org.gbif.occurrence.parsing.xml.rules;
import org.gbif.occurrence.constants.PrioritizedPropertyNameEnum;
import org.gbif.occurrence.parsing.xml.PrioritizedProperty;
import java.util.Properties;
import org.apache.commons.digester.Digester;
import org.apache.commons.digester.RuleSet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public abstract class AbstractRuleSet implements RuleSet {
private static final Logger LOG = LoggerFactory.getLogger(AbstractRuleSet.class);
protected Properties mappingProps;
@Override
public void addRuleInstances(Digester digester) {
// common, simple fields
addNonNullMethod(digester, "institutionCode", "setInstitutionCode", 1);
addNonNullParam(digester, "institutionCode", 0);
addNonNullMethod(digester, "collectionCode", "setCollectionCode", 1);
addNonNullParam(digester, "collectionCode", 0);
addNonNullMethod(digester, "basisOfRecord", "setBasisOfRecord", 1);
addNonNullParam(digester, "basisOfRecord", 0);
addNonNullMethod(digester, "minDepth", "setMinDepth", 1);
addNonNullParam(digester, "minDepth", 0);
addNonNullMethod(digester, "maxDepth", "setMaxDepth", 1);
addNonNullParam(digester, "maxDepth", 0);
addNonNullMethod(digester, "latLongPrecision", "setLatLongPrecision", 1);
addNonNullParam(digester, "latLongPrecision", 0);
addNonNullMethod(digester, "minAltitude", "setMinAltitude", 1);
addNonNullParam(digester, "minAltitude", 0);
addNonNullMethod(digester, "maxAltitude", "setMaxAltitude", 1);
addNonNullParam(digester, "maxAltitude", 0);
// identifier records
addNonNullMethod(digester, "identifierType1", "setIdentifierType1", 1);
addNonNullParam(digester, "identifierType1", 0);
addNonNullMethod(digester, "identifierType2", "setIdentifierType2", 1);
addNonNullParam(digester, "identifierType2", 0);
addNonNullMethod(digester, "identifierType3", "setIdentifierType3", 1);
addNonNullParam(digester, "identifierType3", 0);
addNonNullMethod(digester, "identifierType4", "setIdentifierType4", 1);
addNonNullParam(digester, "identifierType4", 0);
addNonNullMethod(digester, "identifierType5", "setIdentifierType5", 1);
addNonNullParam(digester, "identifierType5", 0);
addNonNullMethod(digester, "identifierType6", "setIdentifierType6", 1);
addNonNullParam(digester, "identifierType6", 0);
addNonNullMethod(digester, "identifierType7", "setIdentifierType7", 1);
addNonNullParam(digester, "identifierType7", 0);
// possibly many typifications
addNonNullMethod(digester, "typificationElement", "addTypification", 4);
addNonNullParam(digester, "typeScientificName", 0);
addNonNullParam(digester, "typePublication", 1);
addNonNullParam(digester, "typeStatus", 2);
addNonNullParam(digester, "typeNotes", 3);
}
protected void addNonNullMethod(Digester digester, String property, String methodName, int argCount) {
String pattern = mappingProps.getProperty(property);
if (pattern != null) {
pattern = pattern.trim();
LOG.debug("adding call method [{}] for pattern [{}] from property [{}]",
new Object[] {methodName, pattern, property});
digester.addCallMethod(pattern, methodName, argCount);
}
}
protected void addNonNullParam(Digester digester, String property, int argPosition) {
String pattern = mappingProps.getProperty(property);
if (pattern != null) {
pattern = pattern.trim();
LOG.debug("adding call param for pattern [{}] from property [{}]", pattern, property);
digester.addCallParam(pattern, argPosition);
}
}
protected void addNonNullAttParam(Digester digester, String elementProperty, String attributeProperty,
int argPosition) {
String elemPattern = mappingProps.getProperty(elementProperty);
String attPattern = mappingProps.getProperty(attributeProperty);
if (elemPattern != null && attPattern != null) {
elemPattern = elemPattern.trim();
attPattern = attPattern.trim();
LOG.debug(
"adding call param from attribute for element pattern [{}] from property [{}], seeking attribute [{}] from property [{}]",
new Object[] {elemPattern, elementProperty, attPattern, attributeProperty});
digester.addCallParam(elemPattern, argPosition, attPattern);
}
}
protected void addNonNullPrioritizedProperty(Digester digester, String property, PrioritizedPropertyNameEnum name,
int paramCount) {
for (int i = 1; i <= paramCount; i++) {
String key = property + '.' + i;
String pattern = mappingProps.getProperty(key);
if (pattern != null) {
pattern = pattern.trim();
LOG.debug("adding prioritized property [{}] with pattern [{}]", key, pattern);
// note order of rule addition is critical
digester.addObjectCreate(pattern, PrioritizedProperty.class);
digester.addSetNext(pattern, "addPrioritizedProperty");
digester.addRule(pattern, new SetLiteralRule("setPriority", i));
digester.addRule(pattern, new SetLiteralRule("setName", name));
digester.addCallMethod(pattern, "setProperty", 1);
digester.addCallParam(pattern, 0);
}
}
}
}