package org.deri.grefine.reconcile.rdf.factories; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Properties; import org.apache.commons.lang.StringUtils; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; import com.hp.hpl.jena.query.QuerySolution; import com.hp.hpl.jena.query.ResultSet; import com.hp.hpl.jena.rdf.model.Literal; import com.hp.hpl.jena.rdf.model.RDFNode; import com.hp.hpl.jena.rdf.model.Resource; public class PreviewResourceCannedQuery { private final String query; public PreviewResourceCannedQuery(InputStream properties) throws IOException{ Properties props = new Properties(); props.load(properties); String[] labels = tokenize(props.getProperty("label")); String[] descriptions = tokenize(props.getProperty("description")); String[] images = tokenize(props.getProperty("image")); StringBuilder selectClause = new StringBuilder(); StringBuilder whereClause = new StringBuilder(); for(int i=0; i<labels.length;i++){ String uri = labels[i].trim(); selectClause.append(" ?en_label").append(i).append(" ?label").append(i); whereClause.append("OPTIONAL { <[[RESOURCE_URI]]> <").append(uri).append("> ?en_label").append(i).append(" FILTER langMatches(lang(?en_label").append(i).append("),'en') } "); whereClause.append("OPTIONAL { <[[RESOURCE_URI]]> <").append(uri).append("> ?label").append(i).append(" FILTER langMatches(lang(?label").append(i).append("),'') } "); } for(int i=0; i<descriptions.length;i++){ String uri = descriptions[i].trim(); selectClause.append(" ?en_desc").append(i).append(" ?desc").append(i); whereClause.append("OPTIONAL { <[[RESOURCE_URI]]> <").append(uri).append("> ?en_desc").append(i).append(" FILTER langMatches(lang(?en_desc").append(i).append("),'en') } "); whereClause.append("OPTIONAL { <[[RESOURCE_URI]]> <").append(uri).append("> ?desc").append(i).append(" FILTER langMatches(lang(?desc").append(i).append("),'') } "); } for(int i=0; i<images.length;i++){ String uri = images[i].trim(); selectClause.append(" ?img").append(i); whereClause.append("OPTIONAL { <[[RESOURCE_URI]]> <").append(uri).append("> ?img").append(i).append("} "); } query = "SELECT" + selectClause + " WHERE{ " + whereClause + "}LIMIT 1" ; } public String getPreviewQueryForResource(String resourceId){ return query.replaceAll("\\[\\[RESOURCE_URI\\]\\]", resourceId); } public Multimap<String, String> wrapResourcePropertiesMapResultSet(ResultSet resultset){ Multimap<String, String> map = LinkedHashMultimap.create(); List<String> vars = resultset.getResultVars(); while(resultset.hasNext()){ QuerySolution sol = resultset.nextSolution(); List<String> labels = getFirstBoundN(sol,vars,"label",1,true); List<String> descriptions = getFirstBoundN(sol,vars,"desc",1,true); List<String> images = getFirstBoundN(sol,vars,"img",1,false); map.putAll("labels", labels); map.putAll("descriptions", descriptions); map.putAll("images", images); } return map; } private String[] tokenize(String s){ return StringUtils.split(s, ","); } private List<String> getFirstBoundN(QuerySolution sol, List<String> varNames, String varName, int num, boolean langAware){ List<String> values = new ArrayList<String>(num); String name, en_name; int i = 0; String prefix = langAware? "en_":""; do{ name = varName + i; en_name = prefix + name; i+=1; RDFNode val = sol.get(en_name); if(val==null){ if(!langAware){ continue; } //if langAware, try the one without language tag val = sol.get(name); if(val==null){ continue; } } values.add(getString(val)); if(values.size()==num){ break; } }while(varNames.contains(name)); return values; } private String getString(RDFNode node){ if(node.canAs(Literal.class)){ return node.asLiteral().getString(); }else if (node.canAs(Resource.class)){ return node.asResource().getURI(); } return node.toString(); } }