// BridgeDb, // An abstraction layer for identifier mapping services, both local and online. // // Copyright 2006-2009 BridgeDb developers // Copyright 2012-2013 Christian Y. A. Brenninkmeijer // Copyright 2012-2013 OpenPhacts // // 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 org.bridgedb.ws.uri; import java.io.File; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Request; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.ResponseBuilder; import javax.ws.rs.core.Variant; import javax.ws.rs.core.Variant.VariantListBuilder; import org.apache.log4j.Logger; import org.apache.velocity.VelocityContext; import org.bridgedb.DataSource; import org.bridgedb.rdf.BridgeDbRdfTools; import org.bridgedb.rdf.UriPattern; import org.bridgedb.sql.SQLUriMapper; import org.bridgedb.statistics.MappingSetInfo; import org.bridgedb.uri.api.Mapping; import org.bridgedb.uri.api.MappingsBySet; import org.bridgedb.uri.api.UriMapper; import org.bridgedb.uri.lens.Lens; import org.bridgedb.uri.lens.LensTools; import org.bridgedb.uri.tools.DirectStatementMaker; import org.bridgedb.uri.tools.GraphResolver; import org.bridgedb.uri.tools.RegexUriPattern; import org.bridgedb.uri.tools.StatementMaker; import org.bridgedb.uri.ws.WsUriConstants; import org.bridgedb.uri.ws.bean.URISpacesInGraphBean; import org.bridgedb.utils.BridgeDBException; import org.bridgedb.ws.WsConstants; import org.bridgedb.ws.templates.WebTemplates; import org.openrdf.model.Statement; import org.openrdf.rio.RDFFormat; import com.sun.jersey.core.header.MediaTypes; /** * * @author Christian */ public class WSUriServer extends WSAPI { private static boolean EXCLUDE_GRAPH = false; private static boolean INCLUDE_GRAPH = true; private final String GET_BASE_URI_FROM_CONTEXT = null; private final String DO_NOT_CONVERT_TO_RDF = null; private final boolean XREF_DATA_NOT_REQUIRED = false; private static final HashMap<String,Response> setMappings = new HashMap<String,Response>(); private final StatementMaker statementMaker; static final Logger logger = Logger.getLogger(WSUriServer.class); public WSUriServer() throws BridgeDBException { this(SQLUriMapper.getExisting(), new DirectStatementMaker()); } public WSUriServer(UriMapper uriMapper, StatementMaker statementMaker) throws BridgeDBException { super(uriMapper); logger.info("WsUriServer setup"); this.statementMaker = statementMaker; } /** * Welcome page for the Serivce. * * Expected to be overridden by the QueryExpander * * @param httpServletRequest * @return * @throws BridgeDBException * @throws UnsupportedEncodingException */ @GET @Produces(MediaType.TEXT_HTML) public Response welcomeMessage(@Context HttpServletRequest httpServletRequest) throws BridgeDBException, UnsupportedEncodingException { if (logger.isDebugEnabled()){ logger.debug("welcomeMessage called!"); } return bridgeDbHome(httpServletRequest); } /** * Welcome page for the Service. * * Expected to be overridden by the QueryExpander * * @param httpServletRequest * @return * @throws BridgeDBException * @throws UnsupportedEncodingException */ @GET @Produces(MediaType.TEXT_HTML) @Path("/" + WsUriConstants.BRIDGEDB_HOME) public Response bridgeDbHome(@Context HttpServletRequest httpServletRequest) throws BridgeDBException, UnsupportedEncodingException { if (logger.isDebugEnabled()){ logger.debug("bridgeDbHome called"); } VelocityContext velocityContext = new VelocityContext(); velocityContext.put("targetUriPatterns", UriPattern.getUriPatterns()); velocityContext.put("lenses", LensTools.getLens(LensTools.ALL_GROUP_NAME)); String mapUriScripts = WebTemplates.getForm(velocityContext, WebTemplates.SELECTORS_SCRIPTS); String mapUriForm = mapUriForm(EXCLUDE_GRAPH, httpServletRequest); velocityContext.put("api", WsUriConstants.BRIDGEDB_API); velocityContext.put("contextPath", httpServletRequest.getContextPath()); velocityContext.put("getMappingInfo", WsUriConstants.MAPPING_SET); velocityContext.put("map",WsUriConstants.MAP); velocityContext.put("mapURI", WsUriConstants.MAP_URI); velocityContext.put("mapUriForm", mapUriForm); String mainBody = WebTemplates.getForm(velocityContext, WebTemplates.BRIDGEDB_HOME); String fullPage = this.createHtmlPage("Home page for BridgeDB WebServer", mainBody, httpServletRequest); return Response.ok(fullPage, MediaType.TEXT_HTML).build(); } @GET @Produces(MediaType.TEXT_HTML) @Path("/mapURI") public Response mapURI(@Context HttpServletRequest httpServletRequest) throws BridgeDBException { if (logger.isDebugEnabled()){ logger.debug("mapURI called"); } VelocityContext velocityContext = new VelocityContext(); velocityContext.put("targetUriPatterns", UriPattern.getUriPatterns()); velocityContext.put("lenses", LensTools.getLens(LensTools.ALL_GROUP_NAME)); String mainBody = WebTemplates.getForm(velocityContext, WebTemplates.SELECTORS_SCRIPTS); String fullPage = this.createHtmlPage("mapURI Service", mainBody, httpServletRequest); return Response.ok(fullPage, MediaType.TEXT_HTML).build(); } @GET @Produces({MediaType.TEXT_HTML}) @Path("/" + WsUriConstants.DATA_SOURCE + "/{id}") public Response getDataSourceHtml(@PathParam("id") String id, @Context HttpServletRequest httpServletRequest) throws BridgeDBException { DataSource ds = DataSource.getExistingBySystemCode(id); if (noContentOnEmpty & ds == null){ return noContentWrapper(httpServletRequest); } Set<String> uriPatterns = uriMapper.getUriPatterns(id); VelocityContext velocityContext = new VelocityContext(); velocityContext.put("dataSource", ds); velocityContext.put("id", "$id"); velocityContext.put("Patterns", uriPatterns); String mainBody = WebTemplates.getForm(velocityContext, WebTemplates.DATA_SOURCE_SCRIPT); String fullPage = this.createHtmlPage("Data Source " + id + " Summary", mainBody, httpServletRequest); return Response.ok(fullPage, MediaType.TEXT_HTML).build(); } @GET @Produces(MediaType.TEXT_HTML) @Path("/" + WsUriConstants.SOURCE_INFOS) public Response getSourceInfosHtml(@QueryParam(WsUriConstants.LENS_URI) String lensUri, @Context HttpServletRequest httpServletRequest) throws BridgeDBException { if (logger.isDebugEnabled()){ logger.debug("getSourceInfosHtml called"); } return getSourceInfosHtml(lensUri, httpServletRequest, null); } private Response getSourceInfosHtml(String lensUri, HttpServletRequest httpServletRequest, String message) throws BridgeDBException { VelocityContext velocityContext = new VelocityContext(); velocityContext.put("SourceInfos", uriMapper.getSourceInfos(lensUri)); velocityContext.put("lens", lensUri); velocityContext.put("contextPath", httpServletRequest.getContextPath() ); velocityContext.put("message", message); String mainBody = WebTemplates.getForm(velocityContext, WebTemplates.SOURCE_INFO_SCRIPT); String fullPage = this.createHtmlPage("Data Source Summary", mainBody, httpServletRequest); return Response.ok(fullPage, MediaType.TEXT_HTML).build(); } @GET @Produces(MediaType.TEXT_HTML) @Path("/" + WsUriConstants.SOURCE_TARGET_INFOS) public Response getSourceTargetInfosHtml(@QueryParam(WsUriConstants.SOURCE_DATASOURCE_SYSTEM_CODE) String scrCode, @QueryParam(WsUriConstants.LENS_URI) String lensUri, @Context HttpServletRequest httpServletRequest) throws BridgeDBException { if (logger.isDebugEnabled()){ logger.debug("getSourceTargetInfosHtml called with " + scrCode); } if (scrCode == null || scrCode.isEmpty()){ return getSourceInfosHtml(lensUri, httpServletRequest, "Due to the size of your request only a summary by source is being shown"); } return getSourceTargetInfosHtml(scrCode, lensUri, httpServletRequest, null); } private Response getSourceTargetInfosHtml(String scrCode, String lensUri, HttpServletRequest httpServletRequest, String message) throws BridgeDBException { VelocityContext velocityContext = new VelocityContext(); velocityContext.put("SourceTargetInfos", uriMapper.getSourceTargetInfos(scrCode, lensUri)); velocityContext.put("scrCode", scrCode); velocityContext.put("contextPath", httpServletRequest.getContextPath() ); velocityContext.put("lens", lensUri); velocityContext.put("message", message); String mainBody = WebTemplates.getForm(velocityContext, WebTemplates.SOURCE_TARGET_INFO_SCRIPT); String fullPage = this.createHtmlPage("Data Source Summary for " + scrCode, mainBody, httpServletRequest); return Response.ok(fullPage, MediaType.TEXT_HTML).build(); } @GET @Produces({MediaType.TEXT_HTML}) @Path("/" + WsUriConstants.MAPPING_SET) public Response getMappingSetInfosHtml(@QueryParam(WsUriConstants.SOURCE_DATASOURCE_SYSTEM_CODE) String scrCode, @QueryParam(WsUriConstants.TARGET_DATASOURCE_SYSTEM_CODE) String targetCode, @QueryParam(WsUriConstants.LENS_URI) String lensUri, @Context HttpServletRequest httpServletRequest) throws BridgeDBException { if (logger.isDebugEnabled()){ logger.debug("getMappingSetInfosHtml called with " + scrCode + " and " + targetCode); } if (scrCode == null || scrCode.isEmpty()){ return getSourceInfosHtml(lensUri, httpServletRequest, "Due to the size of your request only a summary by source is being shown"); } if (targetCode == null || targetCode.isEmpty()){ return getSourceTargetInfosHtml(scrCode, lensUri, httpServletRequest, "Due to the size of your request only a summary by target is being shown"); } VelocityContext velocityContext = new VelocityContext(); velocityContext.put("MappingSetInfos", uriMapper.getMappingSetInfos(scrCode, targetCode, lensUri)); velocityContext.put("scrCode", scrCode); velocityContext.put("targetCode", targetCode); velocityContext.put("contextPath", httpServletRequest.getContextPath() ); velocityContext.put("lens", lensUri); String mainBody = WebTemplates.getForm(velocityContext, WebTemplates.MAPPING_SET_INFO_SCRIPT); String title = "Mapping Summary for " + scrCode + " -> " + targetCode; String fullPage = this.createHtmlPage(title, mainBody, httpServletRequest); return Response.ok(fullPage, MediaType.TEXT_HTML).build(); } @GET @Produces({MediaType.TEXT_HTML}) @Path("/" + WsUriConstants.MAPPING_SET + "/{id}") public Response getMappingSetInfo(@PathParam("id") String idString, @Context HttpServletRequest httpServletRequest) throws BridgeDBException { if (idString == null) { throw new BridgeDBException("Path parameter missing."); } if (idString.isEmpty()) { throw new BridgeDBException("Path parameter may not be null."); } int id = Integer.parseInt(idString); MappingSetInfo info = uriMapper.getMappingSetInfo(id); VelocityContext velocityContext = new VelocityContext(); velocityContext.put("mappingSetInfo", info); String mainBody = WebTemplates.getForm(velocityContext, WebTemplates.MAPPING_SET_SCRIPT); String fullPage = this.createHtmlPage("Mapping Set " + id, mainBody, httpServletRequest); return Response.ok(fullPage, MediaType.TEXT_HTML).build(); } @GET @Path("/" + WsUriConstants.MAPPING_SET + WsUriConstants.RDF + "/{id}") @Produces(MediaType.TEXT_HTML) public Response getMappingSetRdfHtml(@PathParam("id") String idString, @Context HttpServletRequest httpServletRequest) throws BridgeDBException{ return getMappingSetRdfHtml(idString, GET_BASE_URI_FROM_CONTEXT, DO_NOT_CONVERT_TO_RDF, httpServletRequest); } @GET @Path("/" + WsUriConstants.MAPPING_SET + WsUriConstants.RDF + "/{id}") @Produces(MediaType.TEXT_PLAIN) public Response getMappingSetRdfText(@PathParam("id") String idString, @Context Request request, @Context HttpServletRequest httpServletRequest) throws BridgeDBException{ return getMappingSetRdfText(idString, GET_BASE_URI_FROM_CONTEXT, DO_NOT_CONVERT_TO_RDF, request, httpServletRequest); } @GET @Path("/" + WsUriConstants.MAPPING_SET + WsUriConstants.RDF) @Produces({MediaType.TEXT_PLAIN, "text/turtle", "application/rdf+xml", "application/n-triples", "application/ld+json", "application/trig" }) public Response getMappingSetRdfText(@QueryParam(WsConstants.ID) String idString, @QueryParam(WsUriConstants.BASE_URI) String baseUri, @QueryParam(WsUriConstants.RDF_FORMAT) String formatName, @Context Request request, @Context HttpServletRequest httpServletRequest) throws BridgeDBException{ baseUri = checkBaseUri(baseUri, httpServletRequest); String context = checkContext(baseUri, httpServletRequest); Set<Statement> statements = getMappingSetStatements(idString, baseUri, context); if (noContentOnEmpty & statements.isEmpty()){ return Response.noContent().build(); } List<MediaType> types = new ArrayList<MediaType>(); for (RDFFormat f :RDFFormat.values() ) { types.add(MediaType.valueOf(f.getDefaultMIMEType())); types.addAll(MediaTypes.createMediaTypes(f.getMIMETypes().toArray(new String[]{}))); } List<Variant> variants = VariantListBuilder.newInstance().mediaTypes(types.toArray(new MediaType[]{})).build(); Variant variant = request.selectVariant(variants); if (formatName == null || formatName.isEmpty()) { RDFFormat format = RDFFormat.forMIMEType(variant.getMediaType().toString(), RDFFormat.NTRIPLES); formatName = format.getName(); } String rdfInfo = BridgeDbRdfTools.writeRDF(statements, formatName); return Response.ok(rdfInfo, MediaType.TEXT_PLAIN_TYPE).build(); } @GET @Path("/" + WsUriConstants.MAPPING_SET + WsUriConstants.RDF) @Produces(MediaType.TEXT_HTML) public Response getMappingSetRdfHtml(@QueryParam(WsConstants.ID) String idString, @QueryParam(WsUriConstants.BASE_URI) String baseUri, @QueryParam(WsUriConstants.RDF_FORMAT) String formatName, @Context HttpServletRequest httpServletRequest) throws BridgeDBException{ StringBuilder sb = new StringBuilder(); baseUri = checkBaseUri(baseUri, httpServletRequest); String context = checkContext(baseUri, httpServletRequest); Set<Statement> statements = getMappingSetStatements(idString, baseUri, context); sb.append("<h4>Use MediaType.TEXT_PLAIN to return remove HTML stuff</h4>"); sb.append("<p>Warning MediaType.TEXT_PLAIN version returns status 204 if no mappings found.</p>"); if (formatName != null || formatName != null){ generateTextarea(sb, "RDF", BridgeDbRdfTools.writeRDF(statements, formatName)); } else { sb.append("<p>Warning MediaType.TEXT_PLAIN version returns RDF using the default format even if no format specified.</p>"); VelocityContext velocityContext = new VelocityContext(); velocityContext.put("statements", statements); velocityContext.put("subject", WsUriConstants.MAPPING_SET); sb.append(WebTemplates.getForm(velocityContext, WebTemplates.RDF_QUAD_SCRIPT)); } String fullPage = this.createHtmlPage("MappingSet " + idString, sb.toString(), httpServletRequest); return Response.ok(fullPage, MediaType.TEXT_HTML).build(); } private int[] splitId(String idString) throws BridgeDBException{ String[] stringIds = idString.split("_"); int[] ids = new int[stringIds.length]; for (int i = 0; i< ids.length; i++){ try{ ids[i] = Integer.parseInt(stringIds[i]); } catch (NumberFormatException ex){ throw new BridgeDBException("Illegal id String: " + idString + " Expected 1 or more numbers seperated by underscore. ", ex); } } return ids; } /** * Gets known Statements about the mappingSet. * * This method is expected to be overwritten by services like the Open PHACTS IMS * that have better rdf data about the mappingSet * * @param idString * @param baseUri * @return * @throws BridgeDBException */ protected Set<Statement> getMappingSetStatements(String idString, String baseUri, String context) throws BridgeDBException{ if (idString == null || idString.isEmpty()){ throw new BridgeDBException (WsConstants.ID + " parameter is missing"); } int[] ids = splitId(idString); if (ids.length == 1){ return statementMaker.asRDF(uriMapper.getMappingSetInfo(ids[0]), baseUri, context); } else { Set<Statement> statements = new HashSet<Statement>(); for (int id:ids){ statements.addAll(statementMaker.asRDF(uriMapper.getMappingSetInfo(id), baseUri, context)); } return statements; } } private Set<Statement> getMappingSetStatements(Set<Mapping> mappings, String baseUri, String context) throws BridgeDBException { Set<Statement> results = new HashSet<Statement>(); for (Mapping mapping:mappings){ if (mapping.getPredicate() != null){ results.addAll(getMappingSetStatements(mapping.getMappingSetId(), baseUri, context)); } } return results; } private String checkBaseUri(String baseUri, HttpServletRequest httpServletRequest) throws BridgeDBException{ if (baseUri == null || baseUri.isEmpty()){ StringBuffer url = httpServletRequest.getRequestURL(); return url.substring(0, url.length()- httpServletRequest.getPathInfo().length() + 1); } return baseUri; } private String checkContext(String baseUri, HttpServletRequest httpServletRequest) { if (httpServletRequest.getQueryString() == null){ return baseUri + httpServletRequest.getPathInfo(); } else { return baseUri + httpServletRequest.getPathInfo() + "?" + httpServletRequest.getQueryString(); } } @GET @Path("/" + WsUriConstants.MAP_URI + WsUriConstants.RDF) @Produces(MediaType.TEXT_HTML) public Response mapUriRdfHtml( @QueryParam(WsUriConstants.URI) List<String> uris, @QueryParam(WsUriConstants.LENS_URI) String lensUri, @QueryParam(WsUriConstants.GRAPH) String graph, @QueryParam(WsUriConstants.TARGET_URI_PATTERN) List<String> targetUriPatterns, @QueryParam(WsUriConstants.BASE_URI) String baseUri, @QueryParam(WsUriConstants.RDF_FORMAT) String formatName, @QueryParam(WsUriConstants.LINKSET_INFO) Boolean linksetInfo, @QueryParam(WsUriConstants.OVERRIDE_PREDICATE_URI) String overridePredicateURI, @Context HttpServletRequest httpServletRequest) throws BridgeDBException{ Set<Statement> statements = this.mapUriRdfInner(uris, lensUri, graph, targetUriPatterns, baseUri, formatName, linksetInfo, overridePredicateURI, httpServletRequest); String fullPage; if (formatName != null || formatName != null){ StringBuilder sb = new StringBuilder(); generateTextarea(sb, "RDF", BridgeDbRdfTools.writeRDF(statements, formatName)); fullPage = this.createHtmlPage(WsUriConstants.MAP_URI + " as RDF", sb.toString(), httpServletRequest); } else { String contextPath = httpServletRequest.getContextPath(); VelocityContext velocityContext = new VelocityContext(); velocityContext.put("statements", statements); velocityContext.put("subject", WsUriConstants.MAP_URI); velocityContext.put("contextPath", contextPath); String table = WebTemplates.getForm(velocityContext, WebTemplates.RDF_QUAD_SCRIPT); fullPage = this.createTablePage(WsUriConstants.MAP_URI + " as RDF", table, httpServletRequest); } return Response.ok(fullPage, MediaType.TEXT_HTML).build(); } //Did not work when tried private void addTableCss(StringBuilder sb){ VelocityContext velocityContext = new VelocityContext(); sb.append(WebTemplates.getForm(velocityContext, WebTemplates.TABLE_CSS)); } //Did not work when tried private void addJQuery(StringBuilder sb){ VelocityContext velocityContext = new VelocityContext(); sb.append(WebTemplates.getForm(velocityContext, WebTemplates.JQUERY_SCRIPT)); } private void addDataTable(StringBuilder sb){ VelocityContext velocityContext = new VelocityContext(); sb.append(WebTemplates.getForm(velocityContext, WebTemplates.DATATABLE_SCRIPT)); } @GET @Path("/" + WsUriConstants.MAP_URI + WsUriConstants.RDF) @Produces(MediaType.TEXT_PLAIN) public Response mapUriRdfText( @QueryParam(WsUriConstants.URI) List<String> uris, @QueryParam(WsUriConstants.LENS_URI) String lensUri, @QueryParam(WsUriConstants.GRAPH) String graph, @QueryParam(WsUriConstants.TARGET_URI_PATTERN) List<String> targetUriPatterns, @QueryParam(WsUriConstants.BASE_URI) String baseUri, @QueryParam(WsUriConstants.RDF_FORMAT) String formatName, @QueryParam(WsUriConstants.LINKSET_INFO) Boolean linksetInfo, @QueryParam(WsUriConstants.OVERRIDE_PREDICATE_URI) String overridePredicateURI, @Context HttpServletRequest httpServletRequest) throws BridgeDBException{ Set<Statement> statements = this.mapUriRdfInner(uris, lensUri, graph, targetUriPatterns, baseUri, formatName, linksetInfo, overridePredicateURI, httpServletRequest); if (noContentOnEmpty & statements.isEmpty()){ return Response.noContent().build(); } String rdfInfo = BridgeDbRdfTools.writeRDF(statements, formatName); return Response.ok(rdfInfo, MediaType.TEXT_PLAIN_TYPE).build(); } private Set<Statement> mapUriRdfInner(List<String> uris, String lensUri, String graph, List<String> targetUriPatterns, String baseUri, String formatName, Boolean linksetInfo, String overridePredicateURI, HttpServletRequest httpServletRequest) throws BridgeDBException{ boolean addLinks; if (linksetInfo == null){ addLinks = false; } else { addLinks = linksetInfo; } if (overridePredicateURI != null && overridePredicateURI.isEmpty()) { overridePredicateURI = null; } Set<Mapping> mappings; if (uris.size() == 1){ mappings = uriMapper.mapFull(uris.iterator().next(), lensUri, XREF_DATA_NOT_REQUIRED, graph, targetUriPatterns); } else { mappings = new HashSet<Mapping>(); for(String single:uris){ mappings.addAll(uriMapper.mapFull(single, lensUri, XREF_DATA_NOT_REQUIRED, graph, targetUriPatterns)); } } baseUri = checkBaseUri(baseUri, httpServletRequest); String context = checkContext(baseUri, httpServletRequest); Set<Statement> statements = statementMaker.asRDF(mappings, baseUri, addLinks, overridePredicateURI); if (formatName != null || formatName != null){ RDFFormat rdfFormat = RDFFormat.valueOf(formatName); if (linksetInfo != null && linksetInfo){ if (rdfFormat.supportsContexts()){ statements.addAll(getMappingSetStatements(mappings, baseUri, context)); } } } else { if (linksetInfo != null && linksetInfo){ statements.addAll(getMappingSetStatements(mappings, baseUri, context)); } } return statements; } private String mapUriForm(boolean includeGraph, HttpServletRequest httpServletRequest) throws BridgeDBException{ VelocityContext velocityContext = new VelocityContext(); velocityContext.put("targetUriPatterns", UriPattern.getUriPatterns()); velocityContext.put("lenses", LensTools.getLens(LensTools.ALL_GROUP_NAME)); velocityContext.put("contextPath", httpServletRequest.getContextPath()); velocityContext.put("defaultLens", LensTools.byId(Lens.DEFAULT_LENS_NAME)); velocityContext.put("formatName", WsUriConstants.FORMAT); if (includeGraph){ velocityContext.put("graphName", WsUriConstants.GRAPH); velocityContext.put("graphs", GraphResolver.knownGraphs()); } velocityContext.put("lenses", LensTools.getLens(LensTools.ALL_GROUP_NAME)); velocityContext.put("lensURIName", WsUriConstants.LENS_URI); velocityContext.put("mapURI", WsUriConstants.MAP_URI); velocityContext.put("targetUriPatternName", WsUriConstants.TARGET_URI_PATTERN); velocityContext.put("URI", WsUriConstants.URI); return WebTemplates.getForm(velocityContext, WebTemplates.MAP_URI_FORM); } /** * Forwarding page for "/api". * * This is expected to be overwirriten by the QueryExpander * @param httpServletRequest * @return * @throws BridgeDBException * @throws UnsupportedEncodingException */ @GET @Produces(MediaType.TEXT_HTML) @Path("/api") public Response apiPage(@Context HttpServletRequest httpServletRequest) throws BridgeDBException, UnsupportedEncodingException { return imsApiPage(httpServletRequest); } @GET @Produces(MediaType.TEXT_HTML) @Path("/" + Lens.METHOD_NAME) public Response getLensesHtml(@QueryParam(WsUriConstants.LENS_URI) String lensUri, @QueryParam(WsUriConstants.LENS_GROUP) String lensGroup, @Context HttpServletRequest httpServletRequest) throws BridgeDBException { List<Lens> lenses = getTheLens(lensUri, lensGroup); StringBuilder sb = new StringBuilder(); if (lensUri != null && !lensUri.isEmpty()){ sb.append("<h2>For ").append(WsUriConstants.LENS_URI).append("=").append(lensUri).append("</h2>"); }else if (lensGroup != null && !lensGroup.isEmpty()){ sb.append("<h2>For ").append(WsUriConstants.LENS_GROUP).append("=").append(lensGroup).append("</h2>"); } else { sb.append("<h2>For the public lens </h2>"); } VelocityContext velocityContext = new VelocityContext(); velocityContext.put("lenses", lenses); velocityContext.put("contextPath", httpServletRequest.getContextPath()); velocityContext.put("dataSourceMethod", WsUriConstants.DATA_SOURCE + "/"); sb.append(WebTemplates.getForm(velocityContext, WebTemplates.LENS)); sb.append("<p><a href=\""); sb.append(httpServletRequest.getContextPath()); sb.append("/"); sb.append(Lens.METHOD_NAME); sb.append(WsUriConstants.XML); if (lensUri != null && !lensUri.isEmpty()){ sb.append("?"); sb.append(WsUriConstants.LENS_URI); sb.append("="); sb.append(lensUri); } else if (lensGroup != null && !lensGroup.isEmpty()){ sb.append("?"); sb.append(WsUriConstants.LENS_GROUP); sb.append("="); sb.append(lensGroup); } sb.append("\">"); sb.append("XML Format"); sb.append("</a></p>\n"); addLensGroups(sb, httpServletRequest); String fullPage = createHtmlPage("Lens Summary", sb.toString(), httpServletRequest); return Response.ok(fullPage, MediaType.TEXT_HTML).build(); } @GET @Produces(MediaType.TEXT_HTML) @Path("/" + WsUriConstants.LENS_GROUP) public Response getLensGroup(@Context HttpServletRequest httpServletRequest) throws BridgeDBException { StringBuilder sb = new StringBuilder(); addLensGroups(sb, httpServletRequest); String fullPage = createHtmlPage("Lens Groups", sb.toString(), httpServletRequest); return Response.ok(fullPage, MediaType.TEXT_HTML).build(); } private void addLensGroups(StringBuilder sb, HttpServletRequest httpServletRequest){ Set<String> lensGroups = LensTools.getLensGroups(); VelocityContext velocityContext = new VelocityContext(); velocityContext.put("lensGroups", lensGroups); velocityContext.put("lensCall", httpServletRequest.getContextPath() + "/" + Lens.METHOD_NAME + "?" + WsUriConstants.LENS_GROUP + "="); sb.append(WebTemplates.getForm(velocityContext, WebTemplates.LENS_GROUP)); } /** * Not longer works as it did not scale * @deprecated Will now always throw an Exception */ @GET @Produces(MediaType.TEXT_HTML) @Path("/" + WsUriConstants.GRAPHVIZ) public Response graphvizDot(@QueryParam(WsUriConstants.LENS_URI) String lensUri) throws BridgeDBException, UnsupportedEncodingException { StringBuilder sb = new StringBuilder(); List<MappingSetInfo> rawProvenaceinfos = uriMapper.getMappingSetInfos(null, null, lensUri); SourceTargetCounter sourceTargetCounter = new SourceTargetCounter(rawProvenaceinfos); sb.append("digraph G {"); for (MappingSetInfo info:sourceTargetCounter.getSummaryInfos()){ if (info.getSource().compareTo(info.getTarget()) < 0 ){ sb.append("\""); sb.append(info.getSource().getFullName()); sb.append("\" -> \""); sb.append(info.getTarget().getFullName()); sb.append("\" [dir = both, label=\""); sb.append(formatter.format(info.getNumberOfLinks()) + "(" + info.getStringId() + ")"); sb.append("\""); if (info.isTransitive()){ sb.append(", style=dashed"); } sb.append("];\n"); } } sb.append("}"); return Response.ok(sb.toString(), MediaType.TEXT_HTML).build(); } @GET @Produces({MediaType.TEXT_PLAIN}) @Path("/" + WsUriConstants.MAP_BY_SET + WsUriConstants.RDF) @Deprecated public Response mapBySetRdfText(@QueryParam(WsUriConstants.URI) List<String> uris, @QueryParam(WsUriConstants.LENS_URI) String lensUri, @QueryParam(WsUriConstants.GRAPH) String graph, @QueryParam(WsUriConstants.TARGET_URI_PATTERN) List<String> targetUriPatterns, @QueryParam(WsUriConstants.RDF_FORMAT) String formatName, @Context HttpServletRequest httpServletRequest) throws BridgeDBException { MappingsBySet mappingsBySet = mapBySetInner(uris, lensUri, graph, targetUriPatterns); if (mappingsBySet.isEmpty()){ return Response.noContent().build(); } else { Set<Statement> statements = statementMaker.asRDF(mappingsBySet, getBaseUri(httpServletRequest), WsUriConstants.MAPPING_SET + WsUriConstants.RDF); String rdf =BridgeDbRdfTools.writeRDF(statements, formatName); return Response.ok(rdf, MediaType.TEXT_PLAIN_TYPE).build(); } } protected final void generateTextarea(StringBuilder sb, String fieldName, String text) { sb.append("<p>").append(fieldName); sb.append("<br/><textarea rows=\"40\" name=\"").append(fieldName) .append("\" style=\"width:100%; background-color: #EEEEFF;\">"); if (text != null){ sb.append(text); } sb.append("</textarea></p>\n"); } @GET @Produces({MediaType.TEXT_HTML}) @Path("/" + WsUriConstants.MAP_BY_SET + WsUriConstants.RDF) @Deprecated public Response mapBySetRdfHtml(@QueryParam(WsUriConstants.URI) List<String> uris, @QueryParam(WsUriConstants.LENS_URI) String lensUri, @QueryParam(WsUriConstants.GRAPH) String graph, @QueryParam(WsUriConstants.TARGET_URI_PATTERN) List<String> targetUriPatterns, @QueryParam(WsUriConstants.RDF_FORMAT) String formatName, @Context HttpServletRequest httpServletRequest ) throws BridgeDBException { MappingsBySet mappingsBySet = mapBySetInner(uris, lensUri, graph, targetUriPatterns); StringBuilder sb = new StringBuilder(); sb.append("<h2>Warning unlike "); sb.append(WsUriConstants.MAP_BY_SET); sb.append(" this method does not include any protential mapping to self.</h2>"); sb.append("<h4>Use MediaType.TEXT_PLAIN to remove HTML stuff</h4>"); sb.append("<p>Warning MediaType.TEXT_PLAIN version returns status 204 if no mappings found.</p>"); String fullBaseUri = getBaseUri(httpServletRequest); int pureLenght = fullBaseUri.length() - WsUriConstants.MAP_BY_SET.length() - WsUriConstants.RDF.length(); String pureBaseUri = fullBaseUri.substring(0, pureLenght); Set<Statement> statements = statementMaker.asRDF(mappingsBySet, pureBaseUri, WsUriConstants.MAPPING_SET + WsUriConstants.RDF); String rdf =BridgeDbRdfTools.writeRDF(statements, formatName); generateTextarea(sb, "RDF", rdf); String title = "HTML friendly " + WsUriConstants.MAP_BY_SET + WsUriConstants.RDF + " Output"; String fullPage = this.createHtmlPage(title, sb.toString(), httpServletRequest); return Response.ok(fullPage, MediaType.TEXT_HTML).build(); } @GET @Produces({MediaType.TEXT_PLAIN}) @Path("/" + Lens.METHOD_NAME + WsUriConstants.RDF) public Response lensRdfText(@QueryParam(WsUriConstants.RDF_FORMAT) String formatName, @Context HttpServletRequest httpServletRequest) throws BridgeDBException { Set<Statement> statements = LensTools.getLensAsRdf(getBaseUri(httpServletRequest), LensTools.ALL_GROUP_NAME); if (statements.isEmpty()){ return Response.noContent().build(); } else { String rdf = BridgeDbRdfTools.writeRDF(statements, formatName); return Response.ok(rdf, MediaType.TEXT_PLAIN_TYPE).build(); } } @GET @Produces({MediaType.TEXT_HTML}) @Path("/" + Lens.METHOD_NAME + WsUriConstants.RDF) public Response lensRdfHtml(@QueryParam(WsUriConstants.RDF_FORMAT) String formatName, @Context HttpServletRequest httpServletRequest ) throws BridgeDBException { Set<Statement> statements = LensTools.getLensAsRdf(getBaseUri(httpServletRequest), LensTools.ALL_GROUP_NAME); StringBuilder sb = new StringBuilder(); sb.append("<h2>Warning unlike "); sb.append(WsUriConstants.MAP_BY_SET); sb.append(" this method does not include any protential mapping to self.</h2>"); sb.append("<h4>Use MediaType.TEXT_PLAIN to remove HTML stuff</h4>"); sb.append("<p>Warning MediaType.TEXT_PLAIN version returns status 204 if no mappings found.</p>"); String rdf = BridgeDbRdfTools.writeRDF(statements, formatName); generateTextarea(sb, "RDF", rdf); String title = "HTML friendly " + WsUriConstants.MAP_BY_SET + WsUriConstants.RDF + " Output"; String fullPage = this.createHtmlPage(title, sb.toString(), httpServletRequest); return Response.ok(fullPage, MediaType.TEXT_HTML).build(); } @GET @Produces({MediaType.TEXT_HTML}) @Path("/" + WsUriConstants.MAP_BY_SET) public Response mapBySetHtml(@QueryParam(WsUriConstants.URI) List<String> uris, @QueryParam(WsUriConstants.LENS_URI) String lensUri, @QueryParam(WsUriConstants.GRAPH) String graph, @QueryParam(WsUriConstants.TARGET_URI_PATTERN) List<String> targetUriPatterns, @Context HttpServletRequest httpServletRequest) throws BridgeDBException { Response result = mapBySet(uris, lensUri, graph, targetUriPatterns); if (noContentOnEmpty & result.getStatus() == Response.Status.NO_CONTENT.getStatusCode()){ return noContentWrapper(httpServletRequest); } return result; } @Override protected Response noContentWrapper(HttpServletRequest httpServletRequest) { StringBuilder sb = new StringBuilder(); sb.append("<h1>Reply is an Empty Set or Empty Object</h1>\n"); sb.append("<h2>Note: The XML and Json versions of this request simply return status 204 (No Context)</h2>"); String fullPage = this.createHtmlPage("Empty Reply", sb.toString(), httpServletRequest); return Response.ok(fullPage, MediaType.TEXT_HTML).build(); } private String getBaseUri(HttpServletRequest httpServletRequest) { return httpServletRequest.getScheme() + "://" + httpServletRequest.getServerName() + ":" + httpServletRequest.getServerPort() + httpServletRequest.getRequestURI(); } @POST @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) @Path("/" + WsUriConstants.URI_SPACES_PER_GRAPH) public List<URISpacesInGraphBean> URISpacesPerGraphAsXML() throws BridgeDBException { Map<String, Set<RegexUriPattern>> mappings = GraphResolver.getInstance().getAllowedUriPatterns(); ArrayList<URISpacesInGraphBean> results = new ArrayList<URISpacesInGraphBean>(); for (String graph:mappings.keySet()){ Set<String> patternStrings = new HashSet<String>(); for (RegexUriPattern pattern:mappings.get(graph)){ patternStrings.add(pattern.getUriPattern()); } results.add(new URISpacesInGraphBean(graph, patternStrings)); } return results; } @GET @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) @Path("/" + WsUriConstants.URI_SPACES_PER_GRAPH) public List<URISpacesInGraphBean> URISpacesPerGraphAsXMLGet() throws BridgeDBException { return URISpacesPerGraphAsXML(); } @POST @Produces(MediaType.TEXT_HTML) @Path("/" + WsUriConstants.URI_SPACES_PER_GRAPH) public Response URISpacesPerGraphAsHtml(@Context HttpServletRequest httpServletRequest) throws BridgeDBException { VelocityContext velocityContext = new VelocityContext(); velocityContext.put("mappings", GraphResolver.getInstance().getAllowedUriPatterns()); String mainBody = WebTemplates.getForm(velocityContext, WebTemplates.GRAPH_INFO_SCRIPT); String fullPage = this.createHtmlPage("URI Spaces per Graph", mainBody, httpServletRequest); return Response.ok(fullPage, MediaType.TEXT_HTML).build(); } @GET @Produces(MediaType.TEXT_HTML) @Path("/" + WsUriConstants.URI_SPACES_PER_GRAPH) public Response URISpacesPerGraphAsHtmlGet(@Context HttpServletRequest httpServletRequest) throws BridgeDBException { return URISpacesPerGraphAsHtml(httpServletRequest); } @GET @Path("/file/{id}") @Produces(MediaType.TEXT_PLAIN) public Response getFile(@PathParam("id") String idString) throws MalformedURLException { ClassLoader classLoader = this.getClass().getClassLoader(); InputStream input = classLoader.getResourceAsStream(idString); ResponseBuilder response; if (input != null){ response = Response.ok(); response.header("Content-Disposition", "attachment; filename=" + idString); response.entity(input); } else { String message = "File : " + idString + " not found"; response = Response.status(Response.Status.NOT_FOUND).entity(message); } return response.build(); } @GET @Path("/image/{id}") @Produces("image/png") public Response getImage(@PathParam("id") String idString) throws MalformedURLException { return getFile(idString); } }