http://git-wip-us.apache.org/repos/asf/jena/blob/2fb788d3/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java ---------------------------------------------------------------------- diff --git a/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java b/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java deleted file mode 100644 index 2adeef3..0000000 --- a/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java +++ /dev/null @@ -1,358 +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.riot.WebContent.contentTypeSPARQLQuery ; -import static org.apache.jena.riot.WebContent.contentTypeSPARQLUpdate ; - -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.Fuseki ; -import org.apache.jena.fuseki.FusekiException ; -import org.apache.jena.fuseki.conneg.ConNeg ; -import org.apache.jena.fuseki.server.DataAccessPoint ; -import org.apache.jena.fuseki.server.DataService ; -import org.apache.jena.fuseki.server.Endpoint ; -import org.apache.jena.fuseki.server.OperationName ; -import org.apache.jena.riot.web.HttpNames ; - -/** 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 ActionSPARQL -{ - 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, OperationName.Query) ; } - @Override protected boolean allowUpdate(HttpAction action) { return isEnabled(action, OperationName.Update) ; } - @Override protected boolean allowREST_R(HttpAction action) { return isEnabled(action, OperationName.GSP_R) || isEnabled(action, OperationName.GSP) ; } - @Override protected boolean allowREST_W(HttpAction action) { return isEnabled(action, OperationName.GSP) ; } - // Quad operations tied to presence/absence of GSP. - @Override protected boolean allowQuadsR(HttpAction action) { return isEnabled(action, OperationName.GSP_R) ; } - @Override protected boolean allowQuadsW(HttpAction action) { return isEnabled(action, OperationName.GSP) ; } - - private boolean isEnabled(HttpAction action, OperationName opName) - { Endpoint operation = action.getEndpoint() ; - - return operation != null && - operation.getOperationName() == opName && - // XXX Active - operation.endpointName != null ; - } - } - - /* 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 ActionSPARQL queryServlet = new SPARQL_QueryDataset() ; - private final ActionSPARQL updateServlet = new SPARQL_Update() ; - private final ActionSPARQL uploadServlet = new SPARQL_Upload() ; - private final ActionSPARQL gspServlet_R = new SPARQL_GSP_R() ; - private final ActionSPARQL gspServlet_RW = new SPARQL_GSP_RW() ; - private final ActionSPARQL restQuads_R = new REST_Quads_R() ; - private final ActionSPARQL restQuads_RW = new REST_Quads_RW() ; - - 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(HttpAction action) { - String uri = ActionLib.removeContextPath(action) ; - return ActionLib.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 actionURI = action.getActionURI() ; // No context path - String method = request.getMethod() ; - - DataAccessPoint desc = action.getDataAccessPoint() ; - DataService dSrv = action.getDataService() ; - -// if ( ! dSrv.isActive() ) -// ServletOps.error(HttpSC.SERVICE_UNAVAILABLE_503, "Dataset not currently active"); - - String trailing = findTrailing(actionURI, desc.getName()) ; - 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 ; - - String ct = request.getContentType() ; - String charset = request.getCharacterEncoding() ; - - MediaType mt = null ; - if ( ct != null ) - mt = MediaType.create(ct, charset) ; - - if (action.log.isInfoEnabled() ) { - //String cxt = action.getContextPath() ; - action.log.info(format("[%d] %s %s :: '%s' :: %s ? %s", id, method, desc.getName(), trailing, (mt==null?"<none>":mt), (qs==null?"":qs))) ; - } - - boolean hasTrailing = ( trailing.length() != 0 ) ; - - if ( !hasTrailing && !hasParams ) { - // Check enabled. But no trailing here. - // if ( serviceDispatch(action, desc.readWriteGraphStore, trailing, restQuads_RW) ) return ; - // if ( serviceDispatch(action, desc.readGraphStore, trailing, restQuads_R) ) return ; - restQuads_RW.executeLifecycle(action) ; - return ; - } - - if ( !hasTrailing ) { - if ( ct != null ) { - if ( hasParamQuery || contentTypeSPARQLQuery.equalsIgnoreCase(ct) ) { - // SPARQL Query - if ( !allowQuery(action) ) - ServletOps.errorForbidden("Forbidden: SPARQL query") ; - executeRequest(action, queryServlet) ; - return ; - } - - if ( hasParamUpdate || contentTypeSPARQLUpdate.equalsIgnoreCase(ct) ) { - // SPARQL Update - if ( !allowQuery(action) ) - ServletOps.errorForbidden("Forbidden: SPARQL query") ; - executeRequest(action, updateServlet) ; - return ; - } - } - - if ( hasParamGraph || hasParamGraphDefault ) { - doGraphStoreProtocol(action) ; - return ; - } - - ServletOps.errorBadRequest("Malformed request") ; - ServletOps.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. - - // action.operation == query etc. - - if ( serviceDispatch(action, OperationName.Query, queryServlet) ) return ; - if ( serviceDispatch(action, OperationName.Update, updateServlet) ) return ; - if ( serviceDispatch(action, OperationName.Upload, uploadServlet) ) return ; - if ( hasParams ) { - if ( serviceDispatch(action, OperationName.GSP_R, gspServlet_R) ) return ; - if ( serviceDispatch(action, OperationName.GSP, gspServlet_RW) ) return ; - } else { - // No parameters - do as a quads operation on the dataset. - if ( serviceDispatch(action, OperationName.GSP_R, restQuads_R) ) return ; - if ( serviceDispatch(action, OperationName.GSP, restQuads_RW) ) return ; - } - - // If no params, its a daatset operation. - } - // 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") ; - ServletOps.errorNotFound("Not found: dataset='"+printName(desc.getName())+"' 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. - Endpoint operation = action.getEndpoint() ; - 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 ( OperationName.GSP_R == operation.getOperationName() ) - executeRequest(action, gspServlet_R) ; - else if ( OperationName.GSP == operation.getOperationName() ) - executeRequest(action, gspServlet_RW) ; - else - ServletOps.errorMethodNotAllowed(method) ; - return ; - } - - // Graphs Store Protocol, indirect naming, write - if ( ! allowREST_W(action)) - ServletOps.errorForbidden("Forbidden: SPARQL Graph Store Protocol : Write operation : "+method) ; - executeRequest(action, gspServlet_RW) ; - return ; - } - - private void executeRequest(HttpAction action, ActionSPARQL 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 - * @param opName - */ - private boolean serviceDispatch(HttpAction action, OperationName opName, ActionSPARQL servlet) { - Endpoint operation = action.getEndpoint() ; - if ( operation == null ) { - Fuseki.serverLog.warn("No operation: "+opName, new Throwable()) ; - return false ; - } - if ( ! operation.isType(opName) ) - return false ; - servlet.executeLifecycle(action) ; - return true ; - } - - /** Find part after the dataset name: service name or the graph (direct naming) */ - 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-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Update.java ---------------------------------------------------------------------- diff --git a/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Update.java b/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Update.java deleted file mode 100644 index f2543e7..0000000 --- a/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Update.java +++ /dev/null @@ -1,304 +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.server.CounterName.UpdateExecErrors ; -import static org.apache.jena.riot.WebContent.charsetUTF8 ; -import static org.apache.jena.riot.WebContent.contentTypeHTMLForm ; -import static org.apache.jena.riot.WebContent.contentTypeSPARQLUpdate ; -import static org.apache.jena.riot.WebContent.ctSPARQLUpdate ; -import static org.apache.jena.riot.WebContent.isHtmlForm ; -import static org.apache.jena.riot.WebContent.matchContentType ; -import static org.apache.jena.riot.web.HttpNames.paramRequest ; -import static org.apache.jena.riot.web.HttpNames.paramUpdate ; -import static org.apache.jena.riot.web.HttpNames.paramUsingGraphURI ; -import static org.apache.jena.riot.web.HttpNames.paramUsingNamedGraphURI ; - -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.Fuseki ; -import org.apache.jena.fuseki.FusekiLib ; -import org.apache.jena.iri.IRI ; -import org.apache.jena.riot.system.IRIResolver ; -import org.apache.jena.riot.web.HttpNames ; -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 = Fuseki.BaseParserSPARQL ; - 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) - { - ContentType ct = FusekiLib.getContentType(action) ; - if ( ct == null ) - ct = ctSPARQLUpdate ; - - if ( matchContentType(ctSPARQLUpdate, ct) ) { - executeBody(action) ; - return ; - } - if ( isHtmlForm(ct) ) { - executeForm(action) ; - return ; - } - ServletOps.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()) ) - ServletOps.errorMethodNotAllowed("SPARQL Update : use POST") ; - - ContentType ct = FusekiLib.getContentType(action) ; - if ( ct == null ) - ct = ctSPARQLUpdate ; - // ---- - - if ( matchContentType(ctSPARQLUpdate, ct) ) - { - String charset = request.getCharacterEncoding() ; - if ( charset != null && ! charset.equalsIgnoreCase(charsetUTF8) ) - ServletOps.errorBadRequest("Bad charset: "+charset) ; - validate(action, paramsPOST) ; - return ; - } - - if ( isHtmlForm(ct) ) - { - int x = countParamOccurences(request, paramUpdate) + countParamOccurences(request, paramRequest) ; - if ( x == 0 ) - ServletOps.errorBadRequest("SPARQL Update: No 'update=' parameter") ; - if ( x != 1 ) - ServletOps.errorBadRequest("SPARQL Update: Multiple 'update=' parameters") ; - - String requestStr = request.getParameter(paramUpdate) ; - if ( requestStr == null ) - requestStr = request.getParameter(paramRequest) ; - if ( requestStr == null ) - ServletOps.errorBadRequest("SPARQL Update: No update= in HTML form") ; - validate(action, paramsForm) ; - return ; - } - - ServletOps.error(HttpSC.UNSUPPORTED_MEDIA_TYPE_415, "Must be "+contentTypeSPARQLUpdate+" or "+contentTypeHTMLForm+" (got "+ct.getContentType()+")") ; - } - - protected void validate(HttpAction action, Collection<String> params) - { - if ( params != null ) - { - Enumeration<String> en = action.request.getParameterNames() ; - for ( ; en.hasMoreElements() ; ) - { - String name = en.nextElement() ; - if ( ! params.contains(name) ) - ServletOps.warning(action, "SPARQL Update: Unrecognize request parameter (ignored): "+name) ; - } - } - } - - private void executeBody(HttpAction action) - { - InputStream input = null ; - try { input = action.request.getInputStream() ; } - catch (IOException ex) { ServletOps.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) ; } - action.log.info(format("[%d] Update = %s", action.id, ServletOps.formatForLog(requestStr))) ; - - input = new ByteArrayInputStream(requestStr.getBytes()); - requestStr = null; - } - - execute(action, input) ; - ServletOps.successNoContent(action) ; - } - - private void executeForm(HttpAction action) - { - String requestStr = action.request.getParameter(paramUpdate) ; - if ( requestStr == null ) - requestStr = action.request.getParameter(paramRequest) ; - - if ( action.verbose ) - action.log.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); - ServletOps.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) { ServletOps.errorBadRequest(ex.getMessage()) ; return ; } - catch (QueryParseException ex) { ServletOps.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.getEndpoint().getCounters(), UpdateExecErrors) ; - ServletOps.errorOccurred(ex.getMessage()) ; - } catch (QueryParseException ex) { - action.abort() ; - // Counter inc'ed further out. - ServletOps.errorBadRequest(messageForQPE(ex)) ; - } catch (Throwable ex) { - if ( ! ( ex instanceof ActionErrorException ) ) - { - try { action.abort() ; } catch (Exception ex2) {} - ServletOps.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) - { - ServletOps.errorBadRequest("SPARQL Update: bad IRI: "+x) ; - return null ; - } - - } -} http://git-wip-us.apache.org/repos/asf/jena/blob/2fb788d3/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Upload.java ---------------------------------------------------------------------- diff --git a/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Upload.java b/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Upload.java deleted file mode 100644 index 699d06a..0000000 --- a/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Upload.java +++ /dev/null @@ -1,289 +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.web.ContentType ; -import org.apache.jena.fuseki.Fuseki ; -import org.apache.jena.fuseki.FusekiLib ; -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.IRIResolver ; -import org.apache.jena.riot.system.StreamRDF ; -import org.apache.jena.riot.system.StreamRDFLib ; -import org.apache.jena.riot.web.HttpNames ; -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.sparql.core.DatasetGraph ; -import com.hp.hpl.jena.sparql.core.DatasetGraphFactory ; -import com.hp.hpl.jena.sparql.core.Quad ; - -public class SPARQL_Upload extends ActionSPARQL -{ - 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 ) - ServletOps.error(HttpSC.BAD_REQUEST_400 , "Not a file upload") ; - - long count = upload(action, Fuseki.BaseUpload) ; - ServletOps.success(action) ; - 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() ; - ServletOps.success(action) ; - } - catch (Exception ex) { ServletOps.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) { - UploadDetails upload = uploadWorker(action, base) ; - String graphName = upload.graphName ; - DatasetGraph dataTmp = upload.data ; - long count = upload.count ; - - if ( graphName == null ) - action.log.info(format("[%d] Upload: %d Quads(s)",action.id, count)) ; - else - action.log.info(format("[%d] Upload: Graph: %s, %d triple(s)", action.id, graphName, count)) ; - - Node gn = null ; - if ( graphName != null ) { - gn = graphName.equals(HttpNames.valueDefault) - ? Quad.defaultGraphNodeGenerated - : NodeFactory.createURI(graphName) ; - } - - action.beginWrite() ; - try { - if ( gn != null ) - FusekiLib.addDataInto(dataTmp.getDefaultGraph(), action.getActiveDSG(), gn) ; - else - FusekiLib.addDataInto(dataTmp, action.getActiveDSG()) ; - - action.commit() ; - return count ; - } catch (RuntimeException ex) - { - // If anything went wrong, try to backout. - try { action.abort() ; } catch (Exception ex2) {} - ServletOps.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) ; - } - - static class UploadDetails { - final String graphName ; - final DatasetGraph data ; - final long count ; - UploadDetails(String gn, DatasetGraph dsg, long parserCount) { - this.graphName = gn ; - this.data = dsg ; - this.count = parserCount ; - } - } - - /** Process an HTTP file upload of RDF with additiona name field for the graph name. - * We can't stream straight into a dataset because the graph name can be after the data. - * @return graph name and count - */ - - // ?? Combine with Upload.fileUploadWorker - // Difference is the handling of names for graphs. - static private UploadDetails uploadWorker(HttpAction action, String base) - { - DatasetGraph dsgTmp = DatasetGraphFactory.createMem() ; - ServletFileUpload upload = new ServletFileUpload(); - String graphName = null ; - boolean isQuads = false ; - 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) ) - ServletOps.errorBadRequest("Bad IRI: "+graphName) ; - if ( iri.getScheme() == null ) - ServletOps.errorBadRequest("Bad IRI: no IRI scheme name: "+graphName) ; - if ( iri.getScheme().equalsIgnoreCase("http") || iri.getScheme().equalsIgnoreCase("https")) - { - // Redundant?? - if ( iri.getRawHost() == null ) - ServletOps.errorBadRequest("Bad IRI: no host name: "+graphName) ; - if ( iri.getRawPath() == null || iri.getRawPath().length() == 0 ) - ServletOps.errorBadRequest("Bad IRI: no path: "+graphName) ; - if ( iri.getRawPath().charAt(0) != '/' ) - ServletOps.errorBadRequest("Bad IRI: Path does not start '/': "+graphName) ; - } - } - } - else if ( fieldName.equals(HttpNames.paramDefaultGraphURI) ) - graphName = null ; - else - // Add file type? - action.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") ) - ServletOps.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 ; - - isQuads = RDFLanguages.isQuads(lang) ; - - action.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.dataset(dsgTmp) ; - StreamRDFCounting dest = StreamRDFLib.count(x) ; - ActionSPARQL.parse(action, dest, stream, lang, base); - count = dest.count() ; - } - } - - if ( graphName == null || graphName.equals("") ) - graphName = HttpNames.valueDefault ; - if ( isQuads ) - graphName = null ; - return new UploadDetails(graphName, dsgTmp, count) ; - } - catch (ActionErrorException ex) { throw ex ; } - catch (Exception ex) { ServletOps.errorOccurred(ex) ; return null ; } - } - - @Override - protected void validate(HttpAction action) - {} -} http://git-wip-us.apache.org/repos/asf/jena/blob/2fb788d3/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ServletBase.java ---------------------------------------------------------------------- diff --git a/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ServletBase.java b/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ServletBase.java deleted file mode 100644 index 4ac30be..0000000 --- a/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ServletBase.java +++ /dev/null @@ -1,89 +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.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.riot.web.HttpNames ; - -/** - * Addition HTTP Servlet operations. - */ -public abstract class ServletBase extends HttpServlet { - public static final String METHOD_DELETE = "DELETE" ; - public static final String METHOD_HEAD = "HEAD" ; - public static final String METHOD_GET = "GET" ; - public static final String METHOD_OPTIONS = "OPTIONS" ; - public static final String METHOD_POST = "POST" ; - public static final String METHOD_PUT = "PUT" ; - public static final String METHOD_TRACE = "TRACE" ; - public static final String METHOD_PATCH = "PATCH" ; - - 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 static 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 static void addRequestId(HttpServletResponse response, long id) { - response.addHeader("Fuseki-Request-ID", Long.toString(id)) ; - } - - static final 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-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ServletOps.java ---------------------------------------------------------------------- diff --git a/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ServletOps.java b/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ServletOps.java deleted file mode 100644 index 277bf47..0000000 --- a/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ServletOps.java +++ /dev/null @@ -1,209 +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 javax.servlet.ServletOutputStream ; -import javax.servlet.http.HttpServletResponse ; - -import org.apache.jena.atlas.json.JSON ; -import org.apache.jena.atlas.json.JsonValue ; -import org.apache.jena.fuseki.servlets.UploadDetails.PreState ; -import org.apache.jena.riot.WebContent ; -import org.apache.jena.riot.web.HttpNames ; -import org.apache.jena.web.HttpSC ; - -public class ServletOps { - - public static void responseSendError(HttpServletResponse response, int statusCode, String message) { - try { - response.sendError(statusCode, message) ; - } catch (IOException ex) { - errorOccurred(ex) ; - } catch (IllegalStateException ex) {} - } - - public static void responseSendError(HttpServletResponse response, int statusCode) { - try { - response.sendError(statusCode) ; - } catch (IOException ex) { - errorOccurred(ex) ; - } - } - - public static void successNoContent(HttpAction action) { - success(action, HttpSC.NO_CONTENT_204) ; - } - - public static void success(HttpAction action) { - success(action, HttpSC.OK_200) ; - } - - public static void successCreated(HttpAction action) { - success(action, HttpSC.CREATED_201) ; - } - - // When 404 is no big deal e.g. HEAD - public static void successNotFound(HttpAction action) { - success(action, HttpSC.NOT_FOUND_404) ; - } - - // - public static void success(HttpAction action, int httpStatusCode) { - action.response.setStatus(httpStatusCode) ; - } - - public 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) ; - } - } - - public static void warning(HttpAction action, String string) { - action.log.warn(string) ; - } - - public static void warning(HttpAction action, String string, Throwable thorwable) { - action.log.warn(string, thorwable) ; - } - - public static void errorBadRequest(String string) { - error(HttpSC.BAD_REQUEST_400, string) ; - } - - public static void errorNotFound(String string) { - error(HttpSC.NOT_FOUND_404, string) ; - } - - public static void errorNotImplemented(String msg) { - error(HttpSC.NOT_IMPLEMENTED_501, msg) ; - } - - public static void errorMethodNotAllowed(String method) { - errorMethodNotAllowed(method, "HTTP method not allowed: " + method) ; - } - - public static void errorMethodNotAllowed(String method, String msg) { - error(HttpSC.METHOD_NOT_ALLOWED_405, msg) ; - } - - public static void errorForbidden() { - error(HttpSC.FORBIDDEN_403, "Forbidden") ; - } - - public static void errorForbidden(String msg) { - if ( msg != null ) - error(HttpSC.FORBIDDEN_403, msg) ; - else - errorForbidden() ; - } - - public static void error(int statusCode) { - throw new ActionErrorException(null, null, statusCode) ; - } - - public static void error(int statusCode, String string) { - throw new ActionErrorException(null, string, statusCode) ; - } - - public static void errorOccurred(String message) { - errorOccurred(message, null) ; - } - - public static void errorOccurred(Throwable ex) { - errorOccurred(null, ex) ; - } - - public static void errorOccurred(String message, Throwable ex) { - throw new ActionErrorException(ex, message, HttpSC.INTERNAL_SERVER_ERROR_500) ; - } - - public static String formatForLog(String string) { - string = string.replace('\n', ' ') ; - string = string.replace('\r', ' ') ; - return string ; - } - - public static void setNoCache(HttpAction action) { - setNoCache(action.response) ; - } - - public static void setNoCache(HttpServletResponse response) { - response.setHeader(HttpNames.hCacheControl, "must-revalidate,no-cache,no-store"); - response.setHeader(HttpNames.hPragma, "no-cache"); - } - - /** Send a JSON value as a 200 response. Null object means no response body and no content-type headers. */ - public static void sendJsonReponse(HttpAction action, JsonValue v) { - if ( v == null ) { - ServletOps.success(action); - //ServletOps.successNoContent(action); - return ; - } - - ServletOps.success(action); - sendJson(action, v) ; - } - - /** Send a JSON value as a 200 response. Null object means no response body and no content-type headers. */ - public static void sendJson(HttpAction action, JsonValue v) { - if ( v == null ) - return ; - - try { - HttpServletResponse response = action.response ; - ServletOutputStream out = response.getOutputStream() ; - response.setContentType(WebContent.contentTypeJSON); - response.setCharacterEncoding(WebContent.charsetUTF8) ; - JSON.write(out, v) ; - out.println() ; - out.flush() ; - } catch (IOException ex) { ServletOps.errorOccurred(ex) ; } - } - - /** response to a upload operation of some kind. */ - public static void uploadResponse(HttpAction action, UploadDetails details) { - if ( details.getExistedBefore().equals(PreState.ABSENT) ) - ServletOps.successCreated(action) ; - else - ServletOps.success(action) ; // successNoContent if empty body. - JsonValue v = details.detailsJson() ; - ServletOps.sendJson(action, v) ; - } -} - http://git-wip-us.apache.org/repos/asf/jena/blob/2fb788d3/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/Upload.java ---------------------------------------------------------------------- diff --git a/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/Upload.java b/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/Upload.java deleted file mode 100644 index 0343f42..0000000 --- a/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/Upload.java +++ /dev/null @@ -1,165 +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.riot.WebContent.ctMultipartFormData ; -import static org.apache.jena.riot.WebContent.ctTextPlain ; -import static org.apache.jena.riot.WebContent.matchContentType ; - -import java.io.IOException ; -import java.io.InputStream ; -import java.util.zip.GZIPInputStream ; - -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.io.IO ; -import org.apache.jena.atlas.web.ContentType ; -import org.apache.jena.fuseki.FusekiLib ; -import org.apache.jena.riot.Lang ; -import org.apache.jena.riot.RDFLanguages ; -import org.apache.jena.riot.RiotParseException ; -import org.apache.jena.riot.lang.StreamRDFCounting ; -import org.apache.jena.riot.system.StreamRDF ; -import org.apache.jena.riot.system.StreamRDFLib ; - -public class Upload { - public static UploadDetails incomingData(HttpAction action, StreamRDF dest) { - ContentType ct = FusekiLib.getContentType(action) ; - - if ( ct == null ) { - ServletOps.errorBadRequest("No content type") ; - return null ; - } - - if ( matchContentType(ctMultipartFormData, ct) ) { - return fileUploadWorker(action, dest) ; - } - // Single graph (or quads) in body. - - String base = ActionLib.wholeRequestURL(action.request) ; - Lang lang = RDFLanguages.contentTypeToLang(ct.getContentType()) ; - if ( lang == null ) { - ServletOps.errorBadRequest("Unknown content type for triples: " + ct) ; - return null ; - } - InputStream input = null ; - try { input = action.request.getInputStream() ; } - catch (IOException ex) { IO.exception(ex) ; } - - int len = action.request.getContentLength() ; - - StreamRDFCounting countingDest = StreamRDFLib.count(dest) ; - try { - ActionSPARQL.parse(action, countingDest, input, lang, base) ; - UploadDetails details = new UploadDetails(countingDest.count(), countingDest.countTriples(),countingDest.countQuads()) ; - action.log.info(format("[%d] Body: Content-Length=%d, Content-Type=%s, Charset=%s => %s : %s", - action.id, len, ct.getContentType(), ct.getCharset(), lang.getName(), - details.detailsStr())) ; - return details ; - } catch (RiotParseException ex) { - action.log.info(format("[%d] Body: Content-Length=%d, Content-Type=%s, Charset=%s => %s : %s", - action.id, len, ct.getContentType(), ct.getCharset(), lang.getName(), - ex.getMessage())) ; - throw ex ; - } - } - - /** Process an HTTP upload of RDF files (triples or quads) - * Stream straight into a graph or dataset -- unlike SPARQL_Upload the destination - * is known at the start of the multipart file body - */ - - public static UploadDetails fileUploadWorker(HttpAction action, StreamRDF dest) { - String base = ActionLib.wholeRequestURL(action.request) ; - ServletFileUpload upload = new ServletFileUpload(); - //log.info(format("[%d] Upload: Field=%s ignored", action.id, fieldName)) ; - // This is teh overal count. - - // Overall counting. - StreamRDFCounting countingDest = StreamRDFLib.count(dest) ; - - try { - FileItemIterator iter = upload.getItemIterator(action.request); - while (iter.hasNext()) { - FileItemStream fileStream = iter.next(); - if (fileStream.isFormField()) { - // Ignore? - String fieldName = fileStream.getFieldName() ; - InputStream stream = fileStream.openStream(); - String value = Streams.asString(stream, "UTF-8") ; - ServletOps.errorBadRequest(format("Only files accepted in multipart file upload (got %s=%s)",fieldName, value)) ; - } - //Ignore the field name. - //String fieldName = fileStream.getFieldName(); - - InputStream stream = fileStream.openStream(); - // Process the input stream - String contentTypeHeader = fileStream.getContentType() ; - ContentType ct = ContentType.create(contentTypeHeader) ; - Lang lang = null ; - if ( ! matchContentType(ctTextPlain, ct) ) - lang = RDFLanguages.contentTypeToLang(ct.getContentType()) ; - - if ( lang == null ) { - String name = fileStream.getName() ; - if ( name == null || name.equals("") ) - ServletOps.errorBadRequest("No name for content - can't determine RDF syntax") ; - lang = RDFLanguages.filenameToLang(name) ; - if (name.endsWith(".gz")) - stream = new GZIPInputStream(stream); - } - if ( lang == null ) - // Desperate. - lang = RDFLanguages.RDFXML ; - - String printfilename = fileStream.getName() ; - if ( printfilename == null || printfilename.equals("") ) - printfilename = "<none>" ; - - // Before - // action.log.info(format("[%d] Filename: %s, Content-Type=%s, Charset=%s => %s", - // action.id, printfilename, ct.getContentType(), ct.getCharset(), lang.getName())) ; - - // count just this step - StreamRDFCounting countingDest2 = StreamRDFLib.count(countingDest) ; - try { - ActionSPARQL.parse(action, countingDest2, stream, lang, base); - UploadDetails details1 = new UploadDetails(countingDest2.count(), countingDest2.countTriples(),countingDest2.countQuads()) ; - action.log.info(format("[%d] Filename: %s, Content-Type=%s, Charset=%s => %s : %s", - action.id, printfilename, ct.getContentType(), ct.getCharset(), lang.getName(), - details1.detailsStr())) ; - } catch (RiotParseException ex) { - action.log.info(format("[%d] Filename: %s, Content-Type=%s, Charset=%s => %s : %s", - action.id, printfilename, ct.getContentType(), ct.getCharset(), lang.getName(), - ex.getMessage())) ; - throw ex ; - } - } - } - catch (ActionErrorException ex) { throw ex ; } - catch (Exception ex) { ServletOps.errorOccurred(ex.getMessage()) ; } - // Overall results. - UploadDetails details = new UploadDetails(countingDest.count(), countingDest.countTriples(),countingDest.countQuads()) ; - return details ; - } -} - http://git-wip-us.apache.org/repos/asf/jena/blob/2fb788d3/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/UploadDetails.java ---------------------------------------------------------------------- diff --git a/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/UploadDetails.java b/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/UploadDetails.java deleted file mode 100644 index a5c144b..0000000 --- a/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/UploadDetails.java +++ /dev/null @@ -1,86 +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 org.apache.jena.atlas.json.JsonBuilder ; -import org.apache.jena.atlas.json.JsonValue ; - -/** Record of an upload */ -public class UploadDetails { - public enum PreState { EXISTED, ABSENT, UNKNOWN } - - private final long count ; - private final long tripleCount ; - private final long quadCount ; - private PreState state = PreState.UNKNOWN ; - - /*package*/ UploadDetails(long parserCount, long parserTripleCount, long parserQuadCount) { - this.count = parserCount ; - this.tripleCount = parserTripleCount ; - this.quadCount = parserQuadCount ; - } - - public static String detailsStr(long count, long tripleCount, long quadCount) { - return String.format("Count=%d Triples=%d Quads=%d", count, tripleCount, quadCount) ; - } - - public String detailsStr() { - return detailsStr(count, tripleCount, quadCount) ; - } - - public static String jCount = "count" ; - public static String jTriplesCount = "tripleCount" ; - public static String jQuadsCount = "quadCount" ; - - public static JsonValue detailsJson(long count, long tripleCount, long quadCount) { - JsonBuilder b = new JsonBuilder() ; - b.startObject("details") ; - b.key(jCount).value(count) ; - b.key(jTriplesCount).value(tripleCount) ; - b.key(jQuadsCount).value(quadCount) ; - b.finishObject("details") ; - return b.build() ; - } - - public JsonValue detailsJson() { - return detailsJson(count, tripleCount, quadCount) ; - } - - public long getCount() { - return count ; - } - - public long getTripleCount() { - return tripleCount ; - } - - public long getQuadCount() { - return quadCount ; - } - - public void setExistedBefore(boolean existedBefore) { - if ( existedBefore ) - setExistedBefore(PreState.EXISTED) ; - else - setExistedBefore(PreState.ABSENT) ; - } - public void setExistedBefore(PreState state) { this.state = state ; } - - public PreState getExistedBefore() { return state ; } -} http://git-wip-us.apache.org/repos/asf/jena/blob/2fb788d3/jena-fuseki2/src/main/java/org/apache/jena/fuseki/validation/DataValidator.java ---------------------------------------------------------------------- diff --git a/jena-fuseki2/src/main/java/org/apache/jena/fuseki/validation/DataValidator.java b/jena-fuseki2/src/main/java/org/apache/jena/fuseki/validation/DataValidator.java deleted file mode 100644 index 055d798..0000000 --- a/jena-fuseki2/src/main/java/org/apache/jena/fuseki/validation/DataValidator.java +++ /dev/null @@ -1,131 +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.StringReader ; -import java.util.ArrayList ; -import java.util.List ; - -import org.apache.jena.atlas.json.JsonBuilder ; -import org.apache.jena.atlas.json.JsonObject ; -import org.apache.jena.fuseki.servlets.ServletOps ; -import org.apache.jena.riot.* ; -import org.apache.jena.riot.system.ErrorHandler ; -import org.apache.jena.riot.system.StreamRDF ; -import org.apache.jena.riot.system.StreamRDFLib ; - -public class DataValidator extends ValidatorBaseJson { - public DataValidator() { } - - static final String jInput = "input" ; - - static final String paramFormat = "outputFormat" ; - static final String paramIndirection = "url" ; - static final String paramData = "data" ; - static final String paramSyntax = "languageSyntax" ; - @Override - protected JsonObject execute(ValidationAction action) { - JsonBuilder obj = new JsonBuilder() ; - obj.startObject() ; - - - String syntax = getArgOrNull(action, paramSyntax) ; - if ( syntax == null || syntax.equals("") ) - syntax = RDFLanguages.NQUADS.getName() ; - - Lang language = RDFLanguages.shortnameToLang(syntax) ; - if ( language == null ) { - ServletOps.errorBadRequest("Unknown syntax: " + syntax) ; - return null ; - } - - String string = getArg(action, paramData) ; - StringReader sr = new StringReader(string) ; - obj.key(jInput).value(string) ; - StreamRDF dest = StreamRDFLib.sinkNull() ; - - try { - // Set error handler! - RDFDataMgr.parse(dest, sr, null, language) ; - } catch (RiotParseException ex) { - obj.key(jErrors) ; - - obj.startArray() ; // Errors array - obj.startObject() ; - obj.key(jParseError).value(ex.getMessage()) ; - obj.key(jParseErrorLine).value(ex.getLine()) ; - obj.key(jParseErrorCol).value(ex.getCol()) ; - obj.finishObject() ; - obj.finishArray() ; - - obj.finishObject() ; // Outer object - return obj.build().getAsObject() ; - } catch (RiotException ex) { - obj.key(jErrors) ; - - obj.startArray() ; // Errors array - obj.startObject() ; - obj.key(jParseError).value(ex.getMessage()) ; - obj.finishObject() ; - obj.finishArray() ; - - obj.finishObject() ; // Outer object - return obj.build().getAsObject() ; - } - - - obj.finishObject() ; - return obj.build().getAsObject() ; - } - @Override - protected String validatorName() { - return "RDF Data" ; - } - - // Error handler that records messages - private static class ErrorHandlerMsg implements ErrorHandler - { - private List<String> messages = new ArrayList<>() ; - - ErrorHandlerMsg(List<String> messages) { this.messages = messages; } - - @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) - { - String str = fmtMessage(message, line, col) ; - messages.add(str) ; - } - } - -} - http://git-wip-us.apache.org/repos/asf/jena/blob/2fb788d3/jena-fuseki2/src/main/java/org/apache/jena/fuseki/validation/IRIValidator.java ---------------------------------------------------------------------- diff --git a/jena-fuseki2/src/main/java/org/apache/jena/fuseki/validation/IRIValidator.java b/jena-fuseki2/src/main/java/org/apache/jena/fuseki/validation/IRIValidator.java deleted file mode 100644 index 3942115..0000000 --- a/jena-fuseki2/src/main/java/org/apache/jena/fuseki/validation/IRIValidator.java +++ /dev/null @@ -1,168 +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.util.ArrayList ; -import java.util.Iterator ; -import java.util.List ; - -import org.apache.jena.atlas.json.JsonBuilder ; -import org.apache.jena.atlas.json.JsonObject ; -import org.apache.jena.fuseki.servlets.ServletOps ; -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 ValidatorBaseJson { - public IRIValidator() { } - - static IRIFactory iriFactory = IRIResolver.iriFactory ; - - static final String paramIRI = "iri" ; - - // Output is an object { "iris" : [ ] } - // { "iri": "" , "error": [], "warnings": [] } - static final String jIRIs = "iris" ; - static final String jIRI = "iri" ; - - @Override - protected JsonObject execute(ValidationAction action) { - JsonBuilder obj = new JsonBuilder() ; - obj.startObject() ; - - String args[] = getArgs(action, paramIRI) ; - if ( args.length == 0 ) - ServletOps.errorBadRequest("No IRIs supplied"); - - obj.key(jIRIs) ; - obj.startArray() ; - - for ( String iriStr : args ) - { - obj.startObject() ; - obj.key(jIRI).value(iriStr) ; - - IRI iri = iriFactory.create(iriStr) ; - - - List<String> errors = new ArrayList<>() ; - List<String> warnings = new ArrayList<>() ; - - if ( iri.isRelative() ) - warnings.add("Relative IRI: "+iriStr) ; - - Iterator<Violation> vIter = iri.violations(true) ; - for ( ; vIter.hasNext() ; ) - { - Violation v = vIter.next() ; - String str = v.getShortMessage() ; - if ( v.isError() ) - errors.add(str) ; - else - warnings.add(str) ; - } - - obj.key(jErrors) ; - obj.startArray() ; - for ( String msg : errors ) - obj.value(msg) ; - obj.finishArray() ; - - obj.key(jWarnings) ; - obj.startArray() ; - for ( String msg : warnings ) - obj.value(msg) ; - obj.finishArray() ; - - obj.finishObject() ; - } - - - obj.finishArray() ; - - obj.finishObject() ; - return obj.build().getAsObject() ; - } - @Override - protected String validatorName() { - return "RDF Data" ; - } -} - -//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-fuseki2/src/main/java/org/apache/jena/fuseki/validation/QueryValidator.java ---------------------------------------------------------------------- diff --git a/jena-fuseki2/src/main/java/org/apache/jena/fuseki/validation/QueryValidator.java b/jena-fuseki2/src/main/java/org/apache/jena/fuseki/validation/QueryValidator.java deleted file mode 100644 index 2b9aec2..0000000 --- a/jena-fuseki2/src/main/java/org/apache/jena/fuseki/validation/QueryValidator.java +++ /dev/null @@ -1,154 +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 org.apache.jena.atlas.io.IndentedLineBuffer ; -import org.apache.jena.atlas.json.JsonBuilder ; -import org.apache.jena.atlas.json.JsonObject ; -import org.apache.jena.fuseki.servlets.ServletOps ; - -import com.hp.hpl.jena.query.Query ; -import com.hp.hpl.jena.query.QueryFactory ; -import com.hp.hpl.jena.query.QueryParseException ; -import com.hp.hpl.jena.query.Syntax ; -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 ValidatorBaseJson { - public QueryValidator() {} - - @Override - protected String validatorName() { - return "SPARQL Query" ; - } - - static final String paramQuery = "query" ; - static final String paramSyntax = "languageSyntax" ; - - static final String jInput = "input" ; - - static final String jFormatted = "formatted" ; - static final String jAlgebra = "algebra" ; - static final String jAlgebraQuads = "algebra-quads" ; - static final String jAlgebraOpt = "algebra-opt" ; - static final String jAlgebraOptQuads = "algebra-opt-quads" ; - - @Override - protected JsonObject execute(ValidationAction action) { - JsonBuilder obj = new JsonBuilder() ; - obj.startObject() ; - - final String queryString = getArg(action, paramQuery) ; - - String querySyntax = getArgOrNull(action, paramSyntax) ; - if ( querySyntax == null || querySyntax.equals("") ) - querySyntax = "SPARQL" ; - - Syntax language = Syntax.lookup(querySyntax) ; - if ( language == null ) { - ServletOps.errorBadRequest("Unknown syntax: " + querySyntax) ; - return null ; - } - - boolean outputSPARQL = true ; - boolean outputAlgebra = true ; - boolean outputQuads = true ; - boolean outputOptimized = true ; - boolean outputOptimizedQuads = true ; - - obj.key(jInput).value(queryString) ; - - // Attempt to parse it. - Query query = null ; - try { - query = QueryFactory.create(queryString, "http://example/base/", language) ; - } catch (QueryParseException ex) { - obj.key(jErrors) ; - obj.startArray() ; // Errors array - obj.startObject() ; - obj.key(jParseError).value(ex.getMessage()) ; - obj.key(jParseErrorLine).value(ex.getLine()) ; - obj.key(jParseErrorCol).value(ex.getColumn()) ; - obj.finishObject() ; - obj.finishArray() ; - - obj.finishObject() ; // Outer object - return obj.build().getAsObject() ; - } - - if ( query != null ) { - - if ( outputSPARQL ) - formatted(obj, query) ; - - if ( outputAlgebra ) - algebra(obj, query) ; - - if ( outputQuads ) - algebraQuads(obj, query) ; - - if ( outputOptimized ) - algebraOpt(obj, query) ; - - if ( outputOptimizedQuads ) - algebraOptQuads(obj, query) ; - } - - obj.finishObject() ; - return obj.build().getAsObject() ; - } - - private void formatted(JsonBuilder obj, Query query) { - IndentedLineBuffer out = new IndentedLineBuffer() ; - query.serialize(out) ; - obj.key(jFormatted).value(out.asString()) ; - } - - private void algebra(JsonBuilder obj, Query query) { - Op op = Algebra.compile(query) ; - obj.key(jAlgebra).value(string(query, op)) ; - } - - private void algebraQuads(JsonBuilder obj, Query query) { - Op op = Algebra.compile(query) ; - op = Algebra.toQuadForm(op) ; - obj.key(jAlgebraQuads).value(string(query, op)) ; - } - - private void algebraOpt(JsonBuilder obj, Query query) { - Op op = Algebra.compile(query) ; - op = Algebra.optimize(op) ; - obj.key(jAlgebraOpt).value(string(query, op)) ; - } - - private void algebraOptQuads(JsonBuilder obj, Query query) { - Op op = Algebra.compile(query) ; - op = Algebra.toQuadForm(op) ; - op = Algebra.optimize(op) ; - obj.key(jAlgebraOptQuads).value(string(query, op)) ; - } - - private String string(Query query, Op op) { - final SerializationContext sCxt = new SerializationContext(query) ; - IndentedLineBuffer out = new IndentedLineBuffer() ; - op.output(out, sCxt) ; - return out.asString() ; - } -} http://git-wip-us.apache.org/repos/asf/jena/blob/2fb788d3/jena-fuseki2/src/main/java/org/apache/jena/fuseki/validation/UpdateValidator.java ---------------------------------------------------------------------- diff --git a/jena-fuseki2/src/main/java/org/apache/jena/fuseki/validation/UpdateValidator.java b/jena-fuseki2/src/main/java/org/apache/jena/fuseki/validation/UpdateValidator.java deleted file mode 100644 index 4e93438..0000000 --- a/jena-fuseki2/src/main/java/org/apache/jena/fuseki/validation/UpdateValidator.java +++ /dev/null @@ -1,91 +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 org.apache.jena.atlas.io.IndentedLineBuffer ; -import org.apache.jena.atlas.json.JsonBuilder ; -import org.apache.jena.atlas.json.JsonObject ; -import org.apache.jena.fuseki.servlets.ServletOps ; - -import com.hp.hpl.jena.query.QueryParseException ; -import com.hp.hpl.jena.query.Syntax ; -import com.hp.hpl.jena.update.UpdateFactory ; -import com.hp.hpl.jena.update.UpdateRequest ; - -public class UpdateValidator extends ValidatorBaseJson { - public UpdateValidator() {} - - static final String paramUpdate = "update" ; - static final String paramSyntax = "languageSyntax" ; - - static final String jInput = "input" ; - static final String jFormatted = "formatted" ; - - @Override - protected JsonObject execute(ValidationAction action) { - JsonBuilder obj = new JsonBuilder() ; - obj.startObject() ; - - final String updateString = getArg(action, paramUpdate) ; - String updateSyntax = getArgOrNull(action, paramSyntax) ; - if ( updateSyntax == null || updateSyntax.equals("") ) - updateSyntax = "SPARQL" ; - - Syntax language = Syntax.lookup(updateSyntax) ; - if ( language == null ) { - ServletOps.errorBadRequest("Unknown syntax: " + updateSyntax) ; - return null ; - } - - obj.key(jInput).value(updateString) ; - UpdateRequest request = null ; - try { - request = UpdateFactory.create(updateString, "http://example/base/", language) ; - } catch (QueryParseException ex) { - obj.key(jErrors) ; - obj.startArray() ; // Errors array - obj.startObject() ; - obj.key(jParseError).value(ex.getMessage()) ; - obj.key(jParseErrorLine).value(ex.getLine()) ; - obj.key(jParseErrorCol).value(ex.getColumn()) ; - obj.finishObject() ; - obj.finishArray() ; - - obj.finishObject() ; // Outer object - return obj.build().getAsObject() ; - } - - formatted(obj, request) ; - - obj.finishObject() ; - return obj.build().getAsObject() ; - } - - private void formatted(JsonBuilder obj, UpdateRequest updateRequest) { - IndentedLineBuffer out = new IndentedLineBuffer() ; - updateRequest.output(out) ; - obj.key(jFormatted).value(out.asString()) ; - } - - @Override - protected String validatorName() { - return "SPARQL Update" ; - } -} -
