blob: 97dfc77662c08184ab1439ad6434e5a0609fc449 [file] [log] [blame]
/*
* 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.update;
import java.io.InputStream ;
import org.apache.jena.atlas.io.IO ;
import org.apache.jena.graph.Graph ;
import org.apache.jena.query.Dataset ;
import org.apache.jena.query.QuerySolution ;
import org.apache.jena.query.Syntax ;
import org.apache.jena.rdf.model.Model ;
import org.apache.jena.sparql.ARQException ;
import org.apache.jena.sparql.core.DatasetGraph ;
import org.apache.jena.sparql.core.DatasetGraphFactory ;
import org.apache.jena.sparql.engine.binding.Binding ;
import org.apache.jena.sparql.engine.binding.BindingUtils ;
import org.apache.jena.sparql.lang.UpdateParser ;
import org.apache.jena.sparql.modify.UpdateSink ;
import org.apache.jena.sparql.modify.UsingList ;
import org.apache.jena.sparql.modify.UsingUpdateSink ;
import org.apache.jena.sparql.modify.request.UpdateWithUsing ;
/** A class of forms for executing SPARQL Update operations.
* parse means the update request is in a String or an InputStream;
* read means read the contents of a file.
*/
public class UpdateAction
{
/** Read a file containing SPARQL Update operations, and execute the operations.
* @param filename
* @param model
*/
public static void readExecute(String filename, Model model)
{
readExecute(filename, toDatasetGraph(model.getGraph())) ;
}
/** Read a file containing SPARQL Update operations, and execute the operations.
* @param filename
* @param graph
*/
public static void readExecute(String filename, Graph graph)
{
readExecute(filename, toDatasetGraph(graph)) ;
}
/** Read a file containing SPARQL Update operations, and execute the operations.
* @param filename
* @param dataset
*/
public static void readExecute(String filename, Dataset dataset)
{
readExecute(filename, dataset.asDatasetGraph()) ;
}
/** Read a file containing SPARQL Update operations, and execute the operations.
* @param filename
* @param dataset
*/
public static void readExecute(String filename, DatasetGraph dataset)
{
readExecute(filename, dataset, null) ;
}
/** Read a file containing SPARQL Update operations, and execute the operations.
* @param filename
* @param dataset
* @param inputBinding
*/
public static void readExecute(String filename, Dataset dataset, QuerySolution inputBinding) {
UpdateRequest req = UpdateFactory.read(filename) ;
execute(req, dataset, inputBinding) ;
}
/** Read a file containing SPARQL Update operations, and execute the operations.
* @param filename
* @param datasetGraph
* @param inputBinding
*/
public static void readExecute(String filename, DatasetGraph datasetGraph, Binding inputBinding) {
UpdateRequest req = UpdateFactory.read(filename) ;
execute$(req, datasetGraph, inputBinding) ;
}
/** Parse a string containing SPARQL Update operations, and execute the operations.
* @param updateString
* @param model
*/
public static void parseExecute(String updateString, Model model)
{
parseExecute(updateString, model.getGraph()) ;
}
/** Parse a string containing SPARQL Update operations, and execute the operations.
* @param updateString
* @param graph
*/
public static void parseExecute(String updateString, Graph graph)
{
parseExecute(updateString, toDatasetGraph(graph)) ;
}
/** Parse a string containing SPARQL Update operations, and execute the operations.
* @param updateString
* @param dataset
*/
public static void parseExecute(String updateString, Dataset dataset)
{
parseExecute(updateString, dataset.asDatasetGraph()) ;
}
/** Parse a string containing SPARQL Update operations, and execute the operations.
* @param updateString
* @param dataset
*/
public static void parseExecute(String updateString, DatasetGraph dataset)
{
UpdateRequest req = UpdateFactory.create(updateString) ;
execute(req, dataset) ;
}
/** Parse a string containing SPARQL Update operations, and execute the operations.
* @param updateString
* @param dataset
* @param inputBinding
*/
public static void parseExecute(String updateString, Dataset dataset, QuerySolution inputBinding)
{
parseExecute(updateString, dataset.asDatasetGraph(), BindingUtils.asBinding(inputBinding)) ;
}
/** Parse a string containing SPARQL Update operations, and execute the operations.
* @param updateString
* @param dataset
* @param inputBinding
*/
public static void parseExecute(String updateString, DatasetGraph dataset, Binding inputBinding)
{
UpdateRequest req = UpdateFactory.create(updateString) ;
execute(req, dataset, inputBinding) ;
}
/** Execute SPARQL Update operations.
* @param request
* @param model
*/
public static void execute(UpdateRequest request, Model model)
{
execute(request, model.getGraph()) ;
}
/** Execute SPARQL Update operations.
* @param request
* @param graph
*/
public static void execute(UpdateRequest request, Graph graph)
{
execute(request, toDatasetGraph(graph)) ;
}
/** Execute SPARQL Update operations.
* @param request
* @param dataset
*/
public static void execute(UpdateRequest request, Dataset dataset)
{
execute(request, dataset.asDatasetGraph()) ;
}
/** Execute SPARQL Update operations.
* @param request
* @param dataset
*/
public static void execute(UpdateRequest request, DatasetGraph dataset)
{
execute$(request, dataset, null) ;
}
/** Execute SPARQL Update operations.
* @param request
* @param dataset
* @param inputBinding
*/
public static void execute(UpdateRequest request, Dataset dataset, QuerySolution inputBinding)
{
execute(request, dataset.asDatasetGraph(), BindingUtils.asBinding(inputBinding)) ;
}
/** Execute SPARQL Update operations.
* @param request
* @param datasetGraph
* @param inputBinding
*/
public static void execute(UpdateRequest request, DatasetGraph datasetGraph, Binding inputBinding)
{
execute$(request, datasetGraph, inputBinding) ;
}
private static DatasetGraph toDatasetGraph(Graph graph) {
return DatasetGraphFactory.create(graph) ;
}
// All non-streaming updates come through here.
private static void execute$(UpdateRequest request, DatasetGraph datasetGraph, Binding inputBinding)
{
UpdateProcessor uProc = UpdateExecutionFactory.create(request, datasetGraph, inputBinding);
if (uProc == null)
throw new ARQException("No suitable update procesors are registered/able to execute your updates");
uProc.execute();
}
/** Execute a single SPARQL Update operation.
* @param update
* @param model
*/
public static void execute(Update update, Model model)
{
execute(update, model.getGraph()) ;
}
/** Execute a single SPARQL Update operation.
* @param update
* @param graph
*/
public static void execute(Update update, Graph graph)
{
execute(update, toDatasetGraph(graph)) ;
}
/** Execute a single SPARQL Update operation.
* @param update
* @param dataset
*/
public static void execute(Update update, Dataset dataset)
{
execute(update, dataset.asDatasetGraph()) ;
}
/** Execute a single SPARQL Update operation.
* @param update
* @param dataset
*/
public static void execute(Update update, DatasetGraph dataset)
{
execute(update, dataset, null) ;
}
/** Execute a single SPARQL Update operation.
* @param update
* @param dataset
* @param inputBinding
*/
public static void execute(Update update, Dataset dataset, QuerySolution inputBinding)
{
execute(update, dataset.asDatasetGraph(), BindingUtils.asBinding(inputBinding)) ;
}
/** Execute a single SPARQL Update operation.
* @param update
* @param datasetGraph
* @param inputBinding
*/
public static void execute(Update update, DatasetGraph datasetGraph, Binding inputBinding)
{
execute$(update, datasetGraph, inputBinding) ;
}
private static void execute$(Update update, DatasetGraph datasetGraph, Binding inputBinding)
{
UpdateRequest request = new UpdateRequest() ;
request.add(update) ;
execute$(request, datasetGraph, inputBinding) ;
}
// Streaming Updates:
/** Parse update operations into a GraphStore by reading it from a file */
public static void parseExecute(UsingList usingList, DatasetGraph dataset, String fileName)
{
parseExecute(usingList, dataset, fileName, null, Syntax.defaultUpdateSyntax) ;
}
/** Parse update operations into a GraphStore by reading it from a file */
public static void parseExecute(UsingList usingList, DatasetGraph dataset, String fileName, Syntax syntax)
{
parseExecute(usingList, dataset, fileName, null, syntax) ;
}
/** Parse update operations into a GraphStore by reading it from a file */
public static void parseExecute(UsingList usingList, DatasetGraph dataset, String fileName, String baseURI, Syntax syntax)
{
parseExecute(usingList, dataset, fileName, (Binding)null, baseURI, syntax);
}
/** Parse update operations into a GraphStore by reading it from a file */
public static void parseExecute(UsingList usingList, DatasetGraph dataset, String fileName, QuerySolution inputBinding, String baseURI, Syntax syntax)
{
parseExecute(usingList, dataset, fileName, BindingUtils.asBinding(inputBinding), baseURI, syntax) ;
}
/** Parse update operations into a GraphStore by reading it from a file */
@SuppressWarnings("resource")
public static void parseExecute(UsingList usingList, DatasetGraph dataset, String fileName, Binding inputBinding, String baseURI, Syntax syntax)
{
InputStream in = null ;
if ( fileName.equals("-") )
in = System.in ;
else {
in = IO.openFile(fileName) ;
if ( in == null )
throw new UpdateException("File could not be opened: "+fileName) ;
}
parseExecute(usingList, dataset, in, inputBinding, baseURI, syntax) ;
if ( in != System.in )
IO.close(in) ;
}
/**
* Parse update operations into a GraphStore by parsing from an InputStream.
* @param usingList A list of USING or USING NAMED statements that be added to all {@link UpdateWithUsing} queries
* @param input The source of the update request (must be UTF-8).
*/
public static void parseExecute(UsingList usingList, DatasetGraph dataset, InputStream input)
{
parseExecute(usingList, dataset, input, Syntax.defaultUpdateSyntax) ;
}
/**
* Parse update operations into a GraphStore by parsing from an InputStream.
* @param usingList A list of USING or USING NAMED statements that be added to all {@link UpdateWithUsing} queries
* @param input The source of the update request (must be UTF-8).
* @param syntax The update language syntax
*/
public static void parseExecute(UsingList usingList, DatasetGraph dataset, InputStream input, Syntax syntax)
{
parseExecute(usingList, dataset, input, null, syntax) ;
}
/**
* Parse update operations into a GraphStore by parsing from an InputStream.
* @param usingList A list of USING or USING NAMED statements that be added to all {@link UpdateWithUsing} queries
* @param input The source of the update request (must be UTF-8).
* @param baseURI The base URI for resolving relative URIs.
*/
public static void parseExecute(UsingList usingList, DatasetGraph dataset, InputStream input, String baseURI)
{
parseExecute(usingList, dataset, input, baseURI, Syntax.defaultUpdateSyntax) ;
}
/**
* Parse update operations into a GraphStore by parsing from an InputStream.
* @param usingList A list of USING or USING NAMED statements that be added to all {@link UpdateWithUsing} queries
* @param dataset The dataset to apply the changes to
* @param input The source of the update request (must be UTF-8).
* @param baseURI The base URI for resolving relative URIs (may be <code>null</code>)
* @param syntax The update language syntax
*/
public static void parseExecute(UsingList usingList, DatasetGraph dataset, InputStream input, String baseURI, Syntax syntax)
{
parseExecute(usingList, dataset, input, (Binding)null, baseURI, syntax);
}
/**
* Parse update operations into a GraphStore by parsing from an InputStream.
* @param usingList A list of USING or USING NAMED statements that be added to all {@link UpdateWithUsing} queries
* @param dataset The dataset to apply the changes to
* @param input The source of the update request (must be UTF-8).
* @param inputBinding Initial binding to be applied to Update operations that can apply an initial binding
* (i.e. UpdateDeleteWhere, UpdateModify). May be <code>null</code>
* @param baseURI The base URI for resolving relative URIs (may be <code>null</code>)
* @param syntax The update language syntax
*/
public static void parseExecute(UsingList usingList, DatasetGraph dataset, InputStream input, QuerySolution inputBinding, String baseURI, Syntax syntax)
{
parseExecute(usingList, dataset, input, BindingUtils.asBinding(inputBinding), baseURI, syntax) ;
}
/**
* Parse update operations into a GraphStore by parsing from an InputStream.
* @param usingList A list of USING or USING NAMED statements that be added to all {@link UpdateWithUsing} queries
* @param dataset The dataset to apply the changes to
* @param input The source of the update request (must be UTF-8).
* @param inputBinding Initial binding to be applied to Update operations that can apply an initial binding
* (i.e. UpdateDeleteWhere, UpdateModify). May be <code>null</code>
* @param baseURI The base URI for resolving relative URIs (may be <code>null</code>)
* @param syntax The update language syntax
*/
public static void parseExecute(UsingList usingList, DatasetGraph dataset, InputStream input, Binding inputBinding, String baseURI, Syntax syntax)
{
UpdateProcessorStreaming uProc = UpdateExecutionFactory.createStreaming(dataset, inputBinding) ;
if (uProc == null)
throw new ARQException("No suitable update procesors are registered/able to execute your updates");
uProc.startRequest();
try
{
UpdateSink sink = new UsingUpdateSink(uProc.getUpdateSink(), usingList) ;
try
{
UpdateParser parser = UpdateFactory.setupParser(sink.getPrologue(), baseURI, syntax) ;
parser.parse(sink, input) ;
}
finally
{
sink.close() ;
}
}
finally
{
uProc.finishRequest();
}
}
}