/** * 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 java.io.IOException ; import javax.servlet.* ; import javax.servlet.http.HttpServletRequest ; import javax.servlet.http.HttpServletResponse ; import org.apache.jena.fuseki.Fuseki ; import org.apache.jena.fuseki.server.DataAccessPoint ; import org.apache.jena.fuseki.server.DataAccessPointRegistry ; import org.slf4j.Logger ; /** Look at all requests and see if they match a registered dataset name; * if they do, pass down to the uber servlet, which can dispatch any request * for any service. */ public class FusekiFilter implements Filter { private static Logger log = Fuseki.serverLog ; private static SPARQL_UberServlet überServlet = new SPARQL_UberServlet.AccessByConfig() ; @Override public void init(FilterConfig filterConfig) { // log.info("Filter: ["+Utils.className(this)+"] ServletContextName = "+filterConfig.getServletContext().getServletContextName()) ; // log.info("Filter: ["+Utils.className(this)+"] ContextPath = "+filterConfig.getServletContext().getContextPath()) ; } private static final boolean LogFilter = false ; // Development debugging (can be excessive!) @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { try { HttpServletRequest req = (HttpServletRequest)request ; HttpServletResponse resp = (HttpServletResponse)response ; // Handle context path String uri = ActionLib.actionURI(req) ; String datasetUri = ActionLib.mapActionRequestToDataset(uri) ; DataAccessPointRegistry registry = DataAccessPointRegistry.get(request.getServletContext()) ; // is it a long running operation? // (this could be a separate filter) if ( LogFilter ) { log.info("Filter: Request URI = "+req.getRequestURI()) ; log.info("Filter: Action URI = "+uri) ; log.info("Filter: Dataset URI = "+datasetUri) ; } if ( datasetUri != null ) { if ( registry.isRegistered(datasetUri) ) { if ( LogFilter ) log.info("Filter: dispatch") ; überServlet.doCommon(req, resp) ; return ; } // Not found. Last possibility is a GSP direct name. // This is a registry scan so if not supported, we can skip the scan and // not rely on the überServlet. if ( Fuseki.GSP_DIRECT_NAMING ) { // Not a dataset name ; may be a direct GSP direct name that does not look like a service name. for ( String dsKey : registry.keys() ) { DataAccessPoint dap = registry.get(dsKey) ; String dsName = dap.getName() ; if ( datasetUri.startsWith(dsName) ) { if ( LogFilter ) log.info("Filter: dispatch (GSP direct name)") ; überServlet.doCommon(req, resp) ; return ; } } } } } catch (Exception ex) {} if ( LogFilter ) log.info("Filter: pass to chain") ; // Not found - continue. chain.doFilter(request, response); } @Override public void destroy() {} }