/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.apache.jena.fuseki.servlets; import javax.servlet.http.HttpServletRequest ; import org.apache.jena.atlas.web.AcceptList ; import org.apache.jena.atlas.web.MediaType ; import org.apache.jena.fuseki.DEF ; import org.apache.jena.fuseki.conneg.ConNeg ; import org.apache.jena.fuseki.server.DataAccessPoint ; import org.apache.jena.fuseki.server.DataAccessPointRegistry ; /** Operations related to servlets */ public class ActionLib { /** * A possible implementation for {@link ActionSPARQL#mapRequestToDataset} * that assumes the form /dataset/service. * @param action the request * @return the dataset */ public static String mapRequestToDataset(HttpAction action) { String uri = action.getActionURI() ; return mapActionRequestToDataset(uri) ; } /** Map request to uri in the registry. * A possible implementation for mapRequestToDataset(String) * that assumes the form /dataset/service * Returning null means no mapping found. * The URI must be the action URI (no contact path) */ public static String mapActionRequestToDataset(String uri) { // Chop off trailing part - the service selector // e.g. /dataset/sparql => /dataset int i = uri.lastIndexOf('/') ; if ( i == -1 ) return null ; if ( i == 0 ) { // started with '/' - leave. return uri ; } return uri.substring(0, i) ; } /** Calculate the operation , given action and data access point */ public static String mapRequestToOperation(HttpAction action, DataAccessPoint dsRef) { if ( dsRef == null ) return "" ; String uri = action.getActionURI() ; String name = dsRef.getName(); if ( name.length() >= uri.length() ) return "" ; return uri.substring(name.length()+1) ; // Skip the separating "/" } /** Implementation of mapRequestToDataset(String) that looks for * the longest match in the registry. * This includes use in direct naming GSP. */ public static String mapRequestToDatasetLongest$(String uri, DataAccessPointRegistry registry) { if ( uri == null ) return null ; // This covers local, using the URI as a direct name for // a graph, not just using the indirect ?graph= or ?default // forms. String ds = null ; for ( String ds2 : registry.keys() ) { if ( ! uri.startsWith(ds2) ) continue ; if ( ds == null ) { ds = ds2 ; continue ; } if ( ds.length() < ds2.length() ) { ds = ds2 ; continue ; } } return ds ; } /** Calculate the fill URL including query string * for the HTTP request. This may be quite long. * @param request HttpServletRequest * @return String The full URL, including query string. */ public static String wholeRequestURL(HttpServletRequest request) { StringBuffer sb = request.getRequestURL() ; String queryString = request.getQueryString() ; if ( queryString != null ) { sb.append("?") ; sb.append(queryString) ; } return sb.toString() ; } /* * The context path can be: * "" for the root context * "/APP" for named contexts * so: * "/dataset/server" becomes "/dataset/server" * "/APP/dataset/server" becomes "/dataset/server" */ public static String removeContextPath(HttpAction action) { return actionURI(action.request) ; } public static String actionURI(HttpServletRequest request) { // Log.info(this, "URI = '"+request.getRequestURI()) ; // Log.info(this, "Context path = '"+request.getContextPath()+"'") ; // Log.info(this, "Servlet path = '"+request.getServletPath()+"'") ; // ServletContext cxt = this.getServletContext() ; // Log.info(this, "ServletContext path = '"+cxt.getContextPath()+"'") ; String contextPath = request.getServletContext().getContextPath() ; String uri = request.getRequestURI() ; if ( contextPath == null ) return uri ; if ( contextPath.isEmpty()) return uri ; String x = uri ; if ( uri.startsWith(contextPath) ) x = uri.substring(contextPath.length()) ; //log.info("uriWithoutContextPath: uri = "+uri+" contextPath="+contextPath+ "--> x="+x) ; return x ; } /** Negotiate the content-type and set the response headers */ public static MediaType contentNegotation(HttpAction action, AcceptList myPrefs, MediaType defaultMediaType) { MediaType mt = ConNeg.chooseContentType(action.request, myPrefs, defaultMediaType) ; if ( mt == null ) return null ; if ( mt.getContentType() != null ) action.response.setContentType(mt.getContentType()) ; if ( mt.getCharset() != null ) action.response.setCharacterEncoding(mt.getCharset()) ; return mt ; } /** Negotiate the content-type for an RDF triples syntax and set the response headers */ public static MediaType contentNegotationRDF(HttpAction action) { return contentNegotation(action, DEF.rdfOffer, DEF.acceptRDFXML) ; } /** Negotiate the content-type for an RDF quads syntax and set the response headers */ public static MediaType contentNegotationQuads(HttpAction action) { return contentNegotation(action, DEF.quadsOffer, DEF.acceptNQuads) ; } }