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 2015/01/14 11:31:19 UTC

[17/93] [abbrv] [partial] jena git commit: Maven modules for Fuseki2

http://git-wip-us.apache.org/repos/asf/jena/blob/470ee4d7/jena-fuseki2/jena-fuseki-core/src/main/webapp/js/lib/qonsole.js
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-core/src/main/webapp/js/lib/qonsole.js b/jena-fuseki2/jena-fuseki-core/src/main/webapp/js/lib/qonsole.js
new file mode 100644
index 0000000..366bfed
--- /dev/null
+++ b/jena-fuseki2/jena-fuseki-core/src/main/webapp/js/lib/qonsole.js
@@ -0,0 +1,570 @@
+/* Copyright (c) 2012-2013 Epimorphics Ltd. Released under Apache License 2.0 http://www.apache.org/licenses/ */
+
+var qonsole = function() {
+    "use strict";
+    var YASQE = require('yasqe'),
+        YASR = require('yasr');
+    
+    /**
+     * Some custom requirements for Jena, on how to present the bindings. I.e., bnodes prefixed with _:, literals with surrounding quotes, and URIs with brackets
+     */
+    YASR.plugins.table.defaults.getCellContent = function (yasr, plugin, bindings, variable, context) {
+        var binding = bindings[variable];
+        var value = null;
+        if (binding.type == "uri") {
+            var title = null;
+            var href = binding.value;
+            var visibleString = href;
+            var prefixed = false;
+            if (context.usedPrefixes) {
+                for (var prefix in context.usedPrefixes) {
+                    if (visibleString.indexOf(context.usedPrefixes[prefix]) == 0) {
+                        visibleString = prefix + ':' + href.substring(context.usedPrefixes[prefix].length);
+                        prefixed = true;
+                        break;
+                    }
+                }
+            }
+            if (!prefixed) visibleString = "<" + visibleString + ">";
+            value = "<a " + (title? "title='" + href + "' ": "") + "class='uri' target='_blank' href='" + href + "'>" + visibleString + "</a>";
+        } else if (binding.type == "bnode"){
+            value = "<span class='nonUri'>_:" + binding.value + "</span>";
+        } else if (binding.type == "literal") {
+            var stringRepresentation = binding.value;
+            if (binding["xml:lang"]) {
+                stringRepresentation = '"' + binding.value + '"@' + binding["xml:lang"];
+            } else if (binding.datatype) {
+                var xmlSchemaNs = "http://www.w3.org/2001/XMLSchema#";
+                var dataType = binding.datatype;
+                if (dataType.indexOf(xmlSchemaNs) == 0) {
+                    dataType = "xsd:" + dataType.substring(xmlSchemaNs.length);
+                } else {
+                    dataType = "<" + dataType + ">";
+                }
+                
+                stringRepresentation = '"' + stringRepresentation + '"^^' + dataType;
+            } else {
+                //just put quotes around it
+                stringRepresentation = '"' + stringRepresentation + '"';
+            }
+            value = "<span class='nonUri'>" + stringRepresentation + "</span>";
+        } else {
+            //this is a catch-all: when using e.g. a csv content type, the bindings are not typed
+            value = binding.value;
+        }
+        return "<div>" + value + "</div>";
+    };
+    
+    /* JsLint */
+    /*
+     * global sprintf, testCSS, loadConfig, bindEvents, $, onConfigLoaded,
+     * updatePrefixDeclaration, _, showCurrentQuery, setCurrentEndpoint,
+     * setCurrentFormat, elementVisible, runQuery, onLookupPrefix,
+     * startTimingResults, onAddPrefix, initQuery, CodeMirror, onQuerySuccess,
+     * onQueryFail, ajaxDataType, resetResults, XMLSerializer, showTableResult,
+     * showCodeMirrorResult
+     */
+
+    /* --- module vars --- */
+    /** The loaded configuration */
+    var _config = {};
+    var yasqe = null;
+    var yasr = null;
+    var _startTime = 0;
+    var _outstandingQueries = 0;
+
+    /* --- utils --- */
+
+    /**
+     * Return the string representation of the given XML value, which may be a
+     * string or a DOM object
+     */
+    var xmlToString = function(xmlData) {
+        var xs = _.isString(xmlData) ? xmlData : null;
+
+        if (!xs && window.ActiveXObject && xmlData.xml) {
+            xs = xmlData.xml;
+        }
+
+        if (!xs) {
+            xs = new XMLSerializer().serializeToString(xmlData);
+        }
+
+        return xs;
+    };
+
+    /** Browser sniffing */
+    var isOpera = function() {
+        return !!(window.opera && window.opera.version);
+    }; // Opera 8.0+
+    var isFirefox = function() {
+        return testCSS('MozBoxSizing');
+    }; // FF 0.8+
+    var isSafari = function() {
+        return Object.prototype.toString.call(window.HTMLElement).indexOf(
+                'Constructor') > 0;
+    }; // At least Safari 3+: "[object HTMLElementConstructor]"
+    var isChrome = function() {
+        return !isSafari() && testCSS('WebkitTransform');
+    }; // Chrome 1+
+    var isIE = function() {
+        return /* @cc_on!@ */false || testCSS('msTransform');
+    }; // At least IE6
+
+    var testCSS = function(prop) {
+        return document.documentElement.style.hasOwnProperty(prop);
+    };
+
+    /* --- application code --- */
+
+    /** Initialisation - only called once */
+    var init = function(config) {
+        initYasqe();
+        loadConfig(config);
+        bindEvents();
+    };
+
+    var initYasqe = function() {
+        yasqe = YASQE(document.getElementById("query-edit-cm"), {
+            sparql: {
+                showQueryButton: true,
+                callbacks: {
+                    beforeSend: startTimingResults,
+                    complete: showTime,
+                }
+            }
+        });
+        yasr = YASR(document.getElementById("results"), {
+            useGoogleCharts: false,
+            //this way, the URLs in the results are prettified using the defined prefixes in the query
+            getUsedPrefixes: yasqe.getPrefixesFromQuery
+        });
+        
+
+        /**
+        * Set some of the hooks to link YASR and YASQE
+        */
+        yasqe.options.sparql.callbacks.complete = yasr.setResponse;
+    };
+
+    /** Load the configuration definition */
+    var loadConfig = function(config) {
+        if (config.configURL) {
+            $.getJSON(config.configURL, onConfigLoaded);
+        } else {
+            onConfigLoaded(config);
+        }
+    };
+
+    /** Return the current config object */
+    var config = function() {
+        return _config;
+    };
+
+    /** Bind events that we want to manage */
+    var bindEvents = function() {
+        $("ul.prefixes").on(
+                "click",
+                "a.btn",
+                function(e) {
+                    var elem = $(e.currentTarget);
+                    updatePrefixDeclaration($.trim(elem.text()), elem
+                            .data("uri"), !elem.is(".active"));
+                });
+        $("ul.examples").on("click", "a", function(e) {
+            var elem = $(e.currentTarget);
+            $("ul.examples a").removeClass("active");
+            _.defer(function() {
+                showCurrentQuery();
+            });
+        });
+        $(".endpoints").on("click", "a", function(e) {
+            var elem = $(e.currentTarget);
+            setCurrentEndpoint($.trim(elem.text()));
+        });
+        $("#sparqlEndpoint").change(function() {
+           yasqe.options.sparql.endpoint = $(this).val();
+        });
+
+        // dialogue events
+        $("#prefixEditor").on("click", "#lookupPrefix", onLookupPrefix).on(
+                "keyup", "#inputPrefix", function(e) {
+                    var elem = $(e.currentTarget);
+                    $("#lookupPrefix span").text(sprintf("'%s'", elem.val()));
+                });
+        $("#addPrefix").on("click", onAddPrefix);
+        
+        /**
+         * register content type changes.
+         * Do not need to set them on load, as their default values are already the default vals of YASQE as well
+         */
+        $("#graphContentType").change(function(){yasqe.options.sparql.acceptHeaderGraph = $(this).val()});
+        $("#selectContentType").change(function(){yasqe.options.sparql.acceptHeaderSelect = $(this).val()});
+    };
+
+    /** List the current defined prefixes from the config */
+    var initPrefixes = function(config) {
+        var prefixAdd = $("ul.prefixes li:last");
+        $
+                .each(
+                        config.prefixes,
+                        function(key, value) {
+                            var html = sprintf(
+                                    "<li><a class='btn btn-custom2 btn-sm' data-toggle='button' data-uri='%s'>%s</a></li>",
+                                    value, key);
+                            $(html).insertBefore(prefixAdd);
+                        });
+    };
+
+    /** List the example queries from the config */
+    var initExamples = function(config) {
+        var examples = $("ul.examples");
+        examples.empty();
+
+        $
+                .each(
+                        config.queries,
+                        function(i, queryDesc) {
+                            var html = sprintf(
+                                    "<li><a class='btn btn-custom2 btn-sm' data-toggle='button'>%s</a></li>",
+                                    queryDesc.name);
+                            examples.append(html);
+
+                            if (queryDesc.queryURL) {
+                                loadRemoteQuery(queryDesc.name,
+                                        queryDesc.queryURL);
+                            }
+                        });
+        
+        setFirstQueryActive();
+    };
+
+    /** Set the default active query */
+    var setFirstQueryActive = function() {
+        if (_outstandingQueries === 0 && yasqe.getValue() == YASQE.defaults.value) {
+            //only load the example query, when YASQE has not retrieved a previous query executed by the client
+            $("ul.examples").find("a").first().addClass("active");
+            
+            showCurrentQuery();
+        }
+    };
+
+    /** Load a remote query */
+    var loadRemoteQuery = function(name, url) {
+        _outstandingQueries++;
+
+        var options = {
+            success : function(data, xhr) {
+                namedExample(name).query = data;
+
+                _outstandingQueries--;
+                setFirstQueryActive();
+            },
+            failure : function() {
+                namedExample(name).query = "Not found: " + url;
+
+                _outstandingQueries--;
+                setFirstQueryActive();
+            },
+            dataType : "text"
+        };
+
+        $.ajax(url, options);
+    };
+
+    /** Set up the drop-down list of end-points */
+    var initEndpoints = function(config) {
+        var endpoints = $("ul.endpoints");
+        endpoints.empty();
+        if (config.endpoints) {
+            $
+                    .each(
+                            config.endpoints,
+                            function(key, url) {
+                                var html = sprintf(
+                                        "<li role='presentation'><a role='menuitem' tabindex='-1' href='#'>%s</a></li>",
+                                        url);
+                                endpoints.append(html);
+                            });
+
+            setCurrentEndpoint(config.endpoints["default"]);
+        }
+    };
+
+    /** Successfully loaded the configuration */
+    var onConfigLoaded = function(config, status, jqXHR) {
+        _config = config;
+        initPrefixes(config);
+        initExamples(config);
+        initEndpoints(config);
+    };
+
+    /** Set the current endpoint text */
+    var setCurrentEndpoint = function(url) {
+        yasqe.options.sparql.endpoint = url;
+        $("[id=sparqlEndpoint]").val(url);
+    };
+
+    /** Return the current endpoint text */
+    var currentEndpoint = function(url) {
+        return $("[id=sparqlEndpoint]").val();
+    };
+
+    /** Return the query definition with the given name */
+    var namedExample = function(name) {
+        return _.find(config().queries, function(ex) {
+            return ex.name === name;
+        });
+    };
+
+    /** Return the currently active named example */
+    var currentNamedExample = function() {
+        return namedExample($.trim($("ul.examples a.active").first().text()));
+    };
+
+    /** Display the given query, with the currently defined prefixes */
+    var showCurrentQuery = function() {
+        var query = currentNamedExample();
+        displayQuery(query);
+    };
+
+    /** Display the given query */
+    var displayQuery = function(query) {
+        if (query) {
+            var queryBody = query.query ? query.query : query;
+            var prefixes = assemblePrefixes(queryBody, query.prefixes)
+
+            var q = sprintf("%s\n\n%s", renderPrefixes(prefixes),
+                    stripLeader(queryBody));
+            yasqe.setValue(q);
+
+            syncPrefixButtonState(prefixes);
+        }
+    };
+
+    /** Return the currently selected output format */
+    var selectedFormat = function() {
+        return $("a.display-format").data("value");
+    };
+
+    /** Update the user's format selection */
+    var setCurrentFormat = function(val, label) {
+        $("a.display-format").data("value", val).find("span").text(label);
+    };
+
+    /** Assemble the set of prefixes to use when initially rendering the query */
+    var assemblePrefixes = function(queryBody, queryDefinitionPrefixes) {
+        if (queryBody.match(/^prefix/)) {
+            // strategy 1: there are prefixes encoded in the query body
+            return assemblePrefixesFromQuery(queryBody);
+        } else if (queryDefinitionPrefixes) {
+            // strategy 2: prefixes given in query def
+            return _.map(queryDefinitionPrefixes, function(prefixName) {
+                return {
+                    name : prefixName,
+                    uri : config().prefixes[prefixName]
+                };
+            });
+        } else {
+            return assembleCurrentPrefixes();
+        }
+    };
+
+    /** Return an array comprising the currently selected prefixes */
+    var assembleCurrentPrefixes = function() {
+        var l = $("ul.prefixes a.active").map(function(i, elt) {
+            return {
+                name : $.trim($(elt).text()),
+                uri : $(elt).data("uri")
+            };
+        });
+        return $.makeArray(l);
+    };
+
+//    /** Return an array of the prefixes parsed from the given query body */
+//    var assemblePrefixesFromQuery = function(queryBody) {
+//        var leader = queryLeader(queryBody)[0].trim();
+//        var pairs = _.compact(leader.split("prefix"));
+//        var prefixes = [];
+//
+//        _.each(pairs, function(pair) {
+//            var m = pair.match("^\\s*(\\w+)\\s*:\\s*<([^>]*)>\\s*$");
+//            prefixes.push({
+//                name : m[1],
+//                uri : m[2]
+//            });
+//        });
+//
+//        return prefixes;
+//    };
+
+    /**
+     * Ensure that the prefix buttons are in sync with the prefixes used in a
+     * new query
+     */
+    var syncPrefixButtonState = function(prefixes) {
+        $("ul.prefixes a").each(function(i, elt) {
+            var name = $.trim($(elt).text());
+
+            if (_.find(prefixes, function(p) {
+                return p.name === name;
+            })) {
+                $(elt).addClass("active");
+            } else {
+                $(elt).removeClass("active");
+            }
+        });
+    };
+
+    /** Split a query into leader (prefixes and leading blank lines) and body */
+    var queryLeader = function(query) {
+        var pattern = /(prefix [^>]+>[\s\n]*)/;
+        var queryBody = query;
+        var i = 0;
+        var m = queryBody.match(pattern);
+
+        while (m) {
+            i += m[1].length;
+            queryBody = queryBody.substring(i);
+            m = queryBody.match(pattern);
+        }
+
+        return [ query.substring(0, query.length - queryBody.length), queryBody ];
+    };
+
+    /** Remove the query leader */
+    var stripLeader = function(query) {
+        return queryLeader(query)[1];
+    };
+
+    /** Return a string comprising the given prefixes */
+    var renderPrefixes = function(prefixes) {
+        return _.map(prefixes, function(p) {
+            return sprintf("prefix %s: <%s>", p.name, p.uri);
+        }).join("\n");
+    };
+
+    /** Add or remove the given prefix declaration from the current query */
+    var updatePrefixDeclaration = function(prefix, uri, added) {
+        var prefixObj = {};
+        prefixObj[prefix] = uri;
+        if (added) {
+            yasqe.addPrefixes(prefixObj);
+        } else {
+            yasqe.removePrefixes(prefixObj);
+        }
+    };
+
+    /** Return the sparql service we're querying against */
+    var sparqlService = function() {
+        var service = config().service;
+        if (!service) {
+            // default is the remote service
+            config().service = new RemoteSparqlService();
+            service = config().service;
+        }
+
+        return service;
+    };
+
+
+    /** Hide or reveal an element using Bootstrap .hidden class */
+    var elementVisible = function(elem, visible) {
+        if (visible) {
+            $(elem).removeClass("hidden");
+        } else {
+            $(elem).addClass("hidden");
+        }
+    };
+
+    /** Prepare to show query time taken */
+    var startTimingResults = function() {
+        _startTime = new Date().getTime();
+        elementVisible(".timeTaken");
+    };
+    
+    
+    /** Show results count and time */
+    var showTime = function() {
+        var duration = new Date().getTime() - _startTime;
+        var ms = duration % 1000;
+        duration = Math.floor(duration / 1000);
+        var s = duration % 60;
+        var m = Math.floor(duration / 60);
+
+        var html = sprintf("time taken:  %d min %d.%03d s", m, s, ms);
+
+        $(".timeTaken").html(html);
+        elementVisible(".timeTaken", true);
+    };
+
+
+    /** Lookup a prefix on prefix.cc */
+    var onLookupPrefix = function(e) {
+        e.preventDefault();
+
+        var prefix = $.trim($("#inputPrefix").val());
+        $("#inputURI").val("");
+
+        if (prefix) {
+            $.getJSON(sprintf("http://prefix.cc/%s.file.json", prefix),
+                    function(data) {
+                        $("#inputURI").val(data[prefix]);
+                    });
+        }
+    };
+
+    /** User wishes to add the prefix */
+    var onAddPrefix = function(e) {
+        var prefix = $.trim($("#inputPrefix").val());
+        var uri = $.trim($("#inputURI").val());
+
+        if (uri) {
+            _config.prefixes[prefix] = uri;
+        } else {
+            delete _config.prefixes[prefix];
+        }
+
+        // remember the state of current user selections, then re-create the
+        // list
+        var selections = {};
+        $("ul.prefixes a.btn").each(function(i, a) {
+            selections[$(a).text()] = $(a).hasClass("active");
+        });
+
+        $("ul.prefixes li[class!=keep]").remove();
+        initPrefixes(_config);
+
+        // restore selections state
+        $.each(selections, function(k, v) {
+            if (!v) {
+                $(sprintf("ul.prefixes a.btn:contains('%s')", k)).removeClass(
+                        "active");
+            }
+        });
+
+        var lines = yasqe.getValue().split("\n");
+        lines = _.reject(lines, function(line) {
+            return line.match(/^prefix/);
+        });
+        var q = sprintf("%s\n%s", renderPrefixes(assembleCurrentPrefixes()),
+                lines.join("\n"));
+        yasqe.setValue(q);
+    };
+
+    /** Disable or enable the button to submit a query */
+    var disableSubmit = function(disable) {
+        var elem = $("a.run-query");
+        elem.prop('disabled', disable);
+        if (disable) {
+            elem.addClass("disabled");
+        } else {
+            elem.removeClass("disabled");
+        }
+    };
+
+    return {
+        init : init,
+        setCurrentEndpoint: setCurrentEndpoint
+    };
+}();

http://git-wip-us.apache.org/repos/asf/jena/blob/470ee4d7/jena-fuseki2/jena-fuseki-core/src/main/webapp/js/lib/refresh.sh
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-core/src/main/webapp/js/lib/refresh.sh b/jena-fuseki2/jena-fuseki-core/src/main/webapp/js/lib/refresh.sh
new file mode 100644
index 0000000..06239b3
--- /dev/null
+++ b/jena-fuseki2/jena-fuseki-core/src/main/webapp/js/lib/refresh.sh
@@ -0,0 +1,21 @@
+mkdir -p addon/fold
+mkdir -p mode/javascript
+mkdir -p mode/xml
+mkdir -p mode/turtle
+mkdir -p mode/sparql
+
+cp ~/dev/js/codemirror-4.3/lib/codemirror.js .
+cp ~/dev/js/codemirror-4.3/lib/codemirror.css ../../css
+cp ~/dev/js/codemirror-4.3/addon/fold/brace-fold.js ./addon/fold
+cp ~/dev/js/codemirror-4.3/addon/fold/comment-fold.js ./addon/fold
+cp ~/dev/js/codemirror-4.3/addon/fold/foldcode.js ./addon/fold
+cp ~/dev/js/codemirror-4.3/addon/fold/foldgutter.js ./addon/fold
+cp ~/dev/js/codemirror-4.3/addon/fold/xml-fold.js ./addon/fold
+cp ~/dev/js/codemirror-4.3/addon/fold/foldgutter.css ../../css
+
+cp ~/dev/js/codemirror-4.3/mode/javascript/javascript.js ./mode/javascript
+cp ~/dev/js/codemirror-4.3/mode/sparql/sparql.js ./mode/sparql
+cp ~/dev/js/codemirror-4.3/mode/xml/xml.js ./mode/xml
+cp ~/dev/js/codemirror-4.3/mode/turtle/turtle.js ./mode/turtle
+
+