Thank you Andrei. I downloaded a copy of commons.logging and added its jar to my project. Now the Jena code works fine.
This is obviously a trap for new players like me. I had picked up I needed the log4j stuff but a dependancy on commons.logging slipped by. DM On Thu, Sep 20, 2012 at 9:01 AM, Andrei Petrov <[email protected]> wrote: > Hi, > > You need to add commons.logging to your project. I saw this error when > I tried to use rupdate from jena-arq, which also can be an exampe how > to write SPARQL update. > > Hope it helps, > > On Wed, Sep 19, 2012 at 3:17 PM, David Moss <[email protected]> wrote: > > I've been banging my head against the wall until the early hours trying > to > > make Jena post an insert to a sparql endpoint. > > I notice there is no code on the net to use as a guide on this topic. > > > > Initially I thought my server wasn't responding to update requests, but I > > installed fuseki and set it it accept updates from the command line. > Still > > no joy. I could send updates with fuseki's web form, but not from Java > > using Jena. > > > > The code I tried to use from Jena was: > > > > String update = "http://localhost:3030/ds/update"; > > String query = "INSERT {<a> <b> <c>} WHERE {?s ?p ?o}"; > > UpdateRequest u = UpdateFactory.create(); > > u.add(query); > > UpdateProcessRemote p = new UpdateProcessRemote(u, update); > > p.execute(); > > > > No matter what I tried the code would fail deep in the processing of > > p.execute() > > > > I even tried writing my own html page with a form to send the query, just > > to prove it would be accepted and processed by fuseki. > > It was. > > > > The error dump from the above code is as follows: > > > > ****************** > > 0 [AWT-EventQueue-0] INFO jenatest.jenathing - creating jenathing > > Jenathing created > > 3382 [AWT-EventQueue-0] DEBUG com.hp.hpl.jena.sparql.mgt. > > ARQMgt - Register MBean: com.hp.hpl.jena.sparql.system:type=Context > > 3382 [AWT-EventQueue-0] DEBUG com.hp.hpl.jena.sparql.mgt.ARQMgt - > Register > > MBean: com.hp.hpl.jena.sparql.system:type=Engine > > 3499 [AWT-EventQueue-0] DEBUG com.hp.hpl.jena.sparql.mgt.ARQMgt - > Register > > MBean: com.hp.hpl.jena.sparql.system:type=SystemInfo > > 3501 [AWT-EventQueue-0] DEBUG com.hp.hpl.jena.sparql.mgt.ARQMgt - > Register > > MBean: com.hp.hpl.jena.sparql.system:type=SystemInfo > > 3502 [AWT-EventQueue-0] DEBUG com.hp.hpl.jena.sparql.mgt.ARQMgt - > Register > > MBean: org.openjena.riot.system:type=SystemInfo > > 4018 [AWT-EventQueue-0] DEBUG org.openjena.riot.web.HttpOp - [1] POST > > http://localhost:3030/ds/update > > Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: > > org/apache/commons/logging/LogFactory > > at > > > org.apache.http.impl.client.AbstractHttpClient.<init>(AbstractHttpClient.java:182) > > at > > > org.apache.http.impl.client.DefaultHttpClient.<init>(DefaultHttpClient.java:150) > > at org.openjena.riot.web.HttpOp.execHttpPost(HttpOp.java:206) > > at org.openjena.riot.web.HttpOp.execHttpPost(HttpOp.java:154) > > at org.openjena.riot.web.HttpOp.execHttpPost(HttpOp.java:128) > > at > > > com.hp.hpl.jena.sparql.modify.UpdateProcessRemote.execute(UpdateProcessRemote.java:60) > > at jenatest.jenathing.doUpdate(jenathing.java:65) > > ************************* > > and this seems to be the culprit: > > <init>(AbstractHttpClient.java:182) > > > > when it gets to line 206 in HttpOp.java > > > > // Execute > > HttpClient httpclient = new DefaultHttpClient(); > > > > it hangs for a bit and then never actually executes the subsequent lines: > > > > httppost.setEntity(provider) ; > > HttpResponse response = httpclient.execute(httppost) ; > > httpResponse(id, response, baseIRI, handlers) ; > > > > httpclient.getConnectionManager().shutdown(); > > > > it skips over these and > > } catch (IOException ex) > > { > > ex.printStackTrace(System.err) ; > > } > > > > straight to the finally clause: > > > > finally { closeEntity(provider) ; } > > } > > > > So it doesn't work and the problem seems to be deeply hidden within the > > Apache stuff. > > > > Eventually after staying up till past 3am and missing a days work today, > I > > sidestepped the issue entirely and wrote (or rather cut-and-pasted) an > > update routine that ignored the Jena stuff altogether. Not my preferred > > option, but enough is enough. > > > > I replaced the code above with: > > > > String update = "http://localhost:3030/ds/update"; > > String query = "INSERT {<a> <b> <c>} WHERE {?s ?p ?o}"; > > postthing p = new postthing(); > > p.setEndpoint(update); > > p.setUpdateString(query); > > try { > > p.execute(); > > } > > catch (Exception e) { > > logger.error(e.toString()); > > } > > > > where the postthing is defined as: > > > > > > ****************************** > > package jenatest; > > > > import java.io.BufferedReader; > > import java.io.InputStreamReader; > > import java.io.OutputStreamWriter; > > import java.net.URL; > > import java.net.URLConnection; > > import java.net.URLEncoder; > > > > /** > > * > > * @author admos0 > > */ > > public class postthing { > > > > private String updateString = ""; > > private String endpoint = ""; > > > > postthing() { > > // empty constructor > > } > > > > postthing(String input) { > > this.updateString = input; > > } > > > > /** > > * @param set the endpoint > > */ > > public void setEndpoint(String endpoint) { > > this.endpoint = endpoint; > > } > > > > /** > > * @return the endpoint > > */ > > public String getEndpoint() { > > return this.endpoint; > > } > > > > > > /** > > * @method execute the update > > */ > > void execute() throws Exception { > > try { > > > > if (this.endpoint.equals("")) throw new Exception("No > endpoint > > specified"); > > if (this.updateString.equals("")) throw new Exception("no > > update string specified"); > > > > > > // Construct data > > String data = URLEncoder.encode("request", "UTF-8") + "=" + > > URLEncoder.encode(this.getUpdateString(), "UTF-8"); > > > > > > // Send data > > URL url = new URL(endpoint); > > > > URLConnection conn = url.openConnection(); > > conn.setDoOutput(true); > > OutputStreamWriter wr = new > > OutputStreamWriter(conn.getOutputStream()); > > wr.write(data); > > wr.flush(); > > > > // Get the response > > BufferedReader rd = new BufferedReader(new > > InputStreamReader(conn.getInputStream())); > > String line; > > while ((line = rd.readLine()) != null) { > > // Process line... > > } > > wr.close(); > > rd.close(); > > } catch (Exception e) { throw e; > > } > > > > } > > > > /** > > * @return the updateString > > */ > > public String getUpdateString() { > > return updateString; > > } > > > > /** > > * @param updateString the updateString to set > > */ > > public void setUpdateString(String updateString) { > > this.updateString = updateString; > > } > > } > > *********************** > > > > Now it works. I can insert triples into my sparql update endpoint. > > > > There has to be a deep bug in the Apache routines that come with Jena > that > > thwarted my previous efforts and I hope someone notices this and fixes > it. > > > > In the meantime I'm happy that I have something that works, and I hope > that > > by posting here the recipe for updating a remote sparql endpoint will > > become available and more people will take up Jena and Fuseki. > > > > David Moss > -- David Moss
