[ https://issues.apache.org/jira/browse/JENA-626?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15022415#comment-15022415 ]
ASF GitHub Bot commented on JENA-626: ------------------------------------- Github user ajs6f commented on a diff in the pull request: https://github.com/apache/jena/pull/95#discussion_r45625411 --- Diff: jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Query_Cache.java --- @@ -0,0 +1,249 @@ +/* + * 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 org.apache.jena.atlas.io.IO; +import org.apache.jena.atlas.io.IndentedLineBuffer; +import org.apache.jena.atlas.lib.Cache; +import org.apache.jena.atlas.lib.CacheFactory; +import org.apache.jena.atlas.web.ContentType; +import org.apache.jena.fuseki.DEF; +import org.apache.jena.fuseki.Fuseki; +import org.apache.jena.fuseki.FusekiLib; +import org.apache.jena.fuseki.cache.CacheAction; +import org.apache.jena.fuseki.cache.CacheEntry; +import org.apache.jena.query.*; +import org.apache.jena.riot.web.HttpNames; +import org.apache.jena.sparql.core.Prologue; +import org.apache.jena.sparql.resultset.SPARQLResult; +import org.apache.jena.web.HttpSC; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; +import java.util.*; + +import static java.lang.String.format; +import static org.apache.jena.fuseki.server.CounterName.QueryTimeouts; +import static org.apache.jena.riot.WebContent.*; +import static org.apache.jena.riot.web.HttpNames.*; +import static org.apache.jena.riot.web.HttpNames.paramTimeout; + +public class SPARQL_Query_Cache extends SPARQL_Protocol { + + private static final String QueryParseBase = Fuseki.BaseParserSPARQL ; + + private static Cache cache = null; + + private int CACHE_SIZE = 10000; + + public SPARQL_Query_Cache() { + super() ; + if(cache == null){ + cache = CacheFactory.createCache(CACHE_SIZE); + } + } + + // All the params we support + protected static List<String> allParams = Arrays.asList(paramQuery, paramDefaultGraphURI, paramNamedGraphURI, + paramQueryRef, paramStyleSheet, paramAccept, paramOutput1, + paramOutput2, paramCallback, paramForceAccept, paramTimeout) ; + + // Choose REST verbs to support. + + // doMethod : Not used with UberServlet dispatch. + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) { + doCommon(request, response) ; + } + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) { + doCommon(request, response) ; + } + + @Override + protected void doOptions(HttpServletRequest request, HttpServletResponse response) { + setCommonHeadersForOptions(response) ; + response.setHeader(HttpNames.hAllow, "GET,OPTIONS,POST") ; + response.setHeader(HttpNames.hContentLengh, "0") ; + } + + protected void doOptions(HttpAction action) { + doOptions(action.request, action.response) ; + } + + @Override + protected void validate(HttpAction action) { + } + + @Override + protected void perform(HttpAction action) { + + // OPTIONS + if ( action.request.getMethod().equals(HttpNames.METHOD_OPTIONS) ) { + // Share with update via SPARQL_Protocol. + doOptions(action) ; + return ; + } + + // GET + if ( action.request.getMethod().equals(HttpNames.METHOD_GET) ) { + executeWithParameter(action) ; + return ; + } + + ContentType ct = FusekiLib.getContentType(action) ; + + // POST application/x-www-form-url + // POST ?query= and no Content-Type + if ( ct == null || isHtmlForm(ct) ) { + // validation checked that if no Content-type, then its a POST with ?query= + executeWithParameter(action) ; + return ; + } + + // POST application/sparql-query + if ( matchContentType(ct, ctSPARQLQuery) ) { + executeBody(action) ; + return ; + } + + ServletOps.error(HttpSC.UNSUPPORTED_MEDIA_TYPE_415, "Bad content type: " + ct.getContentType()) ; + } + + private void executeWithParameter(HttpAction action) { + String queryString = action.request.getParameter(paramQuery) ; + execute(queryString, action) ; + } + + private void executeBody(HttpAction action) { + String queryString = null ; + try { + InputStream input = action.request.getInputStream() ; + queryString = IO.readWholeFileAsUTF8(input) ; + } catch (IOException ex) { + ServletOps.errorOccurred(ex) ; + } + execute(queryString, action) ; + } + + private void execute(String queryString, HttpAction action) { + String queryStringLog = ServletOps.formatForLog(queryString) ; + if ( action.verbose ) + action.log.info(format("[%d] Query = \n%s", action.id, queryString)) ; + else + action.log.info(format("[%d] Query = %s", action.id, queryStringLog)) ; + + Query query = null ; --- End diff -- Just `final Query query` is clearer. > SPARQL Query Caching > -------------------- > > Key: JENA-626 > URL: https://issues.apache.org/jira/browse/JENA-626 > Project: Apache Jena > Issue Type: Improvement > Reporter: Andy Seaborne > Assignee: Saikat Maitra > Labels: java, linked_data, rdf, sparql > > Add a caching layer to Fuseki to cache the results of SPARQL Query requests. > This cache should allow for in-memory and disk-based caching, configuration > and cache management, and coordination with data modification. -- This message was sent by Atlassian JIRA (v6.3.4#6332)