http://git-wip-us.apache.org/repos/asf/jena/blob/36855e1b/jena-fuseki2/src/main/webapp/js/lib/remote-sparql-service.js
----------------------------------------------------------------------
diff --git a/jena-fuseki2/src/main/webapp/js/lib/remote-sparql-service.js
b/jena-fuseki2/src/main/webapp/js/lib/remote-sparql-service.js
new file mode 100644
index 0000000..27c5824
--- /dev/null
+++ b/jena-fuseki2/src/main/webapp/js/lib/remote-sparql-service.js
@@ -0,0 +1,180 @@
+/** A simple interface to a remote SPARQL service */
+
+/** This class provides a duck-typed API for accessing the content of a value
+ * returned from a SPARQL service. The key methods are:
+ *
+ * asText - returns the result as a suitably formatted text string
+ * asJSON - returns the result as a suitably formatted JSON string
+ * asXML - returns the result as a suitable formatted XML string
+ * asTable - returns the result as an array of objects, with one key per
object per query variable
+ */
+var RemoteSparqlServiceResult = function( val, format ) {
+ this._val = val;
+ this._format = format;
+}
+
+_.extend( RemoteSparqlServiceResult.prototype, {
+ asText: function() {
+ var data = this._val;
+ return {
+ count: data.split('\n').length - 5,
+ data: data,
+ mime: "text/plain"
+ };
+ },
+
+ asJSON: function() {
+ var json, data = this._val;
+
+ if (_.isString( data )) {
+ json = data;
+ data = JSON.parse(data);
+ }
+ else {
+ // en bas le Internet Explorer
+ json = JSON.stringify( data, null, 2 );
+ }
+
+ return {
+ count: data.results.bindings.length,
+ data: json,
+ mime: "application/json"
+ };
+ },
+
+ asXML: function() {
+ var count, xml, data = this._val;
+
+ if (_.isString( data )) {
+ xml = data;
+ data = $.parseXML( data );
+ }
+ else {
+ xml = xmlToString( data );
+ }
+
+ return {
+ count: $( data ).find("results").children().length,
+ data: xml,
+ mime: "application/xml"
+ };
+ },
+
+ asTable: function( config ) {
+ /* Shorten a URI to qname form, if possible */
+ var toQName = function( prefixes, uri ) {
+ var result = uri, qname, u = uri;
+
+ if (u.substring( 0, 1 ) === '<') {
+ u = u.substring( 1, u.length - 1 );
+ }
+
+ $.each( prefixes, function( prefix, prefURI ) {
+ if (u.indexOf( prefURI ) === 0) {
+ qname = sprintf( "%s:%s", prefix, u.substring( prefURI.length ) );
+
+ if (qname.length < result.length) {
+ result = qname;
+ }
+ }
+ } );
+ return result;
+ };
+
+ /** Format a value for display in the table view */
+ var dataTableValue = function( v ) {
+ var f, parts;
+
+ if (_.isNumber( v )) {
+ f = parseFloat( v );
+ }
+ else if (v.match( /\^\^/ )) {
+ parts = v.match( /^"*([^\\^\\""]*)"*\^\^<*(.*)>*$/m )
+ f = sprintf( "<span title='Type: %s'>%s</span>", parts[2], parts[1])
+ }
+ else if (v.match( /@/ )) {
+ parts = v.match( /^"(.*)"@([^@]*)/ );
+ f = sprintf( "<span title='Language: %s'>%s</span>", parts[2],
parts[1] );
+ }
+ else {
+ f = toQName( config.prefixes, v );
+
+ if (f.match( /^</ )) {
+ f = f.slice( 1, -1 );
+ }
+
+ f = _.escape(f );
+ }
+
+ return f;
+ };
+
+ var data = this._val;
+ var lines = _.compact(data.split( "\n" ));
+
+ var columnHeaders = _.map( lines.shift().split("\t"), function( header) {
+ return {sTitle: header};
+ } );
+
+ var rows = _.map( lines, function( line ) {
+ var values = _.flatten( [line.split("\t")] );
+ return _.map( values, dataTableValue );
+ } );
+
+ return {
+ count: lines.length,
+ aoColumns: columnHeaders,
+ aaData: rows,
+ table: true
+ };
+ },
+
+ asFormat: function( format, config ) {
+ switch (format) {
+ case "text":
+ return this.asText();
+ case "json":
+ return this.asJSON();
+ case "xml":
+ return this.asXML();
+ case "tsv":
+ return this.asTable( config );
+ }
+
+ return null;
+ }
+
+} );
+
+
+/** This class proxies a service which is behind a remote SPARQL endpoint URL
*/
+var RemoteSparqlService = function() {
+};
+
+
+_.extend( RemoteSparqlService.prototype, {
+ execute: function( query, options ) {
+
+ var ajaxDataType = function( format ) {
+ return {
+ tsv: "html",
+ csv: "html",
+ }[format] || format;
+ };
+
+ var url = options.url;
+ var format = options.format;
+ var onSuccess = options.success;
+
+ var ajaxOptions = {
+ data: {query: query, output: format},
+ success: function( data ) {
+ onSuccess.call( null, new RemoteSparqlServiceResult( data, format ) );
+ },
+ error: options.error,
+ dataType: ajaxDataType( format )
+ };
+
+ return $.ajax( url, ajaxOptions );
+ }
+} );