http://git-wip-us.apache.org/repos/asf/jena/blob/2fb788d3/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java deleted file mode 100644 index 0c10cee..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java +++ /dev/null @@ -1,338 +0,0 @@ -/** - * 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 static java.lang.String.format ; - -import java.util.List ; - -import javax.servlet.http.HttpServletRequest ; -import javax.servlet.http.HttpServletResponse ; - -import org.apache.jena.atlas.web.MediaType ; -import org.apache.jena.fuseki.DEF ; -import org.apache.jena.fuseki.FusekiException ; -import org.apache.jena.fuseki.HttpNames ; -import org.apache.jena.fuseki.conneg.ConNeg ; -import org.apache.jena.fuseki.server.DatasetRef ; -import org.apache.jena.fuseki.server.ServiceRef ; -import org.apache.jena.riot.WebContent ; - -/** This servlet can be attached to a dataset location - * and acts as a router for all SPARQL operations - * (query, update, graph store, both direct and indirect naming). - */ -public abstract class SPARQL_UberServlet extends SPARQL_ServletBase -{ - protected abstract boolean allowQuery(HttpAction action) ; - protected abstract boolean allowUpdate(HttpAction action) ; - protected abstract boolean allowREST_R(HttpAction action) ; - protected abstract boolean allowREST_W(HttpAction action) ; - protected abstract boolean allowQuadsR(HttpAction action) ; - protected abstract boolean allowQuadsW(HttpAction action) ; - - public static class ReadOnly extends SPARQL_UberServlet - { - public ReadOnly() { super() ; } - @Override protected boolean allowQuery(HttpAction action) { return true ; } - @Override protected boolean allowUpdate(HttpAction action) { return false ; } - @Override protected boolean allowREST_R(HttpAction action) { return true ; } - @Override protected boolean allowREST_W(HttpAction action) { return false ; } - @Override protected boolean allowQuadsR(HttpAction action) { return true ; } - @Override protected boolean allowQuadsW(HttpAction action) { return false ; } - } - - public static class ReadWrite extends SPARQL_UberServlet - { - public ReadWrite() { super() ; } - @Override protected boolean allowQuery(HttpAction action) { return true ; } - @Override protected boolean allowUpdate(HttpAction action) { return true ; } - @Override protected boolean allowREST_R(HttpAction action) { return true ; } - @Override protected boolean allowREST_W(HttpAction action) { return true ; } - @Override protected boolean allowQuadsR(HttpAction action) { return true ; } - @Override protected boolean allowQuadsW(HttpAction action) { return true ; } - } - - public static class AccessByConfig extends SPARQL_UberServlet - { - public AccessByConfig() { super() ; } - @Override protected boolean allowQuery(HttpAction action) { return isEnabled(action.dsRef.query) ; } - @Override protected boolean allowUpdate(HttpAction action) { return isEnabled(action.dsRef.update) ; } - @Override protected boolean allowREST_R(HttpAction action) { return isEnabled(action.dsRef.readGraphStore) || allowREST_W(action); } - @Override protected boolean allowREST_W(HttpAction action) { return isEnabled(action.dsRef.readWriteGraphStore) ; } - // Quad operations tied to presence/absence of GSP. - @Override protected boolean allowQuadsR(HttpAction action) { return isEnabled(action.dsRef.readGraphStore) ; } - @Override protected boolean allowQuadsW(HttpAction action) { return isEnabled(action.dsRef.readWriteGraphStore) ; } - - private boolean isEnabled(ServiceRef service) { return service.isActive() ; } - } - - /* This can be used for a single servlet for everything (über-servlet) - * - * It can check for a request that looks like a service request and passes it on. - * This takes precedence over direct naming. - */ - - // Refactor? Extract the direct naming handling. - // To test: enable in SPARQLServer.configureOneDataset - - private final SPARQL_ServletBase queryServlet = new SPARQL_QueryDataset() ; - private final SPARQL_ServletBase updateServlet = new SPARQL_Update() ; - private final SPARQL_ServletBase uploadServlet = new SPARQL_Upload() ; - private final SPARQL_REST restServlet_RW = new SPARQL_REST_RW() ; - private final SPARQL_REST restServlet_R = new SPARQL_REST_R() ; - private final SPARQL_ServletBase restQuads = new REST_Quads() ; - - public SPARQL_UberServlet() { super(); } - - private String getEPName(String dsname, List<String> endpoints) - { - if (endpoints == null || endpoints.size() == 0) return null ; - String x = endpoints.get(0) ; - if ( ! dsname.endsWith("/") ) - x = dsname+"/"+x ; - else - x = dsname+x ; - return x ; - } - - // These calls should not happen because we hook in at executeAction - @Override protected void validate(HttpAction action) { throw new FusekiException("Call to SPARQL_UberServlet.validate") ; } - @Override protected void perform(HttpAction action) { throw new FusekiException("Call to SPARQL_UberServlet.perform") ; } - - /** Map request to uri in the registry. - * null means no mapping done - */ - @Override - protected String mapRequestToDataset(String uri) - { - return mapRequestToDatasetLongest$(uri) ; - } - - - /** Intercept the processing cycle at the point where the action has been set up, - * the dataset target decided but no validation or execution has been done, - * nor any stats have been done. - */ - @Override - protected void executeAction(HttpAction action) - { - long id = action.id ; - HttpServletRequest request = action.request ; - HttpServletResponse response = action.response ; - String uri = request.getRequestURI() ; - String method = request.getMethod() ; - DatasetRef desc = action.dsRef ; - - String trailing = findTrailing(uri, desc.name) ; - String qs = request.getQueryString() ; - - boolean hasParams = request.getParameterMap().size() > 0 ; - - // Test for parameters - includes HTML forms. - boolean hasParamQuery = request.getParameter(HttpNames.paramQuery) != null ; - // Include old name "request=" - boolean hasParamUpdate = request.getParameter(HttpNames.paramUpdate) != null || request.getParameter(HttpNames.paramRequest) != null ; - boolean hasParamGraph = request.getParameter(HttpNames.paramGraph) != null ; - boolean hasParamGraphDefault = request.getParameter(HttpNames.paramGraphDefault) != null ; - boolean isForm = WebContent.contentTypeHTMLForm.equalsIgnoreCase(request.getContentType()) ; - - String ct = request.getContentType() ; - String charset = request.getCharacterEncoding() ; - - MediaType mt = null ; - if ( ct != null ) - mt = MediaType.create(ct, charset) ; - - log.info(format("[%d] All: %s %s :: '%s' :: %s ? %s", id, method, desc.name, trailing, (mt==null?"<none>":mt), (qs==null?"":qs))) ; - - boolean hasTrailing = ( trailing.length() != 0 ) ; - - if ( ! hasTrailing && ! hasParams ) - { - restQuads.executeLifecycle(action) ; - return ; - } - - if ( ! hasTrailing ) - { - // Has params of some kind. - if ( hasParamQuery || WebContent.contentTypeSPARQLQuery.equalsIgnoreCase(ct) ) - { - // SPARQL Query - if ( ! allowQuery(action)) - errorForbidden("Forbidden: SPARQL query") ; - executeRequest(action, queryServlet, desc.query) ; - return ; - } - - if ( hasParamUpdate || WebContent.contentTypeSPARQLUpdate.equalsIgnoreCase(ct) ) - { - // SPARQL Update - if ( ! allowQuery(action)) - errorForbidden("Forbidden: SPARQL query") ; - executeRequest(action, updateServlet, desc.update) ; - return ; - } - - if ( hasParamGraph || hasParamGraphDefault ) - { - doGraphStoreProtocol(action) ; - return ; - } - - errorBadRequest("Malformed request") ; - errorForbidden("Forbidden: SPARQL Graph Store Protocol : Read operation : "+method) ; - } - - final boolean checkForPossibleService = true ; - if ( checkForPossibleService ) - { - // There is a trailing part. - // Check it's not the same name as a registered service. - // If so, dispatch to that service. - if ( serviceDispatch(action, desc.query, trailing, queryServlet) ) return ; - if ( serviceDispatch(action, desc.update, trailing, updateServlet) ) return ; - if ( serviceDispatch(action, desc.upload, trailing, uploadServlet) ) return ; - if ( serviceDispatch(action, desc.readGraphStore, trailing, restServlet_R) ) return ; - if ( serviceDispatch(action, desc.readWriteGraphStore, trailing, restServlet_RW) ) return ; - } - // There is a trailing part - params are illegal by this point. - if ( hasParams ) - // ?? Revisit to include query-on-one-graph - //errorBadRequest("Can't invoke a query-string service on a direct named graph") ; - errorNotFound("Not found: dataset='"+printName(desc.name)+"' service='"+printName(trailing)+"'"); - - // There is a trailing part - not a service, no params ==> GSP direct naming. - doGraphStoreProtocol(action) ; - } - - private String printName(String x) { - if ( x.startsWith("/") ) - return x.substring(1) ; - return x ; - } - - private void doGraphStoreProtocol(HttpAction action) - { - // The GSP servlets handle direct and indirect naming. - DatasetRef desc = action.dsRef ; - String method = action.request.getMethod() ; - - if ( HttpNames.METHOD_GET.equalsIgnoreCase(method) || - HttpNames.METHOD_HEAD.equalsIgnoreCase(method) ) - { - if ( ! allowREST_R(action)) - // Graphs Store Protocol, indirect naming, read - // Indirect naming. Prefer the R service if available. - if ( desc.readGraphStore.isActive() ) - executeRequest(action, restServlet_R, desc.readGraphStore) ; - else if ( desc.readWriteGraphStore.isActive() ) - executeRequest(action, restServlet_RW, desc.readWriteGraphStore) ; - else - errorMethodNotAllowed(method) ; - return ; - } - - // Graphs Store Protocol, indirect naming, write - if ( ! allowREST_W(action)) - errorForbidden("Forbidden: SPARQL Graph Store Protocol : Write operation : "+method) ; - executeRequest(action, restServlet_RW, desc.readWriteGraphStore) ; - return ; - } - - private void executeRequest(HttpAction action, SPARQL_ServletBase servlet, ServiceRef service) - { - if ( service.endpoints.size() == 0 ) - errorMethodNotAllowed(action.request.getMethod()) ; - servlet.executeLifecycle(action) ; - } - - private void executeRequest(HttpAction action,SPARQL_ServletBase servlet) - { - servlet.executeLifecycle(action) ; -// // Forwarded dispatch. -// try -// { -// String target = getEPName(desc.name, endpointList) ; -// if ( target == null ) -// errorMethodNotAllowed(request.getMethod()) ; -// // ** relative servlet forward -// request.getRequestDispatcher(target).forward(request, response) ; - - -// // ** absolute srvlet forward -// // getServletContext().getRequestDispatcher(target) ; -// } catch (Exception e) { errorOccurred(e) ; } - } - - protected static MediaType contentNegotationQuads(HttpAction action) - { - MediaType mt = ConNeg.chooseContentType(action.request, DEF.quadsOffer, DEF.acceptNQuads) ; - 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 ; - } - - /** return true if dispatched */ - private boolean serviceDispatch(HttpAction action, ServiceRef service, String srvName , SPARQL_ServletBase servlet) - { - if ( ! service.endpoints.contains(srvName) ) - return false ; - servlet.executeLifecycle(action) ; - return true ; - } - - /** Find the graph (direct naming) or service name */ - protected String findTrailing(String uri, String dsname) - { - if ( dsname.length() >= uri.length() ) - return "" ; - return uri.substring(dsname.length()+1) ; // Skip the separating "/" - } - - @Override - protected void doHead(HttpServletRequest request, HttpServletResponse response) - { doCommon(request, response) ; } - - @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) - { doCommon(request, response) ; } - - @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) - { doCommon(request, response) ; } - - @Override - protected void doOptions(HttpServletRequest request, HttpServletResponse response) - { doCommon(request, response) ; } - - @Override - protected void doPut(HttpServletRequest request, HttpServletResponse response) - { doCommon(request, response) ; } - - @Override - protected void doDelete(HttpServletRequest request, HttpServletResponse response) - { doCommon(request, response) ; } -} -
http://git-wip-us.apache.org/repos/asf/jena/blob/2fb788d3/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Update.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Update.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Update.java deleted file mode 100644 index a54715c..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Update.java +++ /dev/null @@ -1,307 +0,0 @@ -/* - * 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 static java.lang.String.format ; -import static org.apache.jena.fuseki.Fuseki.requestLog ; -import static org.apache.jena.fuseki.HttpNames.paramRequest ; -import static org.apache.jena.fuseki.HttpNames.paramUpdate ; -import static org.apache.jena.fuseki.HttpNames.paramUsingGraphURI ; -import static org.apache.jena.fuseki.HttpNames.paramUsingNamedGraphURI ; -import static org.apache.jena.fuseki.server.CounterName.UpdateExecErrors ; - -import java.io.ByteArrayInputStream ; -import java.io.IOException ; -import java.io.InputStream ; -import java.util.Arrays ; -import java.util.Collection ; -import java.util.Enumeration ; -import java.util.List ; - -import javax.servlet.ServletException ; -import javax.servlet.http.HttpServletRequest ; -import javax.servlet.http.HttpServletResponse ; - -import org.apache.jena.atlas.io.IO ; -import org.apache.jena.atlas.lib.StrUtils ; -import org.apache.jena.atlas.web.ContentType ; -import org.apache.jena.fuseki.FusekiLib ; -import org.apache.jena.fuseki.HttpNames ; -import org.apache.jena.iri.IRI ; -import org.apache.jena.riot.WebContent ; -import org.apache.jena.riot.system.IRIResolver ; -import org.apache.jena.web.HttpSC ; - -import com.hp.hpl.jena.graph.Node ; -import com.hp.hpl.jena.graph.NodeFactory ; -import com.hp.hpl.jena.query.QueryParseException ; -import com.hp.hpl.jena.query.Syntax ; -import com.hp.hpl.jena.sparql.modify.UsingList ; -import com.hp.hpl.jena.update.UpdateAction ; -import com.hp.hpl.jena.update.UpdateException ; -import com.hp.hpl.jena.update.UpdateFactory ; -import com.hp.hpl.jena.update.UpdateRequest ; - -public class SPARQL_Update extends SPARQL_Protocol -{ - // Base URI used to isolate parsing from the current directory of the server. - private static final String UpdateParseBase = "http://example/update-base/" ; - private static final IRIResolver resolver = IRIResolver.create(UpdateParseBase) ; - - public SPARQL_Update() - { super() ; } - - @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException - { - response.sendError(HttpSC.BAD_REQUEST_400, "Attempt to perform SPARQL update by GET. Use POST") ; - } - - @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException - { - doCommon(request, response) ; - } - - @Override - protected void doOptions(HttpServletRequest request, HttpServletResponse response) - { - response.setHeader(HttpNames.hAllow, "OPTIONS,POST"); - response.setHeader(HttpNames.hContentLengh, "0") ; - } - - @Override - protected void perform(HttpAction action) - { - // WebContent needs to migrate to using ContentType. - String ctStr ; - { - ContentType ct = FusekiLib.getContentType(action) ; - if ( ct == null ) - ctStr = WebContent.contentTypeSPARQLUpdate ; - else - ctStr = ct.getContentType() ; - } - - if (WebContent.contentTypeSPARQLUpdate.equals(ctStr)) - { - executeBody(action) ; - return ; - } - if (WebContent.contentTypeHTMLForm.equals(ctStr)) - { - executeForm(action) ; - return ; - } - error(HttpSC.UNSUPPORTED_MEDIA_TYPE_415, "Bad content type: " + action.request.getContentType()) ; - } - - protected static List<String> paramsForm = Arrays.asList(paramRequest, paramUpdate, - paramUsingGraphURI, paramUsingNamedGraphURI) ; - protected static List<String> paramsPOST = Arrays.asList(paramUsingGraphURI, paramUsingNamedGraphURI) ; - - @Override - protected void validate(HttpAction action) - { - HttpServletRequest request = action.request ; - - if ( ! HttpNames.METHOD_POST.equalsIgnoreCase(request.getMethod()) ) - errorMethodNotAllowed("SPARQL Update : use POST") ; - - ContentType incoming = FusekiLib.getContentType(action) ; - String ctStr = ( incoming == null ) ? WebContent.contentTypeSPARQLUpdate : incoming.getContentType() ; - // ---- - - if ( WebContent.contentTypeSPARQLUpdate.equals(ctStr) ) - { - String charset = request.getCharacterEncoding() ; - if ( charset != null && ! charset.equalsIgnoreCase(WebContent.charsetUTF8) ) - errorBadRequest("Bad charset: "+charset) ; - validate(request, paramsPOST) ; - return ; - } - - if ( WebContent.contentTypeHTMLForm.equals(ctStr) ) - { - int x = countParamOccurences(request, paramUpdate) + countParamOccurences(request, paramRequest) ; - if ( x == 0 ) - errorBadRequest("SPARQL Update: No 'update=' parameter") ; - if ( x != 1 ) - errorBadRequest("SPARQL Update: Multiple 'update=' parameters") ; - - String requestStr = request.getParameter(paramUpdate) ; - if ( requestStr == null ) - requestStr = request.getParameter(paramRequest) ; - if ( requestStr == null ) - errorBadRequest("SPARQL Update: No update= in HTML form") ; - validate(request, paramsForm) ; - return ; - } - - error(HttpSC.UNSUPPORTED_MEDIA_TYPE_415, "Must be "+WebContent.contentTypeSPARQLUpdate+" or "+WebContent.contentTypeHTMLForm+" (got "+ctStr+")") ; - } - - protected void validate(HttpServletRequest request, Collection<String> params) - { - if ( params != null ) - { - Enumeration<String> en = request.getParameterNames() ; - for ( ; en.hasMoreElements() ; ) - { - String name = en.nextElement() ; - if ( ! params.contains(name) ) - warning("SPARQL Update: Unrecognize request parameter (ignored): "+name) ; - } - } - } - - private void executeBody(HttpAction action) - { - InputStream input = null ; - try { input = action.request.getInputStream() ; } - catch (IOException ex) { errorOccurred(ex) ; } - - if ( action.verbose ) - { - // Verbose mode only .... capture request for logging (does not scale). - String requestStr = null ; - try { requestStr = IO.readWholeFileAsUTF8(input) ; } - catch (IOException ex) { IO.exception(ex) ; } - requestLog.info(format("[%d] Update = %s", action.id, formatForLog(requestStr))) ; - - input = new ByteArrayInputStream(requestStr.getBytes()); - requestStr = null; - } - - execute(action, input) ; - successNoContent(action) ; - } - - private void executeForm(HttpAction action) - { - String requestStr = action.request.getParameter(paramUpdate) ; - if ( requestStr == null ) - requestStr = action.request.getParameter(paramRequest) ; - - if ( action.verbose ) - //requestLog.info(format("[%d] Form update = %s", action.id, formatForLog(requestStr))) ; - requestLog.info(format("[%d] Form update = \n%s", action.id, requestStr)) ; - // A little ugly because we are taking a copy of the string, but hopefully shouldn't be too big if we are in this code-path - // If we didn't want this additional copy, we could make the parser take a Reader in addition to an InputStream - byte[] b = StrUtils.asUTF8bytes(requestStr) ; - ByteArrayInputStream input = new ByteArrayInputStream(b); - requestStr = null; // free it early at least - execute(action, input); - successPage(action,"Update succeeded") ; - } - - private void execute(HttpAction action, InputStream input) - { - UsingList usingList = processProtocol(action.request) ; - - // If the dsg is transactional, then we can parse and execute the update in a streaming fashion. - // If it isn't, we need to read the entire update request before performing any updates, because - // we have to attempt to make the request atomic in the face of malformed queries - UpdateRequest req = null ; - if (!action.isTransactional()) - { - try { - // TODO implement a spill-to-disk version of this - req = UpdateFactory.read(usingList, input, UpdateParseBase, Syntax.syntaxARQ); - } - catch (UpdateException ex) { errorBadRequest(ex.getMessage()) ; return ; } - catch (QueryParseException ex) { errorBadRequest(messageForQPE(ex)) ; return ; } - } - - action.beginWrite() ; - try { - if (req == null ) - UpdateAction.parseExecute(usingList, action.getActiveDSG(), input, UpdateParseBase, Syntax.syntaxARQ); - else - UpdateAction.execute(req, action.getActiveDSG()) ; - action.commit() ; - } catch (UpdateException ex) { - action.abort() ; - incCounter(action.srvRef, UpdateExecErrors) ; - errorOccurred(ex.getMessage()) ; - } catch (QueryParseException ex) { - action.abort() ; - // Counter inc'ed further out. - errorBadRequest(messageForQPE(ex)) ; - } catch (Throwable ex) { - if ( ! ( ex instanceof ActionErrorException ) ) - { - try { action.abort() ; } catch (Exception ex2) {} - errorOccurred(ex.getMessage(), ex) ; - } - } finally { action.endWrite(); } - } - - /* [It is an error to supply the using-graph-uri or using-named-graph-uri parameters - * when using this protocol to convey a SPARQL 1.1 Update request that contains an - * operation that uses the USING, USING NAMED, or WITH clause.] - * - * We will simply capture any using parameters here and pass them to the parser, which will be - * responsible for throwing an UpdateException if the query violates the above requirement, - * and will also be responsible for adding the using parameters to update queries that can - * accept them. - */ - private UsingList processProtocol(HttpServletRequest request) - { - UsingList toReturn = new UsingList(); - - String[] usingArgs = request.getParameterValues(paramUsingGraphURI) ; - String[] usingNamedArgs = request.getParameterValues(paramUsingNamedGraphURI) ; - if ( usingArgs == null && usingNamedArgs == null ) - return toReturn; - if ( usingArgs == null ) - usingArgs = new String[0] ; - if ( usingNamedArgs == null ) - usingNamedArgs = new String[0] ; - // Impossible. -// if ( usingArgs.length == 0 && usingNamedArgs.length == 0 ) -// return ; - - for (String nodeUri : usingArgs) - { - toReturn.addUsing(createNode(nodeUri)); - } - for (String nodeUri : usingNamedArgs) - { - toReturn.addUsingNamed(createNode(nodeUri)); - } - - return toReturn; - } - - private static Node createNode(String x) - { - try { - IRI iri = resolver.resolve(x) ; - return NodeFactory.createURI(iri.toString()) ; - } catch (Exception ex) - { - errorBadRequest("SPARQL Update: bad IRI: "+x) ; - return null ; - } - - } -} http://git-wip-us.apache.org/repos/asf/jena/blob/2fb788d3/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Upload.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Upload.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Upload.java deleted file mode 100644 index d5956e5..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Upload.java +++ /dev/null @@ -1,259 +0,0 @@ -/* - * 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 static java.lang.String.format ; - -import java.io.IOException ; -import java.io.InputStream ; -import java.io.PrintWriter ; -import java.util.zip.GZIPInputStream ; - -import javax.servlet.ServletException ; -import javax.servlet.http.HttpServletRequest ; -import javax.servlet.http.HttpServletResponse ; - -import org.apache.commons.fileupload.FileItemIterator ; -import org.apache.commons.fileupload.FileItemStream ; -import org.apache.commons.fileupload.servlet.ServletFileUpload ; -import org.apache.commons.fileupload.util.Streams ; -import org.apache.jena.atlas.lib.Pair ; -import org.apache.jena.atlas.web.ContentType ; -import org.apache.jena.fuseki.FusekiLib ; -import org.apache.jena.fuseki.HttpNames ; -import org.apache.jena.iri.IRI ; -import org.apache.jena.riot.Lang ; -import org.apache.jena.riot.RDFLanguages ; -import org.apache.jena.riot.lang.StreamRDFCounting ; -import org.apache.jena.riot.system.* ; -import org.apache.jena.web.HttpSC ; - -import com.hp.hpl.jena.graph.Graph ; -import com.hp.hpl.jena.graph.Node ; -import com.hp.hpl.jena.graph.NodeFactory ; -import com.hp.hpl.jena.sparql.core.Quad ; -import com.hp.hpl.jena.sparql.graph.GraphFactory ; - -public class SPARQL_Upload extends SPARQL_ServletBase -{ - private static ErrorHandler errorHandler = ErrorHandlerFactory.errorHandlerStd(log) ; - - public SPARQL_Upload() { - super() ; - } - - // Methods to respond to. - @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException - { - doCommon(request, response) ; - } - - @Override - protected void doOptions(HttpServletRequest request, HttpServletResponse response) - { - response.setHeader(HttpNames.hAllow, "OPTIONS,POST"); - response.setHeader(HttpNames.hContentLengh, "0") ; - } - - @Override - protected void perform(HttpAction action) - { - // Only allows one file in the upload. - boolean isMultipart = ServletFileUpload.isMultipartContent(action.request); - if ( ! isMultipart ) - error(HttpSC.BAD_REQUEST_400 , "Not a file upload") ; - long count = upload(action, "http://example/upload-base/") ; - try { - action.response.setContentType("text/html") ; - action.response.setStatus(HttpSC.OK_200); - PrintWriter out = action.response.getWriter() ; - out.println("<html>") ; - out.println("<head>") ; - out.println("</head>") ; - out.println("<body>") ; - out.println("<h1>Success</h1>"); - out.println("<p>") ; - out.println("Triples = "+count + "\n"); - out.println("<p>") ; - out.println("</p>") ; - out.println("<button onclick=\"timeFunction()\">Back to Fuseki</button>"); - out.println("</p>") ; - out.println("<script type=\"text/javascript\">"); - out.println("function timeFunction(){"); - out.println("window.location.href = \"/fuseki.html\";}"); - out.println("</script>"); - out.println("</body>") ; - out.println("</html>") ; - out.flush() ; - success(action) ; - } - catch (Exception ex) { errorOccurred(ex) ; } - } - - // Also used by SPARQL_REST - static public long upload(HttpAction action, String base) - { - if ( action.isTransactional() ) - return uploadTxn(action, base) ; - else - return uploadNonTxn(action, base) ; - } - - /** Non-transaction - buffer to a temporary graph so that parse errors - * are caught before inserting any data. - */ - private static long uploadNonTxn(HttpAction action, String base) { - Pair<String, Graph> p = uploadWorker(action, base) ; - String graphName = p.getLeft() ; - Graph graphTmp = p.getRight() ; - long tripleCount = graphTmp.size() ; - - log.info(format("[%d] Upload: Graph: %s (%d triple(s))", - action.id, graphName, tripleCount)) ; - - Node gn = graphName.equals(HttpNames.valueDefault) - ? Quad.defaultGraphNodeGenerated - : NodeFactory.createURI(graphName) ; - - action.beginWrite() ; - try { - FusekiLib.addDataInto(graphTmp, action.getActiveDSG(), gn) ; - action.commit() ; - return tripleCount ; - } catch (RuntimeException ex) - { - // If anything went wrong, try to backout. - try { action.abort() ; } catch (Exception ex2) {} - errorOccurred(ex.getMessage()) ; - return -1 ; - } - finally { action.endWrite() ; } - } - - /** Transactional - we'd like data to go straight to the destination, with an abort on parse error. - * But file upload with a name means that the name can be after the data - * (it is in the Fuseki default pages). - * Use Graph Store protocol for bulk uploads. - * (It would be possible to process the incoming stream and see the graph name first.) - */ - private static long uploadTxn(HttpAction action, String base) { - // We can't do better than the non-transaction approach. - return uploadNonTxn(action, base) ; - } - - /** process an HTTP upload of RDF. - * We can't stream straight into a dataset because the graph name can be after the data. - * @return graph name and count - */ - - static private Pair<String, Graph> uploadWorker(HttpAction action, String base) - { - Graph graphTmp = GraphFactory.createDefaultGraph() ; - ServletFileUpload upload = new ServletFileUpload(); - String graphName = null ; - long count = -1 ; - - String name = null ; - ContentType ct = null ; - Lang lang = null ; - - try { - FileItemIterator iter = upload.getItemIterator(action.request); - while (iter.hasNext()) { - FileItemStream item = iter.next(); - String fieldName = item.getFieldName(); - InputStream stream = item.openStream(); - if (item.isFormField()) - { - // Graph name. - String value = Streams.asString(stream, "UTF-8") ; - if ( fieldName.equals(HttpNames.paramGraph) ) - { - graphName = value ; - if ( graphName != null && ! graphName.equals("") && ! graphName.equals(HttpNames.valueDefault) ) - { - IRI iri = IRIResolver.parseIRI(value) ; - if ( iri.hasViolation(false) ) - errorBadRequest("Bad IRI: "+graphName) ; - if ( iri.getScheme() == null ) - errorBadRequest("Bad IRI: no IRI scheme name: "+graphName) ; - if ( iri.getScheme().equalsIgnoreCase("http") || iri.getScheme().equalsIgnoreCase("https")) - { - // Redundant?? - if ( iri.getRawHost() == null ) - errorBadRequest("Bad IRI: no host name: "+graphName) ; - if ( iri.getRawPath() == null || iri.getRawPath().length() == 0 ) - errorBadRequest("Bad IRI: no path: "+graphName) ; - if ( iri.getRawPath().charAt(0) != '/' ) - errorBadRequest("Bad IRI: Path does not start '/': "+graphName) ; - } - } - } - else if ( fieldName.equals(HttpNames.paramDefaultGraphURI) ) - graphName = null ; - else - // Add file type? - log.info(format("[%d] Upload: Field=%s ignored", action.id, fieldName)) ; - } else { - // Process the input stream - name = item.getName() ; - if ( name == null || name.equals("") || name.equals("UNSET FILE NAME") ) - errorBadRequest("No name for content - can't determine RDF syntax") ; - - String contentTypeHeader = item.getContentType() ; - ct = ContentType.create(contentTypeHeader) ; - - lang = RDFLanguages.contentTypeToLang(ct.getContentType()) ; - - if ( lang == null ) { - lang = RDFLanguages.filenameToLang(name) ; - - //JENA-600 filenameToLang() strips off certain extensions such as .gz and - //we need to ensure that if there was a .gz extension present we wrap the stream accordingly - if (name.endsWith(".gz")) - stream = new GZIPInputStream(stream); - } - if ( lang == null ) - // Desperate. - lang = RDFLanguages.RDFXML ; - - log.info(format("[%d] Upload: Filename: %s, Content-Type=%s, Charset=%s => %s", - action.id, name, ct.getContentType(), ct.getCharset(), lang.getName())) ; - - StreamRDF x = StreamRDFLib.graph(graphTmp) ; - StreamRDFCounting dest = StreamRDFLib.count(x) ; - SPARQL_REST.parse(action, dest, stream, lang, base); - count = dest.count() ; - } - } - - if ( graphName == null || graphName.equals("") ) - graphName = HttpNames.valueDefault ; - return Pair.create(graphName, graphTmp) ; - } - catch (ActionErrorException ex) { throw ex ; } - catch (Exception ex) { errorOccurred(ex) ; return null ; } - } - - @Override - protected void validate(HttpAction action) - {} -} http://git-wip-us.apache.org/repos/asf/jena/blob/2fb788d3/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ServletBase.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ServletBase.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ServletBase.java deleted file mode 100644 index 473a7db..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ServletBase.java +++ /dev/null @@ -1,237 +0,0 @@ -/* - * 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 java.io.PrintWriter ; -import java.util.concurrent.atomic.AtomicLong ; - -import javax.servlet.http.HttpServlet ; -import javax.servlet.http.HttpServletRequest ; -import javax.servlet.http.HttpServletResponse ; - -import org.apache.jena.atlas.lib.StrUtils ; -import org.apache.jena.fuseki.Fuseki ; -import org.apache.jena.fuseki.HttpNames ; -import org.apache.jena.web.HttpSC ; -import org.slf4j.Logger ; - -/** - * An abstract HTTP Servlet. Contains implementation methods for setting the request status in a HTTP Action, - * and a mechanism to allocate unique ID's to new requests. - */ -public abstract class ServletBase extends HttpServlet -{ - protected static final Logger log = Fuseki.requestLog ; - public final boolean verboseLogging = Fuseki.verboseLogging ; - private static AtomicLong requestIdAlloc = new AtomicLong(0) ; - - protected ServletBase() { } - - /** - * Helper method which gets a unique request ID and appends it as a header to the response - * @param request HTTP Request - * @param response HTTP Response - * @return Request ID - */ - protected long allocRequestId(HttpServletRequest request, HttpServletResponse response) { - long id = requestIdAlloc.incrementAndGet(); - addRequestId(response, id); - return id; - } - - /** - * Helper method for attaching a request ID to a response as a header - * @param response Response - * @param id Request ID - */ - protected void addRequestId(HttpServletResponse response, long id) { - response.addHeader("Fuseki-Request-ID", Long.toString(id)); - } - - protected void responseSendError(HttpServletResponse response, int statusCode, String message) - { - try { response.sendError(statusCode, message) ; } - catch (IOException ex) { errorOccurred(ex) ; } - catch (IllegalStateException ex) { } - } - - protected void responseSendError(HttpServletResponse response, int statusCode) - { - try { response.sendError(statusCode) ; } - catch (IOException ex) { errorOccurred(ex) ; } - } - - /** - * Returns the HTTP request URL, appended with any additional URL parameters used. - * - * @param request HTTP request - * @return complete request URL - */ - protected static String wholeRequestURL(HttpServletRequest request) - { - StringBuffer sb = request.getRequestURL() ; - String queryString = request.getQueryString() ; - if ( queryString != null ) - { - sb.append("?") ; - sb.append(queryString) ; - } - return sb.toString() ; - } - - protected static void successNoContent(HttpAction action) - { - success(action, HttpSC.NO_CONTENT_204); - } - - protected static void success(HttpAction action) - { - success(action, HttpSC.OK_200); - } - - protected static void successCreated(HttpAction action) - { - success(action, HttpSC.CREATED_201); - } - - // When 404 is no big deal e.g. HEAD - protected static void successNotFound(HttpAction action) - { - success(action, HttpSC.NOT_FOUND_404) ; - } - - // - protected static void success(HttpAction action, int httpStatusCode) - { - action.response.setStatus(httpStatusCode); - } - - protected static void successPage(HttpAction action, String message) - { - try { - action.response.setContentType("text/html"); - action.response.setStatus(HttpSC.OK_200); - PrintWriter out = action.response.getWriter() ; - out.println("<html>") ; - out.println("<head>") ; - out.println("</head>") ; - out.println("<body>") ; - out.println("<h1>Success</h1>"); - if ( message != null ) - { - out.println("<p>") ; - out.println(message) ; - out.println("</p>") ; - } - out.println("</body>") ; - out.println("</html>") ; - out.flush() ; - } catch (IOException ex) { errorOccurred(ex) ; } - } - - protected static void warning(String string) - { - log.warn(string) ; - } - - protected static void warning(String string, Throwable thorwable) - { - log.warn(string, thorwable) ; - } - - protected static void errorBadRequest(String string) - { - error(HttpSC.BAD_REQUEST_400, string) ; - } - - protected static void errorNotFound(String string) - { - error(HttpSC.NOT_FOUND_404, string) ; - } - - protected static void errorNotImplemented(String msg) - { - error(HttpSC.NOT_IMPLEMENTED_501, msg) ; - } - - protected static void errorMethodNotAllowed(String method) - { - error(HttpSC.METHOD_NOT_ALLOWED_405, "HTTP method not allowed: "+method) ; - } - - protected static void errorForbidden(String msg) - { - if ( msg != null ) - error(HttpSC.FORBIDDEN_403, msg) ; - else - error(HttpSC.FORBIDDEN_403, "Forbidden") ; - } - - protected static void error(int statusCode) - { - throw new ActionErrorException(null, null, statusCode) ; - } - - - protected static void error(int statusCode, String string) - { - throw new ActionErrorException(null, string, statusCode) ; - } - - protected static void errorOccurred(String message) - { - errorOccurred(message, null) ; - } - - protected static void errorOccurred(Throwable ex) - { - errorOccurred(null, ex) ; - } - - protected static void errorOccurred(String message, Throwable ex) - { - throw new ActionErrorException(ex, message, HttpSC.INTERNAL_SERVER_ERROR_500) ; - } - - protected static String formatForLog(String string) - { - string = string.replace('\n', ' ') ; - string = string.replace('\r', ' ') ; - return string ; - } - - static String varyHeaderSetting = - StrUtils.strjoin(",", - HttpNames.hAccept, - HttpNames.hAcceptEncoding, - HttpNames.hAcceptCharset ) ; - - public static void setVaryHeader(HttpServletResponse httpResponse) - { - httpResponse.setHeader(HttpNames.hVary, varyHeaderSetting) ; - } - - - public static void setCommonHeaders(HttpServletResponse httpResponse) - { - httpResponse.setHeader(HttpNames.hAccessControlAllowOrigin, "*") ; - httpResponse.setHeader(HttpNames.hServer, Fuseki.serverHttpName) ; - } -} http://git-wip-us.apache.org/repos/asf/jena/blob/2fb788d3/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SimpleVelocity.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SimpleVelocity.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SimpleVelocity.java deleted file mode 100644 index 7f5cad9..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SimpleVelocity.java +++ /dev/null @@ -1,78 +0,0 @@ -/** - * 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 java.io.Writer ; -import java.util.Map ; - -import org.apache.velocity.Template ; -import org.apache.velocity.VelocityContext ; -import org.apache.velocity.app.VelocityEngine ; -import org.apache.velocity.exception.MethodInvocationException ; -import org.apache.velocity.exception.ParseErrorException ; -import org.apache.velocity.exception.ResourceNotFoundException ; -import org.apache.velocity.runtime.RuntimeConstants ; -import org.apache.velocity.runtime.log.LogChute ; -import org.apache.velocity.runtime.log.NullLogChute ; -import org.slf4j.Logger ; -import org.slf4j.LoggerFactory ; - -public class SimpleVelocity -{ - private static LogChute velocityLogChute = new NullLogChute() ; - private static Logger velocityLog = LoggerFactory.getLogger("Velocity"); - - /** Process a template */ - public static void process(String base, String path, Writer out, Map<String, Object> params) - { - process(base, path, out, createContext(params)) ; - } - - /** Process a template */ - public static void process(String base, String path, Writer out, VelocityContext context) - { - VelocityEngine velocity = new VelocityEngine() ; - // Turn off logging - catch exceptions and log ourselves - velocity.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM, velocityLogChute) ; - velocity.setProperty(RuntimeConstants.INPUT_ENCODING, "UTF-8") ; - velocity.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, base) ; - velocity.init() ; - try { - Template temp = velocity.getTemplate(path) ; - temp.merge(context, out) ; - out.flush(); - } - catch (ResourceNotFoundException ex) { velocityLog.error("Resource not found: "+ex.getMessage()) ; } - catch (ParseErrorException ex) { velocityLog.error("Parse error ("+path+") : "+ex.getMessage()) ; } - catch (MethodInvocationException ex) { velocityLog.error("Method invocation exception ("+path+") : "+ex.getMessage()) ; } - catch (IOException ex) { velocityLog.warn("IOException", ex) ; } - } - - public static VelocityContext createContext(Map<String, Object> params) - { - // Velocity requires a mutable map. - // Scala leads to immutable maps ... be safe and copy. - VelocityContext context = new VelocityContext() ; - for ( Map.Entry<String, Object> e : params.entrySet() ) - context.put(e.getKey(), e.getValue()) ; - return context ; - } - -} http://git-wip-us.apache.org/repos/asf/jena/blob/2fb788d3/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SimpleVelocityServlet.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SimpleVelocityServlet.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SimpleVelocityServlet.java deleted file mode 100644 index 8773eba..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SimpleVelocityServlet.java +++ /dev/null @@ -1,178 +0,0 @@ -/** - * 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 java.io.Writer ; -import java.util.Map ; - -import javax.servlet.http.HttpServlet ; -import javax.servlet.http.HttpServletRequest ; -import javax.servlet.http.HttpServletResponse ; - -import org.apache.velocity.VelocityContext ; -import org.apache.velocity.app.VelocityEngine ; -import org.apache.velocity.runtime.RuntimeConstants ; -import org.apache.velocity.runtime.RuntimeServices ; -import org.apache.velocity.runtime.log.LogChute ; -import org.apache.velocity.runtime.log.NullLogChute ; -import org.slf4j.Logger ; -import org.slf4j.LoggerFactory ; - - -/** Simple servlet that uses <a href="http://velocity.apache.org/">Velocity</a> - * to format pages. It isolates the use of velocity by taking a configuration map. - * Use with a servlet mapping of "*.vm" or some such extension. - */ -public class SimpleVelocityServlet extends HttpServlet -{ - //private static Logger log = LoggerFactory.getLogger(SimpleVelocityServlet.class) ; - /* Velocity logging - * Instead of internal velocity logging, we catch the exceptions, - * log the message ourselves. This gives a celaner log file without - * loosing information that the application could use. - */ - - private static Logger vlog = LoggerFactory.getLogger("Velocity") ; - private static LogChute velocityLog = new NullLogChute() ; - //private static LogChute velocityLog = new SimpleSLF4JLogChute(vlog) ; - - private String docbase ; - private VelocityEngine velocity ; - private String functionsName = null ; - private final Map<String, Object> datamodel ; - - public SimpleVelocityServlet(String base, Map<String, Object> datamodel) - { - this.docbase = base ; - this.datamodel = datamodel ; - velocity = new VelocityEngine(); - // Turn off logging - catch exceptions and log ourselves - velocity.setProperty( RuntimeConstants.RUNTIME_LOG_LOGSYSTEM, velocityLog) ; - velocity.setProperty( RuntimeConstants.INPUT_ENCODING, "UTF-8" ) ; - velocity.setProperty( RuntimeConstants.FILE_RESOURCE_LOADER_PATH, base) ; - velocity.init(); - } - - // See also - @Override - public void doGet(HttpServletRequest req, HttpServletResponse resp) - { - process(req, resp) ; - } - - @Override - public void doPost(HttpServletRequest req, HttpServletResponse resp) - { - process(req, resp) ; - } - - private void process(HttpServletRequest req, HttpServletResponse resp) - { - try - { - resp.setContentType("text/html") ; - resp.setCharacterEncoding("UTF-8") ; - Writer out = resp.getWriter() ; - String path = path(req) ; - VelocityContext vc = SimpleVelocity.createContext(datamodel) ; - vc.put("request", req) ; - SimpleVelocity.process(docbase, path, out, vc) ; - } catch (IOException ex) - { - vlog.warn("IOException", ex) ; - } - } - - private String path(HttpServletRequest request) - { - String path = request.getPathInfo(); - if (path != null) return path; - path = request.getServletPath(); - if (path != null) return path; - return null ; - } - - @Override - public String getServletInfo() - { - return "Lightweight Velocity Servlet"; - } - - /** Velocity logger to SLF4J */ - static class SimpleSLF4JLogChute implements LogChute - { - // Uusally for debugging only. - private Logger logger ; - - SimpleSLF4JLogChute( Logger log ) - { - this.logger = log ; - } - - @Override - public void init(RuntimeServices rs) throws Exception - { } - - @Override - public void log(int level, String message) - { - if ( logger == null ) return ; - switch(level) - { - case LogChute.TRACE_ID : logger.trace(message) ; return ; - case LogChute.DEBUG_ID : logger.debug(message) ; return ; - case LogChute.INFO_ID : logger.info(message) ; return ; - case LogChute.WARN_ID : logger.warn(message) ; return ; - case LogChute.ERROR_ID : logger.error(message) ; return ; - } - } - - @Override - public void log(int level, String message, Throwable t) - { - if ( logger == null ) return ; - // Forget the stack trace - velcoity internal - long - unhelpful to application. - t = null ; - switch (level) - { - case LogChute.TRACE_ID : logger.trace(message, t) ; return ; - case LogChute.DEBUG_ID : logger.debug(message, t) ; return ; - case LogChute.INFO_ID : logger.info(message, t) ; return ; - case LogChute.WARN_ID : logger.warn(message, t) ; return ; - case LogChute.ERROR_ID : logger.error(message, t) ; return ; - } - } - - @Override - public boolean isLevelEnabled(int level) - { - switch(level) - { - case LogChute.TRACE_ID: return logger.isTraceEnabled() ; - case LogChute.DEBUG_ID: return logger.isDebugEnabled() ; - case LogChute.INFO_ID: return logger.isInfoEnabled() ; - case LogChute.WARN_ID: return logger.isWarnEnabled() ; - case LogChute.ERROR_ID: return logger.isErrorEnabled() ; - } - return true ; - } - } -} - http://git-wip-us.apache.org/repos/asf/jena/blob/2fb788d3/jena-fuseki/src/main/java/org/apache/jena/fuseki/validation/DataValidator.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/validation/DataValidator.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/validation/DataValidator.java deleted file mode 100644 index 6105562..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/validation/DataValidator.java +++ /dev/null @@ -1,237 +0,0 @@ -/* - * 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.validation; - -import static org.apache.jena.riot.SysRIOT.fmtMessage ; - -import java.io.IOException ; -import java.io.PrintStream ; -import java.io.Reader ; -import java.io.StringReader ; - -import javax.servlet.ServletOutputStream ; -import javax.servlet.http.HttpServletRequest ; -import javax.servlet.http.HttpServletResponse ; - -import org.apache.jena.atlas.io.IO ; -import org.apache.jena.atlas.lib.Sink ; -import org.apache.jena.fuseki.FusekiLib ; -import org.apache.jena.riot.Lang ; -import org.apache.jena.riot.RDFLanguages ; -import org.apache.jena.riot.RiotException ; -import org.apache.jena.riot.RiotReader ; -import org.apache.jena.riot.lang.LangRIOT ; -import org.apache.jena.riot.system.ErrorHandler ; -import org.apache.jena.riot.system.RiotLib ; -import org.apache.jena.riot.system.StreamRDF ; -import org.apache.jena.riot.system.StreamRDFLib ; -import org.apache.jena.riot.tokens.Tokenizer ; -import org.apache.jena.riot.tokens.TokenizerFactory ; - -import com.hp.hpl.jena.graph.Node ; -import com.hp.hpl.jena.sparql.core.Quad ; -import com.hp.hpl.jena.sparql.serializer.SerializationContext ; -import com.hp.hpl.jena.sparql.util.FmtUtils ; - -public class DataValidator extends ValidatorBase -{ - public DataValidator() - { } - - static final String paramLineNumbers = "linenumbers" ; - static final String paramFormat = "outputFormat" ; - static final String paramIndirection = "url" ; - static final String paramData = "data" ; - static final String paramSyntax = "languageSyntax" ; - //static final String paramSyntaxExtended = "extendedSyntax" ; - - @Override - protected void execute(HttpServletRequest httpRequest, HttpServletResponse httpResponse) - { - try { -// if ( log.isInfoEnabled() ) -// log.info("data validation request") ; - - Tokenizer tokenizer = createTokenizer(httpRequest, httpResponse) ; - if ( tokenizer == null ) - return ; - - String syntax = FusekiLib.safeParameter(httpRequest, paramSyntax) ; - if ( syntax == null || syntax.equals("") ) - syntax = RDFLanguages.NQUADS.getName() ; - - Lang language = RDFLanguages.shortnameToLang(syntax) ; - if ( language == null ) - { - httpResponse.sendError(HttpServletResponse.SC_BAD_REQUEST, "Unknown syntax: "+syntax) ; - return ; - } - - ServletOutputStream outStream = httpResponse.getOutputStream() ; - ErrorHandlerMsg errorHandler = new ErrorHandlerMsg(outStream) ; - - PrintStream stdout = System.out ; - PrintStream stderr = System.err ; - System.setOut(new PrintStream(outStream)) ; - System.setErr(new PrintStream(outStream)) ; - - // Headers - setHeaders(httpResponse) ; - - outStream.println("<html>") ; - printHead(outStream, "Jena Data Validator Report") ; - outStream.println("<body>") ; - - outStream.println("<h1>RIOT Parser Report</h1>") ; - outStream.println("<p>Line and column numbers refer to original input</p>") ; - outStream.println("<p> </p>") ; - try { - LangRIOT parser = setupParser(tokenizer, language, errorHandler, outStream) ; - startFixed(outStream) ; - RiotException exception = null ; - try { - parser.parse() ; - System.out.flush() ; - System.err.flush() ; - } catch (RiotException ex) { exception = ex ; } - } finally - { - finishFixed(outStream) ; - System.out.flush() ; - System.err.flush() ; - System.setOut(stdout) ; - System.setErr(stdout) ; - } - - outStream.println("</body>") ; - outStream.println("</html>") ; - } catch (Exception ex) - { - serviceLog.warn("Exception in validationRequest",ex) ; - } - } - - static final long LIMIT = 50000 ; - - - private LangRIOT setupParser(Tokenizer tokenizer, Lang language, ErrorHandler errorHandler, final ServletOutputStream outStream) - { - Sink<Quad> sink = new Sink<Quad>() - { - SerializationContext sCxt = new SerializationContext() ; - @Override - public void send(Quad quad) - { - // Clean up! - StringBuilder sb = new StringBuilder() ; - - sb.append(formatNode(quad.getSubject())) ; - sb.append(" ") ; - sb.append(formatNode(quad.getPredicate())) ; - sb.append(" ") ; - sb.append(formatNode(quad.getObject())) ; - - if ( ! quad.isTriple() ) - { - sb.append(" ") ; - sb.append(formatNode(quad.getGraph())) ; - } - - String $ = htmlQuote(sb.toString()) ; - try { - outStream.print($) ; - outStream.println(" .") ; - } catch (IOException ex) { IO.exception(ex) ; } - } - @Override - public void close() {} - @Override - public void flush() {} - String formatNode(Node n) { return FmtUtils.stringForNode(n, sCxt) ; } - } ; - - StreamRDF dest = StreamRDFLib.sinkQuads(sink) ; - @SuppressWarnings("deprecation") - LangRIOT parser = RiotReader.createParser(tokenizer, language, null, dest) ; - // Don't resolve IRIs. Do checking. - parser.setProfile(RiotLib.profile(null, false, true, errorHandler)) ; - return parser ; - } - - // Error handler that records messages - private static class ErrorHandlerMsg implements ErrorHandler - { - private ServletOutputStream out ; - - ErrorHandlerMsg(ServletOutputStream out) { this.out = out ; } - - @Override - public void warning(String message, long line, long col) - { output(message, line, col, "Warning", "warning") ; } - - // Attempt to continue. - @Override - public void error(String message, long line, long col) - { output(message, line, col, "Error", "error") ; } - - @Override - public void fatal(String message, long line, long col) - { output(message, line, col, "Fatal", "error") ; throw new RiotException(fmtMessage(message, line, col)) ; } - - private void output(String message, long line, long col, String typeName, String className) - { - try { - String str = fmtMessage(message, line, col) ; - //String str = typeName+": "+message ; - str = htmlQuote(str) ; - out.print("<div class=\""+className+"\">") ; - out.print(str) ; - out.print("</div>") ; - } catch (IOException ex) { IO.exception(ex) ; } - } - } - - private Tokenizer createTokenizer(HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws Exception - { - Reader reader = null ; - String[] args = httpRequest.getParameterValues(paramData) ; - if ( args == null || args.length == 0 ) - { - // Not a form? - reader = httpRequest.getReader() ; - } - else if ( args.length > 1 ) - { - httpResponse.sendError(HttpServletResponse.SC_BAD_REQUEST, "Too many parameters for '"+paramData+"='") ; - return null ; - } - else - { - reader = new StringReader(args[0]) ; - } - - if ( reader == null ) - { - httpResponse.sendError(HttpServletResponse.SC_BAD_REQUEST, "Can't find data to validate") ; - return null ; - } - - return TokenizerFactory.makeTokenizer(reader) ; - } -} http://git-wip-us.apache.org/repos/asf/jena/blob/2fb788d3/jena-fuseki/src/main/java/org/apache/jena/fuseki/validation/IRIValidator.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/validation/IRIValidator.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/validation/IRIValidator.java deleted file mode 100644 index 2972b49..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/validation/IRIValidator.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * 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.validation; - -import java.io.IOException ; -import java.io.PrintStream ; -import java.util.Iterator ; - -import javax.servlet.ServletOutputStream ; -import javax.servlet.http.HttpServletRequest ; -import javax.servlet.http.HttpServletResponse ; - -import org.apache.jena.iri.IRI ; -import org.apache.jena.iri.IRIFactory ; -import org.apache.jena.iri.Violation ; -import org.apache.jena.riot.system.IRIResolver ; - -public class IRIValidator extends ValidatorBase -{ - public IRIValidator() - { } - - static final String paramIRI = "iri" ; - //static IRIFactory iriFactory = IRIFactory.iriImplementation() ; - static IRIFactory iriFactory = IRIResolver.iriFactory ; - - @Override - protected void execute(HttpServletRequest httpRequest, HttpServletResponse httpResponse) - { - try { - String[] args = httpRequest.getParameterValues(paramIRI) ; - ServletOutputStream outStream = httpResponse.getOutputStream() ; - PrintStream stdout = System.out ; - PrintStream stderr = System.err ; - System.setOut(new PrintStream(outStream)) ; - System.setErr(new PrintStream(outStream)) ; - - setHeaders(httpResponse) ; - - outStream.println("<html>") ; - printHead(outStream, "Jena IRI Validator Report") ; - outStream.println("<body>") ; - - outStream.println("<h1>IRI Report</h1>") ; - - startFixed(outStream) ; - - try { - boolean first = true ; - for ( String iriStr : args ) - { - if ( ! first ) - System.out.println() ; - first = false ; - - IRI iri = iriFactory.create(iriStr) ; - System.out.println(iriStr + " ==> "+iri) ; - if ( iri.isRelative() ) - System.out.println("Relative IRI: "+iriStr) ; - - Iterator<Violation> vIter = iri.violations(true) ; - for ( ; vIter.hasNext() ; ) - { - String str = vIter.next().getShortMessage() ; - str = htmlQuote(str) ; - - System.out.println(str) ; - } - } - } finally - { - finishFixed(outStream) ; - System.out.flush() ; - System.err.flush() ; - System.setOut(stdout) ; - System.setErr(stdout) ; - } - - outStream.println("</body>") ; - outStream.println("</html>") ; - } catch (IOException ex) {} - } -} http://git-wip-us.apache.org/repos/asf/jena/blob/2fb788d3/jena-fuseki/src/main/java/org/apache/jena/fuseki/validation/QueryValidator.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/validation/QueryValidator.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/validation/QueryValidator.java deleted file mode 100644 index 75ad901..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/validation/QueryValidator.java +++ /dev/null @@ -1,269 +0,0 @@ -/* - * 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.validation; - -import java.io.IOException ; - -import javax.servlet.ServletOutputStream ; -import javax.servlet.http.HttpServletRequest ; -import javax.servlet.http.HttpServletResponse ; - -import org.apache.jena.atlas.io.IndentedLineBuffer ; -import org.apache.jena.atlas.io.IndentedWriter ; - -import com.hp.hpl.jena.query.Query ; -import com.hp.hpl.jena.query.QueryFactory ; -import com.hp.hpl.jena.query.Syntax ; -import com.hp.hpl.jena.sparql.ARQException ; -import com.hp.hpl.jena.sparql.algebra.Algebra ; -import com.hp.hpl.jena.sparql.algebra.Op ; -import com.hp.hpl.jena.sparql.serializer.SerializationContext ; - -public class QueryValidator extends ValidatorBase -{ - public QueryValidator() - { } - - static final String paramLineNumbers = "linenumbers" ; - static final String paramFormat = "outputFormat" ; - static final String paramQuery = "query" ; - static final String paramSyntax = "languageSyntax" ; - //static final String paramSyntaxExtended = "extendedSyntax" ; - - @Override - protected void execute(HttpServletRequest httpRequest, HttpServletResponse httpResponse) - { - try { -// if ( log.isInfoEnabled() ) -// log.info("validation request") ; - - String[] args = httpRequest.getParameterValues(paramQuery) ; - - if ( args == null || args.length == 0 ) - { - httpResponse.sendError(HttpServletResponse.SC_BAD_REQUEST, "No query parameter to validator") ; - return ; - } - - if ( args.length > 1 ) - { - httpResponse.sendError(HttpServletResponse.SC_BAD_REQUEST, "Too many query parameters") ; - return ; - } - - final String queryString = httpRequest.getParameter(paramQuery).replaceAll("(\r|\n| )*$", "") ; -// queryString = queryString.replace("\r\n", "\n") ; -// queryString.replaceAll("(\r|\n| )*$", "") ; - - String querySyntax = httpRequest.getParameter(paramSyntax) ; - if ( querySyntax == null || querySyntax.equals("") ) - querySyntax = "SPARQL" ; - - Syntax language = Syntax.lookup(querySyntax) ; - if ( language == null ) - { - httpResponse.sendError(HttpServletResponse.SC_BAD_REQUEST, "Unknown syntax: "+querySyntax) ; - return ; - } - - String lineNumbersArg = httpRequest.getParameter(paramLineNumbers) ; - - String a[] = httpRequest.getParameterValues(paramFormat) ; - - boolean outputSPARQL = false ; - boolean outputPrefix = false ; - boolean outputAlgebra = false ; - boolean outputQuads = false ; - boolean outputOptimized = false ; - boolean outputOptimizedQuads = false ; - - if ( a != null ) - { - for ( String anA : a ) - { - if ( anA.equals( "sparql" ) ) - { - outputSPARQL = true; - } - if ( anA.equals( "prefix" ) ) - { - outputPrefix = true; - } - if ( anA.equals( "algebra" ) ) - { - outputAlgebra = true; - } - if ( anA.equals( "quads" ) ) - { - outputQuads = true; - } - if ( anA.equals( "opt" ) ) - { - outputOptimized = true; - } - if ( anA.equals( "optquads" ) ) - { - outputOptimizedQuads = true; - } - } - } - -// if ( ! outputSPARQL && ! outputPrefix ) -// outputSPARQL = true ; - - boolean lineNumbers = true ; - - if ( lineNumbersArg != null ) - lineNumbers = lineNumbersArg.equalsIgnoreCase("true") || lineNumbersArg.equalsIgnoreCase("yes") ; - - // Headers - setHeaders(httpResponse) ; - - ServletOutputStream outStream = httpResponse.getOutputStream() ; - - outStream.println("<html>") ; - - printHead(outStream, "SPARQL Query Validation Report") ; - - outStream.println("<body>") ; - outStream.println("<h1>SPARQL Query Validator</h1>") ; - // Print query as received - { - outStream.println("<p>Input:</p>") ; - // Not Java's finest hour. - Content c = new Content(){ - @Override - public void print(IndentedWriter out) - { out.print(queryString) ; } - } ; - output(outStream, c, lineNumbers) ; - } - - // Attempt to parse it. - Query query = null ; - try { - query = QueryFactory.create(queryString, "http://example/base/", language) ; - } catch (ARQException ex) - { - // Over generous exception (should be QueryException) - // but this makes the code robust. - outStream.println("<p>Syntax error:</p>") ; - startFixed(outStream) ; - outStream.println(ex.getMessage()) ; - finishFixed(outStream) ; - } - catch (RuntimeException ex) - { - outStream.println("<p>Internal error:</p>") ; - startFixed(outStream) ; - outStream.println(ex.getMessage()) ; - finishFixed(outStream) ; - } - - if ( query != null ) - { - if ( outputSPARQL ) - outputSyntax(outStream, query, lineNumbers) ; - - if ( outputAlgebra ) - outputAlgebra(outStream, query, lineNumbers) ; - - if ( outputQuads ) - outputAlgebraQuads(outStream, query, lineNumbers) ; - - if ( outputOptimized ) - outputAlgebraOpt(outStream, query, lineNumbers) ; - - if ( outputOptimizedQuads ) - outputAlgebraOptQuads(outStream, query, lineNumbers) ; - } - - outStream.println("</body>") ; - outStream.println("</html>") ; - - } catch (Exception ex) - { - serviceLog.warn("Exception in doGet",ex) ; - } - } - - interface Content { void print(IndentedWriter out) ; } - - private void outputSyntax(ServletOutputStream outStream, final Query query, boolean lineNumbers) throws IOException - { - outStream.println("<p>Formatted, parsed query:</p>") ; - Content c = new Content(){ - @Override - public void print(IndentedWriter out) - { query.serialize(out) ; } - } ; - output(outStream, c, lineNumbers) ; - } - - private void outputAlgebra(ServletOutputStream outStream, final Query query, boolean lineNumbers) throws IOException - { - outStream.println("<p>Algebra structure:</p>") ; - final Op op = Algebra.compile(query) ; // No optimization - output(outStream, query, op, lineNumbers) ; - } - - private void outputAlgebraOpt(ServletOutputStream outStream, final Query query, boolean lineNumbers) throws IOException - { - outStream.println("<p>Alebgra, with general triple optimizations:</p>") ; - final Op op = Algebra.optimize(Algebra.compile(query)) ; - output(outStream, query, op, lineNumbers) ; - } - - private void outputAlgebraQuads(ServletOutputStream outStream, final Query query, boolean lineNumbers) throws IOException - { - outStream.println("<p>Quad structure:</p>") ; - final Op op = Algebra.toQuadForm(Algebra.compile(query)) ; - output(outStream, query, op, lineNumbers) ; - } - - private void outputAlgebraOptQuads(ServletOutputStream outStream, final Query query, boolean lineNumbers) throws IOException - { - outStream.println("<p>Alebgra, with general quads optimizations:</p>") ; - final Op op = Algebra.optimize(Algebra.toQuadForm(Algebra.compile(query))) ; - output(outStream, query, op, lineNumbers) ; - } - - private void output(ServletOutputStream outStream, Query query, final Op op, boolean lineNumbers) throws IOException - { - final SerializationContext sCxt = new SerializationContext(query) ; - Content c = new Content(){ - @Override - public void print(IndentedWriter out) - { op.output(out, sCxt) ; } - } ; - output(outStream, c , lineNumbers) ; - } - - private void output(ServletOutputStream outStream, Content content, boolean lineNumbers) throws IOException - { - startFixed(outStream) ; - IndentedLineBuffer out = new IndentedLineBuffer(lineNumbers) ; - content.print(out) ; - out.flush() ; - String x = htmlQuote(out.asString()) ; - byte b[] = x.getBytes("UTF-8") ; - outStream.write(b) ; - finishFixed(outStream) ; - } -}
