package at.ac.univie.mminf.qskos4j.issues.concepts; import at.ac.univie.mminf.qskos4j.issues.Issue; import at.ac.univie.mminf.qskos4j.progress.MonitoredIterator; import at.ac.univie.mminf.qskos4j.result.CollectionResult; import org.openrdf.OpenRDFException; import org.openrdf.model.Resource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.MalformedURLException; import java.net.URL; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; /** * Finds all "authoritative concepts". See the <a href="https://github.com/cmader/qSKOS/blob/master/README.rdoc"> * qSKOS readme</a> for further information. */ public class AuthoritativeConcepts extends Issue<CollectionResult<Resource>> { private final Logger logger = LoggerFactory.getLogger(AuthoritativeConcepts.class); private String authResourceIdentifier, baseURI; private InvolvedConcepts involvedConcepts; public AuthoritativeConcepts(InvolvedConcepts involvedConcepts) { super(involvedConcepts, "ac", "Authoritative Concepts", "Finds all authoritative concepts in the vocabulary", IssueType.STATISTICAL ); this.involvedConcepts = involvedConcepts; } @Override protected CollectionResult<Resource> invoke() throws OpenRDFException { getAuthResourceIdentifier(); return new CollectionResult<Resource>(extractAuthoritativeConceptsFromInvolved()); } private void determineAuthResourceIdentifier() throws OpenRDFException { try { extractAuthResourceIdentifierFromBaseURI(); } catch (Exception e) { guessAuthoritativeResourceIdentifier(); } } private void extractAuthResourceIdentifierFromBaseURI() throws Exception{ authResourceIdentifier = new java.net.URI(baseURI).getHost(); } private void guessAuthoritativeResourceIdentifier() throws OpenRDFException { HostNameOccurrencies hostNameOccurencies = new HostNameOccurrencies(); Iterator<Resource> resourcesListIt = new MonitoredIterator<Resource>( involvedConcepts.getResult().getData(), progressMonitor, "guessing publishing host"); while (resourcesListIt.hasNext()) { try { URL url = new URL(resourcesListIt.next().stringValue()); hostNameOccurencies.put(url.getHost()); } catch (MalformedURLException e) { // ignore this exception and continue with next concept } } authResourceIdentifier = hostNameOccurencies.getMostOftenOccuringHostName(); logger.info("Guessed authoritative resource identifier: '" +authResourceIdentifier+ "'"); } private Collection<Resource> extractAuthoritativeConceptsFromInvolved() throws OpenRDFException { Collection<Resource> authoritativeConcepts = new HashSet<Resource>(); for (Resource concept : involvedConcepts.getResult().getData()) { String lowerCaseUriValue = concept.toString().toLowerCase(); if (lowerCaseUriValue.contains(authResourceIdentifier.toLowerCase())) { authoritativeConcepts.add(concept); } } return authoritativeConcepts; } public void setAuthResourceIdentifier(String authResourceIdentifier) { this.authResourceIdentifier = authResourceIdentifier; reset(); } public String getAuthResourceIdentifier() throws OpenRDFException { if (authResourceIdentifier == null) { determineAuthResourceIdentifier(); } return authResourceIdentifier; } public void setBaseURI(String baseURI) { this.baseURI = baseURI; } }