package org.gbif.occurrence.parsing.xml.rules; import org.gbif.api.vocabulary.OccurrenceSchemaType; import org.gbif.occurrence.constants.PrioritizedPropertyNameEnum; import org.gbif.occurrence.model.ImageRecord; import org.gbif.occurrence.model.LinkRecord; import java.io.IOException; import java.net.URL; import java.util.Properties; import org.apache.commons.digester.Digester; import org.apache.commons.digester.RuleSet; public class Dwc14RuleSet extends AbstractDwcRuleSet implements RuleSet { private final String mappingFile = "mapping/indexMapping_dwc_1_4.properties"; public Dwc14RuleSet() throws IOException { mappingProps = new Properties(); URL url = ClassLoader.getSystemResource(mappingFile); mappingProps.load(url.openStream()); } @Override public String getNamespaceURI() { return OccurrenceSchemaType.DWC_1_4.toString(); } @Override public void addRuleInstances(Digester digester) { super.addRuleInstances(digester); addNonNullMethod(digester, "dateIdentified", "setDateIdentified", 1); addNonNullParam(digester, "dateIdentified", 0); addNonNullPrioritizedProperty(digester, "dateCollected", PrioritizedPropertyNameEnum.DATE_COLLECTED, 2); addNonNullPrioritizedProperty(digester, "latitude", PrioritizedPropertyNameEnum.LATITUDE, 2); addNonNullPrioritizedProperty(digester, "longitude", PrioritizedPropertyNameEnum.LONGITUDE, 2); addNonNullPrioritizedProperty(digester, "continentOrOcean", PrioritizedPropertyNameEnum.CONTINENT_OR_OCEAN, 2); addNonNullPrioritizedProperty(digester, "catalogueNumber", PrioritizedPropertyNameEnum.CATALOGUE_NUMBER, 2); // possibly many images String pattern = mappingProps.getProperty("imageElement"); if (pattern != null) { pattern = pattern.trim(); digester.addObjectCreate(pattern, ImageRecord.class); digester.addSetNext(pattern, "addImage"); addNonNullMethod(digester, "imageUrl", "setUrl", 1); addNonNullParam(digester, "imageUrl", 0); } // 2 explicit links possible pattern = mappingProps.getProperty("linkElement0"); if (pattern != null) { pattern = pattern.trim(); digester.addObjectCreate(pattern, LinkRecord.class); digester.addSetNext(pattern, "addLink"); digester.addRule(pattern, new SetLiteralRule("setLinkType", 0)); addNonNullMethod(digester, "linkUrlType0", "setUrl", 1); addNonNullParam(digester, "linkUrlType0", 0); } pattern = mappingProps.getProperty("linkElement1"); if (pattern != null) { pattern = pattern.trim(); digester.addObjectCreate(pattern, LinkRecord.class); digester.addSetNext(pattern, "addLink"); digester.addRule(pattern, new SetLiteralRule("setLinkType", 1)); addNonNullMethod(digester, "linkUrlType1", "setUrl", 1); addNonNullParam(digester, "linkUrlType1", 0); } } }