You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by rv...@apache.org on 2014/09/16 14:48:35 UTC
svn commit: r1625265 - in
/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request:
UpdateWriter.java UpdateWriterVisitor.java
Author: rvesse
Date: Tue Sep 16 12:48:34 2014
New Revision: 1625265
URL: http://svn.apache.org/r1625265
Log:
Make UpdateWriter API extensible
Added:
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriterVisitor.java
Modified:
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriter.java
Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriter.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriter.java?rev=1625265&r1=1625264&r2=1625265&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriter.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriter.java Tue Sep 16 12:48:34 2014
@@ -19,26 +19,18 @@
package com.hp.hpl.jena.sparql.modify.request;
import java.util.Iterator ;
-import java.util.List ;
import org.apache.jena.atlas.io.IndentedWriter ;
-import org.apache.jena.atlas.iterator.Iter ;
import org.apache.jena.atlas.lib.Closeable ;
-import org.apache.jena.atlas.lib.Sink ;
-import org.apache.jena.riot.out.SinkQuadBracedOutput ;
import org.apache.jena.riot.system.IRIResolver ;
import com.hp.hpl.jena.graph.Node ;
import com.hp.hpl.jena.graph.Triple ;
-import com.hp.hpl.jena.sparql.ARQException ;
import com.hp.hpl.jena.sparql.core.Prologue ;
import com.hp.hpl.jena.sparql.core.Quad ;
import com.hp.hpl.jena.sparql.modify.request.UpdateDataWriter.UpdateMode ;
-import com.hp.hpl.jena.sparql.serializer.FormatterElement ;
import com.hp.hpl.jena.sparql.serializer.PrologueSerializer ;
import com.hp.hpl.jena.sparql.serializer.SerializationContext ;
-import com.hp.hpl.jena.sparql.syntax.Element ;
-import com.hp.hpl.jena.sparql.util.FmtUtils ;
import com.hp.hpl.jena.sparql.util.NodeToLabelMapBNode ;
import com.hp.hpl.jena.update.Update ;
import com.hp.hpl.jena.update.UpdateRequest ;
@@ -77,13 +69,13 @@ public class UpdateWriter implements Clo
opened = true;
}
- private void checkOpen()
+ protected void checkOpen()
{
if (!opened)
throw new IllegalStateException("UpdateStreamWriter is not opened. Call open() first.");
}
- private void prologue()
+ protected void prologue()
{
int row1 = out.getRow() ;
PrologueSerializer.output(out, sCxt.getPrologue()) ;
@@ -92,7 +84,7 @@ public class UpdateWriter implements Clo
out.newline() ;
}
- private void prepareForDataUpdate(UpdateMode mode)
+ protected void prepareForDataUpdate(UpdateMode mode)
{
if ((null != udw) && !udw.getMode().equals(mode))
{
@@ -190,11 +182,19 @@ public class UpdateWriter implements Clo
{
out.println(" ;");
}
- Writer writer = new Writer(out, sCxt) ;
+ UpdateVisitor writer = prepareWriterVisitor() ;
update.visit(writer) ;
firstOp = false;
}
+
+ /**
+ * Prepares a visitor which is used to visit the actual updates that make up the update request and write them out
+ * @return Update visitor
+ */
+ protected UpdateVisitor prepareWriterVisitor() {
+ return new UpdateWriterVisitor(out, sCxt);
+ }
public void update(Iterable<? extends Update> updates)
{
@@ -259,259 +259,4 @@ public class UpdateWriter implements Clo
uw.update(update);
uw.close();
}
-
- // newline policy - don't add until needed.
- private static class Writer implements UpdateVisitor
- {
- private static final int BLOCK_INDENT = 2 ;
- private final IndentedWriter out ;
- private final SerializationContext sCxt ;
-
- public Writer(IndentedWriter out, SerializationContext sCxt)
- {
- this.out = out ;
- this.sCxt = sCxt ;
- }
-
- private void visitDropClear(String name, UpdateDropClear update)
- {
- out.ensureStartOfLine() ;
- out.print(name) ;
- out.print(" ") ;
- if ( update.isSilent() )
- out.print("SILENT ") ;
-
- printTarget(update.getTarget()) ;
-
- }
-
- private void printTarget(Target target)
- {
- if ( target.isAll() ) { out.print("ALL") ; }
- else if ( target.isAllNamed() ) { out.print("NAMED") ; }
- else if ( target.isDefault() ) { out.print("DEFAULT") ; }
- else if ( target.isOneNamedGraph() )
- {
- out.print("GRAPH ") ;
- String s = FmtUtils.stringForNode(target.getGraph(), sCxt) ;
- out.print(s) ;
- }
- else
- {
- out.print("Target BROKEN") ;
- throw new ARQException("Malformed Target") ;
- }
- }
-
- @Override
- public void visit(UpdateDrop update)
- { visitDropClear("DROP", update) ; }
-
- @Override
- public void visit(UpdateClear update)
- { visitDropClear("CLEAR", update) ; }
-
- @Override
- public void visit(UpdateCreate update)
- {
- out.ensureStartOfLine() ;
- out.print("CREATE") ;
- out.print(" ") ;
- if ( update.isSilent() )
- out.print("SILENT ") ;
- out.print("GRAPH") ;
- out.print(" ") ;
- String s = FmtUtils.stringForNode(update.getGraph(), sCxt) ;
- out.print(s) ;
- }
-
- @Override
- public void visit(UpdateLoad update)
- {
- out.ensureStartOfLine() ;
- out.print("LOAD") ;
- out.print(" ") ;
- if ( update.getSilent() )
- out.print("SILENT ") ;
-
- outputStringAsURI(update.getSource()) ;
-
- if ( update.getDest() != null )
- {
- out.print(" INTO GRAPH ") ;
- output(update.getDest()) ;
- }
- }
-
- private void outputStringAsURI(String uriStr)
- {
- String x = FmtUtils.stringForURI(uriStr, sCxt) ;
- out.print(x) ;
- }
-
- private void printTargetUpdate2(Target target)
- {
- if ( target.isDefault() ) { out.print("DEFAULT") ; }
- else if ( target.isOneNamedGraph() )
- {
- //out.print("GRAPH ") ;
- String s = FmtUtils.stringForNode(target.getGraph(), sCxt) ;
- out.print(s) ;
- }
- else
- {
- out.print("Target BROKEN / Update2") ;
- throw new ARQException("Malformed Target / Update2") ;
- }
- }
-
- private void printUpdate2(UpdateBinaryOp update, String name)
- {
- out.print(name) ;
- if ( update.getSilent() )
- out.print(" SILENT") ;
- out.print(" ") ;
- printTargetUpdate2(update.getSrc()) ;
- out.print(" TO ") ;
- printTargetUpdate2(update.getDest()) ;
- }
-
-
- @Override
- public void visit(UpdateAdd update)
- { printUpdate2(update, "ADD") ; }
-
- @Override
- public void visit(UpdateCopy update)
- { printUpdate2(update, "COPY") ; }
-
- @Override
- public void visit(UpdateMove update)
- { printUpdate2(update, "MOVE") ; }
-
-
- @Override
- public Sink<Quad> createInsertDataSink()
- {
- UpdateDataWriter udw = new UpdateDataWriter(UpdateMode.INSERT, out, sCxt);
- udw.open();
- return udw;
- }
-
- @Override
- public void visit(UpdateDataInsert update)
- {
- Iter.sendToSink(update.getQuads(), createInsertDataSink()); // Iter.sendToSink() will call close() on the sink
- }
-
- @Override
- public Sink<Quad> createDeleteDataSink()
- {
- UpdateDataWriter udw = new UpdateDataWriter(UpdateMode.DELETE, out, sCxt);
- udw.open();
- return udw;
- }
-
- @Override
- public void visit(UpdateDataDelete update)
- {
- Iter.sendToSink(update.getQuads(), createDeleteDataSink()); // Iter.sendToSink() will call close() on the sink
- }
-
- // Prettier later.
-
- private void outputQuadsBraced(List<Quad> quads)
- {
- if ( quads.size() == 0 )
- {
- out.print("{ }") ;
- return ;
- }
-
- SinkQuadBracedOutput sink = new SinkQuadBracedOutput(out, sCxt);
- sink.open();
- Iter.sendToSink(quads, sink);
- }
-
- private void output(Node node)
- {
- String $ = FmtUtils.stringForNode(node, sCxt) ;
- out.print($) ;
- }
-
-
- @Override
- public void visit(UpdateDeleteWhere update)
- {
- out.ensureStartOfLine() ;
- out.println("DELETE WHERE ") ;
- outputQuadsBraced(update.getQuads()) ;
- }
-
- @Override
- public void visit(UpdateModify update)
- {
- out.ensureStartOfLine() ;
- if ( update.getWithIRI() != null )
- {
- //out.ensureStartOfLine() ;
- out.print("WITH ") ;
- output(update.getWithIRI()) ;
- }
-
-
- if ( update.hasDeleteClause() )
- {
- List<Quad> deleteQuads = update.getDeleteQuads() ;
- out.ensureStartOfLine() ;
- out.print("DELETE ") ;
- outputQuadsBraced(deleteQuads) ;
- }
-
-
- if ( update.hasInsertClause() )
- {
- List<Quad> insertQuads = update.getInsertQuads() ;
- out.ensureStartOfLine() ;
- out.print("INSERT ") ;
- outputQuadsBraced(insertQuads) ;
- }
-
- if ( ! update.hasInsertClause() && ! update.hasDeleteClause() )
- {
- // Fake a clause to make it legal syntax.
- out.ensureStartOfLine() ;
- out.println("INSERT { }") ;
- }
-
- for ( Node x : update.getUsing() )
- {
- out.ensureStartOfLine() ;
- out.print("USING ") ;
- output(x) ;
- }
-
- for ( Node x : update.getUsingNamed() )
- {
- out.ensureStartOfLine() ;
- out.print("USING NAMED ") ;
- output(x) ;
- }
-
- Element el = update.getWherePattern() ;
- out.ensureStartOfLine() ;
- out.print("WHERE") ;
- out.incIndent(BLOCK_INDENT) ;
- out.newline() ;
-
- if ( el != null )
- {
- FormatterElement fmtElement = new FormatterElement(out, sCxt) ;
- fmtElement.visitAsGroup(el) ;
- }
- else
- out.print("{}") ;
- out.decIndent(BLOCK_INDENT) ;
- }
- }
}
Added: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriterVisitor.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriterVisitor.java?rev=1625265&view=auto
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriterVisitor.java (added)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriterVisitor.java Tue Sep 16 12:48:34 2014
@@ -0,0 +1,272 @@
+package com.hp.hpl.jena.sparql.modify.request;
+
+import java.util.List;
+
+import org.apache.jena.atlas.io.IndentedWriter;
+import org.apache.jena.atlas.iterator.Iter;
+import org.apache.jena.atlas.lib.Sink;
+import org.apache.jena.riot.out.SinkQuadBracedOutput;
+
+import com.hp.hpl.jena.graph.Node;
+import com.hp.hpl.jena.sparql.ARQException;
+import com.hp.hpl.jena.sparql.core.Quad;
+import com.hp.hpl.jena.sparql.modify.request.UpdateDataWriter.UpdateMode;
+import com.hp.hpl.jena.sparql.serializer.FormatterElement;
+import com.hp.hpl.jena.sparql.serializer.SerializationContext;
+import com.hp.hpl.jena.sparql.syntax.Element;
+import com.hp.hpl.jena.sparql.util.FmtUtils;
+
+// newline policy - don't add until needed.
+class UpdateWriterVisitor implements UpdateVisitor
+{
+ private static final int BLOCK_INDENT = 2 ;
+ private final IndentedWriter out ;
+ private final SerializationContext sCxt ;
+
+ public UpdateWriterVisitor(IndentedWriter out, SerializationContext sCxt)
+ {
+ this.out = out ;
+ this.sCxt = sCxt ;
+ }
+
+ protected void visitDropClear(String name, UpdateDropClear update)
+ {
+ out.ensureStartOfLine() ;
+ out.print(name) ;
+ out.print(" ") ;
+ if ( update.isSilent() )
+ out.print("SILENT ") ;
+
+ printTarget(update.getTarget()) ;
+
+ }
+
+ protected void printTarget(Target target)
+ {
+ if ( target.isAll() ) { out.print("ALL") ; }
+ else if ( target.isAllNamed() ) { out.print("NAMED") ; }
+ else if ( target.isDefault() ) { out.print("DEFAULT") ; }
+ else if ( target.isOneNamedGraph() )
+ {
+ out.print("GRAPH ") ;
+ String s = FmtUtils.stringForNode(target.getGraph(), sCxt) ;
+ out.print(s) ;
+ }
+ else
+ {
+ out.print("Target BROKEN") ;
+ throw new ARQException("Malformed Target") ;
+ }
+ }
+
+ @Override
+ public void visit(UpdateDrop update)
+ { visitDropClear("DROP", update) ; }
+
+ @Override
+ public void visit(UpdateClear update)
+ { visitDropClear("CLEAR", update) ; }
+
+ @Override
+ public void visit(UpdateCreate update)
+ {
+ out.ensureStartOfLine() ;
+ out.print("CREATE") ;
+ out.print(" ") ;
+ if ( update.isSilent() )
+ out.print("SILENT ") ;
+ out.print("GRAPH") ;
+ out.print(" ") ;
+ String s = FmtUtils.stringForNode(update.getGraph(), sCxt) ;
+ out.print(s) ;
+ }
+
+ @Override
+ public void visit(UpdateLoad update)
+ {
+ out.ensureStartOfLine() ;
+ out.print("LOAD") ;
+ out.print(" ") ;
+ if ( update.getSilent() )
+ out.print("SILENT ") ;
+
+ outputStringAsURI(update.getSource()) ;
+
+ if ( update.getDest() != null )
+ {
+ out.print(" INTO GRAPH ") ;
+ output(update.getDest()) ;
+ }
+ }
+
+ protected void outputStringAsURI(String uriStr)
+ {
+ String x = FmtUtils.stringForURI(uriStr, sCxt) ;
+ out.print(x) ;
+ }
+
+ protected void printTargetUpdate2(Target target)
+ {
+ if ( target.isDefault() ) { out.print("DEFAULT") ; }
+ else if ( target.isOneNamedGraph() )
+ {
+ //out.print("GRAPH ") ;
+ String s = FmtUtils.stringForNode(target.getGraph(), sCxt) ;
+ out.print(s) ;
+ }
+ else
+ {
+ out.print("Target BROKEN / Update2") ;
+ throw new ARQException("Malformed Target / Update2") ;
+ }
+ }
+
+ protected void printUpdate2(UpdateBinaryOp update, String name)
+ {
+ out.print(name) ;
+ if ( update.getSilent() )
+ out.print(" SILENT") ;
+ out.print(" ") ;
+ printTargetUpdate2(update.getSrc()) ;
+ out.print(" TO ") ;
+ printTargetUpdate2(update.getDest()) ;
+ }
+
+
+ @Override
+ public void visit(UpdateAdd update)
+ { printUpdate2(update, "ADD") ; }
+
+ @Override
+ public void visit(UpdateCopy update)
+ { printUpdate2(update, "COPY") ; }
+
+ @Override
+ public void visit(UpdateMove update)
+ { printUpdate2(update, "MOVE") ; }
+
+
+ @Override
+ public Sink<Quad> createInsertDataSink()
+ {
+ UpdateDataWriter udw = new UpdateDataWriter(UpdateMode.INSERT, out, sCxt);
+ udw.open();
+ return udw;
+ }
+
+ @Override
+ public void visit(UpdateDataInsert update)
+ {
+ Iter.sendToSink(update.getQuads(), createInsertDataSink()); // Iter.sendToSink() will call close() on the sink
+ }
+
+ @Override
+ public Sink<Quad> createDeleteDataSink()
+ {
+ UpdateDataWriter udw = new UpdateDataWriter(UpdateMode.DELETE, out, sCxt);
+ udw.open();
+ return udw;
+ }
+
+ @Override
+ public void visit(UpdateDataDelete update)
+ {
+ Iter.sendToSink(update.getQuads(), createDeleteDataSink()); // Iter.sendToSink() will call close() on the sink
+ }
+
+ // Prettier later.
+
+ protected void outputQuadsBraced(List<Quad> quads)
+ {
+ if ( quads.size() == 0 )
+ {
+ out.print("{ }") ;
+ return ;
+ }
+
+ SinkQuadBracedOutput sink = new SinkQuadBracedOutput(out, sCxt);
+ sink.open();
+ Iter.sendToSink(quads, sink);
+ }
+
+ protected void output(Node node)
+ {
+ String $ = FmtUtils.stringForNode(node, sCxt) ;
+ out.print($) ;
+ }
+
+
+ @Override
+ public void visit(UpdateDeleteWhere update)
+ {
+ out.ensureStartOfLine() ;
+ out.println("DELETE WHERE ") ;
+ outputQuadsBraced(update.getQuads()) ;
+ }
+
+ @Override
+ public void visit(UpdateModify update)
+ {
+ out.ensureStartOfLine() ;
+ if ( update.getWithIRI() != null )
+ {
+ //out.ensureStartOfLine() ;
+ out.print("WITH ") ;
+ output(update.getWithIRI()) ;
+ }
+
+
+ if ( update.hasDeleteClause() )
+ {
+ List<Quad> deleteQuads = update.getDeleteQuads() ;
+ out.ensureStartOfLine() ;
+ out.print("DELETE ") ;
+ outputQuadsBraced(deleteQuads) ;
+ }
+
+
+ if ( update.hasInsertClause() )
+ {
+ List<Quad> insertQuads = update.getInsertQuads() ;
+ out.ensureStartOfLine() ;
+ out.print("INSERT ") ;
+ outputQuadsBraced(insertQuads) ;
+ }
+
+ if ( ! update.hasInsertClause() && ! update.hasDeleteClause() )
+ {
+ // Fake a clause to make it legal syntax.
+ out.ensureStartOfLine() ;
+ out.println("INSERT { }") ;
+ }
+
+ for ( Node x : update.getUsing() )
+ {
+ out.ensureStartOfLine() ;
+ out.print("USING ") ;
+ output(x) ;
+ }
+
+ for ( Node x : update.getUsingNamed() )
+ {
+ out.ensureStartOfLine() ;
+ out.print("USING NAMED ") ;
+ output(x) ;
+ }
+
+ Element el = update.getWherePattern() ;
+ out.ensureStartOfLine() ;
+ out.print("WHERE") ;
+ out.incIndent(BLOCK_INDENT) ;
+ out.newline() ;
+
+ if ( el != null )
+ {
+ FormatterElement fmtElement = new FormatterElement(out, sCxt) ;
+ fmtElement.visitAsGroup(el) ;
+ }
+ else
+ out.print("{}") ;
+ out.decIndent(BLOCK_INDENT) ;
+ }
+}
\ No newline at end of file