/*
* This is eMonocot, a global online biodiversity information resource.
*
* Copyright © 2011–2015 The Board of Trustees of the Royal Botanic Gardens, Kew and The University of Oxford
*
* eMonocot is free software: you can redistribute it and/or modify it under the terms of the
* GNU Affero General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* eMonocot is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* The complete text of the GNU Affero General Public License is in the source repository as the file
* ‘COPYING’. It is also available from <http://www.gnu.org/licenses/>.
*/
package org.emonocot.api.job;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;
import org.gbif.dwc.terms.Term;
import org.gbif.dwc.terms.DcTerm;
import org.gbif.dwc.terms.DwcTerm;
import org.gbif.dwc.terms.GbifTerm;
import org.gbif.dwc.terms.IucnTerm;
import org.gbif.dwc.terms.UnknownTerm;
public class TermFactory {
private static final Pattern QUOTE_PATTERN = Pattern.compile("\"");
private final static Set<Term> unkownTerms = new HashSet<Term>();
public static String normaliseTerm(String term) {
// no quotes or whitespace in term names
term = StringUtils.strip(StringUtils.trim(QUOTE_PATTERN.matcher(term)
.replaceAll("")));
return term.toLowerCase();
}
public void clear() {
unkownTerms.clear();
}
/**
* @param termName - A string containing a fully qualified URI for a {@link Term}
* @return The {@link Term} represented by the parameter
*/
public static Term findTerm(String termName) {
// normalise termName
String normTermName;
if (termName == null || StringUtils.isBlank(normTermName = normaliseTerm(termName))) {
return null;
}
// try known term enums first
Term term = findTermInEnum(normTermName, DwcTerm.values(),
new String[] {DwcTerm.PREFIX, DwcTerm.NS});
if (term == null) {
term = findTermInEnum(normTermName, DcTerm.values(),
new String[] {DcTerm.PREFIX + ":", "http://purl.org/dc/elements/1.1/", "dct", "dcterm:", "dcterms:", DcTerm.NS});
}
if (term == null) {
term = findTermInEnum(normTermName, GbifTerm.values(),
new String[] {GbifTerm.PREFIX, GbifTerm.NS});
}
if (term == null) {
term = findTermInEnum(normTermName, IucnTerm.values(),
new String[] {IucnTerm.PREFIX, IucnTerm.NS});
}
if (term == null) {
term = findTermInEnum(normTermName, Wgs84Term.values(),
new String[] {Wgs84Term.PREFIX, Wgs84Term.NS});
}
if (term == null) {
term = findTermInEnum(normTermName, EmonocotTerm.values(),
new String[] {EmonocotTerm.PREFIX, EmonocotTerm.NS});
}
if (term == null) {
term = findTermInEnum(normTermName, WCSPTerm.values(),
new String[] {WCSPTerm.PREFIX, WCSPTerm.NS});
}
if (term == null) {
term = findTermInEnum(normTermName, SkosTerm.values(),
new String[] {SkosTerm.PREFIX, SkosTerm.NS});
}
if (term == null) {
term = findTermInEnum(normTermName, unkownTerms);
}
if (term == null) {
term = UnknownTerm.build(termName);
unkownTerms.add(term);
}
return term;
}
private static Term findTermInEnum(String termName,
Collection<Term> vocab) {
for (Term term : vocab) {
if (term.qualifiedName().equalsIgnoreCase(termName)) {
return term;
}
if (term.simpleName().equalsIgnoreCase(termName)) {
return term;
}
}
return null;
}
private static Term findTermInEnum(String termName, Term[] vocab,
String[] prefixes) {
for (String prefix : prefixes) {
if (termName.startsWith(prefix)) {
termName = termName.substring(prefix.length());
break;
}
}
return findTermInEnum(termName, Arrays.asList(vocab));
}
}