/**
* Copyright 2008 The University of North Carolina at Chapel Hill
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package edu.unc.lib.dl.util;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.codehaus.jackson.map.ObjectMapper;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.Namespace;
import org.jdom2.filter.Filters;
import org.jdom2.xpath.XPathExpression;
import org.jdom2.xpath.XPathFactory;
import edu.unc.lib.dl.xml.VocabularyHelper;
/**
* Vocabulary helper instantiated from a JSON array containing a list of vocabulary terms
*
* @author bbpennel
* @date Oct 7, 2015
*/
public class JSONVocabularyHelper implements VocabularyHelper {
private List<String> values;
private String vocabularyURI;
private String invalidTermPrefix;
private String selectorString;
private XPathExpression<Element> selector;
private Namespace[] namespaces;
@Override
public List<List<String>> getAuthoritativeForm(String term) {
if (values.contains(term)) {
return Arrays.asList(Arrays.asList(term));
}
return null;
}
@Override
public List<List<String>> getAuthoritativeForms(Element docRoot) throws JDOMException {
List<List<String>> terms = new ArrayList<>();
List<Element> elements = selector.evaluate(docRoot);
for (Element element : elements) {
String value = element.getTextTrim();
if (values.contains(value)) {
terms.add(Arrays.asList(value));
}
}
return terms;
}
@Override
public Set<String> getInvalidTerms(Element docRoot) throws JDOMException {
return generateInvalidTermsList(docRoot, false);
}
@Override
public Set<String> getInvalidTermsWithPrefix(Element docRoot) throws JDOMException {
return generateInvalidTermsList(docRoot, true);
}
private Set<String> generateInvalidTermsList(Element docRoot, boolean includePrefix) {
Set<String> invalidTerms = new HashSet<>();
List<Element> elements = selector.evaluate(docRoot);
for (Element element : elements) {
String value = element.getTextTrim();
if (!values.contains(value)) {
if (includePrefix) {
invalidTerms.add(invalidTermPrefix + "|" + value);
} else {
invalidTerms.add(value);
}
}
}
return invalidTerms;
}
@Override
public boolean updateDocumentTerms(Element docElement) throws JDOMException {
return false;
}
@Override
public Collection<String> getVocabularyTerms() {
return values;
}
@Override
public void setSelector(String selector) {
XPathFactory xFactory = XPathFactory.instance();
this.selector = xFactory.compile(selector, Filters.element(), null, namespaces);
this.selectorString = selector;
}
@Override
public void setSelectorNamespaces(Namespace[] namespaces) {
this.namespaces = namespaces;
}
@Override
public String getSelector() {
return selectorString;
}
public void setInvalidTermPrefix(String prefix) {
this.invalidTermPrefix = prefix;
}
@Override
public String getInvalidTermPrefix() {
return invalidTermPrefix;
}
@Override
public String getVocabularyURI() {
return this.vocabularyURI;
}
@Override
public void setVocabularyURI(String vocabularyURI) {
this.vocabularyURI = vocabularyURI;
}
@Override
public void setContent(byte[] content) throws Exception {
ObjectMapper mapper = new ObjectMapper();
String[] values = mapper.readValue(content, String[].class);
this.values = Arrays.asList(values);
}
}