/******************************************************************************* * Copyright (c) 2011,2013 IBM Corporation. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Eclipse Distribution License v. 1.0 which accompanies this distribution. * * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * * Masaki Wakao * Yoshio Horiuchi * Kohji Ohsawa *******************************************************************************/ package org.eclipse.lyo.samples.excel.services.common; import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.ArrayList; import java.util.Iterator; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Context; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.StreamingOutput; import javax.ws.rs.core.UriInfo; import org.eclipse.lyo.rio.core.IConstants; import org.eclipse.lyo.samples.excel.adapter.common.AdapterRegistry; import org.eclipse.lyo.samples.excel.adapter.common.ResourceAdapter; import com.hp.hpl.jena.query.QuerySolution; import com.hp.hpl.jena.query.ResultSet; @Path(IConstants.SERVICE_SERVICES + "/{projectId}/sparql") public class SparqlQueryService { @POST public StreamingOutput doPost(@PathParam("projectId") String projectId, @Context UriInfo uriInfo, MultivaluedMap<String, String> formData){ String queryExp = null; try{ queryExp = URLDecoder.decode( formData.getFirst("queryExp"), IConstants.TEXT_ENCODING ); }catch(UnsupportedEncodingException e){ e.printStackTrace(); } String baseUrl = uriInfo.getBaseUri().toString() + IConstants.SERVICE_SERVICES; ResourceAdapter adapter = AdapterRegistry.getAdapter(baseUrl); ResultSet resultSet = adapter.executeSparql(projectId, queryExp); final String html = buildHtml(resultSet); return new StreamingOutput() { public void write(OutputStream output) throws IOException, WebApplicationException { byte[] out = html.getBytes(IConstants.TEXT_ENCODING); output.write(out); } }; } private String buildHtml(ResultSet resultSet) { StringBuffer sb = new StringBuffer(); sb.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">"); sb.append("<!--"); sb.append(" Copyright (c) 2011 IBM Corporation."); sb.append(" All rights reserved. This program and the accompanying materials"); sb.append(" are made available under the terms of the Eclipse Distribution License v. 1.0 "); sb.append(" which accompanies this distribution, and is available at "); sb.append(" http://www.eclipse.org/org/documents/edl-v10.php."); sb.append(""); sb.append(" Contributors:"); sb.append(" Kohji Ohsawa "); sb.append(" -->"); sb.append("<html>"); sb.append("<head>"); sb.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=" + IConstants.TEXT_ENCODING + "\">"); sb.append("<link rel=\"SHORTCUT ICON\" href=\"oslc.png\">"); sb.append("<title>RDF Store SPARQL</title>"); sb.append("</head>"); sb.append("<body>"); sb.append("<h3>Results</h3>"); sb.append("<table border=1>"); boolean needsHeaderRow = true; ArrayList<String> columns = new ArrayList<String>(); while (resultSet.hasNext()) { QuerySolution qs = resultSet.nextSolution(); Iterator<String> headers = qs.varNames(); if(needsHeaderRow){ sb.append("<tr>"); while(headers.hasNext()) { String header = headers.next(); sb.append("<th>" + header + "</th>"); columns.add(header); } needsHeaderRow = false; sb.append("</tr>"); } sb.append("<tr>"); for(String column: columns){ sb.append("<td>" + qs.get(column).toString() + "</td>"); } sb.append("</tr>"); } sb.append("</table>"); sb.append("</body>"); sb.append("</html>"); return sb.toString(); } }