You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2015/01/29 13:12:49 UTC
[1/6] jena git commit: JENA-872 : apache-jena-fuseki
Repository: jena
Updated Branches:
refs/heads/master 36a8bff1c -> 02286cf3f
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/jena-fuseki-dist/bin/soh
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-dist/bin/soh b/jena-fuseki2/jena-fuseki-dist/bin/soh
deleted file mode 100755
index 0e3a807..0000000
--- a/jena-fuseki2/jena-fuseki-dist/bin/soh
+++ /dev/null
@@ -1,707 +0,0 @@
-#!/usr/bin/env ruby
-# -*- coding: utf-8 -*-
-
-# 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.
-
-# SPARQL HTTP Update, client.
-
-require 'optparse'
-require 'net/http'
-require 'uri'
-require 'cgi'
-require 'pp'
-require 'ostruct'
-
-# ToDo
-# Allow a choice of media type for GET
-# --accept "content-type" (and abbreviations)
-# --header "Add:this"
-# --user, --password
-# Basic authentication: request.basic_auth("username", "password")
-# Follow redirects => 301: puts response["location"] # All headers are lowercase?
-
-SOH_NAME="SOH"
-SOH_VERSION="0.0.0"
-
-$proxy = ENV['http_proxy'] ? URI.parse(ENV['http_proxy']) : OpenStruct.new
-
-# What about direct naming?
-
-# Names
-$mtTurtle = 'text/turtle;charset=utf-8'
-$mtRDF = 'application/rdf+xml'
-$mtText = 'text/plain'
-$mtNQuads = 'text/n-quads'
-$mtTriG = 'application/trig'
-$mtSparqlResultsX = 'application/sparql-results+xml'
-$mtSparqlResultsJ = 'application/sparql-results+json'
-$mtAppJSON = 'application/json'
-$mtAppXML = 'application/xml'
-$mtSparqlResultsTSV = 'application/sparql-results+tsv'
-$mtSparqlResultsCSV = 'application/sparql-results+csv'
-$mtSparqlUpdate = 'application/sparql-update'
-$mtWWWForm = 'application/x-www-form-urlencoded'
-$mtSparqlQuery = "application/sparql-query" ;
-
-# Global media type table.
-$fileMediaTypes = {}
-$fileMediaTypes['ttl'] = $mtTurtle
-$fileMediaTypes['n3'] = 'text/n3; charset=utf-8'
-$fileMediaTypes['nt'] = $mtText
-$fileMediaTypes['rdf'] = $mtRDF
-$fileMediaTypes['owl'] = $mtRDF
-$fileMediaTypes['nq'] = $mtNQuads
-$fileMediaTypes['trig'] = $mtTriG
-
-# Global charset : no entry means "don't set"
-$charsetUTF8 = 'utf-8'
-$charset = {}
-$charset[$mtTurtle] = 'utf-8'
-$charset[$mtText] = 'ascii'
-$charset[$mtTriG] = 'utf-8'
-$charset[$mtNQuads] = 'ascii'
-
-# Headers
-
-$hContentType = 'Content-Type'
-# $hContentEncoding = 'Content-Encoding'
-$hContentLength = 'Content-Length'
-# $hContentLocation = 'Content-Location'
-# $hContentRange = 'Content-Range'
-
-$hAccept = 'Accept'
-$hAcceptCharset = 'Accept-Charset'
-$hAcceptEncoding = 'Accept-Encoding'
-$hAcceptRanges = 'Accept-Ranges'
-
-$headers = { "User-Agent" => "#{SOH_NAME}/Fuseki #{SOH_VERSION}"}
-$print_http = false
-
-# Default for GET
-# At least allow anythign (and hope!)
-$accept_rdf="#{$mtRDF};q=0.9 , #{$mtTurtle}"
-# For SPARQL query
-$accept_results="#{$mtSparqlResultsJ} , #{$mtSparqlResultsX};q=0.9 , #{$accept_rdf}"
-
-# Accept any in case of trouble.
-$accept_rdf="#{$accept_rdf} , */*;q=0.1"
-$accept_results="#{$accept_results} , */*;q=0.1"
-
-# The media type usually forces the charset.
-$accept_charset=nil
-
-## Who we are.
-## Two styles:
-## s-query .....
-## soh query .....
-
-$cmd = File.basename($0)
-if $cmd == 'soh'
-then
- $cmd = (ARGV.size == 0) ? 'soh' : ARGV.shift
-end
-
-if ! $cmd.start_with?('s-') && $cmd != 'soh'
- $cmd = 's-'+$cmd
-end
-
-## --------
-
-def GET(dataset, graph)
- print "GET #{dataset} #{graph}\n" if $verbose
- requestURI = target(dataset, graph)
- headers = {}
- headers.merge!($headers)
- headers[$hAccept] = $accept_rdf
- headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
- get_worker(requestURI, headers)
-end
-
-def get_worker(requestURI, headers)
- uri = URI.parse(requestURI)
- request = Net::HTTP::Get.new(uri.request_uri)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- response_print_body(uri, request)
-end
-
-def HEAD(dataset, graph)
- print "HEAD #{dataset} #{graph}\n" if $verbose
- requestURI = target(dataset, graph)
- headers = {}
- headers.merge!($headers)
- headers[$hAccept] = $accept_rdf
- headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
- uri = URI.parse(requestURI)
- request = Net::HTTP::Head.new(uri.request_uri)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def PUT(dataset, graph, file)
- print "PUT #{dataset} #{graph} #{file}\n" if $verbose
- send_body(dataset, graph, file, Net::HTTP::Put)
-end
-
-def POST(dataset, graph, file)
- print "POST #{dataset} #{graph} #{file}\n" if $verbose
- send_body(dataset, graph, file, Net::HTTP::Post)
-end
-
-def DELETE(dataset, graph)
- print "DELETE #{dataset} #{graph}\n" if $verbose
- requestURI = target(dataset, graph)
- uri = URI.parse(requestURI)
- request = Net::HTTP::Delete.new(uri.request_uri)
- headers = {}
- headers.merge!($headers)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def uri_escape(string)
- CGI.escape(string)
-end
-
-def target(dataset, graph)
- return dataset+"?default" if graph == "default"
- return dataset+"?graph="+uri_escape(graph)
-end
-
-def send_body(dataset, graph, file, method)
- mt = content_type(file)
- headers = {}
- headers.merge!($headers)
- headers[$hContentType] = mt
- headers[$hContentLength] = File.size(file).to_s
- ## p headers
-
- requestURI = target(dataset, graph)
- uri = URI.parse(requestURI)
-
- request = method.new(uri.request_uri)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- request.body_stream = File.open(file)
- response_no_body(uri, request)
-end
-
-def response_no_body(uri, request)
- http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
- http.read_timeout = nil
- # check we can connect.
- begin http.start
- rescue Exception => e
- # puts e.message
- #puts e.backtrace.inspect
- warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
- end
- response = http.request(request)
- print_http_response(response)
- case response
- when Net::HTTPSuccess, Net::HTTPRedirection
- # OK
- when Net::HTTPNotFound
- warn_exit "404 Not found: #{uri}", 9
- #print response.body
- else
- warn_exit "#{response.code} #{response.message} #{uri}", 9
- # Unreachable
- response.error!
- end
- # NO BODY IN RESPONSE
-end
-
-def response_print_body(uri, request)
- http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
- http.read_timeout = nil
- # check we can connect.
- begin http.start
- rescue => e
- #puts e.backtrace.inspect
- #print e.class
- warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
- end
-
- # Add a blank line if headers were output.
- print "\n" if $http_print ;
-
- begin
- response = http.request(request) { |res|
- print_http_response(res)
- #puts res.code
- res.read_body do |segment|
- print segment
- end
- }
- case response
- when Net::HTTPSuccess, Net::HTTPRedirection
- # OK
- when Net::HTTPNotFound
- warn_exit "404 Not found: #{uri}", 9
- #print response.body
- else
- warn_exit "#{response.code}: #{uri}", 9
- # Unreachable
- response.error!
- end
- rescue EOFError => e
- warn_exit "IO Error: "+e.message, 3
- end
-end
-
-def print_http_request(uri, request)
- return unless $print_http
- #print "Request\n"
- print request.method," ",uri, "\n"
- print_headers(" ",request)
-end
-
-def print_http_response(response)
- return unless $print_http
- #print "Response\n"
- print response.code, " ", response.message, "\n"
- print_headers(" ",response)
-end
-
-def print_headers(marker, headers)
- headers.each do |k,v|
- k = k.split('-').map{|w| w.capitalize}.join('-')+':'
- printf "%s%-20s %s\n",marker,k,v
- end
-end
-
-def content_type(file)
- file =~ /\.([^.]*)$/
- ext = $1
- mt = $fileMediaTypes[ext]
- cs = $charset[mt]
- mt = mt+';charset='+cs if ! cs.nil?
- return mt
-end
-
-def charset(content_type)
- return $charset[content_type]
-end
-
-def warn_exit(msg, rc)
- warn msg
- exit rc ;
-end
-
-def parseURI(uri_string)
- begin
- return URI.parse(uri_string).to_s
- rescue URI::InvalidURIError => err
- warn_exit "Bad URI: <#{uri_string}>", 2
- end
-end
-
-## ---- Command
-
-def cmd_soh(command=nil)
- ## Command line
- options = {}
- optparse = OptionParser.new do |opts|
- # Set a banner, displayed at the top
- # of the help screen.
- case $cmd
- when "s-http", "sparql-http", "soh"
- banner="$cmd [get|post|put|delete] datasetURI graph [file]"
- when "s-get", "s-head", "s-delete"
- banner="$cmd datasetURI graph"
- end
-
- opts.banner = $banner
- # Define the options, and what they do
-
- options[:verbose] = false
- opts.on( '-v', '--verbose', 'Verbose' ) do
- options[:verbose] = true
- end
-
- options[:version] = false
- opts.on( '--version', 'Print version and exit' ) do
- print "#{SOH_NAME} #{SOH_VERSION}\n"
- exit
- end
-
- # This displays the help screen, all programs are
- # assumed to have this option.
- opts.on( '-h', '--help', 'Display this screen and exit' ) do
- puts opts
- exit
- end
- end
-
- begin optparse.parse!
- rescue OptionParser::InvalidArgument => e
- warn e
- exit
- end
-
- $verbose = options[:verbose]
- $print_http = $verbose
-
- if command.nil?
- if ARGV.size == 0
- warn "No command given: expected one of 'get', 'put', 'post', 'delete', 'query' or 'update'"
- exit 1
- end
- cmdPrint=ARGV.shift
- command=cmdPrint.upcase
- else
- cmdPrint=command
- end
-
- case command
- when "HEAD", "GET", "DELETE"
- requiredFile=false
- when "PUT", "POST"
- requiredFile=true
- when "QUERY"
- cmd_sparql_query
- when "UPDATE"
- cmd_sparql_update
- else
- warn_exit "Unknown command: #{command}", 2
- end
-
- if requiredFile
- then
- if ARGV.size != 3
- warn_exit "Required: dataset URI, graph URI (or 'default') and file", 1
- end
- else
- if ARGV.size != 2
- warn_exit "Required: dataset URI and graph URI (or 'default')", 1
- end
- end
-
- dataset=parseURI(ARGV.shift)
- # Relative URI?
- graph=parseURI(ARGV.shift)
- file=""
- if requiredFile
- then
- file = ARGV.shift if requiredFile
- if ! File.exist?(file)
- warn_exit "No such file: "+file, 3
- end
- if File.directory?(file)
- warn_exit "File is a directory: "+file, 3
- end
- end
-
- case command
- when "GET"
- GET(dataset, graph)
- when "HEAD"
- HEAD(dataset, graph)
- when "PUT"
- PUT(dataset, graph, file)
- when "DELETE"
- DELETE(dataset, graph)
- when "POST"
- POST(dataset, graph, file)
- else
- warn_exit "Internal error: Unknown command: #{cmd}", 2
- end
- exit 0
-end
-
-## --------
-def string_or_file(arg)
- return arg if ! arg.match(/^@/)
- a=(arg[1..-1])
- open(a, 'rb'){|f| f.read}
-end
-
-## -------- SPARQL Query
-
-## Choose method
-def SPARQL_query(service, query, query_file, forcePOST=false, args2={})
- if ! query_file.nil?
- query = open(query_file, 'rb'){|f| f.read}
- end
- if forcePOST || query.length >= 2*1024
- SPARQL_query_POST(service, query, args2)
- else
- SPARQL_query_GET(service, query, args2)
- end
-end
-
-## By GET
-
-def SPARQL_query_GET(service, query, args2)
- args = { "query" => query }
- args.merge!(args2)
- qs=args.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
- action="#{service}?#{qs}"
- headers={}
- headers.merge!($headers)
- headers[$hAccept]=$accept_results
- get_worker(action, headers)
-end
-
-## By POST
-
-def SPARQL_query_POST(service, query, args2)
- # DRY - body/no body for each of request and response.
- post_params={ "query" => query }
- post_params.merge!(args2)
- uri = URI.parse(service)
- headers={}
- headers.merge!($headers)
- headers[$hAccept]=$accept_results
- execute_post_form_body(uri, headers, post_params)
-end
-
-def execute_post_form_body(uri, headers, post_params)
- request = Net::HTTP::Post.new(uri.request_uri)
- qs=post_params.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
- headers[$hContentType] = $mtWWWForm
- headers[$hContentLength] = qs.length.to_s
- request.initialize_http_header(headers)
- request.body = qs
- print_http_request(uri, request)
- response_print_body(uri, request)
-end
-
-# Usage: -v --help --file= --query=
-def cmd_sparql_query
- options={}
- optparse = OptionParser.new do |opts|
- opts.banner = "Usage: #{$cmd} [--query QUERY] [--service URI] [--post] 'query' | @file"
- opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
- options[:service]=uri
- end
- opts.on('--query=FILE','--file=FILE', 'Take query from a file') do |file|
- options[:file]=file
- end
- opts.on('--output=TYPE', [:json,:xml,:text,:csv,:tsv],
- 'Set the output argument') do |type|
- options[:output]=type
- end
- opts.on('--accept=TYPE', [:json,:xml,:text,:csv,:tsv],
- 'Set the accept header type') do |type|
- options[:accept]=type
- end
- options[:verbose] = false
- opts.on( '--post', 'Force use of POST' ) do
- options[:post] = true
- end
- opts.on( '-v', '--verbose', 'Verbose' ) do
- options[:verbose] = true
- end
- opts.on( '--version', 'Print version and exit' ) do
- print "#{SOH_NAME} #{SOH_VERSION}\n"
- exit
- end
- opts.on( '-h', '--help', 'Display this screen and exit' ) do
- puts opts
- exit
- end
- end
-
- begin optparse.parse!
- rescue OptionParser::InvalidArgument, OptionParser::InvalidOption => e
- warn e
- exit 1
- end
-
- $verbose = options[:verbose]
- $print_http = $verbose
- usePOST = options[:post]
-
- service = options[:service]
- warn_exit 'No service specified. Required --service=URI',1 if service.nil?
-
- # Query
- query=nil
- query_file=options[:file]
- if query_file.nil? && ARGV.size == 0
- then
- warn_exit 'No query specified.',1
- end
- if query_file.nil?
- query = ARGV.shift
- if query.match(/^@/)
- query_file = query[1..-1]
- query = nil
- end
- end
-
- # --output ==> output= (non-standard)
- args={}
- case options[:output]
- when nil
- when "json","xml","text","csv","tsv"
- args['output'] = options[:output]
- when :json,:xml,:text,:csv,:tsv
- args['output'] = options[:output].to_s
- else
- warn_exit "Unrecognized output type: "+options[:output],2
- end
-
- # --accept
- # options[:accept]
-
- print "SPARQL #{service}\n" if $verbose
- #args={"output"=>"text"}
- SPARQL_query(service, query, query_file, usePOST, args)
- exit(0)
-end
-
-## -------- SPARQL Update
-
-# Update sent as a WWW form.
-def SPARQL_update_by_form(service, update, args2={})
- args = {}
- args.merge!(args2)
- headers={}
- headers.merge!($headers)
- # args? encode?
- body="update="+uri_escape(update)
- headers[$hContentType] = $mtWWWForm
- headers[$hContentLength] = body.length.to_s
- uri = URI.parse(service)
- execute_post_form(uri, headers, body)
-end
-
-# DRY - query form.
-def execute_post_form(uri, headers, body)
- request = Net::HTTP::Post.new(uri.request_uri)
- request.initialize_http_header(headers)
- request.body = body
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def SPARQL_update(service, update, args2={})
- args = {}
- args.merge!(args2)
- headers={}
- headers.merge!($headers)
- headers[$hContentType] = $mtSparqlUpdate
- uri = URI.parse(service)
- request = Net::HTTP::Post.new(uri.request_uri)
- request.initialize_http_header(headers)
- request.body = update
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def cmd_sparql_update(by_raw_post=true)
- # Share with cmd_sparql_query
- options={}
- optparse = OptionParser.new do |opts|
- opts.banner = "Usage: #{$cmd} [--file REQUEST] [--service URI] 'request' | @file"
- opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
- options[:service]=uri
- end
- opts.on('--update=FILE', '--file=FILE', 'Take update from a file') do |file|
- options[:file]=file
- end
- options[:verbose] = false
- opts.on( '-v', '--verbose', 'Verbose' ) do
- options[:verbose] = true
- end
- opts.on( '--version', 'Print version and exit' ) do
- print "#{SOH_NAME} #{SOH_VERSION}\n"
- exit
- end
- opts.on( '-h', '--help', 'Display this screen and exit' ) do
- puts opts
- exit
- end
- end
-
- begin optparse.parse!
- rescue OptionParser::InvalidArgument => e
- warn e
- exit
- end
-
- $verbose = options[:verbose]
- $print_http = $verbose
-
- service = options[:service]
- warn_exit 'No service specified. Required --service=URI',1 if service.nil?
-
- update=nil
- update_file=options[:file]
-
- if update_file.nil? && ARGV.size == 0
- then
- warn_exit 'No update specified.',1
- end
- if update_file.nil?
- update = ARGV.shift
- if update.match(/^@/)
- update_file = update[1..-1]
- update = nil
- end
- end
-
- print "SPARQL-Update #{service}\n" if $verbose
- args={}
-
- # Reads in the file :-(
- if update.nil?
- then
- update = open(update_file, 'rb'){|f| f.read}
- else
- update = string_or_file(update)
- end
-
- if by_raw_post
- SPARQL_update(service, update, args)
- else
- SPARQL_update_by_form(service, update, args)
- end
- exit(0)
-end
-
-## -------
-
-case $cmd
-when "s-http", "sparql-http", "soh"
- $banner="#{$cmd} [get|post|put|delete] datasetURI graph [file]"
- cmd_soh
-when "s-get", "s-head", "s-put", "s-delete", "s-post"
-
- case $cmd
- when "s-get", "s-head", "s-delete"
- $banner="#{$cmd} datasetURI graph"
- when "s-put", "s-post"
- $banner="#{$cmd} datasetURI graph file"
- end
- cmd2 = $cmd.sub(/^s-/, '').upcase
- cmd_soh cmd2
-
-when "s-query", "sparql-query"
- cmd_sparql_query
-when "s-update", "sparql-update"
- cmd_sparql_update true
-when "s-update-form", "sparql-update-form"
- cmd_sparql_update false
-else
- warn_exit "Unknown: "+$cmd, 1
-end
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/jena-fuseki-dist/dist/ABOUT
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-dist/dist/ABOUT b/jena-fuseki2/jena-fuseki-dist/dist/ABOUT
deleted file mode 100644
index cee2ca2..0000000
--- a/jena-fuseki2/jena-fuseki-dist/dist/ABOUT
+++ /dev/null
@@ -1 +0,0 @@
-This directory holds the material needed for inclusion in the Fuseki distribution.
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/jena-fuseki-dist/dist/LICENSE
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-dist/dist/LICENSE b/jena-fuseki2/jena-fuseki-dist/dist/LICENSE
deleted file mode 100644
index 10474ab..0000000
--- a/jena-fuseki2/jena-fuseki-dist/dist/LICENSE
+++ /dev/null
@@ -1,617 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
-- - - - - - - - - - - - - - - - - - - - - - -
-
- (c) Copyright 2003, Plugged In Software
-
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- 3. The name of the author may not be used to endorse or promote products
- derived from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-- - - - - - - - - - - - - - - - - - - - - - -
-
-http://www.slf4j.org/license.html
-
- Copyright (c) 2004-2011 QOS.ch
- All rights reserved.
-
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of this software and associated documentation files (the
- "Software"), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, sublicense, and/or sell copies of the Software, and to
- permit persons to whom the Software is furnished to do so, subject to
- the following conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-- - - - - - - - - - - - - - - - - - - - - - -
-
-==============================================================
- Jetty Web Container
- Copyright 1995-2012 Mort Bay Consulting Pty Ltd.
-==============================================================
-
-The Jetty Web Container is Copyright Mort Bay Consulting Pty Ltd
-unless otherwise noted.
-
-Jetty is dual licensed under both
-
- * The Apache 2.0 License
- http://www.apache.org/licenses/LICENSE-2.0.html
-
- and
-
- * The Eclipse Public 1.0 License
- http://www.eclipse.org/legal/epl-v10.html
-
-Jetty may be distributed under either license.
-
-The javax.servlet package used was sourced from the Apache
-Software Foundation and is distributed under the apache 2.0
-license.
-
-The UnixCrypt.java code implements the one way cryptography used by
-Unix systems for simple password protection. Copyright 1996 Aki Yoshida,
-modified April 2001 by Iris Van den Broeke, Daniel Deville.
-Permission to use, copy, modify and distribute UnixCrypt
-for non-commercial or commercial purposes and without fee is
-granted provided that the copyright notice appears in all copies.
-
-- - - - - - - - - - - - - - - - - - - - - - -
-
-This product bundles "Bootstrap", which is available under an
-MIT license. See: https://github.com/twbs/bootstrap/blob/master/LICENSE
-
-This product bundles "codemirror", which is available under an
-MIT license. See http://codemirror.net/LICENSE
-
-This product bundles "jquery", which is available under an
-MIT license. See https://jquery.org/license/
-
-This product bundles "jquery.form", which is available under an
-MIT license. See http://malsup.github.io/mit-license.txt
-
-This product bundles "jquery.xdomainrequest", which is available under an
-MIT license. See https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest/blob/master/LICENSE.txt
-
-This product bundles "backbone.js", which is available under an
-MIT license. See https://github.com/jashkenas/backbone/blob/master/LICENSE
-
-This product bundles "backbone.marionette", which is available under an
-MIT license. See http://mutedsolutions.mit-license.org/
- "backbone.marionette" includes "Backbone.BabySitter" and
- "Backbone.Wreqr" also available under the same MIT license.
-
-This product bundles "html5shiv", which is available under an
-MIT license. See https://code.google.com/p/html5shiv/
-
-This product bundles "RequireJS", which is available under an
-MIT license.
-https://github.com/jrburke/requirejs/blob/master/LICENSE
- "RequireJS" is also available with a "30clause BSD license"
-
-This product bundles "Respond", which is available under an
-MIT license. See https://github.com/scottjehl/Respond/blob/master/LICENSE-MIT
-
-This product bundles "sprintf.js", which is available under a
-"3 clause BSD" license.
- https://github.com/alexei/sprintf.js/blob/master/LICENSE
-
-This product bundles "underscore", which is available under an
-MIT license. See https://github.com/jashkenas/underscore/blob/master/LICENSE
-
-This product bundles "FontAwesome"
- "Font Awesome by Dave Gandy - http://fontawesome.io"
-The font is available under an SIL Open Font License 1.1
-and the CSS files under an MIT License.
-See http://fontawesome.io/license/
-
-This product bundles "jQuery File Upload Plugin"
-which is available under an MIT License.
-See https://github.com/blueimp/jQuery-File-Upload
-
-This product bundles "Bootstrap-select"
-which is available under an MIT License.
-See https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE
-
-This product bundles "pivot.js"
-which is available under a BSD 3-clause style license.
-https://github.com/rwjblue/pivot.js/blob/master/LICENSE
-
-This product bundles "YASEQE - Yet Another Sparql Query Editor"
-which is available under an MIT License.
-See http://yasqe.yasgui.org/license.txt
-
-This product bundles "YASR - Yet Another Sparql Resultset GUI"
-which is available under an MIT License.
-See http://yasr.yasgui.org/license.txt
-
-- - - - - - - - - - - - - - - - - - - - - - -
-
-From Apache HttpComponents Client
-
-This project contains annotations derived from JCIP-ANNOTATIONS
-Copyright (c) 2005 Brian Goetz and Tim Peierls.
-See http://www.jcip.net and the Creative Commons Attribution License
-(http://creativecommons.org/licenses/by/2.5)
-
-- - - - - - - - - - - - - - - - - - - - - - -
-
-From Apache Lucene
-
-Some code in core/src/java/org/apache/lucene/util/UnicodeUtil.java was
-derived from unicode conversion examples available at
-http://www.unicode.org/Public/PROGRAMS/CVTUTF. Here is the copyright
-from those sources:
-
-/*
- * Copyright 2001-2004 Unicode, Inc.
- *
- * Disclaimer
- *
- * This source code is provided as is by Unicode, Inc. No claims are
- * made as to fitness for any particular purpose. No warranties of any
- * kind are expressed or implied. The recipient agrees to determine
- * applicability of information provided. If this file has been
- * purchased on magnetic or optical media from Unicode, Inc., the
- * sole remedy for any claim will be exchange of defective media
- * within 90 days of receipt.
- *
- * Limitations on Rights to Redistribute This Code
- *
- * Unicode, Inc. hereby grants the right to freely use the information
- * supplied in this file in the creation of products supporting the
- * Unicode Standard, and to make copies of this file in any form
- * for internal or external distribution as long as this notice
- * remains attached.
- */
-
-
-Some code in core/src/java/org/apache/lucene/util/ArrayUtil.java was
-derived from Python 2.4.2 sources available at
-http://www.python.org. Full license is here:
-
- http://www.python.org/download/releases/2.4.2/license/
-
-Some code in core/src/java/org/apache/lucene/util/UnicodeUtil.java was
-derived from Python 3.1.2 sources available at
-http://www.python.org. Full license is here:
-
- http://www.python.org/download/releases/3.1.2/license/
-
-Some code in core/src/java/org/apache/lucene/util/automaton was
-derived from Brics automaton sources available at
-www.brics.dk/automaton/. Here is the copyright from those sources:
-
-/*
- * Copyright (c) 2001-2009 Anders Moeller
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-The levenshtein automata tables in core/src/java/org/apache/lucene/util/automaton
-were automatically generated with the moman/finenight FSA package.
-Here is the copyright for those sources:
-
-# Copyright (c) 2010, Jean-Philippe Barrette-LaPierre, <jp...@rrette.com>
-#
-# Permission is hereby granted, free of charge, to any person
-# obtaining a copy of this software and associated documentation
-# files (the "Software"), to deal in the Software without
-# restriction, including without limitation the rights to use,
-# copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the
-# Software is furnished to do so, subject to the following
-# conditions:
-#
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-# OTHER DEALINGS IN THE SOFTWARE.
-
-Some code in core/src/java/org/apache/lucene/util/UnicodeUtil.java was
-derived from ICU (http://www.icu-project.org)
-The full license is available here:
- http://source.icu-project.org/repos/icu/icu/trunk/license.html
-
-/*
- * Copyright (C) 1999-2010, International Business Machines
- * Corporation and others. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, and/or sell copies of the
- * Software, and to permit persons to whom the Software is furnished to do so,
- * provided that the above copyright notice(s) and this permission notice appear
- * in all copies of the Software and that both the above copyright notice(s) and
- * this permission notice appear in supporting documentation.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE
- * LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR
- * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
- * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
- * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Except as contained in this notice, the name of a copyright holder shall not
- * be used in advertising or otherwise to promote the sale, use or other
- * dealings in this Software without prior written authorization of the
- * copyright holder.
- */
-
-The following license applies to the Snowball stemmers:
-
-Copyright (c) 2001, Dr Martin Porter
-Copyright (c) 2002, Richard Boulton
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * Neither the name of the copyright holders nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-The following license applies to the KStemmer:
-
-Copyright © 2003,
-Center for Intelligent Information Retrieval,
-University of Massachusetts, Amherst.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
-list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice,
-this list of conditions and the following disclaimer in the documentation
-and/or other materials provided with the distribution.
-
-3. The names "Center for Intelligent Information Retrieval" and
-"University of Massachusetts" must not be used to endorse or promote products
-derived from this software without prior written permission. To obtain
-permission, contact info@ciir.cs.umass.edu.
-
-THIS SOFTWARE IS PROVIDED BY UNIVERSITY OF MASSACHUSETTS AND OTHER CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-
-The following license applies to the Morfologik project:
-
-Copyright (c) 2006 Dawid Weiss
-Copyright (c) 2007-2011 Dawid Weiss, Marcin Miłkowski
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
- * Neither the name of Morfologik nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
----
-
-The dictionary comes from Morfologik project. Morfologik uses data from
-Polish ispell/myspell dictionary hosted at http://www.sjp.pl/slownik/en/ and
-is licenced on the terms of (inter alia) LGPL and Creative Commons
-ShareAlike. The part-of-speech tags were added in Morfologik project and
-are not found in the data from sjp.pl. The tagset is similar to IPI PAN
-tagset.
-
----
-
-The following license applies to the Morfeusz project,
-used by org.apache.lucene.analysis.morfologik.
-
-BSD-licensed dictionary of Polish (SGJP)
-http://sgjp.pl/morfeusz/
-
-Copyright © 2011 Zygmunt Saloni, Włodzimierz Gruszczyński,
- Marcin Woliński, Robert Wołosz
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the
- distribution.
-
-THIS SOFTWARE IS PROVIDED BY COPYRIGHT HOLDERS “AS IS” AND ANY EXPRESS
-OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/jena-fuseki-dist/dist/NOTICE
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-dist/dist/NOTICE b/jena-fuseki2/jena-fuseki-dist/dist/NOTICE
deleted file mode 100644
index 33231f9..0000000
--- a/jena-fuseki2/jena-fuseki-dist/dist/NOTICE
+++ /dev/null
@@ -1,216 +0,0 @@
-Apache Jena - module Fuseki
-Copyright 2011, 2012, 2013, 2014, 2015 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-
-Portions of this software were originally based on the following:
- - Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Hewlett-Packard Development Company, LP
- - Copyright 2010, 2011 Epimorphics Ltd.
- - Copyright 2010, 2011 Talis Systems Ltd.
-These have been licensed to the Apache Software Foundation under a software grant.
-
-- - - - - - - - - - - - - - - - - - - - - - -
-
-slf4j:
- Copyright (c) 2004-2011 QOS.ch
- All rights reserved.
-
-- - - - - - - - - - - - - - - - - - - - - - -
-
-(c) Copyright 2003, Plugged In Software
-This product includes software developed by
-PluggedIn Software under a BSD license.
-
-- - - - - - - - - - - - - - - - - - - - - - -
-
- Jetty Web Container
- Copyright 1995-2012 Mort Bay Consulting Pty Ltd.
-
-under the Apache 2.0 License.
-
-The Jetty Web Container includes:
-
-UnixCrypt.java
-Copyright 1996 Aki Yoshida,
-modified April 2001 by Iris Van den Broeke, Daniel Deville.
-
-- - - - - - - - - - - - - - - - - - - - - - -
-
-From Apache HttpComponents Client:
-
-This project contains annotations derived from JCIP-ANNOTATIONS
-Copyright (c) 2005 Brian Goetz and Tim Peierls. See http://www.jcip.net
-
-- - - - - - - - - - - - - - - - - - - - - - -
-
- Apache Xerces Java
- Copyright 1999-2013 The Apache Software Foundation
-
- This product includes software developed at
- The Apache Software Foundation (http://www.apache.org/).
-
- Portions of this software were originally based on the following:
- - software copyright (c) 1999, IBM Corporation., http://www.ibm.com.
- - software copyright (c) 1999, Sun Microsystems., http://www.sun.com.
- - voluntary contributions made by Paul Eng on behalf of the
- Apache Software Foundation that were originally developed at iClick, Inc.,
- software copyright (c) 1999.
-
-- - - - - - - - - - - - - - - - - - - - - - -
-
-From Apache Lucene:
-
-ICU4J, (under analysis/icu) is licensed under an MIT styles license
-and Copyright (c) 1995-2008 International Business Machines Corporation and others
-
-Some data files (under analysis/icu/src/data) are derived from Unicode data such
-as the Unicode Character Database. See http://unicode.org/copyright.html for more
-details.
-
-Brics Automaton (under core/src/java/org/apache/lucene/util/automaton) is
-BSD-licensed, created by Anders Møller. See http://www.brics.dk/automaton/
-
-The levenshtein automata tables (under core/src/java/org/apache/lucene/util/automaton) were
-automatically generated with the moman/finenight FSA library, created by
-Jean-Philippe Barrette-LaPierre. This library is available under an MIT license,
-see http://sites.google.com/site/rrettesite/moman and
-http://bitbucket.org/jpbarrette/moman/overview/
-
-This product includes code (JaspellTernarySearchTrie) from Java Spelling
-Checking Package (jaspell): http://jaspell.sourceforge.net/
-License: The BSD License (http://www.opensource.org/licenses/bsd-license.php)
-
-The snowball stemmers in
- analysis/common/src/java/net/sf/snowball
-were developed by Martin Porter and Richard Boulton.
-The snowball stopword lists in
- analysis/common/src/resources/org/apache/lucene/analysis/snowball
-were developed by Martin Porter and Richard Boulton.
-The full snowball package is available from
- http://snowball.tartarus.org/
-
-The KStem stemmer in
- analysis/common/src/org/apache/lucene/analysis/en
-was developed by Bob Krovetz and Sergio Guzman-Lara (CIIR-UMass Amherst)
-under the BSD-license.
-
-The Arabic,Persian,Romanian,Bulgarian, and Hindi analyzers (common) come with a default
-stopword list that is BSD-licensed created by Jacques Savoy.
-See http://members.unine.ch/jacques.savoy/clef/index.html.
-
-The German,Spanish,Finnish,French,Hungarian,Italian,Portuguese,Russian and Swedish light stemmers
-(common) are based on BSD-licensed reference implementations created by Jacques Savoy and
-Ljiljana Dolamic.
-
-The Stempel analyzer (stempel) includes BSD-licensed software developed
-by the Egothor project http://egothor.sf.net/, created by Leo Galambos, Martin Kvapil,
-and Edmond Nolan.
-
-The Polish analyzer (stempel) comes with a default
-stopword list that is BSD-licensed created by the Carrot2 project. The file resides
-in stempel/src/resources/org/apache/lucene/analysis/pl/stopwords.txt.
-See http://project.carrot2.org/license.html.
-
-The SmartChineseAnalyzer source code (smartcn) was
-provided by Xiaoping Gao and copyright 2009 by www.imdict.net.
-
-WordBreakTestUnicode_*.java (under modules/analysis/common/src/test/)
-is derived from Unicode data such as the Unicode Character Database.
-See http://unicode.org/copyright.html for more details.
-
-The Morfologik analyzer (morfologik) includes BSD-licensed software
-developed by Dawid Weiss and Marcin Miłkowski (http://morfologik.blogspot.com/).
-
-Morfologik uses data from Polish ispell/myspell dictionary
-(http://www.sjp.pl/slownik/en/) licenced on the terms of (inter alia)
-LGPL and Creative Commons ShareAlike.
-
-Morfologic includes data from BSD-licensed dictionary of Polish (SGJP)
-(http://sgjp.pl/morfeusz/)
-
-Servlet-api.jar and javax.servlet-*.jar are under the CDDL license, the original
-source code for this can be found at http://www.eclipse.org/jetty/downloads.php
-
-===========================================================================
-Kuromoji Japanese Morphological Analyzer - Apache Lucene Integration
-===========================================================================
-
-This software includes a binary and/or source version of data from
-
- mecab-ipadic-2.7.0-20070801
-
-which can be obtained from
-
- http://atilika.com/releases/mecab-ipadic/mecab-ipadic-2.7.0-20070801.tar.gz
-
-or
-
- http://jaist.dl.sourceforge.net/project/mecab/mecab-ipadic/2.7.0-20070801/mecab-ipadic-2.7.0-20070801.tar.gz
-
-===========================================================================
-mecab-ipadic-2.7.0-20070801 Notice
-===========================================================================
-
-Nara Institute of Science and Technology (NAIST),
-the copyright holders, disclaims all warranties with regard to this
-software, including all implied warranties of merchantability and
-fitness, in no event shall NAIST be liable for
-any special, indirect or consequential damages or any damages
-whatsoever resulting from loss of use, data or profits, whether in an
-action of contract, negligence or other tortuous action, arising out
-of or in connection with the use or performance of this software.
-
-A large portion of the dictionary entries
-originate from ICOT Free Software. The following conditions for ICOT
-Free Software applies to the current dictionary as well.
-
-Each User may also freely distribute the Program, whether in its
-original form or modified, to any third party or parties, PROVIDED
-that the provisions of Section 3 ("NO WARRANTY") will ALWAYS appear
-on, or be attached to, the Program, which is distributed substantially
-in the same form as set out herein and that such intended
-distribution, if actually made, will neither violate or otherwise
-contravene any of the laws and regulations of the countries having
-jurisdiction over the User or the intended distribution itself.
-
-NO WARRANTY
-
-The program was produced on an experimental basis in the course of the
-research and development conducted during the project and is provided
-to users as so produced on an experimental basis. Accordingly, the
-program is provided without any warranty whatsoever, whether express,
-implied, statutory or otherwise. The term "warranty" used herein
-includes, but is not limited to, any warranty of the quality,
-performance, merchantability and fitness for a particular purpose of
-the program and the nonexistence of any infringement or violation of
-any right of any third party.
-
-Each user of the program will agree and understand, and be deemed to
-have agreed and understood, that there is no warranty whatsoever for
-the program and, accordingly, the entire risk arising from or
-otherwise connected with the program is assumed by the user.
-
-Therefore, neither ICOT, the copyright holder, or any other
-organization that participated in or was otherwise related to the
-development of the program and their respective officials, directors,
-officers and other employees shall be held liable for any and all
-damages, including, without limitation, general, special, incidental
-and consequential damages, arising out of or otherwise in connection
-with the use or inability to use the program or any product, material
-or result produced or otherwise obtained by using the program,
-regardless of whether they have been advised of, or otherwise had
-knowledge of, the possibility of such damages at any time during the
-project or thereafter. Each user will be deemed to have agreed to the
-foregoing by his or her commencement of use of the program. The term
-"use" as used herein includes, but is not limited to, the use,
-modification, copying and distribution of the program and the
-production of secondary products from the program.
-
-In the case where the program, whether in its original form or
-modified, was distributed or delivered to or received by a user from
-any person, organization or entity other than ICOT, unless it makes or
-grants independently of ICOT any specific warranty to the user in
-writing, such person, organization or entity, will also be exempted
-from and not be held liable to the user for any such damages as noted
-above as far as the program is concerned.
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/jena-fuseki-dist/fuseki
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-dist/fuseki b/jena-fuseki2/jena-fuseki-dist/fuseki
deleted file mode 100644
index 9cc1fe8..0000000
--- a/jena-fuseki2/jena-fuseki-dist/fuseki
+++ /dev/null
@@ -1,477 +0,0 @@
-#!/usr/bin/env bash
-
-# 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.
-#
-# =========
-#
-# Startup script for Fuseki under *nix systems (works with cygwin too)
-#
-# Configuration
-# -------------
-# Default values are loaded from /etc/default/fuseki, if it exists.
-#
-# JAVA
-# Command to invoke Java. If not set, java (from the PATH) will be used.
-#
-# JAVA_OPTIONS
-# Extra options to pass to the JVM.
-#
-# FUSEKI_HOME
-# Where Fuseki is installed. If not set, the script will try
-# to guess it based on the script invokation path.
-#
-# FUSEKI_BASE
-# The root of the runtime area - logs files, system files, local configuration.
-# Defaults to /etc/fuseki.
-#
-# FUSEKI_RUN
-# Where the fuseki.pid file should be stored. It defaults
-# first available of /var/run, /usr/var/run, and /tmp if not set.
-#
-# FUSEKI_PID
-# The FUSEKI PID file, defaults to $FUSEKI_RUN/fuseki.pid
-#
-# FUSEKI_ARGS
-# The arguments to pass to the Fuseki server on the command line. Defaults to:
-# # if FUSEKI_CONF is not set
-# --config=$FUSEKI_CONF # if FUSEKI_CONF is set
-#
-# FUSEKI_START
-# Path to the jar file. Defaults to $FUSEKI_HOME/fuseki-server.jar
-
-# FUSEKI_CONF
-# The Fuseki configuration file, usually in RDF Turtle notation.
-#
-# FUSEKI_USER
-# If set, the server will be run as this user
-#
-# FUSEKI_LOGS
-# Directory where logs will be generated.
-# Fixed as $FUSEKI_BASE/logs.
-#
-# FUSEKI_LOGS_STDERROUT
-# Log file with stderr and stdout log output from Fuseki.
-# Defaults to $FUSEKI_LOGS/stderrout.log
-
-### BEGIN INIT INFO
-# Provides: fuseki
-# Required-Start: $remote_fs $network
-# Required-Stop: $remote_fs $network
-# Default-Start: 3 4 5
-# Default-Stop: 0 1 2 6
-# Short-Description: Start Jena Fuseki at boot time
-# Description: Jena Fuseki is a service that provides a SPARQL API over HTTP
-### END INIT INFO
-
-# DEBUG=1
-NAME=fuseki
-if [ -f /etc/default/$NAME ]; then
- . /etc/default/$NAME
-fi
-
-if [ -f /lib/lsb/init-functions ]; then
- . /lib/lsb/init-functions
-else
- # simple replacements for LSB daemon logging functions if not defined
- log_daemon_msg() {
- echo $1
- }
- log_begin_msg() {
- echo $1
- }
- log_end_msg() {
- if [ $1 -eq 0]; then
- echo '[OK]'
- else
- echo '[failed]'
- fi
- }
-fi
-
-usage()
-{
- echo "Usage: ${0##*/} {start|stop|restart|run|status}"
- exit 1
-}
-
-[ $# -gt 0 ] || usage
-CMD="$1"
-
-# Utility functions
-
-findDirectory()
-{
- local L OP=$1
- shift
- for L in "$@"; do
- [ "$OP" "$L" ] || continue
- printf %s "$L"
- break
- done
-}
-
-findFile()
-{
- local L F=$1
- shift
- for L in "$@"; do
- [ -f "${L}/${F}" ] || continue
- printf %s "${L}/${F}"
- break
- done
-}
-
-running()
-{
- local PID=$(cat "$1" 2>/dev/null) || return 1
- ps -p "$PID" >/dev/null 2>&1
-}
-
-# Are we running in cygwin?
-cygwin=false
-case "`uname`" in
- CYGWIN*) cygwin=true;;
-esac
-
-# Set FUSKEI_HOME to the script invocation directory if it is not specified
-if [ -z "$FUSEKI_HOME" ]
-then
- SCRIPT="$0"
- # Catch common issue: script has been symlinked
- if [ -L "$SCRIPT" ]
- then
- SCRIPT="$(readlink "$0")"
- # If link is relative
- case "$SCRIPT" in
- /*) ;; # fine
- *) SCRIPT=$( dirname "$0" )/$SCRIPT;; # fix
- esac
- fi
-
- # Work out root from script location
- FUSEKI_HOME="$( cd "$( dirname "$SCRIPT" )" && pwd )"
-
-fi
-
-# Deal with Cygwin path issues
-if [ "$cygwin" == "true" ]
-then
- FUSEKI_HOME=`cygpath -w "$FUSEKI_HOME"`
-fi
-
-if [ ! -e "$FUSEKI_HOME" ]
-then
- log_daemon_msg "FUSEKI_HOME '$FUSEKI_HOME' does not exist" 1>&2
- exit 1
-fi
-
-if [ -z "$FUSEKI_BASE" ]
-then
- FUSEKI_BASE="/etc/fuseki"
-fi
-
-if [ "$cygwin" == "true" ]
-then
- FUSEKI_BASE=`cygpath -w "$FUSEKI_BASE"`
-fi
-
-
-if [ ! -e "$FUSEKI_BASE" -o ! -d "$FUSEKI_BASE" ]
-then
- log_daemon_msg "FUSEKI_BASE '$FUSEKI_BASE' does not exist or is not a directory" 1>&2
- exit 1
-fi
-
-if [ ! -w "$FUSEKI_BASE" ]
-then
- log_daemon_msg "FUSEKI_BASE '$FUSEKI_BASE' is not writable." 1>&2
- exit 1
-fi
-
-
-# Deal with Cygwin path issues
-if [ "$cygwin" == "true" ]
-then
- FUSEKI_HOME=`cygpath -w "$FUSEKI_HOME"`
- FUSEKI_BASE=`cygpath -w "$FUSEKI_BASE"`
- fi
-
-# Find a location for the pid file
-if [ -z "$FUSEKI_RUN" ]
-then
- FUSEKI_RUN=$(findDirectory -w /var/run /usr/var/run $FUSEKI_HOME /tmp)
-fi
-
-# Get PID file name
-if [ -z "$FUSEKI_PID" ]
-then
- FUSEKI_PID="$FUSEKI_RUN/fuseki.pid"
-fi
-
-# Log directory
-if [ -n "$FUSEKI_LOGS" ]
-then
- log_daemon_message "FUSEKI_LOGS can not be set externally - ignored" 1>&2
-fi
-FUSEKI_LOGS="$FUSEKI_BASE/logs"
-
-# Std Err and Out log
-if [ -z "$FUSEKI_LOGS_STDERROUT" ]
-then
- FUSEKI_LOGS_STDERROUT="$FUSEKI_LOGS/stderrout.log"
-fi
-
-# Data directory
-if [ -z "$FUSEKI_DATA_DIR" ]
-then
- FUSEKI_DATA_DIR="$FUSEKI_HOME/DB"
-fi
-
-# Set up JAVA if not set
-if [ -z "$JAVA" ]
-then
- JAVA=$(which java)
-fi
-if [ -z "$JAVA" ]
-then
- echo "Cannot find a Java JDK. Please set either set JAVA or put java (>=1.7) in your PATH." 2>&2
- exit 1
-fi
-
-# The location of the start up JAR
-FUSEKI_START=${FUSEKI_START:-$FUSEKI_HOME/fuseki-server.jar}
-
-# Deal with Cygwin path issues
-if [ "$cygwin" == "true" ]
-then
- DATA_DIR=`cygpath -w "$FUSEKI_DATA_DIR"`
- FUSEKI_START=`cygpath -w "$FUSEKI_START"`
-else
- DATA_DIR="$FUSEKI_DATA_DIR"
-fi
-
-# Some JVM settings
-if [ -z "$JAVA_OPTIONS" ]
-then
- JAVA_OPTIONS="-Xmx1200M"
-fi
-
-# Default Fuseki Arguments
-if [ -z "$FUSEKI_ARGS" ]
-then
- if [ -z "$FUSEKI_CONF" ]
- then
- FUSEKI_ARGS=""
- else
- FUSEKI_ARGS="--config=$FUSEKI_CONF"
- fi
-fi
-
-# Run command
-
-RUN_ARGS=(${JAVA_OPTIONS[@]} -jar "$FUSEKI_START" $FUSEKI_ARGS)
-RUN_CMD=("$JAVA" ${RUN_ARGS[@]})
-
-
-#####################################################
-# Comment these out after you're happy with what
-# the script is doing.
-#####################################################
-if (( DEBUG ))
-then
- log_daemon_msg "FUSEKI_HOME = $FUSEKI_HOME"
- log_daemon_msg "FUSEKI_CONF = $FUSEKI_CONF"
- log_daemon_msg "FUSEKI_RUN = $FUSEKI_RUN"
- log_daemon_msg "FUSEKI_PID = $FUSEKI_PID"
- log_daemon_msg "FUSEKI_ARGS = $FUSEKI_ARGS"
- log_daemon_msg "FUSEKI_START = $FUSEKI_START"
- log_daemon_msg "CONFIGS = ${CONFIGS[*]}"
- log_daemon_msg "JAVA = $JAVA"
- log_daemon_msg "JAVA_OPTIONS = ${JAVA_OPTIONS[*]}"
- log_daemon_msg "RUN_ARGS = ${RUN_ARGS[@]}"
- log_daemon_msg "RUN_CMD = ${RUN_CMD[@]}"
-fi
-
-NO_START=0
-
-# Life cycle functions
-start() {
- if (( NO_START )); then
- log_daemon_msg "Not starting Fuseki - NO_START=1"
- exit
- fi
-
- # Make sure the data and log directories exist
- mkdir -p "$FUSEKI_DATA_DIR"
- mkdir -p "$FUSEKI_LOGS"
-
- # Make sure the .jar file exists
- if [ ! -e $FUSEKI_START ]; then
- log_daemon_msg "Could not see Fuseki .jar file: \$FUSEKI_START has value '$FUSEKI_START'"
- exit 1
- fi
-
- log_begin_msg "Starting Fuseki"
- if type start-stop-daemon > /dev/null 2>&1
- then
- unset CH_USER
- if [ -n "$FUSEKI_USER" ]
- then
- CH_USER="--chuid $FUSEKI_USER"
- fi
- if start-stop-daemon --start $CH_USER --chdir "$FUSEKI_HOME" --background --make-pidfile --pidfile "$FUSEKI_PID" --startas /bin/bash -- -c "exec $JAVA ${RUN_ARGS[*]} > $FUSEKI_LOGS_STDERROUT 2>&1"
- then
- sleep 2
- if running "$FUSEKI_PID"
- then
- log_end_msg 0
- print_started
- else
- log_end_msg 1
- fi
- else
- log_end_msg 1
- log_daemon_msg "** start-stop-daemon failed to run"
- fi
- else
- if running $FUSEKI_PID
- then
- log_end_msg 1
- log_daemon_msg 'Already Running!'
- exit 1
- else
- # dead pid file - remove
- rm -f "$FUSEKI_PID"
- fi
-
- if [ "$FUSEKI_USER" ]
- then
- touch "$FUSEKI_PID"
- chown "$FUSEKI_USER" "$FUSEKI_PID"
- su - "$FUSEKI_USER" -c "
- log_daemon_msg "Redirecting Fuseki stderr/stdout to $FUSEKI_LOGS_STDERROUT"
- exec ${RUN_CMD[*]} &
- disown \$!
- echo \$! > '$FUSEKI_PID'"
- else
- #log_daemon_msg "Redirecting Fuseki stderr/stdout to $FUSEKI_LOGS_STDERROUT"
- exec "${RUN_CMD[@]}" &> "$FUSEKI_LOGS_STDERROUT" &
- disown $!
- echo $! > "$FUSEKI_PID"
- fi
-
- log_end_msg 0
- print_started
- fi
-}
-
-print_started() {
- log_daemon_msg "STARTED Fuseki `date`"
- log_daemon_msg "PID=$(cat "$FUSEKI_PID" 2>/dev/null)"
-}
-
-delete_fuseki_pid_file() {
- rm -f "$FUSEKI_PID"
-}
-
-stop() {
- log_begin_msg "Stopping Fuseki: "
-
- if ! running "$FUSEKI_PID"
- then
- log_end_msg 1
-
- # if a stop rather than a restart, signal failure to stop
- if [ -z "$1" ]
- then
- exit 1
- fi
- fi
-
- ###############################################################
- # !!!! This code needs to be improved, too many repeats !!!! #
- ###############################################################
- if type start-stop-daemon > /dev/null 2>&1; then
- start-stop-daemon --stop --pidfile "$FUSEKI_PID" --chdir "$FUSEKI_HOME" --startas "$JAVA" --signal HUP
-
- ## Die after a 30 second timeout
- TIMEOUT=30
- while running "$FUSEKI_PID"; do
- if (( TIMEOUT-- == 0 )); then
- start-stop-daemon --stop --pidfile "$FUSEKI_PID" --chdir "$FUSEKI_HOME" --startas "$JAVA" --signal KILL
- fi
- sleep 1
- done
- delete_fuseki_pid_file
- log_end_msg 0
- else
- PID=$(cat "$FUSEKI_PID" 2>/dev/null)
- kill "$PID" 2>/dev/null
-
- TIMEOUT=30
- while running $FUSEKI_PID; do
- if (( TIMEOUT-- == 0 )); then
- kill -KILL "$PID" 2>/dev/null
- fi
- sleep 1
- done
- delete_fuseki_pid_file
- log_end_msg 0
- fi
-}
-
-
-# Run in the foreground, as the current user
-run() {
- # Make sure the .jar file exists
- if [ ! -e $FUSEKI_START ]; then
- log_daemon_msg "Could not see Fuseki .jar file: \$FUSEKI_START has value '$FUSEKI_START'"
- exit 1
- fi
- exec "${RUN_CMD[@]}"
-}
-
-case $CMD in
- start)
- start
- ;;
- stop)
- stop
- ;;
- restart)
- stop "restarting"
- start
- ;;
- run)
- run
- ;;
- status)
- FUSEKI_PID=$(findFile fuseki.pid /var/run /usr/var/run $FUSEKI_HOME /tmp)
- if running $FUSEKI_PID
- then
- PID=`cat "$FUSEKI_PID"`
- log_daemon_msg "Fuseki is running with pid: $PID"
- else
- log_daemon_msg "Fuseki is not running"
- fi
- ;;
- *)
- usage
- ;;
-esac
-
-exit 0
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/jena-fuseki-dist/fuseki-server
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-dist/fuseki-server b/jena-fuseki2/jena-fuseki-dist/fuseki-server
deleted file mode 100755
index 6342aba..0000000
--- a/jena-fuseki2/jena-fuseki-dist/fuseki-server
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/bin/sh
-# 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.
-
-# Run fuseki as a standalone server
-
-export FUSEKI_HOME="${FUSEKI_HOME:-$PWD}"
-
-if [ ! -e "$FUSEKI_HOME" ]
-then
- echo "$FUSEKI_HOME does not exist" 1>&2
- exit 1
- fi
-
-JAR1="$FUSEKI_HOME/fuseki-server.jar"
-JAR2="$FUSEKI_HOME/jena-fuseki-server-*.jar"
-JAR=""
-
-for J in "$JAR1" "$JAR2"
-do
- # Expand
- J="$(echo $J)"
- if [ -e "$J" ]
- then
- JAR="$J"
- break
- fi
-done
-
-if [ "$JAR" = "" ]
-then
- echo "Can't find jarfile to run"
- exit 1
-fi
-
-# Deal with Cygwin path issues
-cygwin=false
-case "`uname`" in
- CYGWIN*) cygwin=true;;
-esac
-if [ "$cygwin" = "true" ]
-then
- JAR=`cygpath -w "$JAR"`
- FUSEKI_HOME=`cygpath -w "$FUSEKI_HOME"`
-fi
-
-export FUSEKI_BASE="${FUSEKI_BASE:-$PWD/run}"
-
-JVM_ARGS=${JVM_ARGS:--Xmx1200M}
-
-exec java $JVM_ARGS -jar "$JAR" "$@"
-
-## Adding custom code to the Fuseki server:
-##
-## It is also possible to launch Fuseki using
-## java $JVM_ARGS -cp "$JAR" org.apache.jena.fuseki.cmd.FusekiCmd "$@"
-##
-## "exec" is optional - it simple frees up a OS process.
-## In this way, you can add custom java to the classpath:
-##
-## APPJAR=MyCode.jar
-## java $JVM_ARGS -cp "$JAR:$APPJAR" org.apache.jena.fuseki.cmd.FusekiCmd "$@"
-
-
-
-
-
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/jena-fuseki-dist/fuseki-server.bat
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-dist/fuseki-server.bat b/jena-fuseki2/jena-fuseki-dist/fuseki-server.bat
deleted file mode 100644
index 9977a23..0000000
--- a/jena-fuseki2/jena-fuseki-dist/fuseki-server.bat
+++ /dev/null
@@ -1,28 +0,0 @@
-@REM Licensed to the Apache Software Foundation (ASF) under one
-@REM or more contributor license agreements. See the NOTICE file
-@REM distributed with this work for additional information
-@REM regarding copyright ownership. The ASF licenses this file
-@REM to you under the Apache License, Version 2.0 (the
-@REM "License"); you may not use this file except in compliance
-@REM with the License. You may obtain a copy of the License at
-@REM
-@REM http://www.apache.org/licenses/LICENSE-2.0
-@REM
-@REM Unless required by applicable law or agreed to in writing, software
-@REM distributed under the License is distributed on an "AS IS" BASIS,
-@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@REM See the License for the specific language governing permissions and
-@REM limitations under the License.
-
-@echo off
-@REM modify this to name the server jar
-java -Xmx1200M -jar fuseki-server.jar %*
-
-@REM Adding custom code to the Fuseki server:
-@REM
-@REM It is also possible to launch Fuseki using
-@REM java ..jvmarsg... -cp $JAR org.apache.jena.fuseki.cmd.FusekiCmd %*
-@REM
-@REM In this way, you can add custom java to the classpath:
-@REM
-@REM java ... -cp fuseki-server.jar;MyCustomCode.jar org.apache.jena.fuseki.cmd.FusekiCmd %*
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/jena-fuseki-dist/pom.xml
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-dist/pom.xml b/jena-fuseki2/jena-fuseki-dist/pom.xml
deleted file mode 100644
index 9f12875..0000000
--- a/jena-fuseki2/jena-fuseki-dist/pom.xml
+++ /dev/null
@@ -1,95 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- 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.
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <name>Apache Jena - Fuseki Binary Distribution</name>
- <artifactId>jena-fuseki-dist</artifactId>
- <version>2.0.0-SNAPSHOT</version>
- <packaging>pom</packaging>
-
- <parent>
- <groupId>org.apache.jena</groupId>
- <artifactId>jena-fuseki</artifactId>
- <version>2.0.0-SNAPSHOT</version>
- <relativePath>..</relativePath>
- </parent>
-
- <description>Fuseki distribution</description>
- <url>http://jena.apache.org/</url>
-
- <organization>
- <name>Apache Jena</name>
- <url>http://jena.apache.org/</url>
- </organization>
-
- <licenses>
- <license>
- <name>Apache 2.0 License</name>
- <url>http://www.apache.org/licenses/LICENSE-2.0</url>
- </license>
- </licenses>
-
- <properties>
- <maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm:ssZ</maven.build.timestamp.format>
- <build.time.xsd>${maven.build.timestamp}</build.time.xsd>
- </properties>
-
- <dependencies>
-
- <dependency>
- <groupId>org.apache.jena</groupId>
- <artifactId>jena-fuseki-server</artifactId>
- <version>${project.version}</version>
- </dependency>
-
- <dependency>
- <groupId>org.apache.jena</groupId>
- <artifactId>jena-fuseki-war</artifactId>
- <version>${project.version}</version>
- <type>war</type>
- </dependency>
-
- </dependencies>
- <build>
- <plugins>
-
- <plugin>
- <artifactId>maven-assembly-plugin</artifactId>
- <executions>
- <execution>
- <id>create-zip-assembly</id>
- <phase>package</phase>
- <!--<phase/>-->
- <goals><goal>single</goal></goals>
- <configuration>
- <appendAssemblyId>false</appendAssemblyId>
- <descriptors>
- <descriptor>assembly-dist.xml</descriptor>
- </descriptors>
- </configuration>
- </execution>
- </executions>
- </plugin>
-
- </plugins>
-
- </build>
-
-</project>
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/pom.xml
----------------------------------------------------------------------
diff --git a/jena-fuseki2/pom.xml b/jena-fuseki2/pom.xml
index 39475ee..f089dd1 100644
--- a/jena-fuseki2/pom.xml
+++ b/jena-fuseki2/pom.xml
@@ -73,7 +73,7 @@
<module>jena-fuseki-core</module>
<module>jena-fuseki-war</module>
<module>jena-fuseki-server</module>
- <module>jena-fuseki-dist</module>
+ <module>apache-jena-fuseki</module>
</modules>
</project>
[2/6] jena git commit: JENA-872 : apache-jena-fuseki
Posted by an...@apache.org.
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/jena-fuseki-dist/bin/s-put
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-dist/bin/s-put b/jena-fuseki2/jena-fuseki-dist/bin/s-put
deleted file mode 100755
index 0e3a807..0000000
--- a/jena-fuseki2/jena-fuseki-dist/bin/s-put
+++ /dev/null
@@ -1,707 +0,0 @@
-#!/usr/bin/env ruby
-# -*- coding: utf-8 -*-
-
-# 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.
-
-# SPARQL HTTP Update, client.
-
-require 'optparse'
-require 'net/http'
-require 'uri'
-require 'cgi'
-require 'pp'
-require 'ostruct'
-
-# ToDo
-# Allow a choice of media type for GET
-# --accept "content-type" (and abbreviations)
-# --header "Add:this"
-# --user, --password
-# Basic authentication: request.basic_auth("username", "password")
-# Follow redirects => 301: puts response["location"] # All headers are lowercase?
-
-SOH_NAME="SOH"
-SOH_VERSION="0.0.0"
-
-$proxy = ENV['http_proxy'] ? URI.parse(ENV['http_proxy']) : OpenStruct.new
-
-# What about direct naming?
-
-# Names
-$mtTurtle = 'text/turtle;charset=utf-8'
-$mtRDF = 'application/rdf+xml'
-$mtText = 'text/plain'
-$mtNQuads = 'text/n-quads'
-$mtTriG = 'application/trig'
-$mtSparqlResultsX = 'application/sparql-results+xml'
-$mtSparqlResultsJ = 'application/sparql-results+json'
-$mtAppJSON = 'application/json'
-$mtAppXML = 'application/xml'
-$mtSparqlResultsTSV = 'application/sparql-results+tsv'
-$mtSparqlResultsCSV = 'application/sparql-results+csv'
-$mtSparqlUpdate = 'application/sparql-update'
-$mtWWWForm = 'application/x-www-form-urlencoded'
-$mtSparqlQuery = "application/sparql-query" ;
-
-# Global media type table.
-$fileMediaTypes = {}
-$fileMediaTypes['ttl'] = $mtTurtle
-$fileMediaTypes['n3'] = 'text/n3; charset=utf-8'
-$fileMediaTypes['nt'] = $mtText
-$fileMediaTypes['rdf'] = $mtRDF
-$fileMediaTypes['owl'] = $mtRDF
-$fileMediaTypes['nq'] = $mtNQuads
-$fileMediaTypes['trig'] = $mtTriG
-
-# Global charset : no entry means "don't set"
-$charsetUTF8 = 'utf-8'
-$charset = {}
-$charset[$mtTurtle] = 'utf-8'
-$charset[$mtText] = 'ascii'
-$charset[$mtTriG] = 'utf-8'
-$charset[$mtNQuads] = 'ascii'
-
-# Headers
-
-$hContentType = 'Content-Type'
-# $hContentEncoding = 'Content-Encoding'
-$hContentLength = 'Content-Length'
-# $hContentLocation = 'Content-Location'
-# $hContentRange = 'Content-Range'
-
-$hAccept = 'Accept'
-$hAcceptCharset = 'Accept-Charset'
-$hAcceptEncoding = 'Accept-Encoding'
-$hAcceptRanges = 'Accept-Ranges'
-
-$headers = { "User-Agent" => "#{SOH_NAME}/Fuseki #{SOH_VERSION}"}
-$print_http = false
-
-# Default for GET
-# At least allow anythign (and hope!)
-$accept_rdf="#{$mtRDF};q=0.9 , #{$mtTurtle}"
-# For SPARQL query
-$accept_results="#{$mtSparqlResultsJ} , #{$mtSparqlResultsX};q=0.9 , #{$accept_rdf}"
-
-# Accept any in case of trouble.
-$accept_rdf="#{$accept_rdf} , */*;q=0.1"
-$accept_results="#{$accept_results} , */*;q=0.1"
-
-# The media type usually forces the charset.
-$accept_charset=nil
-
-## Who we are.
-## Two styles:
-## s-query .....
-## soh query .....
-
-$cmd = File.basename($0)
-if $cmd == 'soh'
-then
- $cmd = (ARGV.size == 0) ? 'soh' : ARGV.shift
-end
-
-if ! $cmd.start_with?('s-') && $cmd != 'soh'
- $cmd = 's-'+$cmd
-end
-
-## --------
-
-def GET(dataset, graph)
- print "GET #{dataset} #{graph}\n" if $verbose
- requestURI = target(dataset, graph)
- headers = {}
- headers.merge!($headers)
- headers[$hAccept] = $accept_rdf
- headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
- get_worker(requestURI, headers)
-end
-
-def get_worker(requestURI, headers)
- uri = URI.parse(requestURI)
- request = Net::HTTP::Get.new(uri.request_uri)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- response_print_body(uri, request)
-end
-
-def HEAD(dataset, graph)
- print "HEAD #{dataset} #{graph}\n" if $verbose
- requestURI = target(dataset, graph)
- headers = {}
- headers.merge!($headers)
- headers[$hAccept] = $accept_rdf
- headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
- uri = URI.parse(requestURI)
- request = Net::HTTP::Head.new(uri.request_uri)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def PUT(dataset, graph, file)
- print "PUT #{dataset} #{graph} #{file}\n" if $verbose
- send_body(dataset, graph, file, Net::HTTP::Put)
-end
-
-def POST(dataset, graph, file)
- print "POST #{dataset} #{graph} #{file}\n" if $verbose
- send_body(dataset, graph, file, Net::HTTP::Post)
-end
-
-def DELETE(dataset, graph)
- print "DELETE #{dataset} #{graph}\n" if $verbose
- requestURI = target(dataset, graph)
- uri = URI.parse(requestURI)
- request = Net::HTTP::Delete.new(uri.request_uri)
- headers = {}
- headers.merge!($headers)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def uri_escape(string)
- CGI.escape(string)
-end
-
-def target(dataset, graph)
- return dataset+"?default" if graph == "default"
- return dataset+"?graph="+uri_escape(graph)
-end
-
-def send_body(dataset, graph, file, method)
- mt = content_type(file)
- headers = {}
- headers.merge!($headers)
- headers[$hContentType] = mt
- headers[$hContentLength] = File.size(file).to_s
- ## p headers
-
- requestURI = target(dataset, graph)
- uri = URI.parse(requestURI)
-
- request = method.new(uri.request_uri)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- request.body_stream = File.open(file)
- response_no_body(uri, request)
-end
-
-def response_no_body(uri, request)
- http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
- http.read_timeout = nil
- # check we can connect.
- begin http.start
- rescue Exception => e
- # puts e.message
- #puts e.backtrace.inspect
- warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
- end
- response = http.request(request)
- print_http_response(response)
- case response
- when Net::HTTPSuccess, Net::HTTPRedirection
- # OK
- when Net::HTTPNotFound
- warn_exit "404 Not found: #{uri}", 9
- #print response.body
- else
- warn_exit "#{response.code} #{response.message} #{uri}", 9
- # Unreachable
- response.error!
- end
- # NO BODY IN RESPONSE
-end
-
-def response_print_body(uri, request)
- http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
- http.read_timeout = nil
- # check we can connect.
- begin http.start
- rescue => e
- #puts e.backtrace.inspect
- #print e.class
- warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
- end
-
- # Add a blank line if headers were output.
- print "\n" if $http_print ;
-
- begin
- response = http.request(request) { |res|
- print_http_response(res)
- #puts res.code
- res.read_body do |segment|
- print segment
- end
- }
- case response
- when Net::HTTPSuccess, Net::HTTPRedirection
- # OK
- when Net::HTTPNotFound
- warn_exit "404 Not found: #{uri}", 9
- #print response.body
- else
- warn_exit "#{response.code}: #{uri}", 9
- # Unreachable
- response.error!
- end
- rescue EOFError => e
- warn_exit "IO Error: "+e.message, 3
- end
-end
-
-def print_http_request(uri, request)
- return unless $print_http
- #print "Request\n"
- print request.method," ",uri, "\n"
- print_headers(" ",request)
-end
-
-def print_http_response(response)
- return unless $print_http
- #print "Response\n"
- print response.code, " ", response.message, "\n"
- print_headers(" ",response)
-end
-
-def print_headers(marker, headers)
- headers.each do |k,v|
- k = k.split('-').map{|w| w.capitalize}.join('-')+':'
- printf "%s%-20s %s\n",marker,k,v
- end
-end
-
-def content_type(file)
- file =~ /\.([^.]*)$/
- ext = $1
- mt = $fileMediaTypes[ext]
- cs = $charset[mt]
- mt = mt+';charset='+cs if ! cs.nil?
- return mt
-end
-
-def charset(content_type)
- return $charset[content_type]
-end
-
-def warn_exit(msg, rc)
- warn msg
- exit rc ;
-end
-
-def parseURI(uri_string)
- begin
- return URI.parse(uri_string).to_s
- rescue URI::InvalidURIError => err
- warn_exit "Bad URI: <#{uri_string}>", 2
- end
-end
-
-## ---- Command
-
-def cmd_soh(command=nil)
- ## Command line
- options = {}
- optparse = OptionParser.new do |opts|
- # Set a banner, displayed at the top
- # of the help screen.
- case $cmd
- when "s-http", "sparql-http", "soh"
- banner="$cmd [get|post|put|delete] datasetURI graph [file]"
- when "s-get", "s-head", "s-delete"
- banner="$cmd datasetURI graph"
- end
-
- opts.banner = $banner
- # Define the options, and what they do
-
- options[:verbose] = false
- opts.on( '-v', '--verbose', 'Verbose' ) do
- options[:verbose] = true
- end
-
- options[:version] = false
- opts.on( '--version', 'Print version and exit' ) do
- print "#{SOH_NAME} #{SOH_VERSION}\n"
- exit
- end
-
- # This displays the help screen, all programs are
- # assumed to have this option.
- opts.on( '-h', '--help', 'Display this screen and exit' ) do
- puts opts
- exit
- end
- end
-
- begin optparse.parse!
- rescue OptionParser::InvalidArgument => e
- warn e
- exit
- end
-
- $verbose = options[:verbose]
- $print_http = $verbose
-
- if command.nil?
- if ARGV.size == 0
- warn "No command given: expected one of 'get', 'put', 'post', 'delete', 'query' or 'update'"
- exit 1
- end
- cmdPrint=ARGV.shift
- command=cmdPrint.upcase
- else
- cmdPrint=command
- end
-
- case command
- when "HEAD", "GET", "DELETE"
- requiredFile=false
- when "PUT", "POST"
- requiredFile=true
- when "QUERY"
- cmd_sparql_query
- when "UPDATE"
- cmd_sparql_update
- else
- warn_exit "Unknown command: #{command}", 2
- end
-
- if requiredFile
- then
- if ARGV.size != 3
- warn_exit "Required: dataset URI, graph URI (or 'default') and file", 1
- end
- else
- if ARGV.size != 2
- warn_exit "Required: dataset URI and graph URI (or 'default')", 1
- end
- end
-
- dataset=parseURI(ARGV.shift)
- # Relative URI?
- graph=parseURI(ARGV.shift)
- file=""
- if requiredFile
- then
- file = ARGV.shift if requiredFile
- if ! File.exist?(file)
- warn_exit "No such file: "+file, 3
- end
- if File.directory?(file)
- warn_exit "File is a directory: "+file, 3
- end
- end
-
- case command
- when "GET"
- GET(dataset, graph)
- when "HEAD"
- HEAD(dataset, graph)
- when "PUT"
- PUT(dataset, graph, file)
- when "DELETE"
- DELETE(dataset, graph)
- when "POST"
- POST(dataset, graph, file)
- else
- warn_exit "Internal error: Unknown command: #{cmd}", 2
- end
- exit 0
-end
-
-## --------
-def string_or_file(arg)
- return arg if ! arg.match(/^@/)
- a=(arg[1..-1])
- open(a, 'rb'){|f| f.read}
-end
-
-## -------- SPARQL Query
-
-## Choose method
-def SPARQL_query(service, query, query_file, forcePOST=false, args2={})
- if ! query_file.nil?
- query = open(query_file, 'rb'){|f| f.read}
- end
- if forcePOST || query.length >= 2*1024
- SPARQL_query_POST(service, query, args2)
- else
- SPARQL_query_GET(service, query, args2)
- end
-end
-
-## By GET
-
-def SPARQL_query_GET(service, query, args2)
- args = { "query" => query }
- args.merge!(args2)
- qs=args.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
- action="#{service}?#{qs}"
- headers={}
- headers.merge!($headers)
- headers[$hAccept]=$accept_results
- get_worker(action, headers)
-end
-
-## By POST
-
-def SPARQL_query_POST(service, query, args2)
- # DRY - body/no body for each of request and response.
- post_params={ "query" => query }
- post_params.merge!(args2)
- uri = URI.parse(service)
- headers={}
- headers.merge!($headers)
- headers[$hAccept]=$accept_results
- execute_post_form_body(uri, headers, post_params)
-end
-
-def execute_post_form_body(uri, headers, post_params)
- request = Net::HTTP::Post.new(uri.request_uri)
- qs=post_params.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
- headers[$hContentType] = $mtWWWForm
- headers[$hContentLength] = qs.length.to_s
- request.initialize_http_header(headers)
- request.body = qs
- print_http_request(uri, request)
- response_print_body(uri, request)
-end
-
-# Usage: -v --help --file= --query=
-def cmd_sparql_query
- options={}
- optparse = OptionParser.new do |opts|
- opts.banner = "Usage: #{$cmd} [--query QUERY] [--service URI] [--post] 'query' | @file"
- opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
- options[:service]=uri
- end
- opts.on('--query=FILE','--file=FILE', 'Take query from a file') do |file|
- options[:file]=file
- end
- opts.on('--output=TYPE', [:json,:xml,:text,:csv,:tsv],
- 'Set the output argument') do |type|
- options[:output]=type
- end
- opts.on('--accept=TYPE', [:json,:xml,:text,:csv,:tsv],
- 'Set the accept header type') do |type|
- options[:accept]=type
- end
- options[:verbose] = false
- opts.on( '--post', 'Force use of POST' ) do
- options[:post] = true
- end
- opts.on( '-v', '--verbose', 'Verbose' ) do
- options[:verbose] = true
- end
- opts.on( '--version', 'Print version and exit' ) do
- print "#{SOH_NAME} #{SOH_VERSION}\n"
- exit
- end
- opts.on( '-h', '--help', 'Display this screen and exit' ) do
- puts opts
- exit
- end
- end
-
- begin optparse.parse!
- rescue OptionParser::InvalidArgument, OptionParser::InvalidOption => e
- warn e
- exit 1
- end
-
- $verbose = options[:verbose]
- $print_http = $verbose
- usePOST = options[:post]
-
- service = options[:service]
- warn_exit 'No service specified. Required --service=URI',1 if service.nil?
-
- # Query
- query=nil
- query_file=options[:file]
- if query_file.nil? && ARGV.size == 0
- then
- warn_exit 'No query specified.',1
- end
- if query_file.nil?
- query = ARGV.shift
- if query.match(/^@/)
- query_file = query[1..-1]
- query = nil
- end
- end
-
- # --output ==> output= (non-standard)
- args={}
- case options[:output]
- when nil
- when "json","xml","text","csv","tsv"
- args['output'] = options[:output]
- when :json,:xml,:text,:csv,:tsv
- args['output'] = options[:output].to_s
- else
- warn_exit "Unrecognized output type: "+options[:output],2
- end
-
- # --accept
- # options[:accept]
-
- print "SPARQL #{service}\n" if $verbose
- #args={"output"=>"text"}
- SPARQL_query(service, query, query_file, usePOST, args)
- exit(0)
-end
-
-## -------- SPARQL Update
-
-# Update sent as a WWW form.
-def SPARQL_update_by_form(service, update, args2={})
- args = {}
- args.merge!(args2)
- headers={}
- headers.merge!($headers)
- # args? encode?
- body="update="+uri_escape(update)
- headers[$hContentType] = $mtWWWForm
- headers[$hContentLength] = body.length.to_s
- uri = URI.parse(service)
- execute_post_form(uri, headers, body)
-end
-
-# DRY - query form.
-def execute_post_form(uri, headers, body)
- request = Net::HTTP::Post.new(uri.request_uri)
- request.initialize_http_header(headers)
- request.body = body
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def SPARQL_update(service, update, args2={})
- args = {}
- args.merge!(args2)
- headers={}
- headers.merge!($headers)
- headers[$hContentType] = $mtSparqlUpdate
- uri = URI.parse(service)
- request = Net::HTTP::Post.new(uri.request_uri)
- request.initialize_http_header(headers)
- request.body = update
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def cmd_sparql_update(by_raw_post=true)
- # Share with cmd_sparql_query
- options={}
- optparse = OptionParser.new do |opts|
- opts.banner = "Usage: #{$cmd} [--file REQUEST] [--service URI] 'request' | @file"
- opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
- options[:service]=uri
- end
- opts.on('--update=FILE', '--file=FILE', 'Take update from a file') do |file|
- options[:file]=file
- end
- options[:verbose] = false
- opts.on( '-v', '--verbose', 'Verbose' ) do
- options[:verbose] = true
- end
- opts.on( '--version', 'Print version and exit' ) do
- print "#{SOH_NAME} #{SOH_VERSION}\n"
- exit
- end
- opts.on( '-h', '--help', 'Display this screen and exit' ) do
- puts opts
- exit
- end
- end
-
- begin optparse.parse!
- rescue OptionParser::InvalidArgument => e
- warn e
- exit
- end
-
- $verbose = options[:verbose]
- $print_http = $verbose
-
- service = options[:service]
- warn_exit 'No service specified. Required --service=URI',1 if service.nil?
-
- update=nil
- update_file=options[:file]
-
- if update_file.nil? && ARGV.size == 0
- then
- warn_exit 'No update specified.',1
- end
- if update_file.nil?
- update = ARGV.shift
- if update.match(/^@/)
- update_file = update[1..-1]
- update = nil
- end
- end
-
- print "SPARQL-Update #{service}\n" if $verbose
- args={}
-
- # Reads in the file :-(
- if update.nil?
- then
- update = open(update_file, 'rb'){|f| f.read}
- else
- update = string_or_file(update)
- end
-
- if by_raw_post
- SPARQL_update(service, update, args)
- else
- SPARQL_update_by_form(service, update, args)
- end
- exit(0)
-end
-
-## -------
-
-case $cmd
-when "s-http", "sparql-http", "soh"
- $banner="#{$cmd} [get|post|put|delete] datasetURI graph [file]"
- cmd_soh
-when "s-get", "s-head", "s-put", "s-delete", "s-post"
-
- case $cmd
- when "s-get", "s-head", "s-delete"
- $banner="#{$cmd} datasetURI graph"
- when "s-put", "s-post"
- $banner="#{$cmd} datasetURI graph file"
- end
- cmd2 = $cmd.sub(/^s-/, '').upcase
- cmd_soh cmd2
-
-when "s-query", "sparql-query"
- cmd_sparql_query
-when "s-update", "sparql-update"
- cmd_sparql_update true
-when "s-update-form", "sparql-update-form"
- cmd_sparql_update false
-else
- warn_exit "Unknown: "+$cmd, 1
-end
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/jena-fuseki-dist/bin/s-query
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-dist/bin/s-query b/jena-fuseki2/jena-fuseki-dist/bin/s-query
deleted file mode 100755
index 0e3a807..0000000
--- a/jena-fuseki2/jena-fuseki-dist/bin/s-query
+++ /dev/null
@@ -1,707 +0,0 @@
-#!/usr/bin/env ruby
-# -*- coding: utf-8 -*-
-
-# 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.
-
-# SPARQL HTTP Update, client.
-
-require 'optparse'
-require 'net/http'
-require 'uri'
-require 'cgi'
-require 'pp'
-require 'ostruct'
-
-# ToDo
-# Allow a choice of media type for GET
-# --accept "content-type" (and abbreviations)
-# --header "Add:this"
-# --user, --password
-# Basic authentication: request.basic_auth("username", "password")
-# Follow redirects => 301: puts response["location"] # All headers are lowercase?
-
-SOH_NAME="SOH"
-SOH_VERSION="0.0.0"
-
-$proxy = ENV['http_proxy'] ? URI.parse(ENV['http_proxy']) : OpenStruct.new
-
-# What about direct naming?
-
-# Names
-$mtTurtle = 'text/turtle;charset=utf-8'
-$mtRDF = 'application/rdf+xml'
-$mtText = 'text/plain'
-$mtNQuads = 'text/n-quads'
-$mtTriG = 'application/trig'
-$mtSparqlResultsX = 'application/sparql-results+xml'
-$mtSparqlResultsJ = 'application/sparql-results+json'
-$mtAppJSON = 'application/json'
-$mtAppXML = 'application/xml'
-$mtSparqlResultsTSV = 'application/sparql-results+tsv'
-$mtSparqlResultsCSV = 'application/sparql-results+csv'
-$mtSparqlUpdate = 'application/sparql-update'
-$mtWWWForm = 'application/x-www-form-urlencoded'
-$mtSparqlQuery = "application/sparql-query" ;
-
-# Global media type table.
-$fileMediaTypes = {}
-$fileMediaTypes['ttl'] = $mtTurtle
-$fileMediaTypes['n3'] = 'text/n3; charset=utf-8'
-$fileMediaTypes['nt'] = $mtText
-$fileMediaTypes['rdf'] = $mtRDF
-$fileMediaTypes['owl'] = $mtRDF
-$fileMediaTypes['nq'] = $mtNQuads
-$fileMediaTypes['trig'] = $mtTriG
-
-# Global charset : no entry means "don't set"
-$charsetUTF8 = 'utf-8'
-$charset = {}
-$charset[$mtTurtle] = 'utf-8'
-$charset[$mtText] = 'ascii'
-$charset[$mtTriG] = 'utf-8'
-$charset[$mtNQuads] = 'ascii'
-
-# Headers
-
-$hContentType = 'Content-Type'
-# $hContentEncoding = 'Content-Encoding'
-$hContentLength = 'Content-Length'
-# $hContentLocation = 'Content-Location'
-# $hContentRange = 'Content-Range'
-
-$hAccept = 'Accept'
-$hAcceptCharset = 'Accept-Charset'
-$hAcceptEncoding = 'Accept-Encoding'
-$hAcceptRanges = 'Accept-Ranges'
-
-$headers = { "User-Agent" => "#{SOH_NAME}/Fuseki #{SOH_VERSION}"}
-$print_http = false
-
-# Default for GET
-# At least allow anythign (and hope!)
-$accept_rdf="#{$mtRDF};q=0.9 , #{$mtTurtle}"
-# For SPARQL query
-$accept_results="#{$mtSparqlResultsJ} , #{$mtSparqlResultsX};q=0.9 , #{$accept_rdf}"
-
-# Accept any in case of trouble.
-$accept_rdf="#{$accept_rdf} , */*;q=0.1"
-$accept_results="#{$accept_results} , */*;q=0.1"
-
-# The media type usually forces the charset.
-$accept_charset=nil
-
-## Who we are.
-## Two styles:
-## s-query .....
-## soh query .....
-
-$cmd = File.basename($0)
-if $cmd == 'soh'
-then
- $cmd = (ARGV.size == 0) ? 'soh' : ARGV.shift
-end
-
-if ! $cmd.start_with?('s-') && $cmd != 'soh'
- $cmd = 's-'+$cmd
-end
-
-## --------
-
-def GET(dataset, graph)
- print "GET #{dataset} #{graph}\n" if $verbose
- requestURI = target(dataset, graph)
- headers = {}
- headers.merge!($headers)
- headers[$hAccept] = $accept_rdf
- headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
- get_worker(requestURI, headers)
-end
-
-def get_worker(requestURI, headers)
- uri = URI.parse(requestURI)
- request = Net::HTTP::Get.new(uri.request_uri)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- response_print_body(uri, request)
-end
-
-def HEAD(dataset, graph)
- print "HEAD #{dataset} #{graph}\n" if $verbose
- requestURI = target(dataset, graph)
- headers = {}
- headers.merge!($headers)
- headers[$hAccept] = $accept_rdf
- headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
- uri = URI.parse(requestURI)
- request = Net::HTTP::Head.new(uri.request_uri)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def PUT(dataset, graph, file)
- print "PUT #{dataset} #{graph} #{file}\n" if $verbose
- send_body(dataset, graph, file, Net::HTTP::Put)
-end
-
-def POST(dataset, graph, file)
- print "POST #{dataset} #{graph} #{file}\n" if $verbose
- send_body(dataset, graph, file, Net::HTTP::Post)
-end
-
-def DELETE(dataset, graph)
- print "DELETE #{dataset} #{graph}\n" if $verbose
- requestURI = target(dataset, graph)
- uri = URI.parse(requestURI)
- request = Net::HTTP::Delete.new(uri.request_uri)
- headers = {}
- headers.merge!($headers)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def uri_escape(string)
- CGI.escape(string)
-end
-
-def target(dataset, graph)
- return dataset+"?default" if graph == "default"
- return dataset+"?graph="+uri_escape(graph)
-end
-
-def send_body(dataset, graph, file, method)
- mt = content_type(file)
- headers = {}
- headers.merge!($headers)
- headers[$hContentType] = mt
- headers[$hContentLength] = File.size(file).to_s
- ## p headers
-
- requestURI = target(dataset, graph)
- uri = URI.parse(requestURI)
-
- request = method.new(uri.request_uri)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- request.body_stream = File.open(file)
- response_no_body(uri, request)
-end
-
-def response_no_body(uri, request)
- http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
- http.read_timeout = nil
- # check we can connect.
- begin http.start
- rescue Exception => e
- # puts e.message
- #puts e.backtrace.inspect
- warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
- end
- response = http.request(request)
- print_http_response(response)
- case response
- when Net::HTTPSuccess, Net::HTTPRedirection
- # OK
- when Net::HTTPNotFound
- warn_exit "404 Not found: #{uri}", 9
- #print response.body
- else
- warn_exit "#{response.code} #{response.message} #{uri}", 9
- # Unreachable
- response.error!
- end
- # NO BODY IN RESPONSE
-end
-
-def response_print_body(uri, request)
- http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
- http.read_timeout = nil
- # check we can connect.
- begin http.start
- rescue => e
- #puts e.backtrace.inspect
- #print e.class
- warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
- end
-
- # Add a blank line if headers were output.
- print "\n" if $http_print ;
-
- begin
- response = http.request(request) { |res|
- print_http_response(res)
- #puts res.code
- res.read_body do |segment|
- print segment
- end
- }
- case response
- when Net::HTTPSuccess, Net::HTTPRedirection
- # OK
- when Net::HTTPNotFound
- warn_exit "404 Not found: #{uri}", 9
- #print response.body
- else
- warn_exit "#{response.code}: #{uri}", 9
- # Unreachable
- response.error!
- end
- rescue EOFError => e
- warn_exit "IO Error: "+e.message, 3
- end
-end
-
-def print_http_request(uri, request)
- return unless $print_http
- #print "Request\n"
- print request.method," ",uri, "\n"
- print_headers(" ",request)
-end
-
-def print_http_response(response)
- return unless $print_http
- #print "Response\n"
- print response.code, " ", response.message, "\n"
- print_headers(" ",response)
-end
-
-def print_headers(marker, headers)
- headers.each do |k,v|
- k = k.split('-').map{|w| w.capitalize}.join('-')+':'
- printf "%s%-20s %s\n",marker,k,v
- end
-end
-
-def content_type(file)
- file =~ /\.([^.]*)$/
- ext = $1
- mt = $fileMediaTypes[ext]
- cs = $charset[mt]
- mt = mt+';charset='+cs if ! cs.nil?
- return mt
-end
-
-def charset(content_type)
- return $charset[content_type]
-end
-
-def warn_exit(msg, rc)
- warn msg
- exit rc ;
-end
-
-def parseURI(uri_string)
- begin
- return URI.parse(uri_string).to_s
- rescue URI::InvalidURIError => err
- warn_exit "Bad URI: <#{uri_string}>", 2
- end
-end
-
-## ---- Command
-
-def cmd_soh(command=nil)
- ## Command line
- options = {}
- optparse = OptionParser.new do |opts|
- # Set a banner, displayed at the top
- # of the help screen.
- case $cmd
- when "s-http", "sparql-http", "soh"
- banner="$cmd [get|post|put|delete] datasetURI graph [file]"
- when "s-get", "s-head", "s-delete"
- banner="$cmd datasetURI graph"
- end
-
- opts.banner = $banner
- # Define the options, and what they do
-
- options[:verbose] = false
- opts.on( '-v', '--verbose', 'Verbose' ) do
- options[:verbose] = true
- end
-
- options[:version] = false
- opts.on( '--version', 'Print version and exit' ) do
- print "#{SOH_NAME} #{SOH_VERSION}\n"
- exit
- end
-
- # This displays the help screen, all programs are
- # assumed to have this option.
- opts.on( '-h', '--help', 'Display this screen and exit' ) do
- puts opts
- exit
- end
- end
-
- begin optparse.parse!
- rescue OptionParser::InvalidArgument => e
- warn e
- exit
- end
-
- $verbose = options[:verbose]
- $print_http = $verbose
-
- if command.nil?
- if ARGV.size == 0
- warn "No command given: expected one of 'get', 'put', 'post', 'delete', 'query' or 'update'"
- exit 1
- end
- cmdPrint=ARGV.shift
- command=cmdPrint.upcase
- else
- cmdPrint=command
- end
-
- case command
- when "HEAD", "GET", "DELETE"
- requiredFile=false
- when "PUT", "POST"
- requiredFile=true
- when "QUERY"
- cmd_sparql_query
- when "UPDATE"
- cmd_sparql_update
- else
- warn_exit "Unknown command: #{command}", 2
- end
-
- if requiredFile
- then
- if ARGV.size != 3
- warn_exit "Required: dataset URI, graph URI (or 'default') and file", 1
- end
- else
- if ARGV.size != 2
- warn_exit "Required: dataset URI and graph URI (or 'default')", 1
- end
- end
-
- dataset=parseURI(ARGV.shift)
- # Relative URI?
- graph=parseURI(ARGV.shift)
- file=""
- if requiredFile
- then
- file = ARGV.shift if requiredFile
- if ! File.exist?(file)
- warn_exit "No such file: "+file, 3
- end
- if File.directory?(file)
- warn_exit "File is a directory: "+file, 3
- end
- end
-
- case command
- when "GET"
- GET(dataset, graph)
- when "HEAD"
- HEAD(dataset, graph)
- when "PUT"
- PUT(dataset, graph, file)
- when "DELETE"
- DELETE(dataset, graph)
- when "POST"
- POST(dataset, graph, file)
- else
- warn_exit "Internal error: Unknown command: #{cmd}", 2
- end
- exit 0
-end
-
-## --------
-def string_or_file(arg)
- return arg if ! arg.match(/^@/)
- a=(arg[1..-1])
- open(a, 'rb'){|f| f.read}
-end
-
-## -------- SPARQL Query
-
-## Choose method
-def SPARQL_query(service, query, query_file, forcePOST=false, args2={})
- if ! query_file.nil?
- query = open(query_file, 'rb'){|f| f.read}
- end
- if forcePOST || query.length >= 2*1024
- SPARQL_query_POST(service, query, args2)
- else
- SPARQL_query_GET(service, query, args2)
- end
-end
-
-## By GET
-
-def SPARQL_query_GET(service, query, args2)
- args = { "query" => query }
- args.merge!(args2)
- qs=args.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
- action="#{service}?#{qs}"
- headers={}
- headers.merge!($headers)
- headers[$hAccept]=$accept_results
- get_worker(action, headers)
-end
-
-## By POST
-
-def SPARQL_query_POST(service, query, args2)
- # DRY - body/no body for each of request and response.
- post_params={ "query" => query }
- post_params.merge!(args2)
- uri = URI.parse(service)
- headers={}
- headers.merge!($headers)
- headers[$hAccept]=$accept_results
- execute_post_form_body(uri, headers, post_params)
-end
-
-def execute_post_form_body(uri, headers, post_params)
- request = Net::HTTP::Post.new(uri.request_uri)
- qs=post_params.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
- headers[$hContentType] = $mtWWWForm
- headers[$hContentLength] = qs.length.to_s
- request.initialize_http_header(headers)
- request.body = qs
- print_http_request(uri, request)
- response_print_body(uri, request)
-end
-
-# Usage: -v --help --file= --query=
-def cmd_sparql_query
- options={}
- optparse = OptionParser.new do |opts|
- opts.banner = "Usage: #{$cmd} [--query QUERY] [--service URI] [--post] 'query' | @file"
- opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
- options[:service]=uri
- end
- opts.on('--query=FILE','--file=FILE', 'Take query from a file') do |file|
- options[:file]=file
- end
- opts.on('--output=TYPE', [:json,:xml,:text,:csv,:tsv],
- 'Set the output argument') do |type|
- options[:output]=type
- end
- opts.on('--accept=TYPE', [:json,:xml,:text,:csv,:tsv],
- 'Set the accept header type') do |type|
- options[:accept]=type
- end
- options[:verbose] = false
- opts.on( '--post', 'Force use of POST' ) do
- options[:post] = true
- end
- opts.on( '-v', '--verbose', 'Verbose' ) do
- options[:verbose] = true
- end
- opts.on( '--version', 'Print version and exit' ) do
- print "#{SOH_NAME} #{SOH_VERSION}\n"
- exit
- end
- opts.on( '-h', '--help', 'Display this screen and exit' ) do
- puts opts
- exit
- end
- end
-
- begin optparse.parse!
- rescue OptionParser::InvalidArgument, OptionParser::InvalidOption => e
- warn e
- exit 1
- end
-
- $verbose = options[:verbose]
- $print_http = $verbose
- usePOST = options[:post]
-
- service = options[:service]
- warn_exit 'No service specified. Required --service=URI',1 if service.nil?
-
- # Query
- query=nil
- query_file=options[:file]
- if query_file.nil? && ARGV.size == 0
- then
- warn_exit 'No query specified.',1
- end
- if query_file.nil?
- query = ARGV.shift
- if query.match(/^@/)
- query_file = query[1..-1]
- query = nil
- end
- end
-
- # --output ==> output= (non-standard)
- args={}
- case options[:output]
- when nil
- when "json","xml","text","csv","tsv"
- args['output'] = options[:output]
- when :json,:xml,:text,:csv,:tsv
- args['output'] = options[:output].to_s
- else
- warn_exit "Unrecognized output type: "+options[:output],2
- end
-
- # --accept
- # options[:accept]
-
- print "SPARQL #{service}\n" if $verbose
- #args={"output"=>"text"}
- SPARQL_query(service, query, query_file, usePOST, args)
- exit(0)
-end
-
-## -------- SPARQL Update
-
-# Update sent as a WWW form.
-def SPARQL_update_by_form(service, update, args2={})
- args = {}
- args.merge!(args2)
- headers={}
- headers.merge!($headers)
- # args? encode?
- body="update="+uri_escape(update)
- headers[$hContentType] = $mtWWWForm
- headers[$hContentLength] = body.length.to_s
- uri = URI.parse(service)
- execute_post_form(uri, headers, body)
-end
-
-# DRY - query form.
-def execute_post_form(uri, headers, body)
- request = Net::HTTP::Post.new(uri.request_uri)
- request.initialize_http_header(headers)
- request.body = body
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def SPARQL_update(service, update, args2={})
- args = {}
- args.merge!(args2)
- headers={}
- headers.merge!($headers)
- headers[$hContentType] = $mtSparqlUpdate
- uri = URI.parse(service)
- request = Net::HTTP::Post.new(uri.request_uri)
- request.initialize_http_header(headers)
- request.body = update
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def cmd_sparql_update(by_raw_post=true)
- # Share with cmd_sparql_query
- options={}
- optparse = OptionParser.new do |opts|
- opts.banner = "Usage: #{$cmd} [--file REQUEST] [--service URI] 'request' | @file"
- opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
- options[:service]=uri
- end
- opts.on('--update=FILE', '--file=FILE', 'Take update from a file') do |file|
- options[:file]=file
- end
- options[:verbose] = false
- opts.on( '-v', '--verbose', 'Verbose' ) do
- options[:verbose] = true
- end
- opts.on( '--version', 'Print version and exit' ) do
- print "#{SOH_NAME} #{SOH_VERSION}\n"
- exit
- end
- opts.on( '-h', '--help', 'Display this screen and exit' ) do
- puts opts
- exit
- end
- end
-
- begin optparse.parse!
- rescue OptionParser::InvalidArgument => e
- warn e
- exit
- end
-
- $verbose = options[:verbose]
- $print_http = $verbose
-
- service = options[:service]
- warn_exit 'No service specified. Required --service=URI',1 if service.nil?
-
- update=nil
- update_file=options[:file]
-
- if update_file.nil? && ARGV.size == 0
- then
- warn_exit 'No update specified.',1
- end
- if update_file.nil?
- update = ARGV.shift
- if update.match(/^@/)
- update_file = update[1..-1]
- update = nil
- end
- end
-
- print "SPARQL-Update #{service}\n" if $verbose
- args={}
-
- # Reads in the file :-(
- if update.nil?
- then
- update = open(update_file, 'rb'){|f| f.read}
- else
- update = string_or_file(update)
- end
-
- if by_raw_post
- SPARQL_update(service, update, args)
- else
- SPARQL_update_by_form(service, update, args)
- end
- exit(0)
-end
-
-## -------
-
-case $cmd
-when "s-http", "sparql-http", "soh"
- $banner="#{$cmd} [get|post|put|delete] datasetURI graph [file]"
- cmd_soh
-when "s-get", "s-head", "s-put", "s-delete", "s-post"
-
- case $cmd
- when "s-get", "s-head", "s-delete"
- $banner="#{$cmd} datasetURI graph"
- when "s-put", "s-post"
- $banner="#{$cmd} datasetURI graph file"
- end
- cmd2 = $cmd.sub(/^s-/, '').upcase
- cmd_soh cmd2
-
-when "s-query", "sparql-query"
- cmd_sparql_query
-when "s-update", "sparql-update"
- cmd_sparql_update true
-when "s-update-form", "sparql-update-form"
- cmd_sparql_update false
-else
- warn_exit "Unknown: "+$cmd, 1
-end
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/jena-fuseki-dist/bin/s-update
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-dist/bin/s-update b/jena-fuseki2/jena-fuseki-dist/bin/s-update
deleted file mode 100755
index 0e3a807..0000000
--- a/jena-fuseki2/jena-fuseki-dist/bin/s-update
+++ /dev/null
@@ -1,707 +0,0 @@
-#!/usr/bin/env ruby
-# -*- coding: utf-8 -*-
-
-# 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.
-
-# SPARQL HTTP Update, client.
-
-require 'optparse'
-require 'net/http'
-require 'uri'
-require 'cgi'
-require 'pp'
-require 'ostruct'
-
-# ToDo
-# Allow a choice of media type for GET
-# --accept "content-type" (and abbreviations)
-# --header "Add:this"
-# --user, --password
-# Basic authentication: request.basic_auth("username", "password")
-# Follow redirects => 301: puts response["location"] # All headers are lowercase?
-
-SOH_NAME="SOH"
-SOH_VERSION="0.0.0"
-
-$proxy = ENV['http_proxy'] ? URI.parse(ENV['http_proxy']) : OpenStruct.new
-
-# What about direct naming?
-
-# Names
-$mtTurtle = 'text/turtle;charset=utf-8'
-$mtRDF = 'application/rdf+xml'
-$mtText = 'text/plain'
-$mtNQuads = 'text/n-quads'
-$mtTriG = 'application/trig'
-$mtSparqlResultsX = 'application/sparql-results+xml'
-$mtSparqlResultsJ = 'application/sparql-results+json'
-$mtAppJSON = 'application/json'
-$mtAppXML = 'application/xml'
-$mtSparqlResultsTSV = 'application/sparql-results+tsv'
-$mtSparqlResultsCSV = 'application/sparql-results+csv'
-$mtSparqlUpdate = 'application/sparql-update'
-$mtWWWForm = 'application/x-www-form-urlencoded'
-$mtSparqlQuery = "application/sparql-query" ;
-
-# Global media type table.
-$fileMediaTypes = {}
-$fileMediaTypes['ttl'] = $mtTurtle
-$fileMediaTypes['n3'] = 'text/n3; charset=utf-8'
-$fileMediaTypes['nt'] = $mtText
-$fileMediaTypes['rdf'] = $mtRDF
-$fileMediaTypes['owl'] = $mtRDF
-$fileMediaTypes['nq'] = $mtNQuads
-$fileMediaTypes['trig'] = $mtTriG
-
-# Global charset : no entry means "don't set"
-$charsetUTF8 = 'utf-8'
-$charset = {}
-$charset[$mtTurtle] = 'utf-8'
-$charset[$mtText] = 'ascii'
-$charset[$mtTriG] = 'utf-8'
-$charset[$mtNQuads] = 'ascii'
-
-# Headers
-
-$hContentType = 'Content-Type'
-# $hContentEncoding = 'Content-Encoding'
-$hContentLength = 'Content-Length'
-# $hContentLocation = 'Content-Location'
-# $hContentRange = 'Content-Range'
-
-$hAccept = 'Accept'
-$hAcceptCharset = 'Accept-Charset'
-$hAcceptEncoding = 'Accept-Encoding'
-$hAcceptRanges = 'Accept-Ranges'
-
-$headers = { "User-Agent" => "#{SOH_NAME}/Fuseki #{SOH_VERSION}"}
-$print_http = false
-
-# Default for GET
-# At least allow anythign (and hope!)
-$accept_rdf="#{$mtRDF};q=0.9 , #{$mtTurtle}"
-# For SPARQL query
-$accept_results="#{$mtSparqlResultsJ} , #{$mtSparqlResultsX};q=0.9 , #{$accept_rdf}"
-
-# Accept any in case of trouble.
-$accept_rdf="#{$accept_rdf} , */*;q=0.1"
-$accept_results="#{$accept_results} , */*;q=0.1"
-
-# The media type usually forces the charset.
-$accept_charset=nil
-
-## Who we are.
-## Two styles:
-## s-query .....
-## soh query .....
-
-$cmd = File.basename($0)
-if $cmd == 'soh'
-then
- $cmd = (ARGV.size == 0) ? 'soh' : ARGV.shift
-end
-
-if ! $cmd.start_with?('s-') && $cmd != 'soh'
- $cmd = 's-'+$cmd
-end
-
-## --------
-
-def GET(dataset, graph)
- print "GET #{dataset} #{graph}\n" if $verbose
- requestURI = target(dataset, graph)
- headers = {}
- headers.merge!($headers)
- headers[$hAccept] = $accept_rdf
- headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
- get_worker(requestURI, headers)
-end
-
-def get_worker(requestURI, headers)
- uri = URI.parse(requestURI)
- request = Net::HTTP::Get.new(uri.request_uri)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- response_print_body(uri, request)
-end
-
-def HEAD(dataset, graph)
- print "HEAD #{dataset} #{graph}\n" if $verbose
- requestURI = target(dataset, graph)
- headers = {}
- headers.merge!($headers)
- headers[$hAccept] = $accept_rdf
- headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
- uri = URI.parse(requestURI)
- request = Net::HTTP::Head.new(uri.request_uri)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def PUT(dataset, graph, file)
- print "PUT #{dataset} #{graph} #{file}\n" if $verbose
- send_body(dataset, graph, file, Net::HTTP::Put)
-end
-
-def POST(dataset, graph, file)
- print "POST #{dataset} #{graph} #{file}\n" if $verbose
- send_body(dataset, graph, file, Net::HTTP::Post)
-end
-
-def DELETE(dataset, graph)
- print "DELETE #{dataset} #{graph}\n" if $verbose
- requestURI = target(dataset, graph)
- uri = URI.parse(requestURI)
- request = Net::HTTP::Delete.new(uri.request_uri)
- headers = {}
- headers.merge!($headers)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def uri_escape(string)
- CGI.escape(string)
-end
-
-def target(dataset, graph)
- return dataset+"?default" if graph == "default"
- return dataset+"?graph="+uri_escape(graph)
-end
-
-def send_body(dataset, graph, file, method)
- mt = content_type(file)
- headers = {}
- headers.merge!($headers)
- headers[$hContentType] = mt
- headers[$hContentLength] = File.size(file).to_s
- ## p headers
-
- requestURI = target(dataset, graph)
- uri = URI.parse(requestURI)
-
- request = method.new(uri.request_uri)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- request.body_stream = File.open(file)
- response_no_body(uri, request)
-end
-
-def response_no_body(uri, request)
- http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
- http.read_timeout = nil
- # check we can connect.
- begin http.start
- rescue Exception => e
- # puts e.message
- #puts e.backtrace.inspect
- warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
- end
- response = http.request(request)
- print_http_response(response)
- case response
- when Net::HTTPSuccess, Net::HTTPRedirection
- # OK
- when Net::HTTPNotFound
- warn_exit "404 Not found: #{uri}", 9
- #print response.body
- else
- warn_exit "#{response.code} #{response.message} #{uri}", 9
- # Unreachable
- response.error!
- end
- # NO BODY IN RESPONSE
-end
-
-def response_print_body(uri, request)
- http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
- http.read_timeout = nil
- # check we can connect.
- begin http.start
- rescue => e
- #puts e.backtrace.inspect
- #print e.class
- warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
- end
-
- # Add a blank line if headers were output.
- print "\n" if $http_print ;
-
- begin
- response = http.request(request) { |res|
- print_http_response(res)
- #puts res.code
- res.read_body do |segment|
- print segment
- end
- }
- case response
- when Net::HTTPSuccess, Net::HTTPRedirection
- # OK
- when Net::HTTPNotFound
- warn_exit "404 Not found: #{uri}", 9
- #print response.body
- else
- warn_exit "#{response.code}: #{uri}", 9
- # Unreachable
- response.error!
- end
- rescue EOFError => e
- warn_exit "IO Error: "+e.message, 3
- end
-end
-
-def print_http_request(uri, request)
- return unless $print_http
- #print "Request\n"
- print request.method," ",uri, "\n"
- print_headers(" ",request)
-end
-
-def print_http_response(response)
- return unless $print_http
- #print "Response\n"
- print response.code, " ", response.message, "\n"
- print_headers(" ",response)
-end
-
-def print_headers(marker, headers)
- headers.each do |k,v|
- k = k.split('-').map{|w| w.capitalize}.join('-')+':'
- printf "%s%-20s %s\n",marker,k,v
- end
-end
-
-def content_type(file)
- file =~ /\.([^.]*)$/
- ext = $1
- mt = $fileMediaTypes[ext]
- cs = $charset[mt]
- mt = mt+';charset='+cs if ! cs.nil?
- return mt
-end
-
-def charset(content_type)
- return $charset[content_type]
-end
-
-def warn_exit(msg, rc)
- warn msg
- exit rc ;
-end
-
-def parseURI(uri_string)
- begin
- return URI.parse(uri_string).to_s
- rescue URI::InvalidURIError => err
- warn_exit "Bad URI: <#{uri_string}>", 2
- end
-end
-
-## ---- Command
-
-def cmd_soh(command=nil)
- ## Command line
- options = {}
- optparse = OptionParser.new do |opts|
- # Set a banner, displayed at the top
- # of the help screen.
- case $cmd
- when "s-http", "sparql-http", "soh"
- banner="$cmd [get|post|put|delete] datasetURI graph [file]"
- when "s-get", "s-head", "s-delete"
- banner="$cmd datasetURI graph"
- end
-
- opts.banner = $banner
- # Define the options, and what they do
-
- options[:verbose] = false
- opts.on( '-v', '--verbose', 'Verbose' ) do
- options[:verbose] = true
- end
-
- options[:version] = false
- opts.on( '--version', 'Print version and exit' ) do
- print "#{SOH_NAME} #{SOH_VERSION}\n"
- exit
- end
-
- # This displays the help screen, all programs are
- # assumed to have this option.
- opts.on( '-h', '--help', 'Display this screen and exit' ) do
- puts opts
- exit
- end
- end
-
- begin optparse.parse!
- rescue OptionParser::InvalidArgument => e
- warn e
- exit
- end
-
- $verbose = options[:verbose]
- $print_http = $verbose
-
- if command.nil?
- if ARGV.size == 0
- warn "No command given: expected one of 'get', 'put', 'post', 'delete', 'query' or 'update'"
- exit 1
- end
- cmdPrint=ARGV.shift
- command=cmdPrint.upcase
- else
- cmdPrint=command
- end
-
- case command
- when "HEAD", "GET", "DELETE"
- requiredFile=false
- when "PUT", "POST"
- requiredFile=true
- when "QUERY"
- cmd_sparql_query
- when "UPDATE"
- cmd_sparql_update
- else
- warn_exit "Unknown command: #{command}", 2
- end
-
- if requiredFile
- then
- if ARGV.size != 3
- warn_exit "Required: dataset URI, graph URI (or 'default') and file", 1
- end
- else
- if ARGV.size != 2
- warn_exit "Required: dataset URI and graph URI (or 'default')", 1
- end
- end
-
- dataset=parseURI(ARGV.shift)
- # Relative URI?
- graph=parseURI(ARGV.shift)
- file=""
- if requiredFile
- then
- file = ARGV.shift if requiredFile
- if ! File.exist?(file)
- warn_exit "No such file: "+file, 3
- end
- if File.directory?(file)
- warn_exit "File is a directory: "+file, 3
- end
- end
-
- case command
- when "GET"
- GET(dataset, graph)
- when "HEAD"
- HEAD(dataset, graph)
- when "PUT"
- PUT(dataset, graph, file)
- when "DELETE"
- DELETE(dataset, graph)
- when "POST"
- POST(dataset, graph, file)
- else
- warn_exit "Internal error: Unknown command: #{cmd}", 2
- end
- exit 0
-end
-
-## --------
-def string_or_file(arg)
- return arg if ! arg.match(/^@/)
- a=(arg[1..-1])
- open(a, 'rb'){|f| f.read}
-end
-
-## -------- SPARQL Query
-
-## Choose method
-def SPARQL_query(service, query, query_file, forcePOST=false, args2={})
- if ! query_file.nil?
- query = open(query_file, 'rb'){|f| f.read}
- end
- if forcePOST || query.length >= 2*1024
- SPARQL_query_POST(service, query, args2)
- else
- SPARQL_query_GET(service, query, args2)
- end
-end
-
-## By GET
-
-def SPARQL_query_GET(service, query, args2)
- args = { "query" => query }
- args.merge!(args2)
- qs=args.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
- action="#{service}?#{qs}"
- headers={}
- headers.merge!($headers)
- headers[$hAccept]=$accept_results
- get_worker(action, headers)
-end
-
-## By POST
-
-def SPARQL_query_POST(service, query, args2)
- # DRY - body/no body for each of request and response.
- post_params={ "query" => query }
- post_params.merge!(args2)
- uri = URI.parse(service)
- headers={}
- headers.merge!($headers)
- headers[$hAccept]=$accept_results
- execute_post_form_body(uri, headers, post_params)
-end
-
-def execute_post_form_body(uri, headers, post_params)
- request = Net::HTTP::Post.new(uri.request_uri)
- qs=post_params.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
- headers[$hContentType] = $mtWWWForm
- headers[$hContentLength] = qs.length.to_s
- request.initialize_http_header(headers)
- request.body = qs
- print_http_request(uri, request)
- response_print_body(uri, request)
-end
-
-# Usage: -v --help --file= --query=
-def cmd_sparql_query
- options={}
- optparse = OptionParser.new do |opts|
- opts.banner = "Usage: #{$cmd} [--query QUERY] [--service URI] [--post] 'query' | @file"
- opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
- options[:service]=uri
- end
- opts.on('--query=FILE','--file=FILE', 'Take query from a file') do |file|
- options[:file]=file
- end
- opts.on('--output=TYPE', [:json,:xml,:text,:csv,:tsv],
- 'Set the output argument') do |type|
- options[:output]=type
- end
- opts.on('--accept=TYPE', [:json,:xml,:text,:csv,:tsv],
- 'Set the accept header type') do |type|
- options[:accept]=type
- end
- options[:verbose] = false
- opts.on( '--post', 'Force use of POST' ) do
- options[:post] = true
- end
- opts.on( '-v', '--verbose', 'Verbose' ) do
- options[:verbose] = true
- end
- opts.on( '--version', 'Print version and exit' ) do
- print "#{SOH_NAME} #{SOH_VERSION}\n"
- exit
- end
- opts.on( '-h', '--help', 'Display this screen and exit' ) do
- puts opts
- exit
- end
- end
-
- begin optparse.parse!
- rescue OptionParser::InvalidArgument, OptionParser::InvalidOption => e
- warn e
- exit 1
- end
-
- $verbose = options[:verbose]
- $print_http = $verbose
- usePOST = options[:post]
-
- service = options[:service]
- warn_exit 'No service specified. Required --service=URI',1 if service.nil?
-
- # Query
- query=nil
- query_file=options[:file]
- if query_file.nil? && ARGV.size == 0
- then
- warn_exit 'No query specified.',1
- end
- if query_file.nil?
- query = ARGV.shift
- if query.match(/^@/)
- query_file = query[1..-1]
- query = nil
- end
- end
-
- # --output ==> output= (non-standard)
- args={}
- case options[:output]
- when nil
- when "json","xml","text","csv","tsv"
- args['output'] = options[:output]
- when :json,:xml,:text,:csv,:tsv
- args['output'] = options[:output].to_s
- else
- warn_exit "Unrecognized output type: "+options[:output],2
- end
-
- # --accept
- # options[:accept]
-
- print "SPARQL #{service}\n" if $verbose
- #args={"output"=>"text"}
- SPARQL_query(service, query, query_file, usePOST, args)
- exit(0)
-end
-
-## -------- SPARQL Update
-
-# Update sent as a WWW form.
-def SPARQL_update_by_form(service, update, args2={})
- args = {}
- args.merge!(args2)
- headers={}
- headers.merge!($headers)
- # args? encode?
- body="update="+uri_escape(update)
- headers[$hContentType] = $mtWWWForm
- headers[$hContentLength] = body.length.to_s
- uri = URI.parse(service)
- execute_post_form(uri, headers, body)
-end
-
-# DRY - query form.
-def execute_post_form(uri, headers, body)
- request = Net::HTTP::Post.new(uri.request_uri)
- request.initialize_http_header(headers)
- request.body = body
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def SPARQL_update(service, update, args2={})
- args = {}
- args.merge!(args2)
- headers={}
- headers.merge!($headers)
- headers[$hContentType] = $mtSparqlUpdate
- uri = URI.parse(service)
- request = Net::HTTP::Post.new(uri.request_uri)
- request.initialize_http_header(headers)
- request.body = update
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def cmd_sparql_update(by_raw_post=true)
- # Share with cmd_sparql_query
- options={}
- optparse = OptionParser.new do |opts|
- opts.banner = "Usage: #{$cmd} [--file REQUEST] [--service URI] 'request' | @file"
- opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
- options[:service]=uri
- end
- opts.on('--update=FILE', '--file=FILE', 'Take update from a file') do |file|
- options[:file]=file
- end
- options[:verbose] = false
- opts.on( '-v', '--verbose', 'Verbose' ) do
- options[:verbose] = true
- end
- opts.on( '--version', 'Print version and exit' ) do
- print "#{SOH_NAME} #{SOH_VERSION}\n"
- exit
- end
- opts.on( '-h', '--help', 'Display this screen and exit' ) do
- puts opts
- exit
- end
- end
-
- begin optparse.parse!
- rescue OptionParser::InvalidArgument => e
- warn e
- exit
- end
-
- $verbose = options[:verbose]
- $print_http = $verbose
-
- service = options[:service]
- warn_exit 'No service specified. Required --service=URI',1 if service.nil?
-
- update=nil
- update_file=options[:file]
-
- if update_file.nil? && ARGV.size == 0
- then
- warn_exit 'No update specified.',1
- end
- if update_file.nil?
- update = ARGV.shift
- if update.match(/^@/)
- update_file = update[1..-1]
- update = nil
- end
- end
-
- print "SPARQL-Update #{service}\n" if $verbose
- args={}
-
- # Reads in the file :-(
- if update.nil?
- then
- update = open(update_file, 'rb'){|f| f.read}
- else
- update = string_or_file(update)
- end
-
- if by_raw_post
- SPARQL_update(service, update, args)
- else
- SPARQL_update_by_form(service, update, args)
- end
- exit(0)
-end
-
-## -------
-
-case $cmd
-when "s-http", "sparql-http", "soh"
- $banner="#{$cmd} [get|post|put|delete] datasetURI graph [file]"
- cmd_soh
-when "s-get", "s-head", "s-put", "s-delete", "s-post"
-
- case $cmd
- when "s-get", "s-head", "s-delete"
- $banner="#{$cmd} datasetURI graph"
- when "s-put", "s-post"
- $banner="#{$cmd} datasetURI graph file"
- end
- cmd2 = $cmd.sub(/^s-/, '').upcase
- cmd_soh cmd2
-
-when "s-query", "sparql-query"
- cmd_sparql_query
-when "s-update", "sparql-update"
- cmd_sparql_update true
-when "s-update-form", "sparql-update-form"
- cmd_sparql_update false
-else
- warn_exit "Unknown: "+$cmd, 1
-end
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/jena-fuseki-dist/bin/s-update-form
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-dist/bin/s-update-form b/jena-fuseki2/jena-fuseki-dist/bin/s-update-form
deleted file mode 100755
index 0e3a807..0000000
--- a/jena-fuseki2/jena-fuseki-dist/bin/s-update-form
+++ /dev/null
@@ -1,707 +0,0 @@
-#!/usr/bin/env ruby
-# -*- coding: utf-8 -*-
-
-# 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.
-
-# SPARQL HTTP Update, client.
-
-require 'optparse'
-require 'net/http'
-require 'uri'
-require 'cgi'
-require 'pp'
-require 'ostruct'
-
-# ToDo
-# Allow a choice of media type for GET
-# --accept "content-type" (and abbreviations)
-# --header "Add:this"
-# --user, --password
-# Basic authentication: request.basic_auth("username", "password")
-# Follow redirects => 301: puts response["location"] # All headers are lowercase?
-
-SOH_NAME="SOH"
-SOH_VERSION="0.0.0"
-
-$proxy = ENV['http_proxy'] ? URI.parse(ENV['http_proxy']) : OpenStruct.new
-
-# What about direct naming?
-
-# Names
-$mtTurtle = 'text/turtle;charset=utf-8'
-$mtRDF = 'application/rdf+xml'
-$mtText = 'text/plain'
-$mtNQuads = 'text/n-quads'
-$mtTriG = 'application/trig'
-$mtSparqlResultsX = 'application/sparql-results+xml'
-$mtSparqlResultsJ = 'application/sparql-results+json'
-$mtAppJSON = 'application/json'
-$mtAppXML = 'application/xml'
-$mtSparqlResultsTSV = 'application/sparql-results+tsv'
-$mtSparqlResultsCSV = 'application/sparql-results+csv'
-$mtSparqlUpdate = 'application/sparql-update'
-$mtWWWForm = 'application/x-www-form-urlencoded'
-$mtSparqlQuery = "application/sparql-query" ;
-
-# Global media type table.
-$fileMediaTypes = {}
-$fileMediaTypes['ttl'] = $mtTurtle
-$fileMediaTypes['n3'] = 'text/n3; charset=utf-8'
-$fileMediaTypes['nt'] = $mtText
-$fileMediaTypes['rdf'] = $mtRDF
-$fileMediaTypes['owl'] = $mtRDF
-$fileMediaTypes['nq'] = $mtNQuads
-$fileMediaTypes['trig'] = $mtTriG
-
-# Global charset : no entry means "don't set"
-$charsetUTF8 = 'utf-8'
-$charset = {}
-$charset[$mtTurtle] = 'utf-8'
-$charset[$mtText] = 'ascii'
-$charset[$mtTriG] = 'utf-8'
-$charset[$mtNQuads] = 'ascii'
-
-# Headers
-
-$hContentType = 'Content-Type'
-# $hContentEncoding = 'Content-Encoding'
-$hContentLength = 'Content-Length'
-# $hContentLocation = 'Content-Location'
-# $hContentRange = 'Content-Range'
-
-$hAccept = 'Accept'
-$hAcceptCharset = 'Accept-Charset'
-$hAcceptEncoding = 'Accept-Encoding'
-$hAcceptRanges = 'Accept-Ranges'
-
-$headers = { "User-Agent" => "#{SOH_NAME}/Fuseki #{SOH_VERSION}"}
-$print_http = false
-
-# Default for GET
-# At least allow anythign (and hope!)
-$accept_rdf="#{$mtRDF};q=0.9 , #{$mtTurtle}"
-# For SPARQL query
-$accept_results="#{$mtSparqlResultsJ} , #{$mtSparqlResultsX};q=0.9 , #{$accept_rdf}"
-
-# Accept any in case of trouble.
-$accept_rdf="#{$accept_rdf} , */*;q=0.1"
-$accept_results="#{$accept_results} , */*;q=0.1"
-
-# The media type usually forces the charset.
-$accept_charset=nil
-
-## Who we are.
-## Two styles:
-## s-query .....
-## soh query .....
-
-$cmd = File.basename($0)
-if $cmd == 'soh'
-then
- $cmd = (ARGV.size == 0) ? 'soh' : ARGV.shift
-end
-
-if ! $cmd.start_with?('s-') && $cmd != 'soh'
- $cmd = 's-'+$cmd
-end
-
-## --------
-
-def GET(dataset, graph)
- print "GET #{dataset} #{graph}\n" if $verbose
- requestURI = target(dataset, graph)
- headers = {}
- headers.merge!($headers)
- headers[$hAccept] = $accept_rdf
- headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
- get_worker(requestURI, headers)
-end
-
-def get_worker(requestURI, headers)
- uri = URI.parse(requestURI)
- request = Net::HTTP::Get.new(uri.request_uri)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- response_print_body(uri, request)
-end
-
-def HEAD(dataset, graph)
- print "HEAD #{dataset} #{graph}\n" if $verbose
- requestURI = target(dataset, graph)
- headers = {}
- headers.merge!($headers)
- headers[$hAccept] = $accept_rdf
- headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
- uri = URI.parse(requestURI)
- request = Net::HTTP::Head.new(uri.request_uri)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def PUT(dataset, graph, file)
- print "PUT #{dataset} #{graph} #{file}\n" if $verbose
- send_body(dataset, graph, file, Net::HTTP::Put)
-end
-
-def POST(dataset, graph, file)
- print "POST #{dataset} #{graph} #{file}\n" if $verbose
- send_body(dataset, graph, file, Net::HTTP::Post)
-end
-
-def DELETE(dataset, graph)
- print "DELETE #{dataset} #{graph}\n" if $verbose
- requestURI = target(dataset, graph)
- uri = URI.parse(requestURI)
- request = Net::HTTP::Delete.new(uri.request_uri)
- headers = {}
- headers.merge!($headers)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def uri_escape(string)
- CGI.escape(string)
-end
-
-def target(dataset, graph)
- return dataset+"?default" if graph == "default"
- return dataset+"?graph="+uri_escape(graph)
-end
-
-def send_body(dataset, graph, file, method)
- mt = content_type(file)
- headers = {}
- headers.merge!($headers)
- headers[$hContentType] = mt
- headers[$hContentLength] = File.size(file).to_s
- ## p headers
-
- requestURI = target(dataset, graph)
- uri = URI.parse(requestURI)
-
- request = method.new(uri.request_uri)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- request.body_stream = File.open(file)
- response_no_body(uri, request)
-end
-
-def response_no_body(uri, request)
- http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
- http.read_timeout = nil
- # check we can connect.
- begin http.start
- rescue Exception => e
- # puts e.message
- #puts e.backtrace.inspect
- warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
- end
- response = http.request(request)
- print_http_response(response)
- case response
- when Net::HTTPSuccess, Net::HTTPRedirection
- # OK
- when Net::HTTPNotFound
- warn_exit "404 Not found: #{uri}", 9
- #print response.body
- else
- warn_exit "#{response.code} #{response.message} #{uri}", 9
- # Unreachable
- response.error!
- end
- # NO BODY IN RESPONSE
-end
-
-def response_print_body(uri, request)
- http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
- http.read_timeout = nil
- # check we can connect.
- begin http.start
- rescue => e
- #puts e.backtrace.inspect
- #print e.class
- warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
- end
-
- # Add a blank line if headers were output.
- print "\n" if $http_print ;
-
- begin
- response = http.request(request) { |res|
- print_http_response(res)
- #puts res.code
- res.read_body do |segment|
- print segment
- end
- }
- case response
- when Net::HTTPSuccess, Net::HTTPRedirection
- # OK
- when Net::HTTPNotFound
- warn_exit "404 Not found: #{uri}", 9
- #print response.body
- else
- warn_exit "#{response.code}: #{uri}", 9
- # Unreachable
- response.error!
- end
- rescue EOFError => e
- warn_exit "IO Error: "+e.message, 3
- end
-end
-
-def print_http_request(uri, request)
- return unless $print_http
- #print "Request\n"
- print request.method," ",uri, "\n"
- print_headers(" ",request)
-end
-
-def print_http_response(response)
- return unless $print_http
- #print "Response\n"
- print response.code, " ", response.message, "\n"
- print_headers(" ",response)
-end
-
-def print_headers(marker, headers)
- headers.each do |k,v|
- k = k.split('-').map{|w| w.capitalize}.join('-')+':'
- printf "%s%-20s %s\n",marker,k,v
- end
-end
-
-def content_type(file)
- file =~ /\.([^.]*)$/
- ext = $1
- mt = $fileMediaTypes[ext]
- cs = $charset[mt]
- mt = mt+';charset='+cs if ! cs.nil?
- return mt
-end
-
-def charset(content_type)
- return $charset[content_type]
-end
-
-def warn_exit(msg, rc)
- warn msg
- exit rc ;
-end
-
-def parseURI(uri_string)
- begin
- return URI.parse(uri_string).to_s
- rescue URI::InvalidURIError => err
- warn_exit "Bad URI: <#{uri_string}>", 2
- end
-end
-
-## ---- Command
-
-def cmd_soh(command=nil)
- ## Command line
- options = {}
- optparse = OptionParser.new do |opts|
- # Set a banner, displayed at the top
- # of the help screen.
- case $cmd
- when "s-http", "sparql-http", "soh"
- banner="$cmd [get|post|put|delete] datasetURI graph [file]"
- when "s-get", "s-head", "s-delete"
- banner="$cmd datasetURI graph"
- end
-
- opts.banner = $banner
- # Define the options, and what they do
-
- options[:verbose] = false
- opts.on( '-v', '--verbose', 'Verbose' ) do
- options[:verbose] = true
- end
-
- options[:version] = false
- opts.on( '--version', 'Print version and exit' ) do
- print "#{SOH_NAME} #{SOH_VERSION}\n"
- exit
- end
-
- # This displays the help screen, all programs are
- # assumed to have this option.
- opts.on( '-h', '--help', 'Display this screen and exit' ) do
- puts opts
- exit
- end
- end
-
- begin optparse.parse!
- rescue OptionParser::InvalidArgument => e
- warn e
- exit
- end
-
- $verbose = options[:verbose]
- $print_http = $verbose
-
- if command.nil?
- if ARGV.size == 0
- warn "No command given: expected one of 'get', 'put', 'post', 'delete', 'query' or 'update'"
- exit 1
- end
- cmdPrint=ARGV.shift
- command=cmdPrint.upcase
- else
- cmdPrint=command
- end
-
- case command
- when "HEAD", "GET", "DELETE"
- requiredFile=false
- when "PUT", "POST"
- requiredFile=true
- when "QUERY"
- cmd_sparql_query
- when "UPDATE"
- cmd_sparql_update
- else
- warn_exit "Unknown command: #{command}", 2
- end
-
- if requiredFile
- then
- if ARGV.size != 3
- warn_exit "Required: dataset URI, graph URI (or 'default') and file", 1
- end
- else
- if ARGV.size != 2
- warn_exit "Required: dataset URI and graph URI (or 'default')", 1
- end
- end
-
- dataset=parseURI(ARGV.shift)
- # Relative URI?
- graph=parseURI(ARGV.shift)
- file=""
- if requiredFile
- then
- file = ARGV.shift if requiredFile
- if ! File.exist?(file)
- warn_exit "No such file: "+file, 3
- end
- if File.directory?(file)
- warn_exit "File is a directory: "+file, 3
- end
- end
-
- case command
- when "GET"
- GET(dataset, graph)
- when "HEAD"
- HEAD(dataset, graph)
- when "PUT"
- PUT(dataset, graph, file)
- when "DELETE"
- DELETE(dataset, graph)
- when "POST"
- POST(dataset, graph, file)
- else
- warn_exit "Internal error: Unknown command: #{cmd}", 2
- end
- exit 0
-end
-
-## --------
-def string_or_file(arg)
- return arg if ! arg.match(/^@/)
- a=(arg[1..-1])
- open(a, 'rb'){|f| f.read}
-end
-
-## -------- SPARQL Query
-
-## Choose method
-def SPARQL_query(service, query, query_file, forcePOST=false, args2={})
- if ! query_file.nil?
- query = open(query_file, 'rb'){|f| f.read}
- end
- if forcePOST || query.length >= 2*1024
- SPARQL_query_POST(service, query, args2)
- else
- SPARQL_query_GET(service, query, args2)
- end
-end
-
-## By GET
-
-def SPARQL_query_GET(service, query, args2)
- args = { "query" => query }
- args.merge!(args2)
- qs=args.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
- action="#{service}?#{qs}"
- headers={}
- headers.merge!($headers)
- headers[$hAccept]=$accept_results
- get_worker(action, headers)
-end
-
-## By POST
-
-def SPARQL_query_POST(service, query, args2)
- # DRY - body/no body for each of request and response.
- post_params={ "query" => query }
- post_params.merge!(args2)
- uri = URI.parse(service)
- headers={}
- headers.merge!($headers)
- headers[$hAccept]=$accept_results
- execute_post_form_body(uri, headers, post_params)
-end
-
-def execute_post_form_body(uri, headers, post_params)
- request = Net::HTTP::Post.new(uri.request_uri)
- qs=post_params.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
- headers[$hContentType] = $mtWWWForm
- headers[$hContentLength] = qs.length.to_s
- request.initialize_http_header(headers)
- request.body = qs
- print_http_request(uri, request)
- response_print_body(uri, request)
-end
-
-# Usage: -v --help --file= --query=
-def cmd_sparql_query
- options={}
- optparse = OptionParser.new do |opts|
- opts.banner = "Usage: #{$cmd} [--query QUERY] [--service URI] [--post] 'query' | @file"
- opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
- options[:service]=uri
- end
- opts.on('--query=FILE','--file=FILE', 'Take query from a file') do |file|
- options[:file]=file
- end
- opts.on('--output=TYPE', [:json,:xml,:text,:csv,:tsv],
- 'Set the output argument') do |type|
- options[:output]=type
- end
- opts.on('--accept=TYPE', [:json,:xml,:text,:csv,:tsv],
- 'Set the accept header type') do |type|
- options[:accept]=type
- end
- options[:verbose] = false
- opts.on( '--post', 'Force use of POST' ) do
- options[:post] = true
- end
- opts.on( '-v', '--verbose', 'Verbose' ) do
- options[:verbose] = true
- end
- opts.on( '--version', 'Print version and exit' ) do
- print "#{SOH_NAME} #{SOH_VERSION}\n"
- exit
- end
- opts.on( '-h', '--help', 'Display this screen and exit' ) do
- puts opts
- exit
- end
- end
-
- begin optparse.parse!
- rescue OptionParser::InvalidArgument, OptionParser::InvalidOption => e
- warn e
- exit 1
- end
-
- $verbose = options[:verbose]
- $print_http = $verbose
- usePOST = options[:post]
-
- service = options[:service]
- warn_exit 'No service specified. Required --service=URI',1 if service.nil?
-
- # Query
- query=nil
- query_file=options[:file]
- if query_file.nil? && ARGV.size == 0
- then
- warn_exit 'No query specified.',1
- end
- if query_file.nil?
- query = ARGV.shift
- if query.match(/^@/)
- query_file = query[1..-1]
- query = nil
- end
- end
-
- # --output ==> output= (non-standard)
- args={}
- case options[:output]
- when nil
- when "json","xml","text","csv","tsv"
- args['output'] = options[:output]
- when :json,:xml,:text,:csv,:tsv
- args['output'] = options[:output].to_s
- else
- warn_exit "Unrecognized output type: "+options[:output],2
- end
-
- # --accept
- # options[:accept]
-
- print "SPARQL #{service}\n" if $verbose
- #args={"output"=>"text"}
- SPARQL_query(service, query, query_file, usePOST, args)
- exit(0)
-end
-
-## -------- SPARQL Update
-
-# Update sent as a WWW form.
-def SPARQL_update_by_form(service, update, args2={})
- args = {}
- args.merge!(args2)
- headers={}
- headers.merge!($headers)
- # args? encode?
- body="update="+uri_escape(update)
- headers[$hContentType] = $mtWWWForm
- headers[$hContentLength] = body.length.to_s
- uri = URI.parse(service)
- execute_post_form(uri, headers, body)
-end
-
-# DRY - query form.
-def execute_post_form(uri, headers, body)
- request = Net::HTTP::Post.new(uri.request_uri)
- request.initialize_http_header(headers)
- request.body = body
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def SPARQL_update(service, update, args2={})
- args = {}
- args.merge!(args2)
- headers={}
- headers.merge!($headers)
- headers[$hContentType] = $mtSparqlUpdate
- uri = URI.parse(service)
- request = Net::HTTP::Post.new(uri.request_uri)
- request.initialize_http_header(headers)
- request.body = update
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def cmd_sparql_update(by_raw_post=true)
- # Share with cmd_sparql_query
- options={}
- optparse = OptionParser.new do |opts|
- opts.banner = "Usage: #{$cmd} [--file REQUEST] [--service URI] 'request' | @file"
- opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
- options[:service]=uri
- end
- opts.on('--update=FILE', '--file=FILE', 'Take update from a file') do |file|
- options[:file]=file
- end
- options[:verbose] = false
- opts.on( '-v', '--verbose', 'Verbose' ) do
- options[:verbose] = true
- end
- opts.on( '--version', 'Print version and exit' ) do
- print "#{SOH_NAME} #{SOH_VERSION}\n"
- exit
- end
- opts.on( '-h', '--help', 'Display this screen and exit' ) do
- puts opts
- exit
- end
- end
-
- begin optparse.parse!
- rescue OptionParser::InvalidArgument => e
- warn e
- exit
- end
-
- $verbose = options[:verbose]
- $print_http = $verbose
-
- service = options[:service]
- warn_exit 'No service specified. Required --service=URI',1 if service.nil?
-
- update=nil
- update_file=options[:file]
-
- if update_file.nil? && ARGV.size == 0
- then
- warn_exit 'No update specified.',1
- end
- if update_file.nil?
- update = ARGV.shift
- if update.match(/^@/)
- update_file = update[1..-1]
- update = nil
- end
- end
-
- print "SPARQL-Update #{service}\n" if $verbose
- args={}
-
- # Reads in the file :-(
- if update.nil?
- then
- update = open(update_file, 'rb'){|f| f.read}
- else
- update = string_or_file(update)
- end
-
- if by_raw_post
- SPARQL_update(service, update, args)
- else
- SPARQL_update_by_form(service, update, args)
- end
- exit(0)
-end
-
-## -------
-
-case $cmd
-when "s-http", "sparql-http", "soh"
- $banner="#{$cmd} [get|post|put|delete] datasetURI graph [file]"
- cmd_soh
-when "s-get", "s-head", "s-put", "s-delete", "s-post"
-
- case $cmd
- when "s-get", "s-head", "s-delete"
- $banner="#{$cmd} datasetURI graph"
- when "s-put", "s-post"
- $banner="#{$cmd} datasetURI graph file"
- end
- cmd2 = $cmd.sub(/^s-/, '').upcase
- cmd_soh cmd2
-
-when "s-query", "sparql-query"
- cmd_sparql_query
-when "s-update", "sparql-update"
- cmd_sparql_update true
-when "s-update-form", "sparql-update-form"
- cmd_sparql_update false
-else
- warn_exit "Unknown: "+$cmd, 1
-end
[4/6] jena git commit: JENA-872 : apache-jena-fuseki
Posted by an...@apache.org.
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/apache-jena-fuseki/bin/soh
----------------------------------------------------------------------
diff --git a/jena-fuseki2/apache-jena-fuseki/bin/soh b/jena-fuseki2/apache-jena-fuseki/bin/soh
new file mode 100755
index 0000000..0e3a807
--- /dev/null
+++ b/jena-fuseki2/apache-jena-fuseki/bin/soh
@@ -0,0 +1,707 @@
+#!/usr/bin/env ruby
+# -*- coding: utf-8 -*-
+
+# 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.
+
+# SPARQL HTTP Update, client.
+
+require 'optparse'
+require 'net/http'
+require 'uri'
+require 'cgi'
+require 'pp'
+require 'ostruct'
+
+# ToDo
+# Allow a choice of media type for GET
+# --accept "content-type" (and abbreviations)
+# --header "Add:this"
+# --user, --password
+# Basic authentication: request.basic_auth("username", "password")
+# Follow redirects => 301: puts response["location"] # All headers are lowercase?
+
+SOH_NAME="SOH"
+SOH_VERSION="0.0.0"
+
+$proxy = ENV['http_proxy'] ? URI.parse(ENV['http_proxy']) : OpenStruct.new
+
+# What about direct naming?
+
+# Names
+$mtTurtle = 'text/turtle;charset=utf-8'
+$mtRDF = 'application/rdf+xml'
+$mtText = 'text/plain'
+$mtNQuads = 'text/n-quads'
+$mtTriG = 'application/trig'
+$mtSparqlResultsX = 'application/sparql-results+xml'
+$mtSparqlResultsJ = 'application/sparql-results+json'
+$mtAppJSON = 'application/json'
+$mtAppXML = 'application/xml'
+$mtSparqlResultsTSV = 'application/sparql-results+tsv'
+$mtSparqlResultsCSV = 'application/sparql-results+csv'
+$mtSparqlUpdate = 'application/sparql-update'
+$mtWWWForm = 'application/x-www-form-urlencoded'
+$mtSparqlQuery = "application/sparql-query" ;
+
+# Global media type table.
+$fileMediaTypes = {}
+$fileMediaTypes['ttl'] = $mtTurtle
+$fileMediaTypes['n3'] = 'text/n3; charset=utf-8'
+$fileMediaTypes['nt'] = $mtText
+$fileMediaTypes['rdf'] = $mtRDF
+$fileMediaTypes['owl'] = $mtRDF
+$fileMediaTypes['nq'] = $mtNQuads
+$fileMediaTypes['trig'] = $mtTriG
+
+# Global charset : no entry means "don't set"
+$charsetUTF8 = 'utf-8'
+$charset = {}
+$charset[$mtTurtle] = 'utf-8'
+$charset[$mtText] = 'ascii'
+$charset[$mtTriG] = 'utf-8'
+$charset[$mtNQuads] = 'ascii'
+
+# Headers
+
+$hContentType = 'Content-Type'
+# $hContentEncoding = 'Content-Encoding'
+$hContentLength = 'Content-Length'
+# $hContentLocation = 'Content-Location'
+# $hContentRange = 'Content-Range'
+
+$hAccept = 'Accept'
+$hAcceptCharset = 'Accept-Charset'
+$hAcceptEncoding = 'Accept-Encoding'
+$hAcceptRanges = 'Accept-Ranges'
+
+$headers = { "User-Agent" => "#{SOH_NAME}/Fuseki #{SOH_VERSION}"}
+$print_http = false
+
+# Default for GET
+# At least allow anythign (and hope!)
+$accept_rdf="#{$mtRDF};q=0.9 , #{$mtTurtle}"
+# For SPARQL query
+$accept_results="#{$mtSparqlResultsJ} , #{$mtSparqlResultsX};q=0.9 , #{$accept_rdf}"
+
+# Accept any in case of trouble.
+$accept_rdf="#{$accept_rdf} , */*;q=0.1"
+$accept_results="#{$accept_results} , */*;q=0.1"
+
+# The media type usually forces the charset.
+$accept_charset=nil
+
+## Who we are.
+## Two styles:
+## s-query .....
+## soh query .....
+
+$cmd = File.basename($0)
+if $cmd == 'soh'
+then
+ $cmd = (ARGV.size == 0) ? 'soh' : ARGV.shift
+end
+
+if ! $cmd.start_with?('s-') && $cmd != 'soh'
+ $cmd = 's-'+$cmd
+end
+
+## --------
+
+def GET(dataset, graph)
+ print "GET #{dataset} #{graph}\n" if $verbose
+ requestURI = target(dataset, graph)
+ headers = {}
+ headers.merge!($headers)
+ headers[$hAccept] = $accept_rdf
+ headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
+ get_worker(requestURI, headers)
+end
+
+def get_worker(requestURI, headers)
+ uri = URI.parse(requestURI)
+ request = Net::HTTP::Get.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ response_print_body(uri, request)
+end
+
+def HEAD(dataset, graph)
+ print "HEAD #{dataset} #{graph}\n" if $verbose
+ requestURI = target(dataset, graph)
+ headers = {}
+ headers.merge!($headers)
+ headers[$hAccept] = $accept_rdf
+ headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
+ uri = URI.parse(requestURI)
+ request = Net::HTTP::Head.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def PUT(dataset, graph, file)
+ print "PUT #{dataset} #{graph} #{file}\n" if $verbose
+ send_body(dataset, graph, file, Net::HTTP::Put)
+end
+
+def POST(dataset, graph, file)
+ print "POST #{dataset} #{graph} #{file}\n" if $verbose
+ send_body(dataset, graph, file, Net::HTTP::Post)
+end
+
+def DELETE(dataset, graph)
+ print "DELETE #{dataset} #{graph}\n" if $verbose
+ requestURI = target(dataset, graph)
+ uri = URI.parse(requestURI)
+ request = Net::HTTP::Delete.new(uri.request_uri)
+ headers = {}
+ headers.merge!($headers)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def uri_escape(string)
+ CGI.escape(string)
+end
+
+def target(dataset, graph)
+ return dataset+"?default" if graph == "default"
+ return dataset+"?graph="+uri_escape(graph)
+end
+
+def send_body(dataset, graph, file, method)
+ mt = content_type(file)
+ headers = {}
+ headers.merge!($headers)
+ headers[$hContentType] = mt
+ headers[$hContentLength] = File.size(file).to_s
+ ## p headers
+
+ requestURI = target(dataset, graph)
+ uri = URI.parse(requestURI)
+
+ request = method.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ request.body_stream = File.open(file)
+ response_no_body(uri, request)
+end
+
+def response_no_body(uri, request)
+ http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
+ http.read_timeout = nil
+ # check we can connect.
+ begin http.start
+ rescue Exception => e
+ # puts e.message
+ #puts e.backtrace.inspect
+ warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
+ end
+ response = http.request(request)
+ print_http_response(response)
+ case response
+ when Net::HTTPSuccess, Net::HTTPRedirection
+ # OK
+ when Net::HTTPNotFound
+ warn_exit "404 Not found: #{uri}", 9
+ #print response.body
+ else
+ warn_exit "#{response.code} #{response.message} #{uri}", 9
+ # Unreachable
+ response.error!
+ end
+ # NO BODY IN RESPONSE
+end
+
+def response_print_body(uri, request)
+ http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
+ http.read_timeout = nil
+ # check we can connect.
+ begin http.start
+ rescue => e
+ #puts e.backtrace.inspect
+ #print e.class
+ warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
+ end
+
+ # Add a blank line if headers were output.
+ print "\n" if $http_print ;
+
+ begin
+ response = http.request(request) { |res|
+ print_http_response(res)
+ #puts res.code
+ res.read_body do |segment|
+ print segment
+ end
+ }
+ case response
+ when Net::HTTPSuccess, Net::HTTPRedirection
+ # OK
+ when Net::HTTPNotFound
+ warn_exit "404 Not found: #{uri}", 9
+ #print response.body
+ else
+ warn_exit "#{response.code}: #{uri}", 9
+ # Unreachable
+ response.error!
+ end
+ rescue EOFError => e
+ warn_exit "IO Error: "+e.message, 3
+ end
+end
+
+def print_http_request(uri, request)
+ return unless $print_http
+ #print "Request\n"
+ print request.method," ",uri, "\n"
+ print_headers(" ",request)
+end
+
+def print_http_response(response)
+ return unless $print_http
+ #print "Response\n"
+ print response.code, " ", response.message, "\n"
+ print_headers(" ",response)
+end
+
+def print_headers(marker, headers)
+ headers.each do |k,v|
+ k = k.split('-').map{|w| w.capitalize}.join('-')+':'
+ printf "%s%-20s %s\n",marker,k,v
+ end
+end
+
+def content_type(file)
+ file =~ /\.([^.]*)$/
+ ext = $1
+ mt = $fileMediaTypes[ext]
+ cs = $charset[mt]
+ mt = mt+';charset='+cs if ! cs.nil?
+ return mt
+end
+
+def charset(content_type)
+ return $charset[content_type]
+end
+
+def warn_exit(msg, rc)
+ warn msg
+ exit rc ;
+end
+
+def parseURI(uri_string)
+ begin
+ return URI.parse(uri_string).to_s
+ rescue URI::InvalidURIError => err
+ warn_exit "Bad URI: <#{uri_string}>", 2
+ end
+end
+
+## ---- Command
+
+def cmd_soh(command=nil)
+ ## Command line
+ options = {}
+ optparse = OptionParser.new do |opts|
+ # Set a banner, displayed at the top
+ # of the help screen.
+ case $cmd
+ when "s-http", "sparql-http", "soh"
+ banner="$cmd [get|post|put|delete] datasetURI graph [file]"
+ when "s-get", "s-head", "s-delete"
+ banner="$cmd datasetURI graph"
+ end
+
+ opts.banner = $banner
+ # Define the options, and what they do
+
+ options[:verbose] = false
+ opts.on( '-v', '--verbose', 'Verbose' ) do
+ options[:verbose] = true
+ end
+
+ options[:version] = false
+ opts.on( '--version', 'Print version and exit' ) do
+ print "#{SOH_NAME} #{SOH_VERSION}\n"
+ exit
+ end
+
+ # This displays the help screen, all programs are
+ # assumed to have this option.
+ opts.on( '-h', '--help', 'Display this screen and exit' ) do
+ puts opts
+ exit
+ end
+ end
+
+ begin optparse.parse!
+ rescue OptionParser::InvalidArgument => e
+ warn e
+ exit
+ end
+
+ $verbose = options[:verbose]
+ $print_http = $verbose
+
+ if command.nil?
+ if ARGV.size == 0
+ warn "No command given: expected one of 'get', 'put', 'post', 'delete', 'query' or 'update'"
+ exit 1
+ end
+ cmdPrint=ARGV.shift
+ command=cmdPrint.upcase
+ else
+ cmdPrint=command
+ end
+
+ case command
+ when "HEAD", "GET", "DELETE"
+ requiredFile=false
+ when "PUT", "POST"
+ requiredFile=true
+ when "QUERY"
+ cmd_sparql_query
+ when "UPDATE"
+ cmd_sparql_update
+ else
+ warn_exit "Unknown command: #{command}", 2
+ end
+
+ if requiredFile
+ then
+ if ARGV.size != 3
+ warn_exit "Required: dataset URI, graph URI (or 'default') and file", 1
+ end
+ else
+ if ARGV.size != 2
+ warn_exit "Required: dataset URI and graph URI (or 'default')", 1
+ end
+ end
+
+ dataset=parseURI(ARGV.shift)
+ # Relative URI?
+ graph=parseURI(ARGV.shift)
+ file=""
+ if requiredFile
+ then
+ file = ARGV.shift if requiredFile
+ if ! File.exist?(file)
+ warn_exit "No such file: "+file, 3
+ end
+ if File.directory?(file)
+ warn_exit "File is a directory: "+file, 3
+ end
+ end
+
+ case command
+ when "GET"
+ GET(dataset, graph)
+ when "HEAD"
+ HEAD(dataset, graph)
+ when "PUT"
+ PUT(dataset, graph, file)
+ when "DELETE"
+ DELETE(dataset, graph)
+ when "POST"
+ POST(dataset, graph, file)
+ else
+ warn_exit "Internal error: Unknown command: #{cmd}", 2
+ end
+ exit 0
+end
+
+## --------
+def string_or_file(arg)
+ return arg if ! arg.match(/^@/)
+ a=(arg[1..-1])
+ open(a, 'rb'){|f| f.read}
+end
+
+## -------- SPARQL Query
+
+## Choose method
+def SPARQL_query(service, query, query_file, forcePOST=false, args2={})
+ if ! query_file.nil?
+ query = open(query_file, 'rb'){|f| f.read}
+ end
+ if forcePOST || query.length >= 2*1024
+ SPARQL_query_POST(service, query, args2)
+ else
+ SPARQL_query_GET(service, query, args2)
+ end
+end
+
+## By GET
+
+def SPARQL_query_GET(service, query, args2)
+ args = { "query" => query }
+ args.merge!(args2)
+ qs=args.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
+ action="#{service}?#{qs}"
+ headers={}
+ headers.merge!($headers)
+ headers[$hAccept]=$accept_results
+ get_worker(action, headers)
+end
+
+## By POST
+
+def SPARQL_query_POST(service, query, args2)
+ # DRY - body/no body for each of request and response.
+ post_params={ "query" => query }
+ post_params.merge!(args2)
+ uri = URI.parse(service)
+ headers={}
+ headers.merge!($headers)
+ headers[$hAccept]=$accept_results
+ execute_post_form_body(uri, headers, post_params)
+end
+
+def execute_post_form_body(uri, headers, post_params)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ qs=post_params.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
+ headers[$hContentType] = $mtWWWForm
+ headers[$hContentLength] = qs.length.to_s
+ request.initialize_http_header(headers)
+ request.body = qs
+ print_http_request(uri, request)
+ response_print_body(uri, request)
+end
+
+# Usage: -v --help --file= --query=
+def cmd_sparql_query
+ options={}
+ optparse = OptionParser.new do |opts|
+ opts.banner = "Usage: #{$cmd} [--query QUERY] [--service URI] [--post] 'query' | @file"
+ opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
+ options[:service]=uri
+ end
+ opts.on('--query=FILE','--file=FILE', 'Take query from a file') do |file|
+ options[:file]=file
+ end
+ opts.on('--output=TYPE', [:json,:xml,:text,:csv,:tsv],
+ 'Set the output argument') do |type|
+ options[:output]=type
+ end
+ opts.on('--accept=TYPE', [:json,:xml,:text,:csv,:tsv],
+ 'Set the accept header type') do |type|
+ options[:accept]=type
+ end
+ options[:verbose] = false
+ opts.on( '--post', 'Force use of POST' ) do
+ options[:post] = true
+ end
+ opts.on( '-v', '--verbose', 'Verbose' ) do
+ options[:verbose] = true
+ end
+ opts.on( '--version', 'Print version and exit' ) do
+ print "#{SOH_NAME} #{SOH_VERSION}\n"
+ exit
+ end
+ opts.on( '-h', '--help', 'Display this screen and exit' ) do
+ puts opts
+ exit
+ end
+ end
+
+ begin optparse.parse!
+ rescue OptionParser::InvalidArgument, OptionParser::InvalidOption => e
+ warn e
+ exit 1
+ end
+
+ $verbose = options[:verbose]
+ $print_http = $verbose
+ usePOST = options[:post]
+
+ service = options[:service]
+ warn_exit 'No service specified. Required --service=URI',1 if service.nil?
+
+ # Query
+ query=nil
+ query_file=options[:file]
+ if query_file.nil? && ARGV.size == 0
+ then
+ warn_exit 'No query specified.',1
+ end
+ if query_file.nil?
+ query = ARGV.shift
+ if query.match(/^@/)
+ query_file = query[1..-1]
+ query = nil
+ end
+ end
+
+ # --output ==> output= (non-standard)
+ args={}
+ case options[:output]
+ when nil
+ when "json","xml","text","csv","tsv"
+ args['output'] = options[:output]
+ when :json,:xml,:text,:csv,:tsv
+ args['output'] = options[:output].to_s
+ else
+ warn_exit "Unrecognized output type: "+options[:output],2
+ end
+
+ # --accept
+ # options[:accept]
+
+ print "SPARQL #{service}\n" if $verbose
+ #args={"output"=>"text"}
+ SPARQL_query(service, query, query_file, usePOST, args)
+ exit(0)
+end
+
+## -------- SPARQL Update
+
+# Update sent as a WWW form.
+def SPARQL_update_by_form(service, update, args2={})
+ args = {}
+ args.merge!(args2)
+ headers={}
+ headers.merge!($headers)
+ # args? encode?
+ body="update="+uri_escape(update)
+ headers[$hContentType] = $mtWWWForm
+ headers[$hContentLength] = body.length.to_s
+ uri = URI.parse(service)
+ execute_post_form(uri, headers, body)
+end
+
+# DRY - query form.
+def execute_post_form(uri, headers, body)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ request.body = body
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def SPARQL_update(service, update, args2={})
+ args = {}
+ args.merge!(args2)
+ headers={}
+ headers.merge!($headers)
+ headers[$hContentType] = $mtSparqlUpdate
+ uri = URI.parse(service)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ request.body = update
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def cmd_sparql_update(by_raw_post=true)
+ # Share with cmd_sparql_query
+ options={}
+ optparse = OptionParser.new do |opts|
+ opts.banner = "Usage: #{$cmd} [--file REQUEST] [--service URI] 'request' | @file"
+ opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
+ options[:service]=uri
+ end
+ opts.on('--update=FILE', '--file=FILE', 'Take update from a file') do |file|
+ options[:file]=file
+ end
+ options[:verbose] = false
+ opts.on( '-v', '--verbose', 'Verbose' ) do
+ options[:verbose] = true
+ end
+ opts.on( '--version', 'Print version and exit' ) do
+ print "#{SOH_NAME} #{SOH_VERSION}\n"
+ exit
+ end
+ opts.on( '-h', '--help', 'Display this screen and exit' ) do
+ puts opts
+ exit
+ end
+ end
+
+ begin optparse.parse!
+ rescue OptionParser::InvalidArgument => e
+ warn e
+ exit
+ end
+
+ $verbose = options[:verbose]
+ $print_http = $verbose
+
+ service = options[:service]
+ warn_exit 'No service specified. Required --service=URI',1 if service.nil?
+
+ update=nil
+ update_file=options[:file]
+
+ if update_file.nil? && ARGV.size == 0
+ then
+ warn_exit 'No update specified.',1
+ end
+ if update_file.nil?
+ update = ARGV.shift
+ if update.match(/^@/)
+ update_file = update[1..-1]
+ update = nil
+ end
+ end
+
+ print "SPARQL-Update #{service}\n" if $verbose
+ args={}
+
+ # Reads in the file :-(
+ if update.nil?
+ then
+ update = open(update_file, 'rb'){|f| f.read}
+ else
+ update = string_or_file(update)
+ end
+
+ if by_raw_post
+ SPARQL_update(service, update, args)
+ else
+ SPARQL_update_by_form(service, update, args)
+ end
+ exit(0)
+end
+
+## -------
+
+case $cmd
+when "s-http", "sparql-http", "soh"
+ $banner="#{$cmd} [get|post|put|delete] datasetURI graph [file]"
+ cmd_soh
+when "s-get", "s-head", "s-put", "s-delete", "s-post"
+
+ case $cmd
+ when "s-get", "s-head", "s-delete"
+ $banner="#{$cmd} datasetURI graph"
+ when "s-put", "s-post"
+ $banner="#{$cmd} datasetURI graph file"
+ end
+ cmd2 = $cmd.sub(/^s-/, '').upcase
+ cmd_soh cmd2
+
+when "s-query", "sparql-query"
+ cmd_sparql_query
+when "s-update", "sparql-update"
+ cmd_sparql_update true
+when "s-update-form", "sparql-update-form"
+ cmd_sparql_update false
+else
+ warn_exit "Unknown: "+$cmd, 1
+end
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/apache-jena-fuseki/dist/ABOUT
----------------------------------------------------------------------
diff --git a/jena-fuseki2/apache-jena-fuseki/dist/ABOUT b/jena-fuseki2/apache-jena-fuseki/dist/ABOUT
new file mode 100644
index 0000000..cee2ca2
--- /dev/null
+++ b/jena-fuseki2/apache-jena-fuseki/dist/ABOUT
@@ -0,0 +1 @@
+This directory holds the material needed for inclusion in the Fuseki distribution.
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/apache-jena-fuseki/dist/LICENSE
----------------------------------------------------------------------
diff --git a/jena-fuseki2/apache-jena-fuseki/dist/LICENSE b/jena-fuseki2/apache-jena-fuseki/dist/LICENSE
new file mode 100644
index 0000000..10474ab
--- /dev/null
+++ b/jena-fuseki2/apache-jena-fuseki/dist/LICENSE
@@ -0,0 +1,617 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+- - - - - - - - - - - - - - - - - - - - - - -
+
+ (c) Copyright 2003, Plugged In Software
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. The name of the author may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+- - - - - - - - - - - - - - - - - - - - - - -
+
+http://www.slf4j.org/license.html
+
+ Copyright (c) 2004-2011 QOS.ch
+ All rights reserved.
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+- - - - - - - - - - - - - - - - - - - - - - -
+
+==============================================================
+ Jetty Web Container
+ Copyright 1995-2012 Mort Bay Consulting Pty Ltd.
+==============================================================
+
+The Jetty Web Container is Copyright Mort Bay Consulting Pty Ltd
+unless otherwise noted.
+
+Jetty is dual licensed under both
+
+ * The Apache 2.0 License
+ http://www.apache.org/licenses/LICENSE-2.0.html
+
+ and
+
+ * The Eclipse Public 1.0 License
+ http://www.eclipse.org/legal/epl-v10.html
+
+Jetty may be distributed under either license.
+
+The javax.servlet package used was sourced from the Apache
+Software Foundation and is distributed under the apache 2.0
+license.
+
+The UnixCrypt.java code implements the one way cryptography used by
+Unix systems for simple password protection. Copyright 1996 Aki Yoshida,
+modified April 2001 by Iris Van den Broeke, Daniel Deville.
+Permission to use, copy, modify and distribute UnixCrypt
+for non-commercial or commercial purposes and without fee is
+granted provided that the copyright notice appears in all copies.
+
+- - - - - - - - - - - - - - - - - - - - - - -
+
+This product bundles "Bootstrap", which is available under an
+MIT license. See: https://github.com/twbs/bootstrap/blob/master/LICENSE
+
+This product bundles "codemirror", which is available under an
+MIT license. See http://codemirror.net/LICENSE
+
+This product bundles "jquery", which is available under an
+MIT license. See https://jquery.org/license/
+
+This product bundles "jquery.form", which is available under an
+MIT license. See http://malsup.github.io/mit-license.txt
+
+This product bundles "jquery.xdomainrequest", which is available under an
+MIT license. See https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest/blob/master/LICENSE.txt
+
+This product bundles "backbone.js", which is available under an
+MIT license. See https://github.com/jashkenas/backbone/blob/master/LICENSE
+
+This product bundles "backbone.marionette", which is available under an
+MIT license. See http://mutedsolutions.mit-license.org/
+ "backbone.marionette" includes "Backbone.BabySitter" and
+ "Backbone.Wreqr" also available under the same MIT license.
+
+This product bundles "html5shiv", which is available under an
+MIT license. See https://code.google.com/p/html5shiv/
+
+This product bundles "RequireJS", which is available under an
+MIT license.
+https://github.com/jrburke/requirejs/blob/master/LICENSE
+ "RequireJS" is also available with a "30clause BSD license"
+
+This product bundles "Respond", which is available under an
+MIT license. See https://github.com/scottjehl/Respond/blob/master/LICENSE-MIT
+
+This product bundles "sprintf.js", which is available under a
+"3 clause BSD" license.
+ https://github.com/alexei/sprintf.js/blob/master/LICENSE
+
+This product bundles "underscore", which is available under an
+MIT license. See https://github.com/jashkenas/underscore/blob/master/LICENSE
+
+This product bundles "FontAwesome"
+ "Font Awesome by Dave Gandy - http://fontawesome.io"
+The font is available under an SIL Open Font License 1.1
+and the CSS files under an MIT License.
+See http://fontawesome.io/license/
+
+This product bundles "jQuery File Upload Plugin"
+which is available under an MIT License.
+See https://github.com/blueimp/jQuery-File-Upload
+
+This product bundles "Bootstrap-select"
+which is available under an MIT License.
+See https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE
+
+This product bundles "pivot.js"
+which is available under a BSD 3-clause style license.
+https://github.com/rwjblue/pivot.js/blob/master/LICENSE
+
+This product bundles "YASEQE - Yet Another Sparql Query Editor"
+which is available under an MIT License.
+See http://yasqe.yasgui.org/license.txt
+
+This product bundles "YASR - Yet Another Sparql Resultset GUI"
+which is available under an MIT License.
+See http://yasr.yasgui.org/license.txt
+
+- - - - - - - - - - - - - - - - - - - - - - -
+
+From Apache HttpComponents Client
+
+This project contains annotations derived from JCIP-ANNOTATIONS
+Copyright (c) 2005 Brian Goetz and Tim Peierls.
+See http://www.jcip.net and the Creative Commons Attribution License
+(http://creativecommons.org/licenses/by/2.5)
+
+- - - - - - - - - - - - - - - - - - - - - - -
+
+From Apache Lucene
+
+Some code in core/src/java/org/apache/lucene/util/UnicodeUtil.java was
+derived from unicode conversion examples available at
+http://www.unicode.org/Public/PROGRAMS/CVTUTF. Here is the copyright
+from those sources:
+
+/*
+ * Copyright 2001-2004 Unicode, Inc.
+ *
+ * Disclaimer
+ *
+ * This source code is provided as is by Unicode, Inc. No claims are
+ * made as to fitness for any particular purpose. No warranties of any
+ * kind are expressed or implied. The recipient agrees to determine
+ * applicability of information provided. If this file has been
+ * purchased on magnetic or optical media from Unicode, Inc., the
+ * sole remedy for any claim will be exchange of defective media
+ * within 90 days of receipt.
+ *
+ * Limitations on Rights to Redistribute This Code
+ *
+ * Unicode, Inc. hereby grants the right to freely use the information
+ * supplied in this file in the creation of products supporting the
+ * Unicode Standard, and to make copies of this file in any form
+ * for internal or external distribution as long as this notice
+ * remains attached.
+ */
+
+
+Some code in core/src/java/org/apache/lucene/util/ArrayUtil.java was
+derived from Python 2.4.2 sources available at
+http://www.python.org. Full license is here:
+
+ http://www.python.org/download/releases/2.4.2/license/
+
+Some code in core/src/java/org/apache/lucene/util/UnicodeUtil.java was
+derived from Python 3.1.2 sources available at
+http://www.python.org. Full license is here:
+
+ http://www.python.org/download/releases/3.1.2/license/
+
+Some code in core/src/java/org/apache/lucene/util/automaton was
+derived from Brics automaton sources available at
+www.brics.dk/automaton/. Here is the copyright from those sources:
+
+/*
+ * Copyright (c) 2001-2009 Anders Moeller
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+The levenshtein automata tables in core/src/java/org/apache/lucene/util/automaton
+were automatically generated with the moman/finenight FSA package.
+Here is the copyright for those sources:
+
+# Copyright (c) 2010, Jean-Philippe Barrette-LaPierre, <jp...@rrette.com>
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation
+# files (the "Software"), to deal in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+
+Some code in core/src/java/org/apache/lucene/util/UnicodeUtil.java was
+derived from ICU (http://www.icu-project.org)
+The full license is available here:
+ http://source.icu-project.org/repos/icu/icu/trunk/license.html
+
+/*
+ * Copyright (C) 1999-2010, International Business Machines
+ * Corporation and others. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * provided that the above copyright notice(s) and this permission notice appear
+ * in all copies of the Software and that both the above copyright notice(s) and
+ * this permission notice appear in supporting documentation.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE
+ * LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+ * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Except as contained in this notice, the name of a copyright holder shall not
+ * be used in advertising or otherwise to promote the sale, use or other
+ * dealings in this Software without prior written authorization of the
+ * copyright holder.
+ */
+
+The following license applies to the Snowball stemmers:
+
+Copyright (c) 2001, Dr Martin Porter
+Copyright (c) 2002, Richard Boulton
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the copyright holders nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+The following license applies to the KStemmer:
+
+Copyright © 2003,
+Center for Intelligent Information Retrieval,
+University of Massachusetts, Amherst.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+
+3. The names "Center for Intelligent Information Retrieval" and
+"University of Massachusetts" must not be used to endorse or promote products
+derived from this software without prior written permission. To obtain
+permission, contact info@ciir.cs.umass.edu.
+
+THIS SOFTWARE IS PROVIDED BY UNIVERSITY OF MASSACHUSETTS AND OTHER CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+The following license applies to the Morfologik project:
+
+Copyright (c) 2006 Dawid Weiss
+Copyright (c) 2007-2011 Dawid Weiss, Marcin Miłkowski
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ * Neither the name of Morfologik nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+---
+
+The dictionary comes from Morfologik project. Morfologik uses data from
+Polish ispell/myspell dictionary hosted at http://www.sjp.pl/slownik/en/ and
+is licenced on the terms of (inter alia) LGPL and Creative Commons
+ShareAlike. The part-of-speech tags were added in Morfologik project and
+are not found in the data from sjp.pl. The tagset is similar to IPI PAN
+tagset.
+
+---
+
+The following license applies to the Morfeusz project,
+used by org.apache.lucene.analysis.morfologik.
+
+BSD-licensed dictionary of Polish (SGJP)
+http://sgjp.pl/morfeusz/
+
+Copyright © 2011 Zygmunt Saloni, Włodzimierz Gruszczyński,
+ Marcin Woliński, Robert Wołosz
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the
+ distribution.
+
+THIS SOFTWARE IS PROVIDED BY COPYRIGHT HOLDERS “AS IS” AND ANY EXPRESS
+OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/apache-jena-fuseki/dist/NOTICE
----------------------------------------------------------------------
diff --git a/jena-fuseki2/apache-jena-fuseki/dist/NOTICE b/jena-fuseki2/apache-jena-fuseki/dist/NOTICE
new file mode 100644
index 0000000..33231f9
--- /dev/null
+++ b/jena-fuseki2/apache-jena-fuseki/dist/NOTICE
@@ -0,0 +1,216 @@
+Apache Jena - module Fuseki
+Copyright 2011, 2012, 2013, 2014, 2015 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+Portions of this software were originally based on the following:
+ - Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Hewlett-Packard Development Company, LP
+ - Copyright 2010, 2011 Epimorphics Ltd.
+ - Copyright 2010, 2011 Talis Systems Ltd.
+These have been licensed to the Apache Software Foundation under a software grant.
+
+- - - - - - - - - - - - - - - - - - - - - - -
+
+slf4j:
+ Copyright (c) 2004-2011 QOS.ch
+ All rights reserved.
+
+- - - - - - - - - - - - - - - - - - - - - - -
+
+(c) Copyright 2003, Plugged In Software
+This product includes software developed by
+PluggedIn Software under a BSD license.
+
+- - - - - - - - - - - - - - - - - - - - - - -
+
+ Jetty Web Container
+ Copyright 1995-2012 Mort Bay Consulting Pty Ltd.
+
+under the Apache 2.0 License.
+
+The Jetty Web Container includes:
+
+UnixCrypt.java
+Copyright 1996 Aki Yoshida,
+modified April 2001 by Iris Van den Broeke, Daniel Deville.
+
+- - - - - - - - - - - - - - - - - - - - - - -
+
+From Apache HttpComponents Client:
+
+This project contains annotations derived from JCIP-ANNOTATIONS
+Copyright (c) 2005 Brian Goetz and Tim Peierls. See http://www.jcip.net
+
+- - - - - - - - - - - - - - - - - - - - - - -
+
+ Apache Xerces Java
+ Copyright 1999-2013 The Apache Software Foundation
+
+ This product includes software developed at
+ The Apache Software Foundation (http://www.apache.org/).
+
+ Portions of this software were originally based on the following:
+ - software copyright (c) 1999, IBM Corporation., http://www.ibm.com.
+ - software copyright (c) 1999, Sun Microsystems., http://www.sun.com.
+ - voluntary contributions made by Paul Eng on behalf of the
+ Apache Software Foundation that were originally developed at iClick, Inc.,
+ software copyright (c) 1999.
+
+- - - - - - - - - - - - - - - - - - - - - - -
+
+From Apache Lucene:
+
+ICU4J, (under analysis/icu) is licensed under an MIT styles license
+and Copyright (c) 1995-2008 International Business Machines Corporation and others
+
+Some data files (under analysis/icu/src/data) are derived from Unicode data such
+as the Unicode Character Database. See http://unicode.org/copyright.html for more
+details.
+
+Brics Automaton (under core/src/java/org/apache/lucene/util/automaton) is
+BSD-licensed, created by Anders Møller. See http://www.brics.dk/automaton/
+
+The levenshtein automata tables (under core/src/java/org/apache/lucene/util/automaton) were
+automatically generated with the moman/finenight FSA library, created by
+Jean-Philippe Barrette-LaPierre. This library is available under an MIT license,
+see http://sites.google.com/site/rrettesite/moman and
+http://bitbucket.org/jpbarrette/moman/overview/
+
+This product includes code (JaspellTernarySearchTrie) from Java Spelling
+Checking Package (jaspell): http://jaspell.sourceforge.net/
+License: The BSD License (http://www.opensource.org/licenses/bsd-license.php)
+
+The snowball stemmers in
+ analysis/common/src/java/net/sf/snowball
+were developed by Martin Porter and Richard Boulton.
+The snowball stopword lists in
+ analysis/common/src/resources/org/apache/lucene/analysis/snowball
+were developed by Martin Porter and Richard Boulton.
+The full snowball package is available from
+ http://snowball.tartarus.org/
+
+The KStem stemmer in
+ analysis/common/src/org/apache/lucene/analysis/en
+was developed by Bob Krovetz and Sergio Guzman-Lara (CIIR-UMass Amherst)
+under the BSD-license.
+
+The Arabic,Persian,Romanian,Bulgarian, and Hindi analyzers (common) come with a default
+stopword list that is BSD-licensed created by Jacques Savoy.
+See http://members.unine.ch/jacques.savoy/clef/index.html.
+
+The German,Spanish,Finnish,French,Hungarian,Italian,Portuguese,Russian and Swedish light stemmers
+(common) are based on BSD-licensed reference implementations created by Jacques Savoy and
+Ljiljana Dolamic.
+
+The Stempel analyzer (stempel) includes BSD-licensed software developed
+by the Egothor project http://egothor.sf.net/, created by Leo Galambos, Martin Kvapil,
+and Edmond Nolan.
+
+The Polish analyzer (stempel) comes with a default
+stopword list that is BSD-licensed created by the Carrot2 project. The file resides
+in stempel/src/resources/org/apache/lucene/analysis/pl/stopwords.txt.
+See http://project.carrot2.org/license.html.
+
+The SmartChineseAnalyzer source code (smartcn) was
+provided by Xiaoping Gao and copyright 2009 by www.imdict.net.
+
+WordBreakTestUnicode_*.java (under modules/analysis/common/src/test/)
+is derived from Unicode data such as the Unicode Character Database.
+See http://unicode.org/copyright.html for more details.
+
+The Morfologik analyzer (morfologik) includes BSD-licensed software
+developed by Dawid Weiss and Marcin Miłkowski (http://morfologik.blogspot.com/).
+
+Morfologik uses data from Polish ispell/myspell dictionary
+(http://www.sjp.pl/slownik/en/) licenced on the terms of (inter alia)
+LGPL and Creative Commons ShareAlike.
+
+Morfologic includes data from BSD-licensed dictionary of Polish (SGJP)
+(http://sgjp.pl/morfeusz/)
+
+Servlet-api.jar and javax.servlet-*.jar are under the CDDL license, the original
+source code for this can be found at http://www.eclipse.org/jetty/downloads.php
+
+===========================================================================
+Kuromoji Japanese Morphological Analyzer - Apache Lucene Integration
+===========================================================================
+
+This software includes a binary and/or source version of data from
+
+ mecab-ipadic-2.7.0-20070801
+
+which can be obtained from
+
+ http://atilika.com/releases/mecab-ipadic/mecab-ipadic-2.7.0-20070801.tar.gz
+
+or
+
+ http://jaist.dl.sourceforge.net/project/mecab/mecab-ipadic/2.7.0-20070801/mecab-ipadic-2.7.0-20070801.tar.gz
+
+===========================================================================
+mecab-ipadic-2.7.0-20070801 Notice
+===========================================================================
+
+Nara Institute of Science and Technology (NAIST),
+the copyright holders, disclaims all warranties with regard to this
+software, including all implied warranties of merchantability and
+fitness, in no event shall NAIST be liable for
+any special, indirect or consequential damages or any damages
+whatsoever resulting from loss of use, data or profits, whether in an
+action of contract, negligence or other tortuous action, arising out
+of or in connection with the use or performance of this software.
+
+A large portion of the dictionary entries
+originate from ICOT Free Software. The following conditions for ICOT
+Free Software applies to the current dictionary as well.
+
+Each User may also freely distribute the Program, whether in its
+original form or modified, to any third party or parties, PROVIDED
+that the provisions of Section 3 ("NO WARRANTY") will ALWAYS appear
+on, or be attached to, the Program, which is distributed substantially
+in the same form as set out herein and that such intended
+distribution, if actually made, will neither violate or otherwise
+contravene any of the laws and regulations of the countries having
+jurisdiction over the User or the intended distribution itself.
+
+NO WARRANTY
+
+The program was produced on an experimental basis in the course of the
+research and development conducted during the project and is provided
+to users as so produced on an experimental basis. Accordingly, the
+program is provided without any warranty whatsoever, whether express,
+implied, statutory or otherwise. The term "warranty" used herein
+includes, but is not limited to, any warranty of the quality,
+performance, merchantability and fitness for a particular purpose of
+the program and the nonexistence of any infringement or violation of
+any right of any third party.
+
+Each user of the program will agree and understand, and be deemed to
+have agreed and understood, that there is no warranty whatsoever for
+the program and, accordingly, the entire risk arising from or
+otherwise connected with the program is assumed by the user.
+
+Therefore, neither ICOT, the copyright holder, or any other
+organization that participated in or was otherwise related to the
+development of the program and their respective officials, directors,
+officers and other employees shall be held liable for any and all
+damages, including, without limitation, general, special, incidental
+and consequential damages, arising out of or otherwise in connection
+with the use or inability to use the program or any product, material
+or result produced or otherwise obtained by using the program,
+regardless of whether they have been advised of, or otherwise had
+knowledge of, the possibility of such damages at any time during the
+project or thereafter. Each user will be deemed to have agreed to the
+foregoing by his or her commencement of use of the program. The term
+"use" as used herein includes, but is not limited to, the use,
+modification, copying and distribution of the program and the
+production of secondary products from the program.
+
+In the case where the program, whether in its original form or
+modified, was distributed or delivered to or received by a user from
+any person, organization or entity other than ICOT, unless it makes or
+grants independently of ICOT any specific warranty to the user in
+writing, such person, organization or entity, will also be exempted
+from and not be held liable to the user for any such damages as noted
+above as far as the program is concerned.
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/apache-jena-fuseki/fuseki
----------------------------------------------------------------------
diff --git a/jena-fuseki2/apache-jena-fuseki/fuseki b/jena-fuseki2/apache-jena-fuseki/fuseki
new file mode 100644
index 0000000..9cc1fe8
--- /dev/null
+++ b/jena-fuseki2/apache-jena-fuseki/fuseki
@@ -0,0 +1,477 @@
+#!/usr/bin/env bash
+
+# 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.
+#
+# =========
+#
+# Startup script for Fuseki under *nix systems (works with cygwin too)
+#
+# Configuration
+# -------------
+# Default values are loaded from /etc/default/fuseki, if it exists.
+#
+# JAVA
+# Command to invoke Java. If not set, java (from the PATH) will be used.
+#
+# JAVA_OPTIONS
+# Extra options to pass to the JVM.
+#
+# FUSEKI_HOME
+# Where Fuseki is installed. If not set, the script will try
+# to guess it based on the script invokation path.
+#
+# FUSEKI_BASE
+# The root of the runtime area - logs files, system files, local configuration.
+# Defaults to /etc/fuseki.
+#
+# FUSEKI_RUN
+# Where the fuseki.pid file should be stored. It defaults
+# first available of /var/run, /usr/var/run, and /tmp if not set.
+#
+# FUSEKI_PID
+# The FUSEKI PID file, defaults to $FUSEKI_RUN/fuseki.pid
+#
+# FUSEKI_ARGS
+# The arguments to pass to the Fuseki server on the command line. Defaults to:
+# # if FUSEKI_CONF is not set
+# --config=$FUSEKI_CONF # if FUSEKI_CONF is set
+#
+# FUSEKI_START
+# Path to the jar file. Defaults to $FUSEKI_HOME/fuseki-server.jar
+
+# FUSEKI_CONF
+# The Fuseki configuration file, usually in RDF Turtle notation.
+#
+# FUSEKI_USER
+# If set, the server will be run as this user
+#
+# FUSEKI_LOGS
+# Directory where logs will be generated.
+# Fixed as $FUSEKI_BASE/logs.
+#
+# FUSEKI_LOGS_STDERROUT
+# Log file with stderr and stdout log output from Fuseki.
+# Defaults to $FUSEKI_LOGS/stderrout.log
+
+### BEGIN INIT INFO
+# Provides: fuseki
+# Required-Start: $remote_fs $network
+# Required-Stop: $remote_fs $network
+# Default-Start: 3 4 5
+# Default-Stop: 0 1 2 6
+# Short-Description: Start Jena Fuseki at boot time
+# Description: Jena Fuseki is a service that provides a SPARQL API over HTTP
+### END INIT INFO
+
+# DEBUG=1
+NAME=fuseki
+if [ -f /etc/default/$NAME ]; then
+ . /etc/default/$NAME
+fi
+
+if [ -f /lib/lsb/init-functions ]; then
+ . /lib/lsb/init-functions
+else
+ # simple replacements for LSB daemon logging functions if not defined
+ log_daemon_msg() {
+ echo $1
+ }
+ log_begin_msg() {
+ echo $1
+ }
+ log_end_msg() {
+ if [ $1 -eq 0]; then
+ echo '[OK]'
+ else
+ echo '[failed]'
+ fi
+ }
+fi
+
+usage()
+{
+ echo "Usage: ${0##*/} {start|stop|restart|run|status}"
+ exit 1
+}
+
+[ $# -gt 0 ] || usage
+CMD="$1"
+
+# Utility functions
+
+findDirectory()
+{
+ local L OP=$1
+ shift
+ for L in "$@"; do
+ [ "$OP" "$L" ] || continue
+ printf %s "$L"
+ break
+ done
+}
+
+findFile()
+{
+ local L F=$1
+ shift
+ for L in "$@"; do
+ [ -f "${L}/${F}" ] || continue
+ printf %s "${L}/${F}"
+ break
+ done
+}
+
+running()
+{
+ local PID=$(cat "$1" 2>/dev/null) || return 1
+ ps -p "$PID" >/dev/null 2>&1
+}
+
+# Are we running in cygwin?
+cygwin=false
+case "`uname`" in
+ CYGWIN*) cygwin=true;;
+esac
+
+# Set FUSKEI_HOME to the script invocation directory if it is not specified
+if [ -z "$FUSEKI_HOME" ]
+then
+ SCRIPT="$0"
+ # Catch common issue: script has been symlinked
+ if [ -L "$SCRIPT" ]
+ then
+ SCRIPT="$(readlink "$0")"
+ # If link is relative
+ case "$SCRIPT" in
+ /*) ;; # fine
+ *) SCRIPT=$( dirname "$0" )/$SCRIPT;; # fix
+ esac
+ fi
+
+ # Work out root from script location
+ FUSEKI_HOME="$( cd "$( dirname "$SCRIPT" )" && pwd )"
+
+fi
+
+# Deal with Cygwin path issues
+if [ "$cygwin" == "true" ]
+then
+ FUSEKI_HOME=`cygpath -w "$FUSEKI_HOME"`
+fi
+
+if [ ! -e "$FUSEKI_HOME" ]
+then
+ log_daemon_msg "FUSEKI_HOME '$FUSEKI_HOME' does not exist" 1>&2
+ exit 1
+fi
+
+if [ -z "$FUSEKI_BASE" ]
+then
+ FUSEKI_BASE="/etc/fuseki"
+fi
+
+if [ "$cygwin" == "true" ]
+then
+ FUSEKI_BASE=`cygpath -w "$FUSEKI_BASE"`
+fi
+
+
+if [ ! -e "$FUSEKI_BASE" -o ! -d "$FUSEKI_BASE" ]
+then
+ log_daemon_msg "FUSEKI_BASE '$FUSEKI_BASE' does not exist or is not a directory" 1>&2
+ exit 1
+fi
+
+if [ ! -w "$FUSEKI_BASE" ]
+then
+ log_daemon_msg "FUSEKI_BASE '$FUSEKI_BASE' is not writable." 1>&2
+ exit 1
+fi
+
+
+# Deal with Cygwin path issues
+if [ "$cygwin" == "true" ]
+then
+ FUSEKI_HOME=`cygpath -w "$FUSEKI_HOME"`
+ FUSEKI_BASE=`cygpath -w "$FUSEKI_BASE"`
+ fi
+
+# Find a location for the pid file
+if [ -z "$FUSEKI_RUN" ]
+then
+ FUSEKI_RUN=$(findDirectory -w /var/run /usr/var/run $FUSEKI_HOME /tmp)
+fi
+
+# Get PID file name
+if [ -z "$FUSEKI_PID" ]
+then
+ FUSEKI_PID="$FUSEKI_RUN/fuseki.pid"
+fi
+
+# Log directory
+if [ -n "$FUSEKI_LOGS" ]
+then
+ log_daemon_message "FUSEKI_LOGS can not be set externally - ignored" 1>&2
+fi
+FUSEKI_LOGS="$FUSEKI_BASE/logs"
+
+# Std Err and Out log
+if [ -z "$FUSEKI_LOGS_STDERROUT" ]
+then
+ FUSEKI_LOGS_STDERROUT="$FUSEKI_LOGS/stderrout.log"
+fi
+
+# Data directory
+if [ -z "$FUSEKI_DATA_DIR" ]
+then
+ FUSEKI_DATA_DIR="$FUSEKI_HOME/DB"
+fi
+
+# Set up JAVA if not set
+if [ -z "$JAVA" ]
+then
+ JAVA=$(which java)
+fi
+if [ -z "$JAVA" ]
+then
+ echo "Cannot find a Java JDK. Please set either set JAVA or put java (>=1.7) in your PATH." 2>&2
+ exit 1
+fi
+
+# The location of the start up JAR
+FUSEKI_START=${FUSEKI_START:-$FUSEKI_HOME/fuseki-server.jar}
+
+# Deal with Cygwin path issues
+if [ "$cygwin" == "true" ]
+then
+ DATA_DIR=`cygpath -w "$FUSEKI_DATA_DIR"`
+ FUSEKI_START=`cygpath -w "$FUSEKI_START"`
+else
+ DATA_DIR="$FUSEKI_DATA_DIR"
+fi
+
+# Some JVM settings
+if [ -z "$JAVA_OPTIONS" ]
+then
+ JAVA_OPTIONS="-Xmx1200M"
+fi
+
+# Default Fuseki Arguments
+if [ -z "$FUSEKI_ARGS" ]
+then
+ if [ -z "$FUSEKI_CONF" ]
+ then
+ FUSEKI_ARGS=""
+ else
+ FUSEKI_ARGS="--config=$FUSEKI_CONF"
+ fi
+fi
+
+# Run command
+
+RUN_ARGS=(${JAVA_OPTIONS[@]} -jar "$FUSEKI_START" $FUSEKI_ARGS)
+RUN_CMD=("$JAVA" ${RUN_ARGS[@]})
+
+
+#####################################################
+# Comment these out after you're happy with what
+# the script is doing.
+#####################################################
+if (( DEBUG ))
+then
+ log_daemon_msg "FUSEKI_HOME = $FUSEKI_HOME"
+ log_daemon_msg "FUSEKI_CONF = $FUSEKI_CONF"
+ log_daemon_msg "FUSEKI_RUN = $FUSEKI_RUN"
+ log_daemon_msg "FUSEKI_PID = $FUSEKI_PID"
+ log_daemon_msg "FUSEKI_ARGS = $FUSEKI_ARGS"
+ log_daemon_msg "FUSEKI_START = $FUSEKI_START"
+ log_daemon_msg "CONFIGS = ${CONFIGS[*]}"
+ log_daemon_msg "JAVA = $JAVA"
+ log_daemon_msg "JAVA_OPTIONS = ${JAVA_OPTIONS[*]}"
+ log_daemon_msg "RUN_ARGS = ${RUN_ARGS[@]}"
+ log_daemon_msg "RUN_CMD = ${RUN_CMD[@]}"
+fi
+
+NO_START=0
+
+# Life cycle functions
+start() {
+ if (( NO_START )); then
+ log_daemon_msg "Not starting Fuseki - NO_START=1"
+ exit
+ fi
+
+ # Make sure the data and log directories exist
+ mkdir -p "$FUSEKI_DATA_DIR"
+ mkdir -p "$FUSEKI_LOGS"
+
+ # Make sure the .jar file exists
+ if [ ! -e $FUSEKI_START ]; then
+ log_daemon_msg "Could not see Fuseki .jar file: \$FUSEKI_START has value '$FUSEKI_START'"
+ exit 1
+ fi
+
+ log_begin_msg "Starting Fuseki"
+ if type start-stop-daemon > /dev/null 2>&1
+ then
+ unset CH_USER
+ if [ -n "$FUSEKI_USER" ]
+ then
+ CH_USER="--chuid $FUSEKI_USER"
+ fi
+ if start-stop-daemon --start $CH_USER --chdir "$FUSEKI_HOME" --background --make-pidfile --pidfile "$FUSEKI_PID" --startas /bin/bash -- -c "exec $JAVA ${RUN_ARGS[*]} > $FUSEKI_LOGS_STDERROUT 2>&1"
+ then
+ sleep 2
+ if running "$FUSEKI_PID"
+ then
+ log_end_msg 0
+ print_started
+ else
+ log_end_msg 1
+ fi
+ else
+ log_end_msg 1
+ log_daemon_msg "** start-stop-daemon failed to run"
+ fi
+ else
+ if running $FUSEKI_PID
+ then
+ log_end_msg 1
+ log_daemon_msg 'Already Running!'
+ exit 1
+ else
+ # dead pid file - remove
+ rm -f "$FUSEKI_PID"
+ fi
+
+ if [ "$FUSEKI_USER" ]
+ then
+ touch "$FUSEKI_PID"
+ chown "$FUSEKI_USER" "$FUSEKI_PID"
+ su - "$FUSEKI_USER" -c "
+ log_daemon_msg "Redirecting Fuseki stderr/stdout to $FUSEKI_LOGS_STDERROUT"
+ exec ${RUN_CMD[*]} &
+ disown \$!
+ echo \$! > '$FUSEKI_PID'"
+ else
+ #log_daemon_msg "Redirecting Fuseki stderr/stdout to $FUSEKI_LOGS_STDERROUT"
+ exec "${RUN_CMD[@]}" &> "$FUSEKI_LOGS_STDERROUT" &
+ disown $!
+ echo $! > "$FUSEKI_PID"
+ fi
+
+ log_end_msg 0
+ print_started
+ fi
+}
+
+print_started() {
+ log_daemon_msg "STARTED Fuseki `date`"
+ log_daemon_msg "PID=$(cat "$FUSEKI_PID" 2>/dev/null)"
+}
+
+delete_fuseki_pid_file() {
+ rm -f "$FUSEKI_PID"
+}
+
+stop() {
+ log_begin_msg "Stopping Fuseki: "
+
+ if ! running "$FUSEKI_PID"
+ then
+ log_end_msg 1
+
+ # if a stop rather than a restart, signal failure to stop
+ if [ -z "$1" ]
+ then
+ exit 1
+ fi
+ fi
+
+ ###############################################################
+ # !!!! This code needs to be improved, too many repeats !!!! #
+ ###############################################################
+ if type start-stop-daemon > /dev/null 2>&1; then
+ start-stop-daemon --stop --pidfile "$FUSEKI_PID" --chdir "$FUSEKI_HOME" --startas "$JAVA" --signal HUP
+
+ ## Die after a 30 second timeout
+ TIMEOUT=30
+ while running "$FUSEKI_PID"; do
+ if (( TIMEOUT-- == 0 )); then
+ start-stop-daemon --stop --pidfile "$FUSEKI_PID" --chdir "$FUSEKI_HOME" --startas "$JAVA" --signal KILL
+ fi
+ sleep 1
+ done
+ delete_fuseki_pid_file
+ log_end_msg 0
+ else
+ PID=$(cat "$FUSEKI_PID" 2>/dev/null)
+ kill "$PID" 2>/dev/null
+
+ TIMEOUT=30
+ while running $FUSEKI_PID; do
+ if (( TIMEOUT-- == 0 )); then
+ kill -KILL "$PID" 2>/dev/null
+ fi
+ sleep 1
+ done
+ delete_fuseki_pid_file
+ log_end_msg 0
+ fi
+}
+
+
+# Run in the foreground, as the current user
+run() {
+ # Make sure the .jar file exists
+ if [ ! -e $FUSEKI_START ]; then
+ log_daemon_msg "Could not see Fuseki .jar file: \$FUSEKI_START has value '$FUSEKI_START'"
+ exit 1
+ fi
+ exec "${RUN_CMD[@]}"
+}
+
+case $CMD in
+ start)
+ start
+ ;;
+ stop)
+ stop
+ ;;
+ restart)
+ stop "restarting"
+ start
+ ;;
+ run)
+ run
+ ;;
+ status)
+ FUSEKI_PID=$(findFile fuseki.pid /var/run /usr/var/run $FUSEKI_HOME /tmp)
+ if running $FUSEKI_PID
+ then
+ PID=`cat "$FUSEKI_PID"`
+ log_daemon_msg "Fuseki is running with pid: $PID"
+ else
+ log_daemon_msg "Fuseki is not running"
+ fi
+ ;;
+ *)
+ usage
+ ;;
+esac
+
+exit 0
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/apache-jena-fuseki/fuseki-server
----------------------------------------------------------------------
diff --git a/jena-fuseki2/apache-jena-fuseki/fuseki-server b/jena-fuseki2/apache-jena-fuseki/fuseki-server
new file mode 100755
index 0000000..6342aba
--- /dev/null
+++ b/jena-fuseki2/apache-jena-fuseki/fuseki-server
@@ -0,0 +1,80 @@
+#!/bin/sh
+# 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.
+
+# Run fuseki as a standalone server
+
+export FUSEKI_HOME="${FUSEKI_HOME:-$PWD}"
+
+if [ ! -e "$FUSEKI_HOME" ]
+then
+ echo "$FUSEKI_HOME does not exist" 1>&2
+ exit 1
+ fi
+
+JAR1="$FUSEKI_HOME/fuseki-server.jar"
+JAR2="$FUSEKI_HOME/jena-fuseki-server-*.jar"
+JAR=""
+
+for J in "$JAR1" "$JAR2"
+do
+ # Expand
+ J="$(echo $J)"
+ if [ -e "$J" ]
+ then
+ JAR="$J"
+ break
+ fi
+done
+
+if [ "$JAR" = "" ]
+then
+ echo "Can't find jarfile to run"
+ exit 1
+fi
+
+# Deal with Cygwin path issues
+cygwin=false
+case "`uname`" in
+ CYGWIN*) cygwin=true;;
+esac
+if [ "$cygwin" = "true" ]
+then
+ JAR=`cygpath -w "$JAR"`
+ FUSEKI_HOME=`cygpath -w "$FUSEKI_HOME"`
+fi
+
+export FUSEKI_BASE="${FUSEKI_BASE:-$PWD/run}"
+
+JVM_ARGS=${JVM_ARGS:--Xmx1200M}
+
+exec java $JVM_ARGS -jar "$JAR" "$@"
+
+## Adding custom code to the Fuseki server:
+##
+## It is also possible to launch Fuseki using
+## java $JVM_ARGS -cp "$JAR" org.apache.jena.fuseki.cmd.FusekiCmd "$@"
+##
+## "exec" is optional - it simple frees up a OS process.
+## In this way, you can add custom java to the classpath:
+##
+## APPJAR=MyCode.jar
+## java $JVM_ARGS -cp "$JAR:$APPJAR" org.apache.jena.fuseki.cmd.FusekiCmd "$@"
+
+
+
+
+
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/apache-jena-fuseki/fuseki-server.bat
----------------------------------------------------------------------
diff --git a/jena-fuseki2/apache-jena-fuseki/fuseki-server.bat b/jena-fuseki2/apache-jena-fuseki/fuseki-server.bat
new file mode 100644
index 0000000..9977a23
--- /dev/null
+++ b/jena-fuseki2/apache-jena-fuseki/fuseki-server.bat
@@ -0,0 +1,28 @@
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements. See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership. The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License. You may obtain a copy of the License at
+@REM
+@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing, software
+@REM distributed under the License is distributed on an "AS IS" BASIS,
+@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@REM See the License for the specific language governing permissions and
+@REM limitations under the License.
+
+@echo off
+@REM modify this to name the server jar
+java -Xmx1200M -jar fuseki-server.jar %*
+
+@REM Adding custom code to the Fuseki server:
+@REM
+@REM It is also possible to launch Fuseki using
+@REM java ..jvmarsg... -cp $JAR org.apache.jena.fuseki.cmd.FusekiCmd %*
+@REM
+@REM In this way, you can add custom java to the classpath:
+@REM
+@REM java ... -cp fuseki-server.jar;MyCustomCode.jar org.apache.jena.fuseki.cmd.FusekiCmd %*
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/apache-jena-fuseki/pom.xml
----------------------------------------------------------------------
diff --git a/jena-fuseki2/apache-jena-fuseki/pom.xml b/jena-fuseki2/apache-jena-fuseki/pom.xml
new file mode 100644
index 0000000..fb2db6c
--- /dev/null
+++ b/jena-fuseki2/apache-jena-fuseki/pom.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <name>Apache Jena - Fuseki Binary Distribution</name>
+ <artifactId>apache-jena-fuseki</artifactId>
+ <version>2.0.0-SNAPSHOT</version>
+ <packaging>pom</packaging>
+
+ <parent>
+ <groupId>org.apache.jena</groupId>
+ <artifactId>jena-fuseki</artifactId>
+ <version>2.0.0-SNAPSHOT</version>
+ <relativePath>..</relativePath>
+ </parent>
+
+ <description>Fuseki distribution</description>
+ <url>http://jena.apache.org/</url>
+
+ <organization>
+ <name>Apache Jena</name>
+ <url>http://jena.apache.org/</url>
+ </organization>
+
+ <licenses>
+ <license>
+ <name>Apache 2.0 License</name>
+ <url>http://www.apache.org/licenses/LICENSE-2.0</url>
+ </license>
+ </licenses>
+
+ <properties>
+ <maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm:ssZ</maven.build.timestamp.format>
+ <build.time.xsd>${maven.build.timestamp}</build.time.xsd>
+ </properties>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.apache.jena</groupId>
+ <artifactId>jena-fuseki-server</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.jena</groupId>
+ <artifactId>jena-fuseki-war</artifactId>
+ <version>${project.version}</version>
+ <type>war</type>
+ </dependency>
+
+ </dependencies>
+ <build>
+ <plugins>
+
+ <plugin>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>create-zip-assembly</id>
+ <phase>package</phase>
+ <!--<phase/>-->
+ <goals><goal>single</goal></goals>
+ <configuration>
+ <appendAssemblyId>false</appendAssemblyId>
+ <descriptors>
+ <descriptor>assembly-dist.xml</descriptor>
+ </descriptors>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+ </plugins>
+
+ </build>
+
+</project>
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/jena-fuseki-dist/assembly-dist.xml
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-dist/assembly-dist.xml b/jena-fuseki2/jena-fuseki-dist/assembly-dist.xml
deleted file mode 100644
index 3c6c66e..0000000
--- a/jena-fuseki2/jena-fuseki-dist/assembly-dist.xml
+++ /dev/null
@@ -1,99 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- 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.
--->
-
-<!--
- The distribution.
- Assumes jar made and onejar has been assembled.
--->
-
-<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
-
- <id>distribution</id>
-
- <formats>
- <format>zip</format>
- <format>tar.gz</format>
- </formats>
-
- <baseDirectory>${project.artifactId}-${project.version}</baseDirectory>
-
- <dependencySets>
- <!-- Standalone JAR -->
- <dependencySet>
- <useProjectArtifact>false</useProjectArtifact>
- <includes>
- <include>org.apache.jena:jena-fuseki-server:jar</include>
- </includes>
- <outputFileNameMapping>fuseki-server.jar</outputFileNameMapping>
-
- </dependencySet>
- <!-- WAR file -->
- <dependencySet>
- <useProjectArtifact>false</useProjectArtifact>
- <includes>
- <include>org.apache.jena:jena-fuseki-war:war</include>
- </includes>
- <outputFileNameMapping>fuseki.war</outputFileNameMapping>
-
- </dependencySet>
- </dependencySets>
-
- <files>
-
- <file>
- <source>dist/LICENSE</source>
- <destName>LICENSE</destName>
- </file>
- <file>
- <source>dist/NOTICE</source>
- <destName>NOTICE</destName>
- </file>
- </files>
-
- <fileSets>
- <fileSet>
- <outputDirectory></outputDirectory>
- <includes>
- <include>templates/*</include>
- <include>README*</include>
- <include>DEPENDENCIES*</include>
- <include>ReleaseNotes.txt</include>
- </includes>
- </fileSet>
-
- <fileSet>
- <outputDirectory></outputDirectory>
- <includes>
- <include>log4j.properties</include>
- <!--<include>examples/**</include>-->
- <include>fuseki</include>
- <include>fuseki-server</include>
- <include>fuseki-server.bat</include>
- <!--<include>s-*</include>-->
- </includes>
- </fileSet>
-
- <fileSet>
- <directory>../jena-fuseki-core/src/main/webapp</directory>
- <outputDirectory>webapp</outputDirectory>
- </fileSet>
-
- </fileSets>
-</assembly>
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/jena-fuseki-dist/backup
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-dist/backup b/jena-fuseki2/jena-fuseki-dist/backup
deleted file mode 100755
index a3cb0b1..0000000
--- a/jena-fuseki2/jena-fuseki-dist/backup
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/bash
-# 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.
-
-DB="ds"
-
-curl -v -XPOST 'http://localhost:3030/$/sleep?interval=10000'
-
-curl -v 'http://localhost:3030/$/tasks'
\ No newline at end of file
[5/6] jena git commit: JENA-872 : apache-jena-fuseki
Posted by an...@apache.org.
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/apache-jena-fuseki/bin/s-put
----------------------------------------------------------------------
diff --git a/jena-fuseki2/apache-jena-fuseki/bin/s-put b/jena-fuseki2/apache-jena-fuseki/bin/s-put
new file mode 100755
index 0000000..0e3a807
--- /dev/null
+++ b/jena-fuseki2/apache-jena-fuseki/bin/s-put
@@ -0,0 +1,707 @@
+#!/usr/bin/env ruby
+# -*- coding: utf-8 -*-
+
+# 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.
+
+# SPARQL HTTP Update, client.
+
+require 'optparse'
+require 'net/http'
+require 'uri'
+require 'cgi'
+require 'pp'
+require 'ostruct'
+
+# ToDo
+# Allow a choice of media type for GET
+# --accept "content-type" (and abbreviations)
+# --header "Add:this"
+# --user, --password
+# Basic authentication: request.basic_auth("username", "password")
+# Follow redirects => 301: puts response["location"] # All headers are lowercase?
+
+SOH_NAME="SOH"
+SOH_VERSION="0.0.0"
+
+$proxy = ENV['http_proxy'] ? URI.parse(ENV['http_proxy']) : OpenStruct.new
+
+# What about direct naming?
+
+# Names
+$mtTurtle = 'text/turtle;charset=utf-8'
+$mtRDF = 'application/rdf+xml'
+$mtText = 'text/plain'
+$mtNQuads = 'text/n-quads'
+$mtTriG = 'application/trig'
+$mtSparqlResultsX = 'application/sparql-results+xml'
+$mtSparqlResultsJ = 'application/sparql-results+json'
+$mtAppJSON = 'application/json'
+$mtAppXML = 'application/xml'
+$mtSparqlResultsTSV = 'application/sparql-results+tsv'
+$mtSparqlResultsCSV = 'application/sparql-results+csv'
+$mtSparqlUpdate = 'application/sparql-update'
+$mtWWWForm = 'application/x-www-form-urlencoded'
+$mtSparqlQuery = "application/sparql-query" ;
+
+# Global media type table.
+$fileMediaTypes = {}
+$fileMediaTypes['ttl'] = $mtTurtle
+$fileMediaTypes['n3'] = 'text/n3; charset=utf-8'
+$fileMediaTypes['nt'] = $mtText
+$fileMediaTypes['rdf'] = $mtRDF
+$fileMediaTypes['owl'] = $mtRDF
+$fileMediaTypes['nq'] = $mtNQuads
+$fileMediaTypes['trig'] = $mtTriG
+
+# Global charset : no entry means "don't set"
+$charsetUTF8 = 'utf-8'
+$charset = {}
+$charset[$mtTurtle] = 'utf-8'
+$charset[$mtText] = 'ascii'
+$charset[$mtTriG] = 'utf-8'
+$charset[$mtNQuads] = 'ascii'
+
+# Headers
+
+$hContentType = 'Content-Type'
+# $hContentEncoding = 'Content-Encoding'
+$hContentLength = 'Content-Length'
+# $hContentLocation = 'Content-Location'
+# $hContentRange = 'Content-Range'
+
+$hAccept = 'Accept'
+$hAcceptCharset = 'Accept-Charset'
+$hAcceptEncoding = 'Accept-Encoding'
+$hAcceptRanges = 'Accept-Ranges'
+
+$headers = { "User-Agent" => "#{SOH_NAME}/Fuseki #{SOH_VERSION}"}
+$print_http = false
+
+# Default for GET
+# At least allow anythign (and hope!)
+$accept_rdf="#{$mtRDF};q=0.9 , #{$mtTurtle}"
+# For SPARQL query
+$accept_results="#{$mtSparqlResultsJ} , #{$mtSparqlResultsX};q=0.9 , #{$accept_rdf}"
+
+# Accept any in case of trouble.
+$accept_rdf="#{$accept_rdf} , */*;q=0.1"
+$accept_results="#{$accept_results} , */*;q=0.1"
+
+# The media type usually forces the charset.
+$accept_charset=nil
+
+## Who we are.
+## Two styles:
+## s-query .....
+## soh query .....
+
+$cmd = File.basename($0)
+if $cmd == 'soh'
+then
+ $cmd = (ARGV.size == 0) ? 'soh' : ARGV.shift
+end
+
+if ! $cmd.start_with?('s-') && $cmd != 'soh'
+ $cmd = 's-'+$cmd
+end
+
+## --------
+
+def GET(dataset, graph)
+ print "GET #{dataset} #{graph}\n" if $verbose
+ requestURI = target(dataset, graph)
+ headers = {}
+ headers.merge!($headers)
+ headers[$hAccept] = $accept_rdf
+ headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
+ get_worker(requestURI, headers)
+end
+
+def get_worker(requestURI, headers)
+ uri = URI.parse(requestURI)
+ request = Net::HTTP::Get.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ response_print_body(uri, request)
+end
+
+def HEAD(dataset, graph)
+ print "HEAD #{dataset} #{graph}\n" if $verbose
+ requestURI = target(dataset, graph)
+ headers = {}
+ headers.merge!($headers)
+ headers[$hAccept] = $accept_rdf
+ headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
+ uri = URI.parse(requestURI)
+ request = Net::HTTP::Head.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def PUT(dataset, graph, file)
+ print "PUT #{dataset} #{graph} #{file}\n" if $verbose
+ send_body(dataset, graph, file, Net::HTTP::Put)
+end
+
+def POST(dataset, graph, file)
+ print "POST #{dataset} #{graph} #{file}\n" if $verbose
+ send_body(dataset, graph, file, Net::HTTP::Post)
+end
+
+def DELETE(dataset, graph)
+ print "DELETE #{dataset} #{graph}\n" if $verbose
+ requestURI = target(dataset, graph)
+ uri = URI.parse(requestURI)
+ request = Net::HTTP::Delete.new(uri.request_uri)
+ headers = {}
+ headers.merge!($headers)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def uri_escape(string)
+ CGI.escape(string)
+end
+
+def target(dataset, graph)
+ return dataset+"?default" if graph == "default"
+ return dataset+"?graph="+uri_escape(graph)
+end
+
+def send_body(dataset, graph, file, method)
+ mt = content_type(file)
+ headers = {}
+ headers.merge!($headers)
+ headers[$hContentType] = mt
+ headers[$hContentLength] = File.size(file).to_s
+ ## p headers
+
+ requestURI = target(dataset, graph)
+ uri = URI.parse(requestURI)
+
+ request = method.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ request.body_stream = File.open(file)
+ response_no_body(uri, request)
+end
+
+def response_no_body(uri, request)
+ http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
+ http.read_timeout = nil
+ # check we can connect.
+ begin http.start
+ rescue Exception => e
+ # puts e.message
+ #puts e.backtrace.inspect
+ warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
+ end
+ response = http.request(request)
+ print_http_response(response)
+ case response
+ when Net::HTTPSuccess, Net::HTTPRedirection
+ # OK
+ when Net::HTTPNotFound
+ warn_exit "404 Not found: #{uri}", 9
+ #print response.body
+ else
+ warn_exit "#{response.code} #{response.message} #{uri}", 9
+ # Unreachable
+ response.error!
+ end
+ # NO BODY IN RESPONSE
+end
+
+def response_print_body(uri, request)
+ http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
+ http.read_timeout = nil
+ # check we can connect.
+ begin http.start
+ rescue => e
+ #puts e.backtrace.inspect
+ #print e.class
+ warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
+ end
+
+ # Add a blank line if headers were output.
+ print "\n" if $http_print ;
+
+ begin
+ response = http.request(request) { |res|
+ print_http_response(res)
+ #puts res.code
+ res.read_body do |segment|
+ print segment
+ end
+ }
+ case response
+ when Net::HTTPSuccess, Net::HTTPRedirection
+ # OK
+ when Net::HTTPNotFound
+ warn_exit "404 Not found: #{uri}", 9
+ #print response.body
+ else
+ warn_exit "#{response.code}: #{uri}", 9
+ # Unreachable
+ response.error!
+ end
+ rescue EOFError => e
+ warn_exit "IO Error: "+e.message, 3
+ end
+end
+
+def print_http_request(uri, request)
+ return unless $print_http
+ #print "Request\n"
+ print request.method," ",uri, "\n"
+ print_headers(" ",request)
+end
+
+def print_http_response(response)
+ return unless $print_http
+ #print "Response\n"
+ print response.code, " ", response.message, "\n"
+ print_headers(" ",response)
+end
+
+def print_headers(marker, headers)
+ headers.each do |k,v|
+ k = k.split('-').map{|w| w.capitalize}.join('-')+':'
+ printf "%s%-20s %s\n",marker,k,v
+ end
+end
+
+def content_type(file)
+ file =~ /\.([^.]*)$/
+ ext = $1
+ mt = $fileMediaTypes[ext]
+ cs = $charset[mt]
+ mt = mt+';charset='+cs if ! cs.nil?
+ return mt
+end
+
+def charset(content_type)
+ return $charset[content_type]
+end
+
+def warn_exit(msg, rc)
+ warn msg
+ exit rc ;
+end
+
+def parseURI(uri_string)
+ begin
+ return URI.parse(uri_string).to_s
+ rescue URI::InvalidURIError => err
+ warn_exit "Bad URI: <#{uri_string}>", 2
+ end
+end
+
+## ---- Command
+
+def cmd_soh(command=nil)
+ ## Command line
+ options = {}
+ optparse = OptionParser.new do |opts|
+ # Set a banner, displayed at the top
+ # of the help screen.
+ case $cmd
+ when "s-http", "sparql-http", "soh"
+ banner="$cmd [get|post|put|delete] datasetURI graph [file]"
+ when "s-get", "s-head", "s-delete"
+ banner="$cmd datasetURI graph"
+ end
+
+ opts.banner = $banner
+ # Define the options, and what they do
+
+ options[:verbose] = false
+ opts.on( '-v', '--verbose', 'Verbose' ) do
+ options[:verbose] = true
+ end
+
+ options[:version] = false
+ opts.on( '--version', 'Print version and exit' ) do
+ print "#{SOH_NAME} #{SOH_VERSION}\n"
+ exit
+ end
+
+ # This displays the help screen, all programs are
+ # assumed to have this option.
+ opts.on( '-h', '--help', 'Display this screen and exit' ) do
+ puts opts
+ exit
+ end
+ end
+
+ begin optparse.parse!
+ rescue OptionParser::InvalidArgument => e
+ warn e
+ exit
+ end
+
+ $verbose = options[:verbose]
+ $print_http = $verbose
+
+ if command.nil?
+ if ARGV.size == 0
+ warn "No command given: expected one of 'get', 'put', 'post', 'delete', 'query' or 'update'"
+ exit 1
+ end
+ cmdPrint=ARGV.shift
+ command=cmdPrint.upcase
+ else
+ cmdPrint=command
+ end
+
+ case command
+ when "HEAD", "GET", "DELETE"
+ requiredFile=false
+ when "PUT", "POST"
+ requiredFile=true
+ when "QUERY"
+ cmd_sparql_query
+ when "UPDATE"
+ cmd_sparql_update
+ else
+ warn_exit "Unknown command: #{command}", 2
+ end
+
+ if requiredFile
+ then
+ if ARGV.size != 3
+ warn_exit "Required: dataset URI, graph URI (or 'default') and file", 1
+ end
+ else
+ if ARGV.size != 2
+ warn_exit "Required: dataset URI and graph URI (or 'default')", 1
+ end
+ end
+
+ dataset=parseURI(ARGV.shift)
+ # Relative URI?
+ graph=parseURI(ARGV.shift)
+ file=""
+ if requiredFile
+ then
+ file = ARGV.shift if requiredFile
+ if ! File.exist?(file)
+ warn_exit "No such file: "+file, 3
+ end
+ if File.directory?(file)
+ warn_exit "File is a directory: "+file, 3
+ end
+ end
+
+ case command
+ when "GET"
+ GET(dataset, graph)
+ when "HEAD"
+ HEAD(dataset, graph)
+ when "PUT"
+ PUT(dataset, graph, file)
+ when "DELETE"
+ DELETE(dataset, graph)
+ when "POST"
+ POST(dataset, graph, file)
+ else
+ warn_exit "Internal error: Unknown command: #{cmd}", 2
+ end
+ exit 0
+end
+
+## --------
+def string_or_file(arg)
+ return arg if ! arg.match(/^@/)
+ a=(arg[1..-1])
+ open(a, 'rb'){|f| f.read}
+end
+
+## -------- SPARQL Query
+
+## Choose method
+def SPARQL_query(service, query, query_file, forcePOST=false, args2={})
+ if ! query_file.nil?
+ query = open(query_file, 'rb'){|f| f.read}
+ end
+ if forcePOST || query.length >= 2*1024
+ SPARQL_query_POST(service, query, args2)
+ else
+ SPARQL_query_GET(service, query, args2)
+ end
+end
+
+## By GET
+
+def SPARQL_query_GET(service, query, args2)
+ args = { "query" => query }
+ args.merge!(args2)
+ qs=args.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
+ action="#{service}?#{qs}"
+ headers={}
+ headers.merge!($headers)
+ headers[$hAccept]=$accept_results
+ get_worker(action, headers)
+end
+
+## By POST
+
+def SPARQL_query_POST(service, query, args2)
+ # DRY - body/no body for each of request and response.
+ post_params={ "query" => query }
+ post_params.merge!(args2)
+ uri = URI.parse(service)
+ headers={}
+ headers.merge!($headers)
+ headers[$hAccept]=$accept_results
+ execute_post_form_body(uri, headers, post_params)
+end
+
+def execute_post_form_body(uri, headers, post_params)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ qs=post_params.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
+ headers[$hContentType] = $mtWWWForm
+ headers[$hContentLength] = qs.length.to_s
+ request.initialize_http_header(headers)
+ request.body = qs
+ print_http_request(uri, request)
+ response_print_body(uri, request)
+end
+
+# Usage: -v --help --file= --query=
+def cmd_sparql_query
+ options={}
+ optparse = OptionParser.new do |opts|
+ opts.banner = "Usage: #{$cmd} [--query QUERY] [--service URI] [--post] 'query' | @file"
+ opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
+ options[:service]=uri
+ end
+ opts.on('--query=FILE','--file=FILE', 'Take query from a file') do |file|
+ options[:file]=file
+ end
+ opts.on('--output=TYPE', [:json,:xml,:text,:csv,:tsv],
+ 'Set the output argument') do |type|
+ options[:output]=type
+ end
+ opts.on('--accept=TYPE', [:json,:xml,:text,:csv,:tsv],
+ 'Set the accept header type') do |type|
+ options[:accept]=type
+ end
+ options[:verbose] = false
+ opts.on( '--post', 'Force use of POST' ) do
+ options[:post] = true
+ end
+ opts.on( '-v', '--verbose', 'Verbose' ) do
+ options[:verbose] = true
+ end
+ opts.on( '--version', 'Print version and exit' ) do
+ print "#{SOH_NAME} #{SOH_VERSION}\n"
+ exit
+ end
+ opts.on( '-h', '--help', 'Display this screen and exit' ) do
+ puts opts
+ exit
+ end
+ end
+
+ begin optparse.parse!
+ rescue OptionParser::InvalidArgument, OptionParser::InvalidOption => e
+ warn e
+ exit 1
+ end
+
+ $verbose = options[:verbose]
+ $print_http = $verbose
+ usePOST = options[:post]
+
+ service = options[:service]
+ warn_exit 'No service specified. Required --service=URI',1 if service.nil?
+
+ # Query
+ query=nil
+ query_file=options[:file]
+ if query_file.nil? && ARGV.size == 0
+ then
+ warn_exit 'No query specified.',1
+ end
+ if query_file.nil?
+ query = ARGV.shift
+ if query.match(/^@/)
+ query_file = query[1..-1]
+ query = nil
+ end
+ end
+
+ # --output ==> output= (non-standard)
+ args={}
+ case options[:output]
+ when nil
+ when "json","xml","text","csv","tsv"
+ args['output'] = options[:output]
+ when :json,:xml,:text,:csv,:tsv
+ args['output'] = options[:output].to_s
+ else
+ warn_exit "Unrecognized output type: "+options[:output],2
+ end
+
+ # --accept
+ # options[:accept]
+
+ print "SPARQL #{service}\n" if $verbose
+ #args={"output"=>"text"}
+ SPARQL_query(service, query, query_file, usePOST, args)
+ exit(0)
+end
+
+## -------- SPARQL Update
+
+# Update sent as a WWW form.
+def SPARQL_update_by_form(service, update, args2={})
+ args = {}
+ args.merge!(args2)
+ headers={}
+ headers.merge!($headers)
+ # args? encode?
+ body="update="+uri_escape(update)
+ headers[$hContentType] = $mtWWWForm
+ headers[$hContentLength] = body.length.to_s
+ uri = URI.parse(service)
+ execute_post_form(uri, headers, body)
+end
+
+# DRY - query form.
+def execute_post_form(uri, headers, body)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ request.body = body
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def SPARQL_update(service, update, args2={})
+ args = {}
+ args.merge!(args2)
+ headers={}
+ headers.merge!($headers)
+ headers[$hContentType] = $mtSparqlUpdate
+ uri = URI.parse(service)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ request.body = update
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def cmd_sparql_update(by_raw_post=true)
+ # Share with cmd_sparql_query
+ options={}
+ optparse = OptionParser.new do |opts|
+ opts.banner = "Usage: #{$cmd} [--file REQUEST] [--service URI] 'request' | @file"
+ opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
+ options[:service]=uri
+ end
+ opts.on('--update=FILE', '--file=FILE', 'Take update from a file') do |file|
+ options[:file]=file
+ end
+ options[:verbose] = false
+ opts.on( '-v', '--verbose', 'Verbose' ) do
+ options[:verbose] = true
+ end
+ opts.on( '--version', 'Print version and exit' ) do
+ print "#{SOH_NAME} #{SOH_VERSION}\n"
+ exit
+ end
+ opts.on( '-h', '--help', 'Display this screen and exit' ) do
+ puts opts
+ exit
+ end
+ end
+
+ begin optparse.parse!
+ rescue OptionParser::InvalidArgument => e
+ warn e
+ exit
+ end
+
+ $verbose = options[:verbose]
+ $print_http = $verbose
+
+ service = options[:service]
+ warn_exit 'No service specified. Required --service=URI',1 if service.nil?
+
+ update=nil
+ update_file=options[:file]
+
+ if update_file.nil? && ARGV.size == 0
+ then
+ warn_exit 'No update specified.',1
+ end
+ if update_file.nil?
+ update = ARGV.shift
+ if update.match(/^@/)
+ update_file = update[1..-1]
+ update = nil
+ end
+ end
+
+ print "SPARQL-Update #{service}\n" if $verbose
+ args={}
+
+ # Reads in the file :-(
+ if update.nil?
+ then
+ update = open(update_file, 'rb'){|f| f.read}
+ else
+ update = string_or_file(update)
+ end
+
+ if by_raw_post
+ SPARQL_update(service, update, args)
+ else
+ SPARQL_update_by_form(service, update, args)
+ end
+ exit(0)
+end
+
+## -------
+
+case $cmd
+when "s-http", "sparql-http", "soh"
+ $banner="#{$cmd} [get|post|put|delete] datasetURI graph [file]"
+ cmd_soh
+when "s-get", "s-head", "s-put", "s-delete", "s-post"
+
+ case $cmd
+ when "s-get", "s-head", "s-delete"
+ $banner="#{$cmd} datasetURI graph"
+ when "s-put", "s-post"
+ $banner="#{$cmd} datasetURI graph file"
+ end
+ cmd2 = $cmd.sub(/^s-/, '').upcase
+ cmd_soh cmd2
+
+when "s-query", "sparql-query"
+ cmd_sparql_query
+when "s-update", "sparql-update"
+ cmd_sparql_update true
+when "s-update-form", "sparql-update-form"
+ cmd_sparql_update false
+else
+ warn_exit "Unknown: "+$cmd, 1
+end
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/apache-jena-fuseki/bin/s-query
----------------------------------------------------------------------
diff --git a/jena-fuseki2/apache-jena-fuseki/bin/s-query b/jena-fuseki2/apache-jena-fuseki/bin/s-query
new file mode 100755
index 0000000..0e3a807
--- /dev/null
+++ b/jena-fuseki2/apache-jena-fuseki/bin/s-query
@@ -0,0 +1,707 @@
+#!/usr/bin/env ruby
+# -*- coding: utf-8 -*-
+
+# 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.
+
+# SPARQL HTTP Update, client.
+
+require 'optparse'
+require 'net/http'
+require 'uri'
+require 'cgi'
+require 'pp'
+require 'ostruct'
+
+# ToDo
+# Allow a choice of media type for GET
+# --accept "content-type" (and abbreviations)
+# --header "Add:this"
+# --user, --password
+# Basic authentication: request.basic_auth("username", "password")
+# Follow redirects => 301: puts response["location"] # All headers are lowercase?
+
+SOH_NAME="SOH"
+SOH_VERSION="0.0.0"
+
+$proxy = ENV['http_proxy'] ? URI.parse(ENV['http_proxy']) : OpenStruct.new
+
+# What about direct naming?
+
+# Names
+$mtTurtle = 'text/turtle;charset=utf-8'
+$mtRDF = 'application/rdf+xml'
+$mtText = 'text/plain'
+$mtNQuads = 'text/n-quads'
+$mtTriG = 'application/trig'
+$mtSparqlResultsX = 'application/sparql-results+xml'
+$mtSparqlResultsJ = 'application/sparql-results+json'
+$mtAppJSON = 'application/json'
+$mtAppXML = 'application/xml'
+$mtSparqlResultsTSV = 'application/sparql-results+tsv'
+$mtSparqlResultsCSV = 'application/sparql-results+csv'
+$mtSparqlUpdate = 'application/sparql-update'
+$mtWWWForm = 'application/x-www-form-urlencoded'
+$mtSparqlQuery = "application/sparql-query" ;
+
+# Global media type table.
+$fileMediaTypes = {}
+$fileMediaTypes['ttl'] = $mtTurtle
+$fileMediaTypes['n3'] = 'text/n3; charset=utf-8'
+$fileMediaTypes['nt'] = $mtText
+$fileMediaTypes['rdf'] = $mtRDF
+$fileMediaTypes['owl'] = $mtRDF
+$fileMediaTypes['nq'] = $mtNQuads
+$fileMediaTypes['trig'] = $mtTriG
+
+# Global charset : no entry means "don't set"
+$charsetUTF8 = 'utf-8'
+$charset = {}
+$charset[$mtTurtle] = 'utf-8'
+$charset[$mtText] = 'ascii'
+$charset[$mtTriG] = 'utf-8'
+$charset[$mtNQuads] = 'ascii'
+
+# Headers
+
+$hContentType = 'Content-Type'
+# $hContentEncoding = 'Content-Encoding'
+$hContentLength = 'Content-Length'
+# $hContentLocation = 'Content-Location'
+# $hContentRange = 'Content-Range'
+
+$hAccept = 'Accept'
+$hAcceptCharset = 'Accept-Charset'
+$hAcceptEncoding = 'Accept-Encoding'
+$hAcceptRanges = 'Accept-Ranges'
+
+$headers = { "User-Agent" => "#{SOH_NAME}/Fuseki #{SOH_VERSION}"}
+$print_http = false
+
+# Default for GET
+# At least allow anythign (and hope!)
+$accept_rdf="#{$mtRDF};q=0.9 , #{$mtTurtle}"
+# For SPARQL query
+$accept_results="#{$mtSparqlResultsJ} , #{$mtSparqlResultsX};q=0.9 , #{$accept_rdf}"
+
+# Accept any in case of trouble.
+$accept_rdf="#{$accept_rdf} , */*;q=0.1"
+$accept_results="#{$accept_results} , */*;q=0.1"
+
+# The media type usually forces the charset.
+$accept_charset=nil
+
+## Who we are.
+## Two styles:
+## s-query .....
+## soh query .....
+
+$cmd = File.basename($0)
+if $cmd == 'soh'
+then
+ $cmd = (ARGV.size == 0) ? 'soh' : ARGV.shift
+end
+
+if ! $cmd.start_with?('s-') && $cmd != 'soh'
+ $cmd = 's-'+$cmd
+end
+
+## --------
+
+def GET(dataset, graph)
+ print "GET #{dataset} #{graph}\n" if $verbose
+ requestURI = target(dataset, graph)
+ headers = {}
+ headers.merge!($headers)
+ headers[$hAccept] = $accept_rdf
+ headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
+ get_worker(requestURI, headers)
+end
+
+def get_worker(requestURI, headers)
+ uri = URI.parse(requestURI)
+ request = Net::HTTP::Get.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ response_print_body(uri, request)
+end
+
+def HEAD(dataset, graph)
+ print "HEAD #{dataset} #{graph}\n" if $verbose
+ requestURI = target(dataset, graph)
+ headers = {}
+ headers.merge!($headers)
+ headers[$hAccept] = $accept_rdf
+ headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
+ uri = URI.parse(requestURI)
+ request = Net::HTTP::Head.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def PUT(dataset, graph, file)
+ print "PUT #{dataset} #{graph} #{file}\n" if $verbose
+ send_body(dataset, graph, file, Net::HTTP::Put)
+end
+
+def POST(dataset, graph, file)
+ print "POST #{dataset} #{graph} #{file}\n" if $verbose
+ send_body(dataset, graph, file, Net::HTTP::Post)
+end
+
+def DELETE(dataset, graph)
+ print "DELETE #{dataset} #{graph}\n" if $verbose
+ requestURI = target(dataset, graph)
+ uri = URI.parse(requestURI)
+ request = Net::HTTP::Delete.new(uri.request_uri)
+ headers = {}
+ headers.merge!($headers)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def uri_escape(string)
+ CGI.escape(string)
+end
+
+def target(dataset, graph)
+ return dataset+"?default" if graph == "default"
+ return dataset+"?graph="+uri_escape(graph)
+end
+
+def send_body(dataset, graph, file, method)
+ mt = content_type(file)
+ headers = {}
+ headers.merge!($headers)
+ headers[$hContentType] = mt
+ headers[$hContentLength] = File.size(file).to_s
+ ## p headers
+
+ requestURI = target(dataset, graph)
+ uri = URI.parse(requestURI)
+
+ request = method.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ request.body_stream = File.open(file)
+ response_no_body(uri, request)
+end
+
+def response_no_body(uri, request)
+ http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
+ http.read_timeout = nil
+ # check we can connect.
+ begin http.start
+ rescue Exception => e
+ # puts e.message
+ #puts e.backtrace.inspect
+ warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
+ end
+ response = http.request(request)
+ print_http_response(response)
+ case response
+ when Net::HTTPSuccess, Net::HTTPRedirection
+ # OK
+ when Net::HTTPNotFound
+ warn_exit "404 Not found: #{uri}", 9
+ #print response.body
+ else
+ warn_exit "#{response.code} #{response.message} #{uri}", 9
+ # Unreachable
+ response.error!
+ end
+ # NO BODY IN RESPONSE
+end
+
+def response_print_body(uri, request)
+ http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
+ http.read_timeout = nil
+ # check we can connect.
+ begin http.start
+ rescue => e
+ #puts e.backtrace.inspect
+ #print e.class
+ warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
+ end
+
+ # Add a blank line if headers were output.
+ print "\n" if $http_print ;
+
+ begin
+ response = http.request(request) { |res|
+ print_http_response(res)
+ #puts res.code
+ res.read_body do |segment|
+ print segment
+ end
+ }
+ case response
+ when Net::HTTPSuccess, Net::HTTPRedirection
+ # OK
+ when Net::HTTPNotFound
+ warn_exit "404 Not found: #{uri}", 9
+ #print response.body
+ else
+ warn_exit "#{response.code}: #{uri}", 9
+ # Unreachable
+ response.error!
+ end
+ rescue EOFError => e
+ warn_exit "IO Error: "+e.message, 3
+ end
+end
+
+def print_http_request(uri, request)
+ return unless $print_http
+ #print "Request\n"
+ print request.method," ",uri, "\n"
+ print_headers(" ",request)
+end
+
+def print_http_response(response)
+ return unless $print_http
+ #print "Response\n"
+ print response.code, " ", response.message, "\n"
+ print_headers(" ",response)
+end
+
+def print_headers(marker, headers)
+ headers.each do |k,v|
+ k = k.split('-').map{|w| w.capitalize}.join('-')+':'
+ printf "%s%-20s %s\n",marker,k,v
+ end
+end
+
+def content_type(file)
+ file =~ /\.([^.]*)$/
+ ext = $1
+ mt = $fileMediaTypes[ext]
+ cs = $charset[mt]
+ mt = mt+';charset='+cs if ! cs.nil?
+ return mt
+end
+
+def charset(content_type)
+ return $charset[content_type]
+end
+
+def warn_exit(msg, rc)
+ warn msg
+ exit rc ;
+end
+
+def parseURI(uri_string)
+ begin
+ return URI.parse(uri_string).to_s
+ rescue URI::InvalidURIError => err
+ warn_exit "Bad URI: <#{uri_string}>", 2
+ end
+end
+
+## ---- Command
+
+def cmd_soh(command=nil)
+ ## Command line
+ options = {}
+ optparse = OptionParser.new do |opts|
+ # Set a banner, displayed at the top
+ # of the help screen.
+ case $cmd
+ when "s-http", "sparql-http", "soh"
+ banner="$cmd [get|post|put|delete] datasetURI graph [file]"
+ when "s-get", "s-head", "s-delete"
+ banner="$cmd datasetURI graph"
+ end
+
+ opts.banner = $banner
+ # Define the options, and what they do
+
+ options[:verbose] = false
+ opts.on( '-v', '--verbose', 'Verbose' ) do
+ options[:verbose] = true
+ end
+
+ options[:version] = false
+ opts.on( '--version', 'Print version and exit' ) do
+ print "#{SOH_NAME} #{SOH_VERSION}\n"
+ exit
+ end
+
+ # This displays the help screen, all programs are
+ # assumed to have this option.
+ opts.on( '-h', '--help', 'Display this screen and exit' ) do
+ puts opts
+ exit
+ end
+ end
+
+ begin optparse.parse!
+ rescue OptionParser::InvalidArgument => e
+ warn e
+ exit
+ end
+
+ $verbose = options[:verbose]
+ $print_http = $verbose
+
+ if command.nil?
+ if ARGV.size == 0
+ warn "No command given: expected one of 'get', 'put', 'post', 'delete', 'query' or 'update'"
+ exit 1
+ end
+ cmdPrint=ARGV.shift
+ command=cmdPrint.upcase
+ else
+ cmdPrint=command
+ end
+
+ case command
+ when "HEAD", "GET", "DELETE"
+ requiredFile=false
+ when "PUT", "POST"
+ requiredFile=true
+ when "QUERY"
+ cmd_sparql_query
+ when "UPDATE"
+ cmd_sparql_update
+ else
+ warn_exit "Unknown command: #{command}", 2
+ end
+
+ if requiredFile
+ then
+ if ARGV.size != 3
+ warn_exit "Required: dataset URI, graph URI (or 'default') and file", 1
+ end
+ else
+ if ARGV.size != 2
+ warn_exit "Required: dataset URI and graph URI (or 'default')", 1
+ end
+ end
+
+ dataset=parseURI(ARGV.shift)
+ # Relative URI?
+ graph=parseURI(ARGV.shift)
+ file=""
+ if requiredFile
+ then
+ file = ARGV.shift if requiredFile
+ if ! File.exist?(file)
+ warn_exit "No such file: "+file, 3
+ end
+ if File.directory?(file)
+ warn_exit "File is a directory: "+file, 3
+ end
+ end
+
+ case command
+ when "GET"
+ GET(dataset, graph)
+ when "HEAD"
+ HEAD(dataset, graph)
+ when "PUT"
+ PUT(dataset, graph, file)
+ when "DELETE"
+ DELETE(dataset, graph)
+ when "POST"
+ POST(dataset, graph, file)
+ else
+ warn_exit "Internal error: Unknown command: #{cmd}", 2
+ end
+ exit 0
+end
+
+## --------
+def string_or_file(arg)
+ return arg if ! arg.match(/^@/)
+ a=(arg[1..-1])
+ open(a, 'rb'){|f| f.read}
+end
+
+## -------- SPARQL Query
+
+## Choose method
+def SPARQL_query(service, query, query_file, forcePOST=false, args2={})
+ if ! query_file.nil?
+ query = open(query_file, 'rb'){|f| f.read}
+ end
+ if forcePOST || query.length >= 2*1024
+ SPARQL_query_POST(service, query, args2)
+ else
+ SPARQL_query_GET(service, query, args2)
+ end
+end
+
+## By GET
+
+def SPARQL_query_GET(service, query, args2)
+ args = { "query" => query }
+ args.merge!(args2)
+ qs=args.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
+ action="#{service}?#{qs}"
+ headers={}
+ headers.merge!($headers)
+ headers[$hAccept]=$accept_results
+ get_worker(action, headers)
+end
+
+## By POST
+
+def SPARQL_query_POST(service, query, args2)
+ # DRY - body/no body for each of request and response.
+ post_params={ "query" => query }
+ post_params.merge!(args2)
+ uri = URI.parse(service)
+ headers={}
+ headers.merge!($headers)
+ headers[$hAccept]=$accept_results
+ execute_post_form_body(uri, headers, post_params)
+end
+
+def execute_post_form_body(uri, headers, post_params)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ qs=post_params.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
+ headers[$hContentType] = $mtWWWForm
+ headers[$hContentLength] = qs.length.to_s
+ request.initialize_http_header(headers)
+ request.body = qs
+ print_http_request(uri, request)
+ response_print_body(uri, request)
+end
+
+# Usage: -v --help --file= --query=
+def cmd_sparql_query
+ options={}
+ optparse = OptionParser.new do |opts|
+ opts.banner = "Usage: #{$cmd} [--query QUERY] [--service URI] [--post] 'query' | @file"
+ opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
+ options[:service]=uri
+ end
+ opts.on('--query=FILE','--file=FILE', 'Take query from a file') do |file|
+ options[:file]=file
+ end
+ opts.on('--output=TYPE', [:json,:xml,:text,:csv,:tsv],
+ 'Set the output argument') do |type|
+ options[:output]=type
+ end
+ opts.on('--accept=TYPE', [:json,:xml,:text,:csv,:tsv],
+ 'Set the accept header type') do |type|
+ options[:accept]=type
+ end
+ options[:verbose] = false
+ opts.on( '--post', 'Force use of POST' ) do
+ options[:post] = true
+ end
+ opts.on( '-v', '--verbose', 'Verbose' ) do
+ options[:verbose] = true
+ end
+ opts.on( '--version', 'Print version and exit' ) do
+ print "#{SOH_NAME} #{SOH_VERSION}\n"
+ exit
+ end
+ opts.on( '-h', '--help', 'Display this screen and exit' ) do
+ puts opts
+ exit
+ end
+ end
+
+ begin optparse.parse!
+ rescue OptionParser::InvalidArgument, OptionParser::InvalidOption => e
+ warn e
+ exit 1
+ end
+
+ $verbose = options[:verbose]
+ $print_http = $verbose
+ usePOST = options[:post]
+
+ service = options[:service]
+ warn_exit 'No service specified. Required --service=URI',1 if service.nil?
+
+ # Query
+ query=nil
+ query_file=options[:file]
+ if query_file.nil? && ARGV.size == 0
+ then
+ warn_exit 'No query specified.',1
+ end
+ if query_file.nil?
+ query = ARGV.shift
+ if query.match(/^@/)
+ query_file = query[1..-1]
+ query = nil
+ end
+ end
+
+ # --output ==> output= (non-standard)
+ args={}
+ case options[:output]
+ when nil
+ when "json","xml","text","csv","tsv"
+ args['output'] = options[:output]
+ when :json,:xml,:text,:csv,:tsv
+ args['output'] = options[:output].to_s
+ else
+ warn_exit "Unrecognized output type: "+options[:output],2
+ end
+
+ # --accept
+ # options[:accept]
+
+ print "SPARQL #{service}\n" if $verbose
+ #args={"output"=>"text"}
+ SPARQL_query(service, query, query_file, usePOST, args)
+ exit(0)
+end
+
+## -------- SPARQL Update
+
+# Update sent as a WWW form.
+def SPARQL_update_by_form(service, update, args2={})
+ args = {}
+ args.merge!(args2)
+ headers={}
+ headers.merge!($headers)
+ # args? encode?
+ body="update="+uri_escape(update)
+ headers[$hContentType] = $mtWWWForm
+ headers[$hContentLength] = body.length.to_s
+ uri = URI.parse(service)
+ execute_post_form(uri, headers, body)
+end
+
+# DRY - query form.
+def execute_post_form(uri, headers, body)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ request.body = body
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def SPARQL_update(service, update, args2={})
+ args = {}
+ args.merge!(args2)
+ headers={}
+ headers.merge!($headers)
+ headers[$hContentType] = $mtSparqlUpdate
+ uri = URI.parse(service)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ request.body = update
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def cmd_sparql_update(by_raw_post=true)
+ # Share with cmd_sparql_query
+ options={}
+ optparse = OptionParser.new do |opts|
+ opts.banner = "Usage: #{$cmd} [--file REQUEST] [--service URI] 'request' | @file"
+ opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
+ options[:service]=uri
+ end
+ opts.on('--update=FILE', '--file=FILE', 'Take update from a file') do |file|
+ options[:file]=file
+ end
+ options[:verbose] = false
+ opts.on( '-v', '--verbose', 'Verbose' ) do
+ options[:verbose] = true
+ end
+ opts.on( '--version', 'Print version and exit' ) do
+ print "#{SOH_NAME} #{SOH_VERSION}\n"
+ exit
+ end
+ opts.on( '-h', '--help', 'Display this screen and exit' ) do
+ puts opts
+ exit
+ end
+ end
+
+ begin optparse.parse!
+ rescue OptionParser::InvalidArgument => e
+ warn e
+ exit
+ end
+
+ $verbose = options[:verbose]
+ $print_http = $verbose
+
+ service = options[:service]
+ warn_exit 'No service specified. Required --service=URI',1 if service.nil?
+
+ update=nil
+ update_file=options[:file]
+
+ if update_file.nil? && ARGV.size == 0
+ then
+ warn_exit 'No update specified.',1
+ end
+ if update_file.nil?
+ update = ARGV.shift
+ if update.match(/^@/)
+ update_file = update[1..-1]
+ update = nil
+ end
+ end
+
+ print "SPARQL-Update #{service}\n" if $verbose
+ args={}
+
+ # Reads in the file :-(
+ if update.nil?
+ then
+ update = open(update_file, 'rb'){|f| f.read}
+ else
+ update = string_or_file(update)
+ end
+
+ if by_raw_post
+ SPARQL_update(service, update, args)
+ else
+ SPARQL_update_by_form(service, update, args)
+ end
+ exit(0)
+end
+
+## -------
+
+case $cmd
+when "s-http", "sparql-http", "soh"
+ $banner="#{$cmd} [get|post|put|delete] datasetURI graph [file]"
+ cmd_soh
+when "s-get", "s-head", "s-put", "s-delete", "s-post"
+
+ case $cmd
+ when "s-get", "s-head", "s-delete"
+ $banner="#{$cmd} datasetURI graph"
+ when "s-put", "s-post"
+ $banner="#{$cmd} datasetURI graph file"
+ end
+ cmd2 = $cmd.sub(/^s-/, '').upcase
+ cmd_soh cmd2
+
+when "s-query", "sparql-query"
+ cmd_sparql_query
+when "s-update", "sparql-update"
+ cmd_sparql_update true
+when "s-update-form", "sparql-update-form"
+ cmd_sparql_update false
+else
+ warn_exit "Unknown: "+$cmd, 1
+end
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/apache-jena-fuseki/bin/s-update
----------------------------------------------------------------------
diff --git a/jena-fuseki2/apache-jena-fuseki/bin/s-update b/jena-fuseki2/apache-jena-fuseki/bin/s-update
new file mode 100755
index 0000000..0e3a807
--- /dev/null
+++ b/jena-fuseki2/apache-jena-fuseki/bin/s-update
@@ -0,0 +1,707 @@
+#!/usr/bin/env ruby
+# -*- coding: utf-8 -*-
+
+# 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.
+
+# SPARQL HTTP Update, client.
+
+require 'optparse'
+require 'net/http'
+require 'uri'
+require 'cgi'
+require 'pp'
+require 'ostruct'
+
+# ToDo
+# Allow a choice of media type for GET
+# --accept "content-type" (and abbreviations)
+# --header "Add:this"
+# --user, --password
+# Basic authentication: request.basic_auth("username", "password")
+# Follow redirects => 301: puts response["location"] # All headers are lowercase?
+
+SOH_NAME="SOH"
+SOH_VERSION="0.0.0"
+
+$proxy = ENV['http_proxy'] ? URI.parse(ENV['http_proxy']) : OpenStruct.new
+
+# What about direct naming?
+
+# Names
+$mtTurtle = 'text/turtle;charset=utf-8'
+$mtRDF = 'application/rdf+xml'
+$mtText = 'text/plain'
+$mtNQuads = 'text/n-quads'
+$mtTriG = 'application/trig'
+$mtSparqlResultsX = 'application/sparql-results+xml'
+$mtSparqlResultsJ = 'application/sparql-results+json'
+$mtAppJSON = 'application/json'
+$mtAppXML = 'application/xml'
+$mtSparqlResultsTSV = 'application/sparql-results+tsv'
+$mtSparqlResultsCSV = 'application/sparql-results+csv'
+$mtSparqlUpdate = 'application/sparql-update'
+$mtWWWForm = 'application/x-www-form-urlencoded'
+$mtSparqlQuery = "application/sparql-query" ;
+
+# Global media type table.
+$fileMediaTypes = {}
+$fileMediaTypes['ttl'] = $mtTurtle
+$fileMediaTypes['n3'] = 'text/n3; charset=utf-8'
+$fileMediaTypes['nt'] = $mtText
+$fileMediaTypes['rdf'] = $mtRDF
+$fileMediaTypes['owl'] = $mtRDF
+$fileMediaTypes['nq'] = $mtNQuads
+$fileMediaTypes['trig'] = $mtTriG
+
+# Global charset : no entry means "don't set"
+$charsetUTF8 = 'utf-8'
+$charset = {}
+$charset[$mtTurtle] = 'utf-8'
+$charset[$mtText] = 'ascii'
+$charset[$mtTriG] = 'utf-8'
+$charset[$mtNQuads] = 'ascii'
+
+# Headers
+
+$hContentType = 'Content-Type'
+# $hContentEncoding = 'Content-Encoding'
+$hContentLength = 'Content-Length'
+# $hContentLocation = 'Content-Location'
+# $hContentRange = 'Content-Range'
+
+$hAccept = 'Accept'
+$hAcceptCharset = 'Accept-Charset'
+$hAcceptEncoding = 'Accept-Encoding'
+$hAcceptRanges = 'Accept-Ranges'
+
+$headers = { "User-Agent" => "#{SOH_NAME}/Fuseki #{SOH_VERSION}"}
+$print_http = false
+
+# Default for GET
+# At least allow anythign (and hope!)
+$accept_rdf="#{$mtRDF};q=0.9 , #{$mtTurtle}"
+# For SPARQL query
+$accept_results="#{$mtSparqlResultsJ} , #{$mtSparqlResultsX};q=0.9 , #{$accept_rdf}"
+
+# Accept any in case of trouble.
+$accept_rdf="#{$accept_rdf} , */*;q=0.1"
+$accept_results="#{$accept_results} , */*;q=0.1"
+
+# The media type usually forces the charset.
+$accept_charset=nil
+
+## Who we are.
+## Two styles:
+## s-query .....
+## soh query .....
+
+$cmd = File.basename($0)
+if $cmd == 'soh'
+then
+ $cmd = (ARGV.size == 0) ? 'soh' : ARGV.shift
+end
+
+if ! $cmd.start_with?('s-') && $cmd != 'soh'
+ $cmd = 's-'+$cmd
+end
+
+## --------
+
+def GET(dataset, graph)
+ print "GET #{dataset} #{graph}\n" if $verbose
+ requestURI = target(dataset, graph)
+ headers = {}
+ headers.merge!($headers)
+ headers[$hAccept] = $accept_rdf
+ headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
+ get_worker(requestURI, headers)
+end
+
+def get_worker(requestURI, headers)
+ uri = URI.parse(requestURI)
+ request = Net::HTTP::Get.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ response_print_body(uri, request)
+end
+
+def HEAD(dataset, graph)
+ print "HEAD #{dataset} #{graph}\n" if $verbose
+ requestURI = target(dataset, graph)
+ headers = {}
+ headers.merge!($headers)
+ headers[$hAccept] = $accept_rdf
+ headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
+ uri = URI.parse(requestURI)
+ request = Net::HTTP::Head.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def PUT(dataset, graph, file)
+ print "PUT #{dataset} #{graph} #{file}\n" if $verbose
+ send_body(dataset, graph, file, Net::HTTP::Put)
+end
+
+def POST(dataset, graph, file)
+ print "POST #{dataset} #{graph} #{file}\n" if $verbose
+ send_body(dataset, graph, file, Net::HTTP::Post)
+end
+
+def DELETE(dataset, graph)
+ print "DELETE #{dataset} #{graph}\n" if $verbose
+ requestURI = target(dataset, graph)
+ uri = URI.parse(requestURI)
+ request = Net::HTTP::Delete.new(uri.request_uri)
+ headers = {}
+ headers.merge!($headers)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def uri_escape(string)
+ CGI.escape(string)
+end
+
+def target(dataset, graph)
+ return dataset+"?default" if graph == "default"
+ return dataset+"?graph="+uri_escape(graph)
+end
+
+def send_body(dataset, graph, file, method)
+ mt = content_type(file)
+ headers = {}
+ headers.merge!($headers)
+ headers[$hContentType] = mt
+ headers[$hContentLength] = File.size(file).to_s
+ ## p headers
+
+ requestURI = target(dataset, graph)
+ uri = URI.parse(requestURI)
+
+ request = method.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ request.body_stream = File.open(file)
+ response_no_body(uri, request)
+end
+
+def response_no_body(uri, request)
+ http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
+ http.read_timeout = nil
+ # check we can connect.
+ begin http.start
+ rescue Exception => e
+ # puts e.message
+ #puts e.backtrace.inspect
+ warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
+ end
+ response = http.request(request)
+ print_http_response(response)
+ case response
+ when Net::HTTPSuccess, Net::HTTPRedirection
+ # OK
+ when Net::HTTPNotFound
+ warn_exit "404 Not found: #{uri}", 9
+ #print response.body
+ else
+ warn_exit "#{response.code} #{response.message} #{uri}", 9
+ # Unreachable
+ response.error!
+ end
+ # NO BODY IN RESPONSE
+end
+
+def response_print_body(uri, request)
+ http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
+ http.read_timeout = nil
+ # check we can connect.
+ begin http.start
+ rescue => e
+ #puts e.backtrace.inspect
+ #print e.class
+ warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
+ end
+
+ # Add a blank line if headers were output.
+ print "\n" if $http_print ;
+
+ begin
+ response = http.request(request) { |res|
+ print_http_response(res)
+ #puts res.code
+ res.read_body do |segment|
+ print segment
+ end
+ }
+ case response
+ when Net::HTTPSuccess, Net::HTTPRedirection
+ # OK
+ when Net::HTTPNotFound
+ warn_exit "404 Not found: #{uri}", 9
+ #print response.body
+ else
+ warn_exit "#{response.code}: #{uri}", 9
+ # Unreachable
+ response.error!
+ end
+ rescue EOFError => e
+ warn_exit "IO Error: "+e.message, 3
+ end
+end
+
+def print_http_request(uri, request)
+ return unless $print_http
+ #print "Request\n"
+ print request.method," ",uri, "\n"
+ print_headers(" ",request)
+end
+
+def print_http_response(response)
+ return unless $print_http
+ #print "Response\n"
+ print response.code, " ", response.message, "\n"
+ print_headers(" ",response)
+end
+
+def print_headers(marker, headers)
+ headers.each do |k,v|
+ k = k.split('-').map{|w| w.capitalize}.join('-')+':'
+ printf "%s%-20s %s\n",marker,k,v
+ end
+end
+
+def content_type(file)
+ file =~ /\.([^.]*)$/
+ ext = $1
+ mt = $fileMediaTypes[ext]
+ cs = $charset[mt]
+ mt = mt+';charset='+cs if ! cs.nil?
+ return mt
+end
+
+def charset(content_type)
+ return $charset[content_type]
+end
+
+def warn_exit(msg, rc)
+ warn msg
+ exit rc ;
+end
+
+def parseURI(uri_string)
+ begin
+ return URI.parse(uri_string).to_s
+ rescue URI::InvalidURIError => err
+ warn_exit "Bad URI: <#{uri_string}>", 2
+ end
+end
+
+## ---- Command
+
+def cmd_soh(command=nil)
+ ## Command line
+ options = {}
+ optparse = OptionParser.new do |opts|
+ # Set a banner, displayed at the top
+ # of the help screen.
+ case $cmd
+ when "s-http", "sparql-http", "soh"
+ banner="$cmd [get|post|put|delete] datasetURI graph [file]"
+ when "s-get", "s-head", "s-delete"
+ banner="$cmd datasetURI graph"
+ end
+
+ opts.banner = $banner
+ # Define the options, and what they do
+
+ options[:verbose] = false
+ opts.on( '-v', '--verbose', 'Verbose' ) do
+ options[:verbose] = true
+ end
+
+ options[:version] = false
+ opts.on( '--version', 'Print version and exit' ) do
+ print "#{SOH_NAME} #{SOH_VERSION}\n"
+ exit
+ end
+
+ # This displays the help screen, all programs are
+ # assumed to have this option.
+ opts.on( '-h', '--help', 'Display this screen and exit' ) do
+ puts opts
+ exit
+ end
+ end
+
+ begin optparse.parse!
+ rescue OptionParser::InvalidArgument => e
+ warn e
+ exit
+ end
+
+ $verbose = options[:verbose]
+ $print_http = $verbose
+
+ if command.nil?
+ if ARGV.size == 0
+ warn "No command given: expected one of 'get', 'put', 'post', 'delete', 'query' or 'update'"
+ exit 1
+ end
+ cmdPrint=ARGV.shift
+ command=cmdPrint.upcase
+ else
+ cmdPrint=command
+ end
+
+ case command
+ when "HEAD", "GET", "DELETE"
+ requiredFile=false
+ when "PUT", "POST"
+ requiredFile=true
+ when "QUERY"
+ cmd_sparql_query
+ when "UPDATE"
+ cmd_sparql_update
+ else
+ warn_exit "Unknown command: #{command}", 2
+ end
+
+ if requiredFile
+ then
+ if ARGV.size != 3
+ warn_exit "Required: dataset URI, graph URI (or 'default') and file", 1
+ end
+ else
+ if ARGV.size != 2
+ warn_exit "Required: dataset URI and graph URI (or 'default')", 1
+ end
+ end
+
+ dataset=parseURI(ARGV.shift)
+ # Relative URI?
+ graph=parseURI(ARGV.shift)
+ file=""
+ if requiredFile
+ then
+ file = ARGV.shift if requiredFile
+ if ! File.exist?(file)
+ warn_exit "No such file: "+file, 3
+ end
+ if File.directory?(file)
+ warn_exit "File is a directory: "+file, 3
+ end
+ end
+
+ case command
+ when "GET"
+ GET(dataset, graph)
+ when "HEAD"
+ HEAD(dataset, graph)
+ when "PUT"
+ PUT(dataset, graph, file)
+ when "DELETE"
+ DELETE(dataset, graph)
+ when "POST"
+ POST(dataset, graph, file)
+ else
+ warn_exit "Internal error: Unknown command: #{cmd}", 2
+ end
+ exit 0
+end
+
+## --------
+def string_or_file(arg)
+ return arg if ! arg.match(/^@/)
+ a=(arg[1..-1])
+ open(a, 'rb'){|f| f.read}
+end
+
+## -------- SPARQL Query
+
+## Choose method
+def SPARQL_query(service, query, query_file, forcePOST=false, args2={})
+ if ! query_file.nil?
+ query = open(query_file, 'rb'){|f| f.read}
+ end
+ if forcePOST || query.length >= 2*1024
+ SPARQL_query_POST(service, query, args2)
+ else
+ SPARQL_query_GET(service, query, args2)
+ end
+end
+
+## By GET
+
+def SPARQL_query_GET(service, query, args2)
+ args = { "query" => query }
+ args.merge!(args2)
+ qs=args.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
+ action="#{service}?#{qs}"
+ headers={}
+ headers.merge!($headers)
+ headers[$hAccept]=$accept_results
+ get_worker(action, headers)
+end
+
+## By POST
+
+def SPARQL_query_POST(service, query, args2)
+ # DRY - body/no body for each of request and response.
+ post_params={ "query" => query }
+ post_params.merge!(args2)
+ uri = URI.parse(service)
+ headers={}
+ headers.merge!($headers)
+ headers[$hAccept]=$accept_results
+ execute_post_form_body(uri, headers, post_params)
+end
+
+def execute_post_form_body(uri, headers, post_params)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ qs=post_params.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
+ headers[$hContentType] = $mtWWWForm
+ headers[$hContentLength] = qs.length.to_s
+ request.initialize_http_header(headers)
+ request.body = qs
+ print_http_request(uri, request)
+ response_print_body(uri, request)
+end
+
+# Usage: -v --help --file= --query=
+def cmd_sparql_query
+ options={}
+ optparse = OptionParser.new do |opts|
+ opts.banner = "Usage: #{$cmd} [--query QUERY] [--service URI] [--post] 'query' | @file"
+ opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
+ options[:service]=uri
+ end
+ opts.on('--query=FILE','--file=FILE', 'Take query from a file') do |file|
+ options[:file]=file
+ end
+ opts.on('--output=TYPE', [:json,:xml,:text,:csv,:tsv],
+ 'Set the output argument') do |type|
+ options[:output]=type
+ end
+ opts.on('--accept=TYPE', [:json,:xml,:text,:csv,:tsv],
+ 'Set the accept header type') do |type|
+ options[:accept]=type
+ end
+ options[:verbose] = false
+ opts.on( '--post', 'Force use of POST' ) do
+ options[:post] = true
+ end
+ opts.on( '-v', '--verbose', 'Verbose' ) do
+ options[:verbose] = true
+ end
+ opts.on( '--version', 'Print version and exit' ) do
+ print "#{SOH_NAME} #{SOH_VERSION}\n"
+ exit
+ end
+ opts.on( '-h', '--help', 'Display this screen and exit' ) do
+ puts opts
+ exit
+ end
+ end
+
+ begin optparse.parse!
+ rescue OptionParser::InvalidArgument, OptionParser::InvalidOption => e
+ warn e
+ exit 1
+ end
+
+ $verbose = options[:verbose]
+ $print_http = $verbose
+ usePOST = options[:post]
+
+ service = options[:service]
+ warn_exit 'No service specified. Required --service=URI',1 if service.nil?
+
+ # Query
+ query=nil
+ query_file=options[:file]
+ if query_file.nil? && ARGV.size == 0
+ then
+ warn_exit 'No query specified.',1
+ end
+ if query_file.nil?
+ query = ARGV.shift
+ if query.match(/^@/)
+ query_file = query[1..-1]
+ query = nil
+ end
+ end
+
+ # --output ==> output= (non-standard)
+ args={}
+ case options[:output]
+ when nil
+ when "json","xml","text","csv","tsv"
+ args['output'] = options[:output]
+ when :json,:xml,:text,:csv,:tsv
+ args['output'] = options[:output].to_s
+ else
+ warn_exit "Unrecognized output type: "+options[:output],2
+ end
+
+ # --accept
+ # options[:accept]
+
+ print "SPARQL #{service}\n" if $verbose
+ #args={"output"=>"text"}
+ SPARQL_query(service, query, query_file, usePOST, args)
+ exit(0)
+end
+
+## -------- SPARQL Update
+
+# Update sent as a WWW form.
+def SPARQL_update_by_form(service, update, args2={})
+ args = {}
+ args.merge!(args2)
+ headers={}
+ headers.merge!($headers)
+ # args? encode?
+ body="update="+uri_escape(update)
+ headers[$hContentType] = $mtWWWForm
+ headers[$hContentLength] = body.length.to_s
+ uri = URI.parse(service)
+ execute_post_form(uri, headers, body)
+end
+
+# DRY - query form.
+def execute_post_form(uri, headers, body)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ request.body = body
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def SPARQL_update(service, update, args2={})
+ args = {}
+ args.merge!(args2)
+ headers={}
+ headers.merge!($headers)
+ headers[$hContentType] = $mtSparqlUpdate
+ uri = URI.parse(service)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ request.body = update
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def cmd_sparql_update(by_raw_post=true)
+ # Share with cmd_sparql_query
+ options={}
+ optparse = OptionParser.new do |opts|
+ opts.banner = "Usage: #{$cmd} [--file REQUEST] [--service URI] 'request' | @file"
+ opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
+ options[:service]=uri
+ end
+ opts.on('--update=FILE', '--file=FILE', 'Take update from a file') do |file|
+ options[:file]=file
+ end
+ options[:verbose] = false
+ opts.on( '-v', '--verbose', 'Verbose' ) do
+ options[:verbose] = true
+ end
+ opts.on( '--version', 'Print version and exit' ) do
+ print "#{SOH_NAME} #{SOH_VERSION}\n"
+ exit
+ end
+ opts.on( '-h', '--help', 'Display this screen and exit' ) do
+ puts opts
+ exit
+ end
+ end
+
+ begin optparse.parse!
+ rescue OptionParser::InvalidArgument => e
+ warn e
+ exit
+ end
+
+ $verbose = options[:verbose]
+ $print_http = $verbose
+
+ service = options[:service]
+ warn_exit 'No service specified. Required --service=URI',1 if service.nil?
+
+ update=nil
+ update_file=options[:file]
+
+ if update_file.nil? && ARGV.size == 0
+ then
+ warn_exit 'No update specified.',1
+ end
+ if update_file.nil?
+ update = ARGV.shift
+ if update.match(/^@/)
+ update_file = update[1..-1]
+ update = nil
+ end
+ end
+
+ print "SPARQL-Update #{service}\n" if $verbose
+ args={}
+
+ # Reads in the file :-(
+ if update.nil?
+ then
+ update = open(update_file, 'rb'){|f| f.read}
+ else
+ update = string_or_file(update)
+ end
+
+ if by_raw_post
+ SPARQL_update(service, update, args)
+ else
+ SPARQL_update_by_form(service, update, args)
+ end
+ exit(0)
+end
+
+## -------
+
+case $cmd
+when "s-http", "sparql-http", "soh"
+ $banner="#{$cmd} [get|post|put|delete] datasetURI graph [file]"
+ cmd_soh
+when "s-get", "s-head", "s-put", "s-delete", "s-post"
+
+ case $cmd
+ when "s-get", "s-head", "s-delete"
+ $banner="#{$cmd} datasetURI graph"
+ when "s-put", "s-post"
+ $banner="#{$cmd} datasetURI graph file"
+ end
+ cmd2 = $cmd.sub(/^s-/, '').upcase
+ cmd_soh cmd2
+
+when "s-query", "sparql-query"
+ cmd_sparql_query
+when "s-update", "sparql-update"
+ cmd_sparql_update true
+when "s-update-form", "sparql-update-form"
+ cmd_sparql_update false
+else
+ warn_exit "Unknown: "+$cmd, 1
+end
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/apache-jena-fuseki/bin/s-update-form
----------------------------------------------------------------------
diff --git a/jena-fuseki2/apache-jena-fuseki/bin/s-update-form b/jena-fuseki2/apache-jena-fuseki/bin/s-update-form
new file mode 100755
index 0000000..0e3a807
--- /dev/null
+++ b/jena-fuseki2/apache-jena-fuseki/bin/s-update-form
@@ -0,0 +1,707 @@
+#!/usr/bin/env ruby
+# -*- coding: utf-8 -*-
+
+# 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.
+
+# SPARQL HTTP Update, client.
+
+require 'optparse'
+require 'net/http'
+require 'uri'
+require 'cgi'
+require 'pp'
+require 'ostruct'
+
+# ToDo
+# Allow a choice of media type for GET
+# --accept "content-type" (and abbreviations)
+# --header "Add:this"
+# --user, --password
+# Basic authentication: request.basic_auth("username", "password")
+# Follow redirects => 301: puts response["location"] # All headers are lowercase?
+
+SOH_NAME="SOH"
+SOH_VERSION="0.0.0"
+
+$proxy = ENV['http_proxy'] ? URI.parse(ENV['http_proxy']) : OpenStruct.new
+
+# What about direct naming?
+
+# Names
+$mtTurtle = 'text/turtle;charset=utf-8'
+$mtRDF = 'application/rdf+xml'
+$mtText = 'text/plain'
+$mtNQuads = 'text/n-quads'
+$mtTriG = 'application/trig'
+$mtSparqlResultsX = 'application/sparql-results+xml'
+$mtSparqlResultsJ = 'application/sparql-results+json'
+$mtAppJSON = 'application/json'
+$mtAppXML = 'application/xml'
+$mtSparqlResultsTSV = 'application/sparql-results+tsv'
+$mtSparqlResultsCSV = 'application/sparql-results+csv'
+$mtSparqlUpdate = 'application/sparql-update'
+$mtWWWForm = 'application/x-www-form-urlencoded'
+$mtSparqlQuery = "application/sparql-query" ;
+
+# Global media type table.
+$fileMediaTypes = {}
+$fileMediaTypes['ttl'] = $mtTurtle
+$fileMediaTypes['n3'] = 'text/n3; charset=utf-8'
+$fileMediaTypes['nt'] = $mtText
+$fileMediaTypes['rdf'] = $mtRDF
+$fileMediaTypes['owl'] = $mtRDF
+$fileMediaTypes['nq'] = $mtNQuads
+$fileMediaTypes['trig'] = $mtTriG
+
+# Global charset : no entry means "don't set"
+$charsetUTF8 = 'utf-8'
+$charset = {}
+$charset[$mtTurtle] = 'utf-8'
+$charset[$mtText] = 'ascii'
+$charset[$mtTriG] = 'utf-8'
+$charset[$mtNQuads] = 'ascii'
+
+# Headers
+
+$hContentType = 'Content-Type'
+# $hContentEncoding = 'Content-Encoding'
+$hContentLength = 'Content-Length'
+# $hContentLocation = 'Content-Location'
+# $hContentRange = 'Content-Range'
+
+$hAccept = 'Accept'
+$hAcceptCharset = 'Accept-Charset'
+$hAcceptEncoding = 'Accept-Encoding'
+$hAcceptRanges = 'Accept-Ranges'
+
+$headers = { "User-Agent" => "#{SOH_NAME}/Fuseki #{SOH_VERSION}"}
+$print_http = false
+
+# Default for GET
+# At least allow anythign (and hope!)
+$accept_rdf="#{$mtRDF};q=0.9 , #{$mtTurtle}"
+# For SPARQL query
+$accept_results="#{$mtSparqlResultsJ} , #{$mtSparqlResultsX};q=0.9 , #{$accept_rdf}"
+
+# Accept any in case of trouble.
+$accept_rdf="#{$accept_rdf} , */*;q=0.1"
+$accept_results="#{$accept_results} , */*;q=0.1"
+
+# The media type usually forces the charset.
+$accept_charset=nil
+
+## Who we are.
+## Two styles:
+## s-query .....
+## soh query .....
+
+$cmd = File.basename($0)
+if $cmd == 'soh'
+then
+ $cmd = (ARGV.size == 0) ? 'soh' : ARGV.shift
+end
+
+if ! $cmd.start_with?('s-') && $cmd != 'soh'
+ $cmd = 's-'+$cmd
+end
+
+## --------
+
+def GET(dataset, graph)
+ print "GET #{dataset} #{graph}\n" if $verbose
+ requestURI = target(dataset, graph)
+ headers = {}
+ headers.merge!($headers)
+ headers[$hAccept] = $accept_rdf
+ headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
+ get_worker(requestURI, headers)
+end
+
+def get_worker(requestURI, headers)
+ uri = URI.parse(requestURI)
+ request = Net::HTTP::Get.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ response_print_body(uri, request)
+end
+
+def HEAD(dataset, graph)
+ print "HEAD #{dataset} #{graph}\n" if $verbose
+ requestURI = target(dataset, graph)
+ headers = {}
+ headers.merge!($headers)
+ headers[$hAccept] = $accept_rdf
+ headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
+ uri = URI.parse(requestURI)
+ request = Net::HTTP::Head.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def PUT(dataset, graph, file)
+ print "PUT #{dataset} #{graph} #{file}\n" if $verbose
+ send_body(dataset, graph, file, Net::HTTP::Put)
+end
+
+def POST(dataset, graph, file)
+ print "POST #{dataset} #{graph} #{file}\n" if $verbose
+ send_body(dataset, graph, file, Net::HTTP::Post)
+end
+
+def DELETE(dataset, graph)
+ print "DELETE #{dataset} #{graph}\n" if $verbose
+ requestURI = target(dataset, graph)
+ uri = URI.parse(requestURI)
+ request = Net::HTTP::Delete.new(uri.request_uri)
+ headers = {}
+ headers.merge!($headers)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def uri_escape(string)
+ CGI.escape(string)
+end
+
+def target(dataset, graph)
+ return dataset+"?default" if graph == "default"
+ return dataset+"?graph="+uri_escape(graph)
+end
+
+def send_body(dataset, graph, file, method)
+ mt = content_type(file)
+ headers = {}
+ headers.merge!($headers)
+ headers[$hContentType] = mt
+ headers[$hContentLength] = File.size(file).to_s
+ ## p headers
+
+ requestURI = target(dataset, graph)
+ uri = URI.parse(requestURI)
+
+ request = method.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ request.body_stream = File.open(file)
+ response_no_body(uri, request)
+end
+
+def response_no_body(uri, request)
+ http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
+ http.read_timeout = nil
+ # check we can connect.
+ begin http.start
+ rescue Exception => e
+ # puts e.message
+ #puts e.backtrace.inspect
+ warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
+ end
+ response = http.request(request)
+ print_http_response(response)
+ case response
+ when Net::HTTPSuccess, Net::HTTPRedirection
+ # OK
+ when Net::HTTPNotFound
+ warn_exit "404 Not found: #{uri}", 9
+ #print response.body
+ else
+ warn_exit "#{response.code} #{response.message} #{uri}", 9
+ # Unreachable
+ response.error!
+ end
+ # NO BODY IN RESPONSE
+end
+
+def response_print_body(uri, request)
+ http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
+ http.read_timeout = nil
+ # check we can connect.
+ begin http.start
+ rescue => e
+ #puts e.backtrace.inspect
+ #print e.class
+ warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
+ end
+
+ # Add a blank line if headers were output.
+ print "\n" if $http_print ;
+
+ begin
+ response = http.request(request) { |res|
+ print_http_response(res)
+ #puts res.code
+ res.read_body do |segment|
+ print segment
+ end
+ }
+ case response
+ when Net::HTTPSuccess, Net::HTTPRedirection
+ # OK
+ when Net::HTTPNotFound
+ warn_exit "404 Not found: #{uri}", 9
+ #print response.body
+ else
+ warn_exit "#{response.code}: #{uri}", 9
+ # Unreachable
+ response.error!
+ end
+ rescue EOFError => e
+ warn_exit "IO Error: "+e.message, 3
+ end
+end
+
+def print_http_request(uri, request)
+ return unless $print_http
+ #print "Request\n"
+ print request.method," ",uri, "\n"
+ print_headers(" ",request)
+end
+
+def print_http_response(response)
+ return unless $print_http
+ #print "Response\n"
+ print response.code, " ", response.message, "\n"
+ print_headers(" ",response)
+end
+
+def print_headers(marker, headers)
+ headers.each do |k,v|
+ k = k.split('-').map{|w| w.capitalize}.join('-')+':'
+ printf "%s%-20s %s\n",marker,k,v
+ end
+end
+
+def content_type(file)
+ file =~ /\.([^.]*)$/
+ ext = $1
+ mt = $fileMediaTypes[ext]
+ cs = $charset[mt]
+ mt = mt+';charset='+cs if ! cs.nil?
+ return mt
+end
+
+def charset(content_type)
+ return $charset[content_type]
+end
+
+def warn_exit(msg, rc)
+ warn msg
+ exit rc ;
+end
+
+def parseURI(uri_string)
+ begin
+ return URI.parse(uri_string).to_s
+ rescue URI::InvalidURIError => err
+ warn_exit "Bad URI: <#{uri_string}>", 2
+ end
+end
+
+## ---- Command
+
+def cmd_soh(command=nil)
+ ## Command line
+ options = {}
+ optparse = OptionParser.new do |opts|
+ # Set a banner, displayed at the top
+ # of the help screen.
+ case $cmd
+ when "s-http", "sparql-http", "soh"
+ banner="$cmd [get|post|put|delete] datasetURI graph [file]"
+ when "s-get", "s-head", "s-delete"
+ banner="$cmd datasetURI graph"
+ end
+
+ opts.banner = $banner
+ # Define the options, and what they do
+
+ options[:verbose] = false
+ opts.on( '-v', '--verbose', 'Verbose' ) do
+ options[:verbose] = true
+ end
+
+ options[:version] = false
+ opts.on( '--version', 'Print version and exit' ) do
+ print "#{SOH_NAME} #{SOH_VERSION}\n"
+ exit
+ end
+
+ # This displays the help screen, all programs are
+ # assumed to have this option.
+ opts.on( '-h', '--help', 'Display this screen and exit' ) do
+ puts opts
+ exit
+ end
+ end
+
+ begin optparse.parse!
+ rescue OptionParser::InvalidArgument => e
+ warn e
+ exit
+ end
+
+ $verbose = options[:verbose]
+ $print_http = $verbose
+
+ if command.nil?
+ if ARGV.size == 0
+ warn "No command given: expected one of 'get', 'put', 'post', 'delete', 'query' or 'update'"
+ exit 1
+ end
+ cmdPrint=ARGV.shift
+ command=cmdPrint.upcase
+ else
+ cmdPrint=command
+ end
+
+ case command
+ when "HEAD", "GET", "DELETE"
+ requiredFile=false
+ when "PUT", "POST"
+ requiredFile=true
+ when "QUERY"
+ cmd_sparql_query
+ when "UPDATE"
+ cmd_sparql_update
+ else
+ warn_exit "Unknown command: #{command}", 2
+ end
+
+ if requiredFile
+ then
+ if ARGV.size != 3
+ warn_exit "Required: dataset URI, graph URI (or 'default') and file", 1
+ end
+ else
+ if ARGV.size != 2
+ warn_exit "Required: dataset URI and graph URI (or 'default')", 1
+ end
+ end
+
+ dataset=parseURI(ARGV.shift)
+ # Relative URI?
+ graph=parseURI(ARGV.shift)
+ file=""
+ if requiredFile
+ then
+ file = ARGV.shift if requiredFile
+ if ! File.exist?(file)
+ warn_exit "No such file: "+file, 3
+ end
+ if File.directory?(file)
+ warn_exit "File is a directory: "+file, 3
+ end
+ end
+
+ case command
+ when "GET"
+ GET(dataset, graph)
+ when "HEAD"
+ HEAD(dataset, graph)
+ when "PUT"
+ PUT(dataset, graph, file)
+ when "DELETE"
+ DELETE(dataset, graph)
+ when "POST"
+ POST(dataset, graph, file)
+ else
+ warn_exit "Internal error: Unknown command: #{cmd}", 2
+ end
+ exit 0
+end
+
+## --------
+def string_or_file(arg)
+ return arg if ! arg.match(/^@/)
+ a=(arg[1..-1])
+ open(a, 'rb'){|f| f.read}
+end
+
+## -------- SPARQL Query
+
+## Choose method
+def SPARQL_query(service, query, query_file, forcePOST=false, args2={})
+ if ! query_file.nil?
+ query = open(query_file, 'rb'){|f| f.read}
+ end
+ if forcePOST || query.length >= 2*1024
+ SPARQL_query_POST(service, query, args2)
+ else
+ SPARQL_query_GET(service, query, args2)
+ end
+end
+
+## By GET
+
+def SPARQL_query_GET(service, query, args2)
+ args = { "query" => query }
+ args.merge!(args2)
+ qs=args.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
+ action="#{service}?#{qs}"
+ headers={}
+ headers.merge!($headers)
+ headers[$hAccept]=$accept_results
+ get_worker(action, headers)
+end
+
+## By POST
+
+def SPARQL_query_POST(service, query, args2)
+ # DRY - body/no body for each of request and response.
+ post_params={ "query" => query }
+ post_params.merge!(args2)
+ uri = URI.parse(service)
+ headers={}
+ headers.merge!($headers)
+ headers[$hAccept]=$accept_results
+ execute_post_form_body(uri, headers, post_params)
+end
+
+def execute_post_form_body(uri, headers, post_params)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ qs=post_params.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
+ headers[$hContentType] = $mtWWWForm
+ headers[$hContentLength] = qs.length.to_s
+ request.initialize_http_header(headers)
+ request.body = qs
+ print_http_request(uri, request)
+ response_print_body(uri, request)
+end
+
+# Usage: -v --help --file= --query=
+def cmd_sparql_query
+ options={}
+ optparse = OptionParser.new do |opts|
+ opts.banner = "Usage: #{$cmd} [--query QUERY] [--service URI] [--post] 'query' | @file"
+ opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
+ options[:service]=uri
+ end
+ opts.on('--query=FILE','--file=FILE', 'Take query from a file') do |file|
+ options[:file]=file
+ end
+ opts.on('--output=TYPE', [:json,:xml,:text,:csv,:tsv],
+ 'Set the output argument') do |type|
+ options[:output]=type
+ end
+ opts.on('--accept=TYPE', [:json,:xml,:text,:csv,:tsv],
+ 'Set the accept header type') do |type|
+ options[:accept]=type
+ end
+ options[:verbose] = false
+ opts.on( '--post', 'Force use of POST' ) do
+ options[:post] = true
+ end
+ opts.on( '-v', '--verbose', 'Verbose' ) do
+ options[:verbose] = true
+ end
+ opts.on( '--version', 'Print version and exit' ) do
+ print "#{SOH_NAME} #{SOH_VERSION}\n"
+ exit
+ end
+ opts.on( '-h', '--help', 'Display this screen and exit' ) do
+ puts opts
+ exit
+ end
+ end
+
+ begin optparse.parse!
+ rescue OptionParser::InvalidArgument, OptionParser::InvalidOption => e
+ warn e
+ exit 1
+ end
+
+ $verbose = options[:verbose]
+ $print_http = $verbose
+ usePOST = options[:post]
+
+ service = options[:service]
+ warn_exit 'No service specified. Required --service=URI',1 if service.nil?
+
+ # Query
+ query=nil
+ query_file=options[:file]
+ if query_file.nil? && ARGV.size == 0
+ then
+ warn_exit 'No query specified.',1
+ end
+ if query_file.nil?
+ query = ARGV.shift
+ if query.match(/^@/)
+ query_file = query[1..-1]
+ query = nil
+ end
+ end
+
+ # --output ==> output= (non-standard)
+ args={}
+ case options[:output]
+ when nil
+ when "json","xml","text","csv","tsv"
+ args['output'] = options[:output]
+ when :json,:xml,:text,:csv,:tsv
+ args['output'] = options[:output].to_s
+ else
+ warn_exit "Unrecognized output type: "+options[:output],2
+ end
+
+ # --accept
+ # options[:accept]
+
+ print "SPARQL #{service}\n" if $verbose
+ #args={"output"=>"text"}
+ SPARQL_query(service, query, query_file, usePOST, args)
+ exit(0)
+end
+
+## -------- SPARQL Update
+
+# Update sent as a WWW form.
+def SPARQL_update_by_form(service, update, args2={})
+ args = {}
+ args.merge!(args2)
+ headers={}
+ headers.merge!($headers)
+ # args? encode?
+ body="update="+uri_escape(update)
+ headers[$hContentType] = $mtWWWForm
+ headers[$hContentLength] = body.length.to_s
+ uri = URI.parse(service)
+ execute_post_form(uri, headers, body)
+end
+
+# DRY - query form.
+def execute_post_form(uri, headers, body)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ request.body = body
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def SPARQL_update(service, update, args2={})
+ args = {}
+ args.merge!(args2)
+ headers={}
+ headers.merge!($headers)
+ headers[$hContentType] = $mtSparqlUpdate
+ uri = URI.parse(service)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ request.body = update
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def cmd_sparql_update(by_raw_post=true)
+ # Share with cmd_sparql_query
+ options={}
+ optparse = OptionParser.new do |opts|
+ opts.banner = "Usage: #{$cmd} [--file REQUEST] [--service URI] 'request' | @file"
+ opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
+ options[:service]=uri
+ end
+ opts.on('--update=FILE', '--file=FILE', 'Take update from a file') do |file|
+ options[:file]=file
+ end
+ options[:verbose] = false
+ opts.on( '-v', '--verbose', 'Verbose' ) do
+ options[:verbose] = true
+ end
+ opts.on( '--version', 'Print version and exit' ) do
+ print "#{SOH_NAME} #{SOH_VERSION}\n"
+ exit
+ end
+ opts.on( '-h', '--help', 'Display this screen and exit' ) do
+ puts opts
+ exit
+ end
+ end
+
+ begin optparse.parse!
+ rescue OptionParser::InvalidArgument => e
+ warn e
+ exit
+ end
+
+ $verbose = options[:verbose]
+ $print_http = $verbose
+
+ service = options[:service]
+ warn_exit 'No service specified. Required --service=URI',1 if service.nil?
+
+ update=nil
+ update_file=options[:file]
+
+ if update_file.nil? && ARGV.size == 0
+ then
+ warn_exit 'No update specified.',1
+ end
+ if update_file.nil?
+ update = ARGV.shift
+ if update.match(/^@/)
+ update_file = update[1..-1]
+ update = nil
+ end
+ end
+
+ print "SPARQL-Update #{service}\n" if $verbose
+ args={}
+
+ # Reads in the file :-(
+ if update.nil?
+ then
+ update = open(update_file, 'rb'){|f| f.read}
+ else
+ update = string_or_file(update)
+ end
+
+ if by_raw_post
+ SPARQL_update(service, update, args)
+ else
+ SPARQL_update_by_form(service, update, args)
+ end
+ exit(0)
+end
+
+## -------
+
+case $cmd
+when "s-http", "sparql-http", "soh"
+ $banner="#{$cmd} [get|post|put|delete] datasetURI graph [file]"
+ cmd_soh
+when "s-get", "s-head", "s-put", "s-delete", "s-post"
+
+ case $cmd
+ when "s-get", "s-head", "s-delete"
+ $banner="#{$cmd} datasetURI graph"
+ when "s-put", "s-post"
+ $banner="#{$cmd} datasetURI graph file"
+ end
+ cmd2 = $cmd.sub(/^s-/, '').upcase
+ cmd_soh cmd2
+
+when "s-query", "sparql-query"
+ cmd_sparql_query
+when "s-update", "sparql-update"
+ cmd_sparql_update true
+when "s-update-form", "sparql-update-form"
+ cmd_sparql_update false
+else
+ warn_exit "Unknown: "+$cmd, 1
+end
[6/6] jena git commit: JENA-872 : apache-jena-fuseki
Posted by an...@apache.org.
JENA-872 : apache-jena-fuseki
Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/02286cf3
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/02286cf3
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/02286cf3
Branch: refs/heads/master
Commit: 02286cf3fdf76f2da54510f7882489c29ca5007a
Parents: 36a8bff
Author: Andy Seaborne <an...@apache.org>
Authored: Thu Jan 29 12:12:35 2015 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Thu Jan 29 12:12:35 2015 +0000
----------------------------------------------------------------------
.../apache-jena-fuseki/assembly-dist.xml | 99 +++
jena-fuseki2/apache-jena-fuseki/backup | 22 +
jena-fuseki2/apache-jena-fuseki/bin/s-delete | 707 +++++++++++++++++++
jena-fuseki2/apache-jena-fuseki/bin/s-get | 707 +++++++++++++++++++
jena-fuseki2/apache-jena-fuseki/bin/s-head | 707 +++++++++++++++++++
jena-fuseki2/apache-jena-fuseki/bin/s-post | 707 +++++++++++++++++++
jena-fuseki2/apache-jena-fuseki/bin/s-put | 707 +++++++++++++++++++
jena-fuseki2/apache-jena-fuseki/bin/s-query | 707 +++++++++++++++++++
jena-fuseki2/apache-jena-fuseki/bin/s-update | 707 +++++++++++++++++++
.../apache-jena-fuseki/bin/s-update-form | 707 +++++++++++++++++++
jena-fuseki2/apache-jena-fuseki/bin/soh | 707 +++++++++++++++++++
jena-fuseki2/apache-jena-fuseki/dist/ABOUT | 1 +
jena-fuseki2/apache-jena-fuseki/dist/LICENSE | 617 ++++++++++++++++
jena-fuseki2/apache-jena-fuseki/dist/NOTICE | 216 ++++++
jena-fuseki2/apache-jena-fuseki/fuseki | 477 +++++++++++++
jena-fuseki2/apache-jena-fuseki/fuseki-server | 80 +++
.../apache-jena-fuseki/fuseki-server.bat | 28 +
jena-fuseki2/apache-jena-fuseki/pom.xml | 95 +++
jena-fuseki2/jena-fuseki-dist/assembly-dist.xml | 99 ---
jena-fuseki2/jena-fuseki-dist/backup | 22 -
jena-fuseki2/jena-fuseki-dist/bin/s-delete | 707 -------------------
jena-fuseki2/jena-fuseki-dist/bin/s-get | 707 -------------------
jena-fuseki2/jena-fuseki-dist/bin/s-head | 707 -------------------
jena-fuseki2/jena-fuseki-dist/bin/s-post | 707 -------------------
jena-fuseki2/jena-fuseki-dist/bin/s-put | 707 -------------------
jena-fuseki2/jena-fuseki-dist/bin/s-query | 707 -------------------
jena-fuseki2/jena-fuseki-dist/bin/s-update | 707 -------------------
jena-fuseki2/jena-fuseki-dist/bin/s-update-form | 707 -------------------
jena-fuseki2/jena-fuseki-dist/bin/soh | 707 -------------------
jena-fuseki2/jena-fuseki-dist/dist/ABOUT | 1 -
jena-fuseki2/jena-fuseki-dist/dist/LICENSE | 617 ----------------
jena-fuseki2/jena-fuseki-dist/dist/NOTICE | 216 ------
jena-fuseki2/jena-fuseki-dist/fuseki | 477 -------------
jena-fuseki2/jena-fuseki-dist/fuseki-server | 80 ---
jena-fuseki2/jena-fuseki-dist/fuseki-server.bat | 28 -
jena-fuseki2/jena-fuseki-dist/pom.xml | 95 ---
jena-fuseki2/pom.xml | 2 +-
37 files changed, 7999 insertions(+), 7999 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/apache-jena-fuseki/assembly-dist.xml
----------------------------------------------------------------------
diff --git a/jena-fuseki2/apache-jena-fuseki/assembly-dist.xml b/jena-fuseki2/apache-jena-fuseki/assembly-dist.xml
new file mode 100644
index 0000000..3c6c66e
--- /dev/null
+++ b/jena-fuseki2/apache-jena-fuseki/assembly-dist.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+-->
+
+<!--
+ The distribution.
+ Assumes jar made and onejar has been assembled.
+-->
+
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+
+ <id>distribution</id>
+
+ <formats>
+ <format>zip</format>
+ <format>tar.gz</format>
+ </formats>
+
+ <baseDirectory>${project.artifactId}-${project.version}</baseDirectory>
+
+ <dependencySets>
+ <!-- Standalone JAR -->
+ <dependencySet>
+ <useProjectArtifact>false</useProjectArtifact>
+ <includes>
+ <include>org.apache.jena:jena-fuseki-server:jar</include>
+ </includes>
+ <outputFileNameMapping>fuseki-server.jar</outputFileNameMapping>
+
+ </dependencySet>
+ <!-- WAR file -->
+ <dependencySet>
+ <useProjectArtifact>false</useProjectArtifact>
+ <includes>
+ <include>org.apache.jena:jena-fuseki-war:war</include>
+ </includes>
+ <outputFileNameMapping>fuseki.war</outputFileNameMapping>
+
+ </dependencySet>
+ </dependencySets>
+
+ <files>
+
+ <file>
+ <source>dist/LICENSE</source>
+ <destName>LICENSE</destName>
+ </file>
+ <file>
+ <source>dist/NOTICE</source>
+ <destName>NOTICE</destName>
+ </file>
+ </files>
+
+ <fileSets>
+ <fileSet>
+ <outputDirectory></outputDirectory>
+ <includes>
+ <include>templates/*</include>
+ <include>README*</include>
+ <include>DEPENDENCIES*</include>
+ <include>ReleaseNotes.txt</include>
+ </includes>
+ </fileSet>
+
+ <fileSet>
+ <outputDirectory></outputDirectory>
+ <includes>
+ <include>log4j.properties</include>
+ <!--<include>examples/**</include>-->
+ <include>fuseki</include>
+ <include>fuseki-server</include>
+ <include>fuseki-server.bat</include>
+ <!--<include>s-*</include>-->
+ </includes>
+ </fileSet>
+
+ <fileSet>
+ <directory>../jena-fuseki-core/src/main/webapp</directory>
+ <outputDirectory>webapp</outputDirectory>
+ </fileSet>
+
+ </fileSets>
+</assembly>
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/apache-jena-fuseki/backup
----------------------------------------------------------------------
diff --git a/jena-fuseki2/apache-jena-fuseki/backup b/jena-fuseki2/apache-jena-fuseki/backup
new file mode 100755
index 0000000..a3cb0b1
--- /dev/null
+++ b/jena-fuseki2/apache-jena-fuseki/backup
@@ -0,0 +1,22 @@
+#!/bin/bash
+# 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.
+
+DB="ds"
+
+curl -v -XPOST 'http://localhost:3030/$/sleep?interval=10000'
+
+curl -v 'http://localhost:3030/$/tasks'
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/apache-jena-fuseki/bin/s-delete
----------------------------------------------------------------------
diff --git a/jena-fuseki2/apache-jena-fuseki/bin/s-delete b/jena-fuseki2/apache-jena-fuseki/bin/s-delete
new file mode 100755
index 0000000..0e3a807
--- /dev/null
+++ b/jena-fuseki2/apache-jena-fuseki/bin/s-delete
@@ -0,0 +1,707 @@
+#!/usr/bin/env ruby
+# -*- coding: utf-8 -*-
+
+# 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.
+
+# SPARQL HTTP Update, client.
+
+require 'optparse'
+require 'net/http'
+require 'uri'
+require 'cgi'
+require 'pp'
+require 'ostruct'
+
+# ToDo
+# Allow a choice of media type for GET
+# --accept "content-type" (and abbreviations)
+# --header "Add:this"
+# --user, --password
+# Basic authentication: request.basic_auth("username", "password")
+# Follow redirects => 301: puts response["location"] # All headers are lowercase?
+
+SOH_NAME="SOH"
+SOH_VERSION="0.0.0"
+
+$proxy = ENV['http_proxy'] ? URI.parse(ENV['http_proxy']) : OpenStruct.new
+
+# What about direct naming?
+
+# Names
+$mtTurtle = 'text/turtle;charset=utf-8'
+$mtRDF = 'application/rdf+xml'
+$mtText = 'text/plain'
+$mtNQuads = 'text/n-quads'
+$mtTriG = 'application/trig'
+$mtSparqlResultsX = 'application/sparql-results+xml'
+$mtSparqlResultsJ = 'application/sparql-results+json'
+$mtAppJSON = 'application/json'
+$mtAppXML = 'application/xml'
+$mtSparqlResultsTSV = 'application/sparql-results+tsv'
+$mtSparqlResultsCSV = 'application/sparql-results+csv'
+$mtSparqlUpdate = 'application/sparql-update'
+$mtWWWForm = 'application/x-www-form-urlencoded'
+$mtSparqlQuery = "application/sparql-query" ;
+
+# Global media type table.
+$fileMediaTypes = {}
+$fileMediaTypes['ttl'] = $mtTurtle
+$fileMediaTypes['n3'] = 'text/n3; charset=utf-8'
+$fileMediaTypes['nt'] = $mtText
+$fileMediaTypes['rdf'] = $mtRDF
+$fileMediaTypes['owl'] = $mtRDF
+$fileMediaTypes['nq'] = $mtNQuads
+$fileMediaTypes['trig'] = $mtTriG
+
+# Global charset : no entry means "don't set"
+$charsetUTF8 = 'utf-8'
+$charset = {}
+$charset[$mtTurtle] = 'utf-8'
+$charset[$mtText] = 'ascii'
+$charset[$mtTriG] = 'utf-8'
+$charset[$mtNQuads] = 'ascii'
+
+# Headers
+
+$hContentType = 'Content-Type'
+# $hContentEncoding = 'Content-Encoding'
+$hContentLength = 'Content-Length'
+# $hContentLocation = 'Content-Location'
+# $hContentRange = 'Content-Range'
+
+$hAccept = 'Accept'
+$hAcceptCharset = 'Accept-Charset'
+$hAcceptEncoding = 'Accept-Encoding'
+$hAcceptRanges = 'Accept-Ranges'
+
+$headers = { "User-Agent" => "#{SOH_NAME}/Fuseki #{SOH_VERSION}"}
+$print_http = false
+
+# Default for GET
+# At least allow anythign (and hope!)
+$accept_rdf="#{$mtRDF};q=0.9 , #{$mtTurtle}"
+# For SPARQL query
+$accept_results="#{$mtSparqlResultsJ} , #{$mtSparqlResultsX};q=0.9 , #{$accept_rdf}"
+
+# Accept any in case of trouble.
+$accept_rdf="#{$accept_rdf} , */*;q=0.1"
+$accept_results="#{$accept_results} , */*;q=0.1"
+
+# The media type usually forces the charset.
+$accept_charset=nil
+
+## Who we are.
+## Two styles:
+## s-query .....
+## soh query .....
+
+$cmd = File.basename($0)
+if $cmd == 'soh'
+then
+ $cmd = (ARGV.size == 0) ? 'soh' : ARGV.shift
+end
+
+if ! $cmd.start_with?('s-') && $cmd != 'soh'
+ $cmd = 's-'+$cmd
+end
+
+## --------
+
+def GET(dataset, graph)
+ print "GET #{dataset} #{graph}\n" if $verbose
+ requestURI = target(dataset, graph)
+ headers = {}
+ headers.merge!($headers)
+ headers[$hAccept] = $accept_rdf
+ headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
+ get_worker(requestURI, headers)
+end
+
+def get_worker(requestURI, headers)
+ uri = URI.parse(requestURI)
+ request = Net::HTTP::Get.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ response_print_body(uri, request)
+end
+
+def HEAD(dataset, graph)
+ print "HEAD #{dataset} #{graph}\n" if $verbose
+ requestURI = target(dataset, graph)
+ headers = {}
+ headers.merge!($headers)
+ headers[$hAccept] = $accept_rdf
+ headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
+ uri = URI.parse(requestURI)
+ request = Net::HTTP::Head.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def PUT(dataset, graph, file)
+ print "PUT #{dataset} #{graph} #{file}\n" if $verbose
+ send_body(dataset, graph, file, Net::HTTP::Put)
+end
+
+def POST(dataset, graph, file)
+ print "POST #{dataset} #{graph} #{file}\n" if $verbose
+ send_body(dataset, graph, file, Net::HTTP::Post)
+end
+
+def DELETE(dataset, graph)
+ print "DELETE #{dataset} #{graph}\n" if $verbose
+ requestURI = target(dataset, graph)
+ uri = URI.parse(requestURI)
+ request = Net::HTTP::Delete.new(uri.request_uri)
+ headers = {}
+ headers.merge!($headers)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def uri_escape(string)
+ CGI.escape(string)
+end
+
+def target(dataset, graph)
+ return dataset+"?default" if graph == "default"
+ return dataset+"?graph="+uri_escape(graph)
+end
+
+def send_body(dataset, graph, file, method)
+ mt = content_type(file)
+ headers = {}
+ headers.merge!($headers)
+ headers[$hContentType] = mt
+ headers[$hContentLength] = File.size(file).to_s
+ ## p headers
+
+ requestURI = target(dataset, graph)
+ uri = URI.parse(requestURI)
+
+ request = method.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ request.body_stream = File.open(file)
+ response_no_body(uri, request)
+end
+
+def response_no_body(uri, request)
+ http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
+ http.read_timeout = nil
+ # check we can connect.
+ begin http.start
+ rescue Exception => e
+ # puts e.message
+ #puts e.backtrace.inspect
+ warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
+ end
+ response = http.request(request)
+ print_http_response(response)
+ case response
+ when Net::HTTPSuccess, Net::HTTPRedirection
+ # OK
+ when Net::HTTPNotFound
+ warn_exit "404 Not found: #{uri}", 9
+ #print response.body
+ else
+ warn_exit "#{response.code} #{response.message} #{uri}", 9
+ # Unreachable
+ response.error!
+ end
+ # NO BODY IN RESPONSE
+end
+
+def response_print_body(uri, request)
+ http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
+ http.read_timeout = nil
+ # check we can connect.
+ begin http.start
+ rescue => e
+ #puts e.backtrace.inspect
+ #print e.class
+ warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
+ end
+
+ # Add a blank line if headers were output.
+ print "\n" if $http_print ;
+
+ begin
+ response = http.request(request) { |res|
+ print_http_response(res)
+ #puts res.code
+ res.read_body do |segment|
+ print segment
+ end
+ }
+ case response
+ when Net::HTTPSuccess, Net::HTTPRedirection
+ # OK
+ when Net::HTTPNotFound
+ warn_exit "404 Not found: #{uri}", 9
+ #print response.body
+ else
+ warn_exit "#{response.code}: #{uri}", 9
+ # Unreachable
+ response.error!
+ end
+ rescue EOFError => e
+ warn_exit "IO Error: "+e.message, 3
+ end
+end
+
+def print_http_request(uri, request)
+ return unless $print_http
+ #print "Request\n"
+ print request.method," ",uri, "\n"
+ print_headers(" ",request)
+end
+
+def print_http_response(response)
+ return unless $print_http
+ #print "Response\n"
+ print response.code, " ", response.message, "\n"
+ print_headers(" ",response)
+end
+
+def print_headers(marker, headers)
+ headers.each do |k,v|
+ k = k.split('-').map{|w| w.capitalize}.join('-')+':'
+ printf "%s%-20s %s\n",marker,k,v
+ end
+end
+
+def content_type(file)
+ file =~ /\.([^.]*)$/
+ ext = $1
+ mt = $fileMediaTypes[ext]
+ cs = $charset[mt]
+ mt = mt+';charset='+cs if ! cs.nil?
+ return mt
+end
+
+def charset(content_type)
+ return $charset[content_type]
+end
+
+def warn_exit(msg, rc)
+ warn msg
+ exit rc ;
+end
+
+def parseURI(uri_string)
+ begin
+ return URI.parse(uri_string).to_s
+ rescue URI::InvalidURIError => err
+ warn_exit "Bad URI: <#{uri_string}>", 2
+ end
+end
+
+## ---- Command
+
+def cmd_soh(command=nil)
+ ## Command line
+ options = {}
+ optparse = OptionParser.new do |opts|
+ # Set a banner, displayed at the top
+ # of the help screen.
+ case $cmd
+ when "s-http", "sparql-http", "soh"
+ banner="$cmd [get|post|put|delete] datasetURI graph [file]"
+ when "s-get", "s-head", "s-delete"
+ banner="$cmd datasetURI graph"
+ end
+
+ opts.banner = $banner
+ # Define the options, and what they do
+
+ options[:verbose] = false
+ opts.on( '-v', '--verbose', 'Verbose' ) do
+ options[:verbose] = true
+ end
+
+ options[:version] = false
+ opts.on( '--version', 'Print version and exit' ) do
+ print "#{SOH_NAME} #{SOH_VERSION}\n"
+ exit
+ end
+
+ # This displays the help screen, all programs are
+ # assumed to have this option.
+ opts.on( '-h', '--help', 'Display this screen and exit' ) do
+ puts opts
+ exit
+ end
+ end
+
+ begin optparse.parse!
+ rescue OptionParser::InvalidArgument => e
+ warn e
+ exit
+ end
+
+ $verbose = options[:verbose]
+ $print_http = $verbose
+
+ if command.nil?
+ if ARGV.size == 0
+ warn "No command given: expected one of 'get', 'put', 'post', 'delete', 'query' or 'update'"
+ exit 1
+ end
+ cmdPrint=ARGV.shift
+ command=cmdPrint.upcase
+ else
+ cmdPrint=command
+ end
+
+ case command
+ when "HEAD", "GET", "DELETE"
+ requiredFile=false
+ when "PUT", "POST"
+ requiredFile=true
+ when "QUERY"
+ cmd_sparql_query
+ when "UPDATE"
+ cmd_sparql_update
+ else
+ warn_exit "Unknown command: #{command}", 2
+ end
+
+ if requiredFile
+ then
+ if ARGV.size != 3
+ warn_exit "Required: dataset URI, graph URI (or 'default') and file", 1
+ end
+ else
+ if ARGV.size != 2
+ warn_exit "Required: dataset URI and graph URI (or 'default')", 1
+ end
+ end
+
+ dataset=parseURI(ARGV.shift)
+ # Relative URI?
+ graph=parseURI(ARGV.shift)
+ file=""
+ if requiredFile
+ then
+ file = ARGV.shift if requiredFile
+ if ! File.exist?(file)
+ warn_exit "No such file: "+file, 3
+ end
+ if File.directory?(file)
+ warn_exit "File is a directory: "+file, 3
+ end
+ end
+
+ case command
+ when "GET"
+ GET(dataset, graph)
+ when "HEAD"
+ HEAD(dataset, graph)
+ when "PUT"
+ PUT(dataset, graph, file)
+ when "DELETE"
+ DELETE(dataset, graph)
+ when "POST"
+ POST(dataset, graph, file)
+ else
+ warn_exit "Internal error: Unknown command: #{cmd}", 2
+ end
+ exit 0
+end
+
+## --------
+def string_or_file(arg)
+ return arg if ! arg.match(/^@/)
+ a=(arg[1..-1])
+ open(a, 'rb'){|f| f.read}
+end
+
+## -------- SPARQL Query
+
+## Choose method
+def SPARQL_query(service, query, query_file, forcePOST=false, args2={})
+ if ! query_file.nil?
+ query = open(query_file, 'rb'){|f| f.read}
+ end
+ if forcePOST || query.length >= 2*1024
+ SPARQL_query_POST(service, query, args2)
+ else
+ SPARQL_query_GET(service, query, args2)
+ end
+end
+
+## By GET
+
+def SPARQL_query_GET(service, query, args2)
+ args = { "query" => query }
+ args.merge!(args2)
+ qs=args.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
+ action="#{service}?#{qs}"
+ headers={}
+ headers.merge!($headers)
+ headers[$hAccept]=$accept_results
+ get_worker(action, headers)
+end
+
+## By POST
+
+def SPARQL_query_POST(service, query, args2)
+ # DRY - body/no body for each of request and response.
+ post_params={ "query" => query }
+ post_params.merge!(args2)
+ uri = URI.parse(service)
+ headers={}
+ headers.merge!($headers)
+ headers[$hAccept]=$accept_results
+ execute_post_form_body(uri, headers, post_params)
+end
+
+def execute_post_form_body(uri, headers, post_params)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ qs=post_params.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
+ headers[$hContentType] = $mtWWWForm
+ headers[$hContentLength] = qs.length.to_s
+ request.initialize_http_header(headers)
+ request.body = qs
+ print_http_request(uri, request)
+ response_print_body(uri, request)
+end
+
+# Usage: -v --help --file= --query=
+def cmd_sparql_query
+ options={}
+ optparse = OptionParser.new do |opts|
+ opts.banner = "Usage: #{$cmd} [--query QUERY] [--service URI] [--post] 'query' | @file"
+ opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
+ options[:service]=uri
+ end
+ opts.on('--query=FILE','--file=FILE', 'Take query from a file') do |file|
+ options[:file]=file
+ end
+ opts.on('--output=TYPE', [:json,:xml,:text,:csv,:tsv],
+ 'Set the output argument') do |type|
+ options[:output]=type
+ end
+ opts.on('--accept=TYPE', [:json,:xml,:text,:csv,:tsv],
+ 'Set the accept header type') do |type|
+ options[:accept]=type
+ end
+ options[:verbose] = false
+ opts.on( '--post', 'Force use of POST' ) do
+ options[:post] = true
+ end
+ opts.on( '-v', '--verbose', 'Verbose' ) do
+ options[:verbose] = true
+ end
+ opts.on( '--version', 'Print version and exit' ) do
+ print "#{SOH_NAME} #{SOH_VERSION}\n"
+ exit
+ end
+ opts.on( '-h', '--help', 'Display this screen and exit' ) do
+ puts opts
+ exit
+ end
+ end
+
+ begin optparse.parse!
+ rescue OptionParser::InvalidArgument, OptionParser::InvalidOption => e
+ warn e
+ exit 1
+ end
+
+ $verbose = options[:verbose]
+ $print_http = $verbose
+ usePOST = options[:post]
+
+ service = options[:service]
+ warn_exit 'No service specified. Required --service=URI',1 if service.nil?
+
+ # Query
+ query=nil
+ query_file=options[:file]
+ if query_file.nil? && ARGV.size == 0
+ then
+ warn_exit 'No query specified.',1
+ end
+ if query_file.nil?
+ query = ARGV.shift
+ if query.match(/^@/)
+ query_file = query[1..-1]
+ query = nil
+ end
+ end
+
+ # --output ==> output= (non-standard)
+ args={}
+ case options[:output]
+ when nil
+ when "json","xml","text","csv","tsv"
+ args['output'] = options[:output]
+ when :json,:xml,:text,:csv,:tsv
+ args['output'] = options[:output].to_s
+ else
+ warn_exit "Unrecognized output type: "+options[:output],2
+ end
+
+ # --accept
+ # options[:accept]
+
+ print "SPARQL #{service}\n" if $verbose
+ #args={"output"=>"text"}
+ SPARQL_query(service, query, query_file, usePOST, args)
+ exit(0)
+end
+
+## -------- SPARQL Update
+
+# Update sent as a WWW form.
+def SPARQL_update_by_form(service, update, args2={})
+ args = {}
+ args.merge!(args2)
+ headers={}
+ headers.merge!($headers)
+ # args? encode?
+ body="update="+uri_escape(update)
+ headers[$hContentType] = $mtWWWForm
+ headers[$hContentLength] = body.length.to_s
+ uri = URI.parse(service)
+ execute_post_form(uri, headers, body)
+end
+
+# DRY - query form.
+def execute_post_form(uri, headers, body)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ request.body = body
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def SPARQL_update(service, update, args2={})
+ args = {}
+ args.merge!(args2)
+ headers={}
+ headers.merge!($headers)
+ headers[$hContentType] = $mtSparqlUpdate
+ uri = URI.parse(service)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ request.body = update
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def cmd_sparql_update(by_raw_post=true)
+ # Share with cmd_sparql_query
+ options={}
+ optparse = OptionParser.new do |opts|
+ opts.banner = "Usage: #{$cmd} [--file REQUEST] [--service URI] 'request' | @file"
+ opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
+ options[:service]=uri
+ end
+ opts.on('--update=FILE', '--file=FILE', 'Take update from a file') do |file|
+ options[:file]=file
+ end
+ options[:verbose] = false
+ opts.on( '-v', '--verbose', 'Verbose' ) do
+ options[:verbose] = true
+ end
+ opts.on( '--version', 'Print version and exit' ) do
+ print "#{SOH_NAME} #{SOH_VERSION}\n"
+ exit
+ end
+ opts.on( '-h', '--help', 'Display this screen and exit' ) do
+ puts opts
+ exit
+ end
+ end
+
+ begin optparse.parse!
+ rescue OptionParser::InvalidArgument => e
+ warn e
+ exit
+ end
+
+ $verbose = options[:verbose]
+ $print_http = $verbose
+
+ service = options[:service]
+ warn_exit 'No service specified. Required --service=URI',1 if service.nil?
+
+ update=nil
+ update_file=options[:file]
+
+ if update_file.nil? && ARGV.size == 0
+ then
+ warn_exit 'No update specified.',1
+ end
+ if update_file.nil?
+ update = ARGV.shift
+ if update.match(/^@/)
+ update_file = update[1..-1]
+ update = nil
+ end
+ end
+
+ print "SPARQL-Update #{service}\n" if $verbose
+ args={}
+
+ # Reads in the file :-(
+ if update.nil?
+ then
+ update = open(update_file, 'rb'){|f| f.read}
+ else
+ update = string_or_file(update)
+ end
+
+ if by_raw_post
+ SPARQL_update(service, update, args)
+ else
+ SPARQL_update_by_form(service, update, args)
+ end
+ exit(0)
+end
+
+## -------
+
+case $cmd
+when "s-http", "sparql-http", "soh"
+ $banner="#{$cmd} [get|post|put|delete] datasetURI graph [file]"
+ cmd_soh
+when "s-get", "s-head", "s-put", "s-delete", "s-post"
+
+ case $cmd
+ when "s-get", "s-head", "s-delete"
+ $banner="#{$cmd} datasetURI graph"
+ when "s-put", "s-post"
+ $banner="#{$cmd} datasetURI graph file"
+ end
+ cmd2 = $cmd.sub(/^s-/, '').upcase
+ cmd_soh cmd2
+
+when "s-query", "sparql-query"
+ cmd_sparql_query
+when "s-update", "sparql-update"
+ cmd_sparql_update true
+when "s-update-form", "sparql-update-form"
+ cmd_sparql_update false
+else
+ warn_exit "Unknown: "+$cmd, 1
+end
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/apache-jena-fuseki/bin/s-get
----------------------------------------------------------------------
diff --git a/jena-fuseki2/apache-jena-fuseki/bin/s-get b/jena-fuseki2/apache-jena-fuseki/bin/s-get
new file mode 100755
index 0000000..0e3a807
--- /dev/null
+++ b/jena-fuseki2/apache-jena-fuseki/bin/s-get
@@ -0,0 +1,707 @@
+#!/usr/bin/env ruby
+# -*- coding: utf-8 -*-
+
+# 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.
+
+# SPARQL HTTP Update, client.
+
+require 'optparse'
+require 'net/http'
+require 'uri'
+require 'cgi'
+require 'pp'
+require 'ostruct'
+
+# ToDo
+# Allow a choice of media type for GET
+# --accept "content-type" (and abbreviations)
+# --header "Add:this"
+# --user, --password
+# Basic authentication: request.basic_auth("username", "password")
+# Follow redirects => 301: puts response["location"] # All headers are lowercase?
+
+SOH_NAME="SOH"
+SOH_VERSION="0.0.0"
+
+$proxy = ENV['http_proxy'] ? URI.parse(ENV['http_proxy']) : OpenStruct.new
+
+# What about direct naming?
+
+# Names
+$mtTurtle = 'text/turtle;charset=utf-8'
+$mtRDF = 'application/rdf+xml'
+$mtText = 'text/plain'
+$mtNQuads = 'text/n-quads'
+$mtTriG = 'application/trig'
+$mtSparqlResultsX = 'application/sparql-results+xml'
+$mtSparqlResultsJ = 'application/sparql-results+json'
+$mtAppJSON = 'application/json'
+$mtAppXML = 'application/xml'
+$mtSparqlResultsTSV = 'application/sparql-results+tsv'
+$mtSparqlResultsCSV = 'application/sparql-results+csv'
+$mtSparqlUpdate = 'application/sparql-update'
+$mtWWWForm = 'application/x-www-form-urlencoded'
+$mtSparqlQuery = "application/sparql-query" ;
+
+# Global media type table.
+$fileMediaTypes = {}
+$fileMediaTypes['ttl'] = $mtTurtle
+$fileMediaTypes['n3'] = 'text/n3; charset=utf-8'
+$fileMediaTypes['nt'] = $mtText
+$fileMediaTypes['rdf'] = $mtRDF
+$fileMediaTypes['owl'] = $mtRDF
+$fileMediaTypes['nq'] = $mtNQuads
+$fileMediaTypes['trig'] = $mtTriG
+
+# Global charset : no entry means "don't set"
+$charsetUTF8 = 'utf-8'
+$charset = {}
+$charset[$mtTurtle] = 'utf-8'
+$charset[$mtText] = 'ascii'
+$charset[$mtTriG] = 'utf-8'
+$charset[$mtNQuads] = 'ascii'
+
+# Headers
+
+$hContentType = 'Content-Type'
+# $hContentEncoding = 'Content-Encoding'
+$hContentLength = 'Content-Length'
+# $hContentLocation = 'Content-Location'
+# $hContentRange = 'Content-Range'
+
+$hAccept = 'Accept'
+$hAcceptCharset = 'Accept-Charset'
+$hAcceptEncoding = 'Accept-Encoding'
+$hAcceptRanges = 'Accept-Ranges'
+
+$headers = { "User-Agent" => "#{SOH_NAME}/Fuseki #{SOH_VERSION}"}
+$print_http = false
+
+# Default for GET
+# At least allow anythign (and hope!)
+$accept_rdf="#{$mtRDF};q=0.9 , #{$mtTurtle}"
+# For SPARQL query
+$accept_results="#{$mtSparqlResultsJ} , #{$mtSparqlResultsX};q=0.9 , #{$accept_rdf}"
+
+# Accept any in case of trouble.
+$accept_rdf="#{$accept_rdf} , */*;q=0.1"
+$accept_results="#{$accept_results} , */*;q=0.1"
+
+# The media type usually forces the charset.
+$accept_charset=nil
+
+## Who we are.
+## Two styles:
+## s-query .....
+## soh query .....
+
+$cmd = File.basename($0)
+if $cmd == 'soh'
+then
+ $cmd = (ARGV.size == 0) ? 'soh' : ARGV.shift
+end
+
+if ! $cmd.start_with?('s-') && $cmd != 'soh'
+ $cmd = 's-'+$cmd
+end
+
+## --------
+
+def GET(dataset, graph)
+ print "GET #{dataset} #{graph}\n" if $verbose
+ requestURI = target(dataset, graph)
+ headers = {}
+ headers.merge!($headers)
+ headers[$hAccept] = $accept_rdf
+ headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
+ get_worker(requestURI, headers)
+end
+
+def get_worker(requestURI, headers)
+ uri = URI.parse(requestURI)
+ request = Net::HTTP::Get.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ response_print_body(uri, request)
+end
+
+def HEAD(dataset, graph)
+ print "HEAD #{dataset} #{graph}\n" if $verbose
+ requestURI = target(dataset, graph)
+ headers = {}
+ headers.merge!($headers)
+ headers[$hAccept] = $accept_rdf
+ headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
+ uri = URI.parse(requestURI)
+ request = Net::HTTP::Head.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def PUT(dataset, graph, file)
+ print "PUT #{dataset} #{graph} #{file}\n" if $verbose
+ send_body(dataset, graph, file, Net::HTTP::Put)
+end
+
+def POST(dataset, graph, file)
+ print "POST #{dataset} #{graph} #{file}\n" if $verbose
+ send_body(dataset, graph, file, Net::HTTP::Post)
+end
+
+def DELETE(dataset, graph)
+ print "DELETE #{dataset} #{graph}\n" if $verbose
+ requestURI = target(dataset, graph)
+ uri = URI.parse(requestURI)
+ request = Net::HTTP::Delete.new(uri.request_uri)
+ headers = {}
+ headers.merge!($headers)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def uri_escape(string)
+ CGI.escape(string)
+end
+
+def target(dataset, graph)
+ return dataset+"?default" if graph == "default"
+ return dataset+"?graph="+uri_escape(graph)
+end
+
+def send_body(dataset, graph, file, method)
+ mt = content_type(file)
+ headers = {}
+ headers.merge!($headers)
+ headers[$hContentType] = mt
+ headers[$hContentLength] = File.size(file).to_s
+ ## p headers
+
+ requestURI = target(dataset, graph)
+ uri = URI.parse(requestURI)
+
+ request = method.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ request.body_stream = File.open(file)
+ response_no_body(uri, request)
+end
+
+def response_no_body(uri, request)
+ http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
+ http.read_timeout = nil
+ # check we can connect.
+ begin http.start
+ rescue Exception => e
+ # puts e.message
+ #puts e.backtrace.inspect
+ warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
+ end
+ response = http.request(request)
+ print_http_response(response)
+ case response
+ when Net::HTTPSuccess, Net::HTTPRedirection
+ # OK
+ when Net::HTTPNotFound
+ warn_exit "404 Not found: #{uri}", 9
+ #print response.body
+ else
+ warn_exit "#{response.code} #{response.message} #{uri}", 9
+ # Unreachable
+ response.error!
+ end
+ # NO BODY IN RESPONSE
+end
+
+def response_print_body(uri, request)
+ http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
+ http.read_timeout = nil
+ # check we can connect.
+ begin http.start
+ rescue => e
+ #puts e.backtrace.inspect
+ #print e.class
+ warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
+ end
+
+ # Add a blank line if headers were output.
+ print "\n" if $http_print ;
+
+ begin
+ response = http.request(request) { |res|
+ print_http_response(res)
+ #puts res.code
+ res.read_body do |segment|
+ print segment
+ end
+ }
+ case response
+ when Net::HTTPSuccess, Net::HTTPRedirection
+ # OK
+ when Net::HTTPNotFound
+ warn_exit "404 Not found: #{uri}", 9
+ #print response.body
+ else
+ warn_exit "#{response.code}: #{uri}", 9
+ # Unreachable
+ response.error!
+ end
+ rescue EOFError => e
+ warn_exit "IO Error: "+e.message, 3
+ end
+end
+
+def print_http_request(uri, request)
+ return unless $print_http
+ #print "Request\n"
+ print request.method," ",uri, "\n"
+ print_headers(" ",request)
+end
+
+def print_http_response(response)
+ return unless $print_http
+ #print "Response\n"
+ print response.code, " ", response.message, "\n"
+ print_headers(" ",response)
+end
+
+def print_headers(marker, headers)
+ headers.each do |k,v|
+ k = k.split('-').map{|w| w.capitalize}.join('-')+':'
+ printf "%s%-20s %s\n",marker,k,v
+ end
+end
+
+def content_type(file)
+ file =~ /\.([^.]*)$/
+ ext = $1
+ mt = $fileMediaTypes[ext]
+ cs = $charset[mt]
+ mt = mt+';charset='+cs if ! cs.nil?
+ return mt
+end
+
+def charset(content_type)
+ return $charset[content_type]
+end
+
+def warn_exit(msg, rc)
+ warn msg
+ exit rc ;
+end
+
+def parseURI(uri_string)
+ begin
+ return URI.parse(uri_string).to_s
+ rescue URI::InvalidURIError => err
+ warn_exit "Bad URI: <#{uri_string}>", 2
+ end
+end
+
+## ---- Command
+
+def cmd_soh(command=nil)
+ ## Command line
+ options = {}
+ optparse = OptionParser.new do |opts|
+ # Set a banner, displayed at the top
+ # of the help screen.
+ case $cmd
+ when "s-http", "sparql-http", "soh"
+ banner="$cmd [get|post|put|delete] datasetURI graph [file]"
+ when "s-get", "s-head", "s-delete"
+ banner="$cmd datasetURI graph"
+ end
+
+ opts.banner = $banner
+ # Define the options, and what they do
+
+ options[:verbose] = false
+ opts.on( '-v', '--verbose', 'Verbose' ) do
+ options[:verbose] = true
+ end
+
+ options[:version] = false
+ opts.on( '--version', 'Print version and exit' ) do
+ print "#{SOH_NAME} #{SOH_VERSION}\n"
+ exit
+ end
+
+ # This displays the help screen, all programs are
+ # assumed to have this option.
+ opts.on( '-h', '--help', 'Display this screen and exit' ) do
+ puts opts
+ exit
+ end
+ end
+
+ begin optparse.parse!
+ rescue OptionParser::InvalidArgument => e
+ warn e
+ exit
+ end
+
+ $verbose = options[:verbose]
+ $print_http = $verbose
+
+ if command.nil?
+ if ARGV.size == 0
+ warn "No command given: expected one of 'get', 'put', 'post', 'delete', 'query' or 'update'"
+ exit 1
+ end
+ cmdPrint=ARGV.shift
+ command=cmdPrint.upcase
+ else
+ cmdPrint=command
+ end
+
+ case command
+ when "HEAD", "GET", "DELETE"
+ requiredFile=false
+ when "PUT", "POST"
+ requiredFile=true
+ when "QUERY"
+ cmd_sparql_query
+ when "UPDATE"
+ cmd_sparql_update
+ else
+ warn_exit "Unknown command: #{command}", 2
+ end
+
+ if requiredFile
+ then
+ if ARGV.size != 3
+ warn_exit "Required: dataset URI, graph URI (or 'default') and file", 1
+ end
+ else
+ if ARGV.size != 2
+ warn_exit "Required: dataset URI and graph URI (or 'default')", 1
+ end
+ end
+
+ dataset=parseURI(ARGV.shift)
+ # Relative URI?
+ graph=parseURI(ARGV.shift)
+ file=""
+ if requiredFile
+ then
+ file = ARGV.shift if requiredFile
+ if ! File.exist?(file)
+ warn_exit "No such file: "+file, 3
+ end
+ if File.directory?(file)
+ warn_exit "File is a directory: "+file, 3
+ end
+ end
+
+ case command
+ when "GET"
+ GET(dataset, graph)
+ when "HEAD"
+ HEAD(dataset, graph)
+ when "PUT"
+ PUT(dataset, graph, file)
+ when "DELETE"
+ DELETE(dataset, graph)
+ when "POST"
+ POST(dataset, graph, file)
+ else
+ warn_exit "Internal error: Unknown command: #{cmd}", 2
+ end
+ exit 0
+end
+
+## --------
+def string_or_file(arg)
+ return arg if ! arg.match(/^@/)
+ a=(arg[1..-1])
+ open(a, 'rb'){|f| f.read}
+end
+
+## -------- SPARQL Query
+
+## Choose method
+def SPARQL_query(service, query, query_file, forcePOST=false, args2={})
+ if ! query_file.nil?
+ query = open(query_file, 'rb'){|f| f.read}
+ end
+ if forcePOST || query.length >= 2*1024
+ SPARQL_query_POST(service, query, args2)
+ else
+ SPARQL_query_GET(service, query, args2)
+ end
+end
+
+## By GET
+
+def SPARQL_query_GET(service, query, args2)
+ args = { "query" => query }
+ args.merge!(args2)
+ qs=args.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
+ action="#{service}?#{qs}"
+ headers={}
+ headers.merge!($headers)
+ headers[$hAccept]=$accept_results
+ get_worker(action, headers)
+end
+
+## By POST
+
+def SPARQL_query_POST(service, query, args2)
+ # DRY - body/no body for each of request and response.
+ post_params={ "query" => query }
+ post_params.merge!(args2)
+ uri = URI.parse(service)
+ headers={}
+ headers.merge!($headers)
+ headers[$hAccept]=$accept_results
+ execute_post_form_body(uri, headers, post_params)
+end
+
+def execute_post_form_body(uri, headers, post_params)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ qs=post_params.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
+ headers[$hContentType] = $mtWWWForm
+ headers[$hContentLength] = qs.length.to_s
+ request.initialize_http_header(headers)
+ request.body = qs
+ print_http_request(uri, request)
+ response_print_body(uri, request)
+end
+
+# Usage: -v --help --file= --query=
+def cmd_sparql_query
+ options={}
+ optparse = OptionParser.new do |opts|
+ opts.banner = "Usage: #{$cmd} [--query QUERY] [--service URI] [--post] 'query' | @file"
+ opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
+ options[:service]=uri
+ end
+ opts.on('--query=FILE','--file=FILE', 'Take query from a file') do |file|
+ options[:file]=file
+ end
+ opts.on('--output=TYPE', [:json,:xml,:text,:csv,:tsv],
+ 'Set the output argument') do |type|
+ options[:output]=type
+ end
+ opts.on('--accept=TYPE', [:json,:xml,:text,:csv,:tsv],
+ 'Set the accept header type') do |type|
+ options[:accept]=type
+ end
+ options[:verbose] = false
+ opts.on( '--post', 'Force use of POST' ) do
+ options[:post] = true
+ end
+ opts.on( '-v', '--verbose', 'Verbose' ) do
+ options[:verbose] = true
+ end
+ opts.on( '--version', 'Print version and exit' ) do
+ print "#{SOH_NAME} #{SOH_VERSION}\n"
+ exit
+ end
+ opts.on( '-h', '--help', 'Display this screen and exit' ) do
+ puts opts
+ exit
+ end
+ end
+
+ begin optparse.parse!
+ rescue OptionParser::InvalidArgument, OptionParser::InvalidOption => e
+ warn e
+ exit 1
+ end
+
+ $verbose = options[:verbose]
+ $print_http = $verbose
+ usePOST = options[:post]
+
+ service = options[:service]
+ warn_exit 'No service specified. Required --service=URI',1 if service.nil?
+
+ # Query
+ query=nil
+ query_file=options[:file]
+ if query_file.nil? && ARGV.size == 0
+ then
+ warn_exit 'No query specified.',1
+ end
+ if query_file.nil?
+ query = ARGV.shift
+ if query.match(/^@/)
+ query_file = query[1..-1]
+ query = nil
+ end
+ end
+
+ # --output ==> output= (non-standard)
+ args={}
+ case options[:output]
+ when nil
+ when "json","xml","text","csv","tsv"
+ args['output'] = options[:output]
+ when :json,:xml,:text,:csv,:tsv
+ args['output'] = options[:output].to_s
+ else
+ warn_exit "Unrecognized output type: "+options[:output],2
+ end
+
+ # --accept
+ # options[:accept]
+
+ print "SPARQL #{service}\n" if $verbose
+ #args={"output"=>"text"}
+ SPARQL_query(service, query, query_file, usePOST, args)
+ exit(0)
+end
+
+## -------- SPARQL Update
+
+# Update sent as a WWW form.
+def SPARQL_update_by_form(service, update, args2={})
+ args = {}
+ args.merge!(args2)
+ headers={}
+ headers.merge!($headers)
+ # args? encode?
+ body="update="+uri_escape(update)
+ headers[$hContentType] = $mtWWWForm
+ headers[$hContentLength] = body.length.to_s
+ uri = URI.parse(service)
+ execute_post_form(uri, headers, body)
+end
+
+# DRY - query form.
+def execute_post_form(uri, headers, body)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ request.body = body
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def SPARQL_update(service, update, args2={})
+ args = {}
+ args.merge!(args2)
+ headers={}
+ headers.merge!($headers)
+ headers[$hContentType] = $mtSparqlUpdate
+ uri = URI.parse(service)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ request.body = update
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def cmd_sparql_update(by_raw_post=true)
+ # Share with cmd_sparql_query
+ options={}
+ optparse = OptionParser.new do |opts|
+ opts.banner = "Usage: #{$cmd} [--file REQUEST] [--service URI] 'request' | @file"
+ opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
+ options[:service]=uri
+ end
+ opts.on('--update=FILE', '--file=FILE', 'Take update from a file') do |file|
+ options[:file]=file
+ end
+ options[:verbose] = false
+ opts.on( '-v', '--verbose', 'Verbose' ) do
+ options[:verbose] = true
+ end
+ opts.on( '--version', 'Print version and exit' ) do
+ print "#{SOH_NAME} #{SOH_VERSION}\n"
+ exit
+ end
+ opts.on( '-h', '--help', 'Display this screen and exit' ) do
+ puts opts
+ exit
+ end
+ end
+
+ begin optparse.parse!
+ rescue OptionParser::InvalidArgument => e
+ warn e
+ exit
+ end
+
+ $verbose = options[:verbose]
+ $print_http = $verbose
+
+ service = options[:service]
+ warn_exit 'No service specified. Required --service=URI',1 if service.nil?
+
+ update=nil
+ update_file=options[:file]
+
+ if update_file.nil? && ARGV.size == 0
+ then
+ warn_exit 'No update specified.',1
+ end
+ if update_file.nil?
+ update = ARGV.shift
+ if update.match(/^@/)
+ update_file = update[1..-1]
+ update = nil
+ end
+ end
+
+ print "SPARQL-Update #{service}\n" if $verbose
+ args={}
+
+ # Reads in the file :-(
+ if update.nil?
+ then
+ update = open(update_file, 'rb'){|f| f.read}
+ else
+ update = string_or_file(update)
+ end
+
+ if by_raw_post
+ SPARQL_update(service, update, args)
+ else
+ SPARQL_update_by_form(service, update, args)
+ end
+ exit(0)
+end
+
+## -------
+
+case $cmd
+when "s-http", "sparql-http", "soh"
+ $banner="#{$cmd} [get|post|put|delete] datasetURI graph [file]"
+ cmd_soh
+when "s-get", "s-head", "s-put", "s-delete", "s-post"
+
+ case $cmd
+ when "s-get", "s-head", "s-delete"
+ $banner="#{$cmd} datasetURI graph"
+ when "s-put", "s-post"
+ $banner="#{$cmd} datasetURI graph file"
+ end
+ cmd2 = $cmd.sub(/^s-/, '').upcase
+ cmd_soh cmd2
+
+when "s-query", "sparql-query"
+ cmd_sparql_query
+when "s-update", "sparql-update"
+ cmd_sparql_update true
+when "s-update-form", "sparql-update-form"
+ cmd_sparql_update false
+else
+ warn_exit "Unknown: "+$cmd, 1
+end
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/apache-jena-fuseki/bin/s-head
----------------------------------------------------------------------
diff --git a/jena-fuseki2/apache-jena-fuseki/bin/s-head b/jena-fuseki2/apache-jena-fuseki/bin/s-head
new file mode 100755
index 0000000..0e3a807
--- /dev/null
+++ b/jena-fuseki2/apache-jena-fuseki/bin/s-head
@@ -0,0 +1,707 @@
+#!/usr/bin/env ruby
+# -*- coding: utf-8 -*-
+
+# 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.
+
+# SPARQL HTTP Update, client.
+
+require 'optparse'
+require 'net/http'
+require 'uri'
+require 'cgi'
+require 'pp'
+require 'ostruct'
+
+# ToDo
+# Allow a choice of media type for GET
+# --accept "content-type" (and abbreviations)
+# --header "Add:this"
+# --user, --password
+# Basic authentication: request.basic_auth("username", "password")
+# Follow redirects => 301: puts response["location"] # All headers are lowercase?
+
+SOH_NAME="SOH"
+SOH_VERSION="0.0.0"
+
+$proxy = ENV['http_proxy'] ? URI.parse(ENV['http_proxy']) : OpenStruct.new
+
+# What about direct naming?
+
+# Names
+$mtTurtle = 'text/turtle;charset=utf-8'
+$mtRDF = 'application/rdf+xml'
+$mtText = 'text/plain'
+$mtNQuads = 'text/n-quads'
+$mtTriG = 'application/trig'
+$mtSparqlResultsX = 'application/sparql-results+xml'
+$mtSparqlResultsJ = 'application/sparql-results+json'
+$mtAppJSON = 'application/json'
+$mtAppXML = 'application/xml'
+$mtSparqlResultsTSV = 'application/sparql-results+tsv'
+$mtSparqlResultsCSV = 'application/sparql-results+csv'
+$mtSparqlUpdate = 'application/sparql-update'
+$mtWWWForm = 'application/x-www-form-urlencoded'
+$mtSparqlQuery = "application/sparql-query" ;
+
+# Global media type table.
+$fileMediaTypes = {}
+$fileMediaTypes['ttl'] = $mtTurtle
+$fileMediaTypes['n3'] = 'text/n3; charset=utf-8'
+$fileMediaTypes['nt'] = $mtText
+$fileMediaTypes['rdf'] = $mtRDF
+$fileMediaTypes['owl'] = $mtRDF
+$fileMediaTypes['nq'] = $mtNQuads
+$fileMediaTypes['trig'] = $mtTriG
+
+# Global charset : no entry means "don't set"
+$charsetUTF8 = 'utf-8'
+$charset = {}
+$charset[$mtTurtle] = 'utf-8'
+$charset[$mtText] = 'ascii'
+$charset[$mtTriG] = 'utf-8'
+$charset[$mtNQuads] = 'ascii'
+
+# Headers
+
+$hContentType = 'Content-Type'
+# $hContentEncoding = 'Content-Encoding'
+$hContentLength = 'Content-Length'
+# $hContentLocation = 'Content-Location'
+# $hContentRange = 'Content-Range'
+
+$hAccept = 'Accept'
+$hAcceptCharset = 'Accept-Charset'
+$hAcceptEncoding = 'Accept-Encoding'
+$hAcceptRanges = 'Accept-Ranges'
+
+$headers = { "User-Agent" => "#{SOH_NAME}/Fuseki #{SOH_VERSION}"}
+$print_http = false
+
+# Default for GET
+# At least allow anythign (and hope!)
+$accept_rdf="#{$mtRDF};q=0.9 , #{$mtTurtle}"
+# For SPARQL query
+$accept_results="#{$mtSparqlResultsJ} , #{$mtSparqlResultsX};q=0.9 , #{$accept_rdf}"
+
+# Accept any in case of trouble.
+$accept_rdf="#{$accept_rdf} , */*;q=0.1"
+$accept_results="#{$accept_results} , */*;q=0.1"
+
+# The media type usually forces the charset.
+$accept_charset=nil
+
+## Who we are.
+## Two styles:
+## s-query .....
+## soh query .....
+
+$cmd = File.basename($0)
+if $cmd == 'soh'
+then
+ $cmd = (ARGV.size == 0) ? 'soh' : ARGV.shift
+end
+
+if ! $cmd.start_with?('s-') && $cmd != 'soh'
+ $cmd = 's-'+$cmd
+end
+
+## --------
+
+def GET(dataset, graph)
+ print "GET #{dataset} #{graph}\n" if $verbose
+ requestURI = target(dataset, graph)
+ headers = {}
+ headers.merge!($headers)
+ headers[$hAccept] = $accept_rdf
+ headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
+ get_worker(requestURI, headers)
+end
+
+def get_worker(requestURI, headers)
+ uri = URI.parse(requestURI)
+ request = Net::HTTP::Get.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ response_print_body(uri, request)
+end
+
+def HEAD(dataset, graph)
+ print "HEAD #{dataset} #{graph}\n" if $verbose
+ requestURI = target(dataset, graph)
+ headers = {}
+ headers.merge!($headers)
+ headers[$hAccept] = $accept_rdf
+ headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
+ uri = URI.parse(requestURI)
+ request = Net::HTTP::Head.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def PUT(dataset, graph, file)
+ print "PUT #{dataset} #{graph} #{file}\n" if $verbose
+ send_body(dataset, graph, file, Net::HTTP::Put)
+end
+
+def POST(dataset, graph, file)
+ print "POST #{dataset} #{graph} #{file}\n" if $verbose
+ send_body(dataset, graph, file, Net::HTTP::Post)
+end
+
+def DELETE(dataset, graph)
+ print "DELETE #{dataset} #{graph}\n" if $verbose
+ requestURI = target(dataset, graph)
+ uri = URI.parse(requestURI)
+ request = Net::HTTP::Delete.new(uri.request_uri)
+ headers = {}
+ headers.merge!($headers)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def uri_escape(string)
+ CGI.escape(string)
+end
+
+def target(dataset, graph)
+ return dataset+"?default" if graph == "default"
+ return dataset+"?graph="+uri_escape(graph)
+end
+
+def send_body(dataset, graph, file, method)
+ mt = content_type(file)
+ headers = {}
+ headers.merge!($headers)
+ headers[$hContentType] = mt
+ headers[$hContentLength] = File.size(file).to_s
+ ## p headers
+
+ requestURI = target(dataset, graph)
+ uri = URI.parse(requestURI)
+
+ request = method.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ request.body_stream = File.open(file)
+ response_no_body(uri, request)
+end
+
+def response_no_body(uri, request)
+ http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
+ http.read_timeout = nil
+ # check we can connect.
+ begin http.start
+ rescue Exception => e
+ # puts e.message
+ #puts e.backtrace.inspect
+ warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
+ end
+ response = http.request(request)
+ print_http_response(response)
+ case response
+ when Net::HTTPSuccess, Net::HTTPRedirection
+ # OK
+ when Net::HTTPNotFound
+ warn_exit "404 Not found: #{uri}", 9
+ #print response.body
+ else
+ warn_exit "#{response.code} #{response.message} #{uri}", 9
+ # Unreachable
+ response.error!
+ end
+ # NO BODY IN RESPONSE
+end
+
+def response_print_body(uri, request)
+ http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
+ http.read_timeout = nil
+ # check we can connect.
+ begin http.start
+ rescue => e
+ #puts e.backtrace.inspect
+ #print e.class
+ warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
+ end
+
+ # Add a blank line if headers were output.
+ print "\n" if $http_print ;
+
+ begin
+ response = http.request(request) { |res|
+ print_http_response(res)
+ #puts res.code
+ res.read_body do |segment|
+ print segment
+ end
+ }
+ case response
+ when Net::HTTPSuccess, Net::HTTPRedirection
+ # OK
+ when Net::HTTPNotFound
+ warn_exit "404 Not found: #{uri}", 9
+ #print response.body
+ else
+ warn_exit "#{response.code}: #{uri}", 9
+ # Unreachable
+ response.error!
+ end
+ rescue EOFError => e
+ warn_exit "IO Error: "+e.message, 3
+ end
+end
+
+def print_http_request(uri, request)
+ return unless $print_http
+ #print "Request\n"
+ print request.method," ",uri, "\n"
+ print_headers(" ",request)
+end
+
+def print_http_response(response)
+ return unless $print_http
+ #print "Response\n"
+ print response.code, " ", response.message, "\n"
+ print_headers(" ",response)
+end
+
+def print_headers(marker, headers)
+ headers.each do |k,v|
+ k = k.split('-').map{|w| w.capitalize}.join('-')+':'
+ printf "%s%-20s %s\n",marker,k,v
+ end
+end
+
+def content_type(file)
+ file =~ /\.([^.]*)$/
+ ext = $1
+ mt = $fileMediaTypes[ext]
+ cs = $charset[mt]
+ mt = mt+';charset='+cs if ! cs.nil?
+ return mt
+end
+
+def charset(content_type)
+ return $charset[content_type]
+end
+
+def warn_exit(msg, rc)
+ warn msg
+ exit rc ;
+end
+
+def parseURI(uri_string)
+ begin
+ return URI.parse(uri_string).to_s
+ rescue URI::InvalidURIError => err
+ warn_exit "Bad URI: <#{uri_string}>", 2
+ end
+end
+
+## ---- Command
+
+def cmd_soh(command=nil)
+ ## Command line
+ options = {}
+ optparse = OptionParser.new do |opts|
+ # Set a banner, displayed at the top
+ # of the help screen.
+ case $cmd
+ when "s-http", "sparql-http", "soh"
+ banner="$cmd [get|post|put|delete] datasetURI graph [file]"
+ when "s-get", "s-head", "s-delete"
+ banner="$cmd datasetURI graph"
+ end
+
+ opts.banner = $banner
+ # Define the options, and what they do
+
+ options[:verbose] = false
+ opts.on( '-v', '--verbose', 'Verbose' ) do
+ options[:verbose] = true
+ end
+
+ options[:version] = false
+ opts.on( '--version', 'Print version and exit' ) do
+ print "#{SOH_NAME} #{SOH_VERSION}\n"
+ exit
+ end
+
+ # This displays the help screen, all programs are
+ # assumed to have this option.
+ opts.on( '-h', '--help', 'Display this screen and exit' ) do
+ puts opts
+ exit
+ end
+ end
+
+ begin optparse.parse!
+ rescue OptionParser::InvalidArgument => e
+ warn e
+ exit
+ end
+
+ $verbose = options[:verbose]
+ $print_http = $verbose
+
+ if command.nil?
+ if ARGV.size == 0
+ warn "No command given: expected one of 'get', 'put', 'post', 'delete', 'query' or 'update'"
+ exit 1
+ end
+ cmdPrint=ARGV.shift
+ command=cmdPrint.upcase
+ else
+ cmdPrint=command
+ end
+
+ case command
+ when "HEAD", "GET", "DELETE"
+ requiredFile=false
+ when "PUT", "POST"
+ requiredFile=true
+ when "QUERY"
+ cmd_sparql_query
+ when "UPDATE"
+ cmd_sparql_update
+ else
+ warn_exit "Unknown command: #{command}", 2
+ end
+
+ if requiredFile
+ then
+ if ARGV.size != 3
+ warn_exit "Required: dataset URI, graph URI (or 'default') and file", 1
+ end
+ else
+ if ARGV.size != 2
+ warn_exit "Required: dataset URI and graph URI (or 'default')", 1
+ end
+ end
+
+ dataset=parseURI(ARGV.shift)
+ # Relative URI?
+ graph=parseURI(ARGV.shift)
+ file=""
+ if requiredFile
+ then
+ file = ARGV.shift if requiredFile
+ if ! File.exist?(file)
+ warn_exit "No such file: "+file, 3
+ end
+ if File.directory?(file)
+ warn_exit "File is a directory: "+file, 3
+ end
+ end
+
+ case command
+ when "GET"
+ GET(dataset, graph)
+ when "HEAD"
+ HEAD(dataset, graph)
+ when "PUT"
+ PUT(dataset, graph, file)
+ when "DELETE"
+ DELETE(dataset, graph)
+ when "POST"
+ POST(dataset, graph, file)
+ else
+ warn_exit "Internal error: Unknown command: #{cmd}", 2
+ end
+ exit 0
+end
+
+## --------
+def string_or_file(arg)
+ return arg if ! arg.match(/^@/)
+ a=(arg[1..-1])
+ open(a, 'rb'){|f| f.read}
+end
+
+## -------- SPARQL Query
+
+## Choose method
+def SPARQL_query(service, query, query_file, forcePOST=false, args2={})
+ if ! query_file.nil?
+ query = open(query_file, 'rb'){|f| f.read}
+ end
+ if forcePOST || query.length >= 2*1024
+ SPARQL_query_POST(service, query, args2)
+ else
+ SPARQL_query_GET(service, query, args2)
+ end
+end
+
+## By GET
+
+def SPARQL_query_GET(service, query, args2)
+ args = { "query" => query }
+ args.merge!(args2)
+ qs=args.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
+ action="#{service}?#{qs}"
+ headers={}
+ headers.merge!($headers)
+ headers[$hAccept]=$accept_results
+ get_worker(action, headers)
+end
+
+## By POST
+
+def SPARQL_query_POST(service, query, args2)
+ # DRY - body/no body for each of request and response.
+ post_params={ "query" => query }
+ post_params.merge!(args2)
+ uri = URI.parse(service)
+ headers={}
+ headers.merge!($headers)
+ headers[$hAccept]=$accept_results
+ execute_post_form_body(uri, headers, post_params)
+end
+
+def execute_post_form_body(uri, headers, post_params)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ qs=post_params.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
+ headers[$hContentType] = $mtWWWForm
+ headers[$hContentLength] = qs.length.to_s
+ request.initialize_http_header(headers)
+ request.body = qs
+ print_http_request(uri, request)
+ response_print_body(uri, request)
+end
+
+# Usage: -v --help --file= --query=
+def cmd_sparql_query
+ options={}
+ optparse = OptionParser.new do |opts|
+ opts.banner = "Usage: #{$cmd} [--query QUERY] [--service URI] [--post] 'query' | @file"
+ opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
+ options[:service]=uri
+ end
+ opts.on('--query=FILE','--file=FILE', 'Take query from a file') do |file|
+ options[:file]=file
+ end
+ opts.on('--output=TYPE', [:json,:xml,:text,:csv,:tsv],
+ 'Set the output argument') do |type|
+ options[:output]=type
+ end
+ opts.on('--accept=TYPE', [:json,:xml,:text,:csv,:tsv],
+ 'Set the accept header type') do |type|
+ options[:accept]=type
+ end
+ options[:verbose] = false
+ opts.on( '--post', 'Force use of POST' ) do
+ options[:post] = true
+ end
+ opts.on( '-v', '--verbose', 'Verbose' ) do
+ options[:verbose] = true
+ end
+ opts.on( '--version', 'Print version and exit' ) do
+ print "#{SOH_NAME} #{SOH_VERSION}\n"
+ exit
+ end
+ opts.on( '-h', '--help', 'Display this screen and exit' ) do
+ puts opts
+ exit
+ end
+ end
+
+ begin optparse.parse!
+ rescue OptionParser::InvalidArgument, OptionParser::InvalidOption => e
+ warn e
+ exit 1
+ end
+
+ $verbose = options[:verbose]
+ $print_http = $verbose
+ usePOST = options[:post]
+
+ service = options[:service]
+ warn_exit 'No service specified. Required --service=URI',1 if service.nil?
+
+ # Query
+ query=nil
+ query_file=options[:file]
+ if query_file.nil? && ARGV.size == 0
+ then
+ warn_exit 'No query specified.',1
+ end
+ if query_file.nil?
+ query = ARGV.shift
+ if query.match(/^@/)
+ query_file = query[1..-1]
+ query = nil
+ end
+ end
+
+ # --output ==> output= (non-standard)
+ args={}
+ case options[:output]
+ when nil
+ when "json","xml","text","csv","tsv"
+ args['output'] = options[:output]
+ when :json,:xml,:text,:csv,:tsv
+ args['output'] = options[:output].to_s
+ else
+ warn_exit "Unrecognized output type: "+options[:output],2
+ end
+
+ # --accept
+ # options[:accept]
+
+ print "SPARQL #{service}\n" if $verbose
+ #args={"output"=>"text"}
+ SPARQL_query(service, query, query_file, usePOST, args)
+ exit(0)
+end
+
+## -------- SPARQL Update
+
+# Update sent as a WWW form.
+def SPARQL_update_by_form(service, update, args2={})
+ args = {}
+ args.merge!(args2)
+ headers={}
+ headers.merge!($headers)
+ # args? encode?
+ body="update="+uri_escape(update)
+ headers[$hContentType] = $mtWWWForm
+ headers[$hContentLength] = body.length.to_s
+ uri = URI.parse(service)
+ execute_post_form(uri, headers, body)
+end
+
+# DRY - query form.
+def execute_post_form(uri, headers, body)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ request.body = body
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def SPARQL_update(service, update, args2={})
+ args = {}
+ args.merge!(args2)
+ headers={}
+ headers.merge!($headers)
+ headers[$hContentType] = $mtSparqlUpdate
+ uri = URI.parse(service)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ request.body = update
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def cmd_sparql_update(by_raw_post=true)
+ # Share with cmd_sparql_query
+ options={}
+ optparse = OptionParser.new do |opts|
+ opts.banner = "Usage: #{$cmd} [--file REQUEST] [--service URI] 'request' | @file"
+ opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
+ options[:service]=uri
+ end
+ opts.on('--update=FILE', '--file=FILE', 'Take update from a file') do |file|
+ options[:file]=file
+ end
+ options[:verbose] = false
+ opts.on( '-v', '--verbose', 'Verbose' ) do
+ options[:verbose] = true
+ end
+ opts.on( '--version', 'Print version and exit' ) do
+ print "#{SOH_NAME} #{SOH_VERSION}\n"
+ exit
+ end
+ opts.on( '-h', '--help', 'Display this screen and exit' ) do
+ puts opts
+ exit
+ end
+ end
+
+ begin optparse.parse!
+ rescue OptionParser::InvalidArgument => e
+ warn e
+ exit
+ end
+
+ $verbose = options[:verbose]
+ $print_http = $verbose
+
+ service = options[:service]
+ warn_exit 'No service specified. Required --service=URI',1 if service.nil?
+
+ update=nil
+ update_file=options[:file]
+
+ if update_file.nil? && ARGV.size == 0
+ then
+ warn_exit 'No update specified.',1
+ end
+ if update_file.nil?
+ update = ARGV.shift
+ if update.match(/^@/)
+ update_file = update[1..-1]
+ update = nil
+ end
+ end
+
+ print "SPARQL-Update #{service}\n" if $verbose
+ args={}
+
+ # Reads in the file :-(
+ if update.nil?
+ then
+ update = open(update_file, 'rb'){|f| f.read}
+ else
+ update = string_or_file(update)
+ end
+
+ if by_raw_post
+ SPARQL_update(service, update, args)
+ else
+ SPARQL_update_by_form(service, update, args)
+ end
+ exit(0)
+end
+
+## -------
+
+case $cmd
+when "s-http", "sparql-http", "soh"
+ $banner="#{$cmd} [get|post|put|delete] datasetURI graph [file]"
+ cmd_soh
+when "s-get", "s-head", "s-put", "s-delete", "s-post"
+
+ case $cmd
+ when "s-get", "s-head", "s-delete"
+ $banner="#{$cmd} datasetURI graph"
+ when "s-put", "s-post"
+ $banner="#{$cmd} datasetURI graph file"
+ end
+ cmd2 = $cmd.sub(/^s-/, '').upcase
+ cmd_soh cmd2
+
+when "s-query", "sparql-query"
+ cmd_sparql_query
+when "s-update", "sparql-update"
+ cmd_sparql_update true
+when "s-update-form", "sparql-update-form"
+ cmd_sparql_update false
+else
+ warn_exit "Unknown: "+$cmd, 1
+end
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/apache-jena-fuseki/bin/s-post
----------------------------------------------------------------------
diff --git a/jena-fuseki2/apache-jena-fuseki/bin/s-post b/jena-fuseki2/apache-jena-fuseki/bin/s-post
new file mode 100755
index 0000000..0e3a807
--- /dev/null
+++ b/jena-fuseki2/apache-jena-fuseki/bin/s-post
@@ -0,0 +1,707 @@
+#!/usr/bin/env ruby
+# -*- coding: utf-8 -*-
+
+# 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.
+
+# SPARQL HTTP Update, client.
+
+require 'optparse'
+require 'net/http'
+require 'uri'
+require 'cgi'
+require 'pp'
+require 'ostruct'
+
+# ToDo
+# Allow a choice of media type for GET
+# --accept "content-type" (and abbreviations)
+# --header "Add:this"
+# --user, --password
+# Basic authentication: request.basic_auth("username", "password")
+# Follow redirects => 301: puts response["location"] # All headers are lowercase?
+
+SOH_NAME="SOH"
+SOH_VERSION="0.0.0"
+
+$proxy = ENV['http_proxy'] ? URI.parse(ENV['http_proxy']) : OpenStruct.new
+
+# What about direct naming?
+
+# Names
+$mtTurtle = 'text/turtle;charset=utf-8'
+$mtRDF = 'application/rdf+xml'
+$mtText = 'text/plain'
+$mtNQuads = 'text/n-quads'
+$mtTriG = 'application/trig'
+$mtSparqlResultsX = 'application/sparql-results+xml'
+$mtSparqlResultsJ = 'application/sparql-results+json'
+$mtAppJSON = 'application/json'
+$mtAppXML = 'application/xml'
+$mtSparqlResultsTSV = 'application/sparql-results+tsv'
+$mtSparqlResultsCSV = 'application/sparql-results+csv'
+$mtSparqlUpdate = 'application/sparql-update'
+$mtWWWForm = 'application/x-www-form-urlencoded'
+$mtSparqlQuery = "application/sparql-query" ;
+
+# Global media type table.
+$fileMediaTypes = {}
+$fileMediaTypes['ttl'] = $mtTurtle
+$fileMediaTypes['n3'] = 'text/n3; charset=utf-8'
+$fileMediaTypes['nt'] = $mtText
+$fileMediaTypes['rdf'] = $mtRDF
+$fileMediaTypes['owl'] = $mtRDF
+$fileMediaTypes['nq'] = $mtNQuads
+$fileMediaTypes['trig'] = $mtTriG
+
+# Global charset : no entry means "don't set"
+$charsetUTF8 = 'utf-8'
+$charset = {}
+$charset[$mtTurtle] = 'utf-8'
+$charset[$mtText] = 'ascii'
+$charset[$mtTriG] = 'utf-8'
+$charset[$mtNQuads] = 'ascii'
+
+# Headers
+
+$hContentType = 'Content-Type'
+# $hContentEncoding = 'Content-Encoding'
+$hContentLength = 'Content-Length'
+# $hContentLocation = 'Content-Location'
+# $hContentRange = 'Content-Range'
+
+$hAccept = 'Accept'
+$hAcceptCharset = 'Accept-Charset'
+$hAcceptEncoding = 'Accept-Encoding'
+$hAcceptRanges = 'Accept-Ranges'
+
+$headers = { "User-Agent" => "#{SOH_NAME}/Fuseki #{SOH_VERSION}"}
+$print_http = false
+
+# Default for GET
+# At least allow anythign (and hope!)
+$accept_rdf="#{$mtRDF};q=0.9 , #{$mtTurtle}"
+# For SPARQL query
+$accept_results="#{$mtSparqlResultsJ} , #{$mtSparqlResultsX};q=0.9 , #{$accept_rdf}"
+
+# Accept any in case of trouble.
+$accept_rdf="#{$accept_rdf} , */*;q=0.1"
+$accept_results="#{$accept_results} , */*;q=0.1"
+
+# The media type usually forces the charset.
+$accept_charset=nil
+
+## Who we are.
+## Two styles:
+## s-query .....
+## soh query .....
+
+$cmd = File.basename($0)
+if $cmd == 'soh'
+then
+ $cmd = (ARGV.size == 0) ? 'soh' : ARGV.shift
+end
+
+if ! $cmd.start_with?('s-') && $cmd != 'soh'
+ $cmd = 's-'+$cmd
+end
+
+## --------
+
+def GET(dataset, graph)
+ print "GET #{dataset} #{graph}\n" if $verbose
+ requestURI = target(dataset, graph)
+ headers = {}
+ headers.merge!($headers)
+ headers[$hAccept] = $accept_rdf
+ headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
+ get_worker(requestURI, headers)
+end
+
+def get_worker(requestURI, headers)
+ uri = URI.parse(requestURI)
+ request = Net::HTTP::Get.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ response_print_body(uri, request)
+end
+
+def HEAD(dataset, graph)
+ print "HEAD #{dataset} #{graph}\n" if $verbose
+ requestURI = target(dataset, graph)
+ headers = {}
+ headers.merge!($headers)
+ headers[$hAccept] = $accept_rdf
+ headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
+ uri = URI.parse(requestURI)
+ request = Net::HTTP::Head.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def PUT(dataset, graph, file)
+ print "PUT #{dataset} #{graph} #{file}\n" if $verbose
+ send_body(dataset, graph, file, Net::HTTP::Put)
+end
+
+def POST(dataset, graph, file)
+ print "POST #{dataset} #{graph} #{file}\n" if $verbose
+ send_body(dataset, graph, file, Net::HTTP::Post)
+end
+
+def DELETE(dataset, graph)
+ print "DELETE #{dataset} #{graph}\n" if $verbose
+ requestURI = target(dataset, graph)
+ uri = URI.parse(requestURI)
+ request = Net::HTTP::Delete.new(uri.request_uri)
+ headers = {}
+ headers.merge!($headers)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def uri_escape(string)
+ CGI.escape(string)
+end
+
+def target(dataset, graph)
+ return dataset+"?default" if graph == "default"
+ return dataset+"?graph="+uri_escape(graph)
+end
+
+def send_body(dataset, graph, file, method)
+ mt = content_type(file)
+ headers = {}
+ headers.merge!($headers)
+ headers[$hContentType] = mt
+ headers[$hContentLength] = File.size(file).to_s
+ ## p headers
+
+ requestURI = target(dataset, graph)
+ uri = URI.parse(requestURI)
+
+ request = method.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ print_http_request(uri, request)
+ request.body_stream = File.open(file)
+ response_no_body(uri, request)
+end
+
+def response_no_body(uri, request)
+ http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
+ http.read_timeout = nil
+ # check we can connect.
+ begin http.start
+ rescue Exception => e
+ # puts e.message
+ #puts e.backtrace.inspect
+ warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
+ end
+ response = http.request(request)
+ print_http_response(response)
+ case response
+ when Net::HTTPSuccess, Net::HTTPRedirection
+ # OK
+ when Net::HTTPNotFound
+ warn_exit "404 Not found: #{uri}", 9
+ #print response.body
+ else
+ warn_exit "#{response.code} #{response.message} #{uri}", 9
+ # Unreachable
+ response.error!
+ end
+ # NO BODY IN RESPONSE
+end
+
+def response_print_body(uri, request)
+ http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
+ http.read_timeout = nil
+ # check we can connect.
+ begin http.start
+ rescue => e
+ #puts e.backtrace.inspect
+ #print e.class
+ warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
+ end
+
+ # Add a blank line if headers were output.
+ print "\n" if $http_print ;
+
+ begin
+ response = http.request(request) { |res|
+ print_http_response(res)
+ #puts res.code
+ res.read_body do |segment|
+ print segment
+ end
+ }
+ case response
+ when Net::HTTPSuccess, Net::HTTPRedirection
+ # OK
+ when Net::HTTPNotFound
+ warn_exit "404 Not found: #{uri}", 9
+ #print response.body
+ else
+ warn_exit "#{response.code}: #{uri}", 9
+ # Unreachable
+ response.error!
+ end
+ rescue EOFError => e
+ warn_exit "IO Error: "+e.message, 3
+ end
+end
+
+def print_http_request(uri, request)
+ return unless $print_http
+ #print "Request\n"
+ print request.method," ",uri, "\n"
+ print_headers(" ",request)
+end
+
+def print_http_response(response)
+ return unless $print_http
+ #print "Response\n"
+ print response.code, " ", response.message, "\n"
+ print_headers(" ",response)
+end
+
+def print_headers(marker, headers)
+ headers.each do |k,v|
+ k = k.split('-').map{|w| w.capitalize}.join('-')+':'
+ printf "%s%-20s %s\n",marker,k,v
+ end
+end
+
+def content_type(file)
+ file =~ /\.([^.]*)$/
+ ext = $1
+ mt = $fileMediaTypes[ext]
+ cs = $charset[mt]
+ mt = mt+';charset='+cs if ! cs.nil?
+ return mt
+end
+
+def charset(content_type)
+ return $charset[content_type]
+end
+
+def warn_exit(msg, rc)
+ warn msg
+ exit rc ;
+end
+
+def parseURI(uri_string)
+ begin
+ return URI.parse(uri_string).to_s
+ rescue URI::InvalidURIError => err
+ warn_exit "Bad URI: <#{uri_string}>", 2
+ end
+end
+
+## ---- Command
+
+def cmd_soh(command=nil)
+ ## Command line
+ options = {}
+ optparse = OptionParser.new do |opts|
+ # Set a banner, displayed at the top
+ # of the help screen.
+ case $cmd
+ when "s-http", "sparql-http", "soh"
+ banner="$cmd [get|post|put|delete] datasetURI graph [file]"
+ when "s-get", "s-head", "s-delete"
+ banner="$cmd datasetURI graph"
+ end
+
+ opts.banner = $banner
+ # Define the options, and what they do
+
+ options[:verbose] = false
+ opts.on( '-v', '--verbose', 'Verbose' ) do
+ options[:verbose] = true
+ end
+
+ options[:version] = false
+ opts.on( '--version', 'Print version and exit' ) do
+ print "#{SOH_NAME} #{SOH_VERSION}\n"
+ exit
+ end
+
+ # This displays the help screen, all programs are
+ # assumed to have this option.
+ opts.on( '-h', '--help', 'Display this screen and exit' ) do
+ puts opts
+ exit
+ end
+ end
+
+ begin optparse.parse!
+ rescue OptionParser::InvalidArgument => e
+ warn e
+ exit
+ end
+
+ $verbose = options[:verbose]
+ $print_http = $verbose
+
+ if command.nil?
+ if ARGV.size == 0
+ warn "No command given: expected one of 'get', 'put', 'post', 'delete', 'query' or 'update'"
+ exit 1
+ end
+ cmdPrint=ARGV.shift
+ command=cmdPrint.upcase
+ else
+ cmdPrint=command
+ end
+
+ case command
+ when "HEAD", "GET", "DELETE"
+ requiredFile=false
+ when "PUT", "POST"
+ requiredFile=true
+ when "QUERY"
+ cmd_sparql_query
+ when "UPDATE"
+ cmd_sparql_update
+ else
+ warn_exit "Unknown command: #{command}", 2
+ end
+
+ if requiredFile
+ then
+ if ARGV.size != 3
+ warn_exit "Required: dataset URI, graph URI (or 'default') and file", 1
+ end
+ else
+ if ARGV.size != 2
+ warn_exit "Required: dataset URI and graph URI (or 'default')", 1
+ end
+ end
+
+ dataset=parseURI(ARGV.shift)
+ # Relative URI?
+ graph=parseURI(ARGV.shift)
+ file=""
+ if requiredFile
+ then
+ file = ARGV.shift if requiredFile
+ if ! File.exist?(file)
+ warn_exit "No such file: "+file, 3
+ end
+ if File.directory?(file)
+ warn_exit "File is a directory: "+file, 3
+ end
+ end
+
+ case command
+ when "GET"
+ GET(dataset, graph)
+ when "HEAD"
+ HEAD(dataset, graph)
+ when "PUT"
+ PUT(dataset, graph, file)
+ when "DELETE"
+ DELETE(dataset, graph)
+ when "POST"
+ POST(dataset, graph, file)
+ else
+ warn_exit "Internal error: Unknown command: #{cmd}", 2
+ end
+ exit 0
+end
+
+## --------
+def string_or_file(arg)
+ return arg if ! arg.match(/^@/)
+ a=(arg[1..-1])
+ open(a, 'rb'){|f| f.read}
+end
+
+## -------- SPARQL Query
+
+## Choose method
+def SPARQL_query(service, query, query_file, forcePOST=false, args2={})
+ if ! query_file.nil?
+ query = open(query_file, 'rb'){|f| f.read}
+ end
+ if forcePOST || query.length >= 2*1024
+ SPARQL_query_POST(service, query, args2)
+ else
+ SPARQL_query_GET(service, query, args2)
+ end
+end
+
+## By GET
+
+def SPARQL_query_GET(service, query, args2)
+ args = { "query" => query }
+ args.merge!(args2)
+ qs=args.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
+ action="#{service}?#{qs}"
+ headers={}
+ headers.merge!($headers)
+ headers[$hAccept]=$accept_results
+ get_worker(action, headers)
+end
+
+## By POST
+
+def SPARQL_query_POST(service, query, args2)
+ # DRY - body/no body for each of request and response.
+ post_params={ "query" => query }
+ post_params.merge!(args2)
+ uri = URI.parse(service)
+ headers={}
+ headers.merge!($headers)
+ headers[$hAccept]=$accept_results
+ execute_post_form_body(uri, headers, post_params)
+end
+
+def execute_post_form_body(uri, headers, post_params)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ qs=post_params.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
+ headers[$hContentType] = $mtWWWForm
+ headers[$hContentLength] = qs.length.to_s
+ request.initialize_http_header(headers)
+ request.body = qs
+ print_http_request(uri, request)
+ response_print_body(uri, request)
+end
+
+# Usage: -v --help --file= --query=
+def cmd_sparql_query
+ options={}
+ optparse = OptionParser.new do |opts|
+ opts.banner = "Usage: #{$cmd} [--query QUERY] [--service URI] [--post] 'query' | @file"
+ opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
+ options[:service]=uri
+ end
+ opts.on('--query=FILE','--file=FILE', 'Take query from a file') do |file|
+ options[:file]=file
+ end
+ opts.on('--output=TYPE', [:json,:xml,:text,:csv,:tsv],
+ 'Set the output argument') do |type|
+ options[:output]=type
+ end
+ opts.on('--accept=TYPE', [:json,:xml,:text,:csv,:tsv],
+ 'Set the accept header type') do |type|
+ options[:accept]=type
+ end
+ options[:verbose] = false
+ opts.on( '--post', 'Force use of POST' ) do
+ options[:post] = true
+ end
+ opts.on( '-v', '--verbose', 'Verbose' ) do
+ options[:verbose] = true
+ end
+ opts.on( '--version', 'Print version and exit' ) do
+ print "#{SOH_NAME} #{SOH_VERSION}\n"
+ exit
+ end
+ opts.on( '-h', '--help', 'Display this screen and exit' ) do
+ puts opts
+ exit
+ end
+ end
+
+ begin optparse.parse!
+ rescue OptionParser::InvalidArgument, OptionParser::InvalidOption => e
+ warn e
+ exit 1
+ end
+
+ $verbose = options[:verbose]
+ $print_http = $verbose
+ usePOST = options[:post]
+
+ service = options[:service]
+ warn_exit 'No service specified. Required --service=URI',1 if service.nil?
+
+ # Query
+ query=nil
+ query_file=options[:file]
+ if query_file.nil? && ARGV.size == 0
+ then
+ warn_exit 'No query specified.',1
+ end
+ if query_file.nil?
+ query = ARGV.shift
+ if query.match(/^@/)
+ query_file = query[1..-1]
+ query = nil
+ end
+ end
+
+ # --output ==> output= (non-standard)
+ args={}
+ case options[:output]
+ when nil
+ when "json","xml","text","csv","tsv"
+ args['output'] = options[:output]
+ when :json,:xml,:text,:csv,:tsv
+ args['output'] = options[:output].to_s
+ else
+ warn_exit "Unrecognized output type: "+options[:output],2
+ end
+
+ # --accept
+ # options[:accept]
+
+ print "SPARQL #{service}\n" if $verbose
+ #args={"output"=>"text"}
+ SPARQL_query(service, query, query_file, usePOST, args)
+ exit(0)
+end
+
+## -------- SPARQL Update
+
+# Update sent as a WWW form.
+def SPARQL_update_by_form(service, update, args2={})
+ args = {}
+ args.merge!(args2)
+ headers={}
+ headers.merge!($headers)
+ # args? encode?
+ body="update="+uri_escape(update)
+ headers[$hContentType] = $mtWWWForm
+ headers[$hContentLength] = body.length.to_s
+ uri = URI.parse(service)
+ execute_post_form(uri, headers, body)
+end
+
+# DRY - query form.
+def execute_post_form(uri, headers, body)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ request.body = body
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def SPARQL_update(service, update, args2={})
+ args = {}
+ args.merge!(args2)
+ headers={}
+ headers.merge!($headers)
+ headers[$hContentType] = $mtSparqlUpdate
+ uri = URI.parse(service)
+ request = Net::HTTP::Post.new(uri.request_uri)
+ request.initialize_http_header(headers)
+ request.body = update
+ print_http_request(uri, request)
+ response_no_body(uri, request)
+end
+
+def cmd_sparql_update(by_raw_post=true)
+ # Share with cmd_sparql_query
+ options={}
+ optparse = OptionParser.new do |opts|
+ opts.banner = "Usage: #{$cmd} [--file REQUEST] [--service URI] 'request' | @file"
+ opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
+ options[:service]=uri
+ end
+ opts.on('--update=FILE', '--file=FILE', 'Take update from a file') do |file|
+ options[:file]=file
+ end
+ options[:verbose] = false
+ opts.on( '-v', '--verbose', 'Verbose' ) do
+ options[:verbose] = true
+ end
+ opts.on( '--version', 'Print version and exit' ) do
+ print "#{SOH_NAME} #{SOH_VERSION}\n"
+ exit
+ end
+ opts.on( '-h', '--help', 'Display this screen and exit' ) do
+ puts opts
+ exit
+ end
+ end
+
+ begin optparse.parse!
+ rescue OptionParser::InvalidArgument => e
+ warn e
+ exit
+ end
+
+ $verbose = options[:verbose]
+ $print_http = $verbose
+
+ service = options[:service]
+ warn_exit 'No service specified. Required --service=URI',1 if service.nil?
+
+ update=nil
+ update_file=options[:file]
+
+ if update_file.nil? && ARGV.size == 0
+ then
+ warn_exit 'No update specified.',1
+ end
+ if update_file.nil?
+ update = ARGV.shift
+ if update.match(/^@/)
+ update_file = update[1..-1]
+ update = nil
+ end
+ end
+
+ print "SPARQL-Update #{service}\n" if $verbose
+ args={}
+
+ # Reads in the file :-(
+ if update.nil?
+ then
+ update = open(update_file, 'rb'){|f| f.read}
+ else
+ update = string_or_file(update)
+ end
+
+ if by_raw_post
+ SPARQL_update(service, update, args)
+ else
+ SPARQL_update_by_form(service, update, args)
+ end
+ exit(0)
+end
+
+## -------
+
+case $cmd
+when "s-http", "sparql-http", "soh"
+ $banner="#{$cmd} [get|post|put|delete] datasetURI graph [file]"
+ cmd_soh
+when "s-get", "s-head", "s-put", "s-delete", "s-post"
+
+ case $cmd
+ when "s-get", "s-head", "s-delete"
+ $banner="#{$cmd} datasetURI graph"
+ when "s-put", "s-post"
+ $banner="#{$cmd} datasetURI graph file"
+ end
+ cmd2 = $cmd.sub(/^s-/, '').upcase
+ cmd_soh cmd2
+
+when "s-query", "sparql-query"
+ cmd_sparql_query
+when "s-update", "sparql-update"
+ cmd_sparql_update true
+when "s-update-form", "sparql-update-form"
+ cmd_sparql_update false
+else
+ warn_exit "Unknown: "+$cmd, 1
+end
[3/6] jena git commit: JENA-872 : apache-jena-fuseki
Posted by an...@apache.org.
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/jena-fuseki-dist/bin/s-delete
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-dist/bin/s-delete b/jena-fuseki2/jena-fuseki-dist/bin/s-delete
deleted file mode 100755
index 0e3a807..0000000
--- a/jena-fuseki2/jena-fuseki-dist/bin/s-delete
+++ /dev/null
@@ -1,707 +0,0 @@
-#!/usr/bin/env ruby
-# -*- coding: utf-8 -*-
-
-# 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.
-
-# SPARQL HTTP Update, client.
-
-require 'optparse'
-require 'net/http'
-require 'uri'
-require 'cgi'
-require 'pp'
-require 'ostruct'
-
-# ToDo
-# Allow a choice of media type for GET
-# --accept "content-type" (and abbreviations)
-# --header "Add:this"
-# --user, --password
-# Basic authentication: request.basic_auth("username", "password")
-# Follow redirects => 301: puts response["location"] # All headers are lowercase?
-
-SOH_NAME="SOH"
-SOH_VERSION="0.0.0"
-
-$proxy = ENV['http_proxy'] ? URI.parse(ENV['http_proxy']) : OpenStruct.new
-
-# What about direct naming?
-
-# Names
-$mtTurtle = 'text/turtle;charset=utf-8'
-$mtRDF = 'application/rdf+xml'
-$mtText = 'text/plain'
-$mtNQuads = 'text/n-quads'
-$mtTriG = 'application/trig'
-$mtSparqlResultsX = 'application/sparql-results+xml'
-$mtSparqlResultsJ = 'application/sparql-results+json'
-$mtAppJSON = 'application/json'
-$mtAppXML = 'application/xml'
-$mtSparqlResultsTSV = 'application/sparql-results+tsv'
-$mtSparqlResultsCSV = 'application/sparql-results+csv'
-$mtSparqlUpdate = 'application/sparql-update'
-$mtWWWForm = 'application/x-www-form-urlencoded'
-$mtSparqlQuery = "application/sparql-query" ;
-
-# Global media type table.
-$fileMediaTypes = {}
-$fileMediaTypes['ttl'] = $mtTurtle
-$fileMediaTypes['n3'] = 'text/n3; charset=utf-8'
-$fileMediaTypes['nt'] = $mtText
-$fileMediaTypes['rdf'] = $mtRDF
-$fileMediaTypes['owl'] = $mtRDF
-$fileMediaTypes['nq'] = $mtNQuads
-$fileMediaTypes['trig'] = $mtTriG
-
-# Global charset : no entry means "don't set"
-$charsetUTF8 = 'utf-8'
-$charset = {}
-$charset[$mtTurtle] = 'utf-8'
-$charset[$mtText] = 'ascii'
-$charset[$mtTriG] = 'utf-8'
-$charset[$mtNQuads] = 'ascii'
-
-# Headers
-
-$hContentType = 'Content-Type'
-# $hContentEncoding = 'Content-Encoding'
-$hContentLength = 'Content-Length'
-# $hContentLocation = 'Content-Location'
-# $hContentRange = 'Content-Range'
-
-$hAccept = 'Accept'
-$hAcceptCharset = 'Accept-Charset'
-$hAcceptEncoding = 'Accept-Encoding'
-$hAcceptRanges = 'Accept-Ranges'
-
-$headers = { "User-Agent" => "#{SOH_NAME}/Fuseki #{SOH_VERSION}"}
-$print_http = false
-
-# Default for GET
-# At least allow anythign (and hope!)
-$accept_rdf="#{$mtRDF};q=0.9 , #{$mtTurtle}"
-# For SPARQL query
-$accept_results="#{$mtSparqlResultsJ} , #{$mtSparqlResultsX};q=0.9 , #{$accept_rdf}"
-
-# Accept any in case of trouble.
-$accept_rdf="#{$accept_rdf} , */*;q=0.1"
-$accept_results="#{$accept_results} , */*;q=0.1"
-
-# The media type usually forces the charset.
-$accept_charset=nil
-
-## Who we are.
-## Two styles:
-## s-query .....
-## soh query .....
-
-$cmd = File.basename($0)
-if $cmd == 'soh'
-then
- $cmd = (ARGV.size == 0) ? 'soh' : ARGV.shift
-end
-
-if ! $cmd.start_with?('s-') && $cmd != 'soh'
- $cmd = 's-'+$cmd
-end
-
-## --------
-
-def GET(dataset, graph)
- print "GET #{dataset} #{graph}\n" if $verbose
- requestURI = target(dataset, graph)
- headers = {}
- headers.merge!($headers)
- headers[$hAccept] = $accept_rdf
- headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
- get_worker(requestURI, headers)
-end
-
-def get_worker(requestURI, headers)
- uri = URI.parse(requestURI)
- request = Net::HTTP::Get.new(uri.request_uri)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- response_print_body(uri, request)
-end
-
-def HEAD(dataset, graph)
- print "HEAD #{dataset} #{graph}\n" if $verbose
- requestURI = target(dataset, graph)
- headers = {}
- headers.merge!($headers)
- headers[$hAccept] = $accept_rdf
- headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
- uri = URI.parse(requestURI)
- request = Net::HTTP::Head.new(uri.request_uri)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def PUT(dataset, graph, file)
- print "PUT #{dataset} #{graph} #{file}\n" if $verbose
- send_body(dataset, graph, file, Net::HTTP::Put)
-end
-
-def POST(dataset, graph, file)
- print "POST #{dataset} #{graph} #{file}\n" if $verbose
- send_body(dataset, graph, file, Net::HTTP::Post)
-end
-
-def DELETE(dataset, graph)
- print "DELETE #{dataset} #{graph}\n" if $verbose
- requestURI = target(dataset, graph)
- uri = URI.parse(requestURI)
- request = Net::HTTP::Delete.new(uri.request_uri)
- headers = {}
- headers.merge!($headers)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def uri_escape(string)
- CGI.escape(string)
-end
-
-def target(dataset, graph)
- return dataset+"?default" if graph == "default"
- return dataset+"?graph="+uri_escape(graph)
-end
-
-def send_body(dataset, graph, file, method)
- mt = content_type(file)
- headers = {}
- headers.merge!($headers)
- headers[$hContentType] = mt
- headers[$hContentLength] = File.size(file).to_s
- ## p headers
-
- requestURI = target(dataset, graph)
- uri = URI.parse(requestURI)
-
- request = method.new(uri.request_uri)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- request.body_stream = File.open(file)
- response_no_body(uri, request)
-end
-
-def response_no_body(uri, request)
- http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
- http.read_timeout = nil
- # check we can connect.
- begin http.start
- rescue Exception => e
- # puts e.message
- #puts e.backtrace.inspect
- warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
- end
- response = http.request(request)
- print_http_response(response)
- case response
- when Net::HTTPSuccess, Net::HTTPRedirection
- # OK
- when Net::HTTPNotFound
- warn_exit "404 Not found: #{uri}", 9
- #print response.body
- else
- warn_exit "#{response.code} #{response.message} #{uri}", 9
- # Unreachable
- response.error!
- end
- # NO BODY IN RESPONSE
-end
-
-def response_print_body(uri, request)
- http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
- http.read_timeout = nil
- # check we can connect.
- begin http.start
- rescue => e
- #puts e.backtrace.inspect
- #print e.class
- warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
- end
-
- # Add a blank line if headers were output.
- print "\n" if $http_print ;
-
- begin
- response = http.request(request) { |res|
- print_http_response(res)
- #puts res.code
- res.read_body do |segment|
- print segment
- end
- }
- case response
- when Net::HTTPSuccess, Net::HTTPRedirection
- # OK
- when Net::HTTPNotFound
- warn_exit "404 Not found: #{uri}", 9
- #print response.body
- else
- warn_exit "#{response.code}: #{uri}", 9
- # Unreachable
- response.error!
- end
- rescue EOFError => e
- warn_exit "IO Error: "+e.message, 3
- end
-end
-
-def print_http_request(uri, request)
- return unless $print_http
- #print "Request\n"
- print request.method," ",uri, "\n"
- print_headers(" ",request)
-end
-
-def print_http_response(response)
- return unless $print_http
- #print "Response\n"
- print response.code, " ", response.message, "\n"
- print_headers(" ",response)
-end
-
-def print_headers(marker, headers)
- headers.each do |k,v|
- k = k.split('-').map{|w| w.capitalize}.join('-')+':'
- printf "%s%-20s %s\n",marker,k,v
- end
-end
-
-def content_type(file)
- file =~ /\.([^.]*)$/
- ext = $1
- mt = $fileMediaTypes[ext]
- cs = $charset[mt]
- mt = mt+';charset='+cs if ! cs.nil?
- return mt
-end
-
-def charset(content_type)
- return $charset[content_type]
-end
-
-def warn_exit(msg, rc)
- warn msg
- exit rc ;
-end
-
-def parseURI(uri_string)
- begin
- return URI.parse(uri_string).to_s
- rescue URI::InvalidURIError => err
- warn_exit "Bad URI: <#{uri_string}>", 2
- end
-end
-
-## ---- Command
-
-def cmd_soh(command=nil)
- ## Command line
- options = {}
- optparse = OptionParser.new do |opts|
- # Set a banner, displayed at the top
- # of the help screen.
- case $cmd
- when "s-http", "sparql-http", "soh"
- banner="$cmd [get|post|put|delete] datasetURI graph [file]"
- when "s-get", "s-head", "s-delete"
- banner="$cmd datasetURI graph"
- end
-
- opts.banner = $banner
- # Define the options, and what they do
-
- options[:verbose] = false
- opts.on( '-v', '--verbose', 'Verbose' ) do
- options[:verbose] = true
- end
-
- options[:version] = false
- opts.on( '--version', 'Print version and exit' ) do
- print "#{SOH_NAME} #{SOH_VERSION}\n"
- exit
- end
-
- # This displays the help screen, all programs are
- # assumed to have this option.
- opts.on( '-h', '--help', 'Display this screen and exit' ) do
- puts opts
- exit
- end
- end
-
- begin optparse.parse!
- rescue OptionParser::InvalidArgument => e
- warn e
- exit
- end
-
- $verbose = options[:verbose]
- $print_http = $verbose
-
- if command.nil?
- if ARGV.size == 0
- warn "No command given: expected one of 'get', 'put', 'post', 'delete', 'query' or 'update'"
- exit 1
- end
- cmdPrint=ARGV.shift
- command=cmdPrint.upcase
- else
- cmdPrint=command
- end
-
- case command
- when "HEAD", "GET", "DELETE"
- requiredFile=false
- when "PUT", "POST"
- requiredFile=true
- when "QUERY"
- cmd_sparql_query
- when "UPDATE"
- cmd_sparql_update
- else
- warn_exit "Unknown command: #{command}", 2
- end
-
- if requiredFile
- then
- if ARGV.size != 3
- warn_exit "Required: dataset URI, graph URI (or 'default') and file", 1
- end
- else
- if ARGV.size != 2
- warn_exit "Required: dataset URI and graph URI (or 'default')", 1
- end
- end
-
- dataset=parseURI(ARGV.shift)
- # Relative URI?
- graph=parseURI(ARGV.shift)
- file=""
- if requiredFile
- then
- file = ARGV.shift if requiredFile
- if ! File.exist?(file)
- warn_exit "No such file: "+file, 3
- end
- if File.directory?(file)
- warn_exit "File is a directory: "+file, 3
- end
- end
-
- case command
- when "GET"
- GET(dataset, graph)
- when "HEAD"
- HEAD(dataset, graph)
- when "PUT"
- PUT(dataset, graph, file)
- when "DELETE"
- DELETE(dataset, graph)
- when "POST"
- POST(dataset, graph, file)
- else
- warn_exit "Internal error: Unknown command: #{cmd}", 2
- end
- exit 0
-end
-
-## --------
-def string_or_file(arg)
- return arg if ! arg.match(/^@/)
- a=(arg[1..-1])
- open(a, 'rb'){|f| f.read}
-end
-
-## -------- SPARQL Query
-
-## Choose method
-def SPARQL_query(service, query, query_file, forcePOST=false, args2={})
- if ! query_file.nil?
- query = open(query_file, 'rb'){|f| f.read}
- end
- if forcePOST || query.length >= 2*1024
- SPARQL_query_POST(service, query, args2)
- else
- SPARQL_query_GET(service, query, args2)
- end
-end
-
-## By GET
-
-def SPARQL_query_GET(service, query, args2)
- args = { "query" => query }
- args.merge!(args2)
- qs=args.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
- action="#{service}?#{qs}"
- headers={}
- headers.merge!($headers)
- headers[$hAccept]=$accept_results
- get_worker(action, headers)
-end
-
-## By POST
-
-def SPARQL_query_POST(service, query, args2)
- # DRY - body/no body for each of request and response.
- post_params={ "query" => query }
- post_params.merge!(args2)
- uri = URI.parse(service)
- headers={}
- headers.merge!($headers)
- headers[$hAccept]=$accept_results
- execute_post_form_body(uri, headers, post_params)
-end
-
-def execute_post_form_body(uri, headers, post_params)
- request = Net::HTTP::Post.new(uri.request_uri)
- qs=post_params.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
- headers[$hContentType] = $mtWWWForm
- headers[$hContentLength] = qs.length.to_s
- request.initialize_http_header(headers)
- request.body = qs
- print_http_request(uri, request)
- response_print_body(uri, request)
-end
-
-# Usage: -v --help --file= --query=
-def cmd_sparql_query
- options={}
- optparse = OptionParser.new do |opts|
- opts.banner = "Usage: #{$cmd} [--query QUERY] [--service URI] [--post] 'query' | @file"
- opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
- options[:service]=uri
- end
- opts.on('--query=FILE','--file=FILE', 'Take query from a file') do |file|
- options[:file]=file
- end
- opts.on('--output=TYPE', [:json,:xml,:text,:csv,:tsv],
- 'Set the output argument') do |type|
- options[:output]=type
- end
- opts.on('--accept=TYPE', [:json,:xml,:text,:csv,:tsv],
- 'Set the accept header type') do |type|
- options[:accept]=type
- end
- options[:verbose] = false
- opts.on( '--post', 'Force use of POST' ) do
- options[:post] = true
- end
- opts.on( '-v', '--verbose', 'Verbose' ) do
- options[:verbose] = true
- end
- opts.on( '--version', 'Print version and exit' ) do
- print "#{SOH_NAME} #{SOH_VERSION}\n"
- exit
- end
- opts.on( '-h', '--help', 'Display this screen and exit' ) do
- puts opts
- exit
- end
- end
-
- begin optparse.parse!
- rescue OptionParser::InvalidArgument, OptionParser::InvalidOption => e
- warn e
- exit 1
- end
-
- $verbose = options[:verbose]
- $print_http = $verbose
- usePOST = options[:post]
-
- service = options[:service]
- warn_exit 'No service specified. Required --service=URI',1 if service.nil?
-
- # Query
- query=nil
- query_file=options[:file]
- if query_file.nil? && ARGV.size == 0
- then
- warn_exit 'No query specified.',1
- end
- if query_file.nil?
- query = ARGV.shift
- if query.match(/^@/)
- query_file = query[1..-1]
- query = nil
- end
- end
-
- # --output ==> output= (non-standard)
- args={}
- case options[:output]
- when nil
- when "json","xml","text","csv","tsv"
- args['output'] = options[:output]
- when :json,:xml,:text,:csv,:tsv
- args['output'] = options[:output].to_s
- else
- warn_exit "Unrecognized output type: "+options[:output],2
- end
-
- # --accept
- # options[:accept]
-
- print "SPARQL #{service}\n" if $verbose
- #args={"output"=>"text"}
- SPARQL_query(service, query, query_file, usePOST, args)
- exit(0)
-end
-
-## -------- SPARQL Update
-
-# Update sent as a WWW form.
-def SPARQL_update_by_form(service, update, args2={})
- args = {}
- args.merge!(args2)
- headers={}
- headers.merge!($headers)
- # args? encode?
- body="update="+uri_escape(update)
- headers[$hContentType] = $mtWWWForm
- headers[$hContentLength] = body.length.to_s
- uri = URI.parse(service)
- execute_post_form(uri, headers, body)
-end
-
-# DRY - query form.
-def execute_post_form(uri, headers, body)
- request = Net::HTTP::Post.new(uri.request_uri)
- request.initialize_http_header(headers)
- request.body = body
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def SPARQL_update(service, update, args2={})
- args = {}
- args.merge!(args2)
- headers={}
- headers.merge!($headers)
- headers[$hContentType] = $mtSparqlUpdate
- uri = URI.parse(service)
- request = Net::HTTP::Post.new(uri.request_uri)
- request.initialize_http_header(headers)
- request.body = update
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def cmd_sparql_update(by_raw_post=true)
- # Share with cmd_sparql_query
- options={}
- optparse = OptionParser.new do |opts|
- opts.banner = "Usage: #{$cmd} [--file REQUEST] [--service URI] 'request' | @file"
- opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
- options[:service]=uri
- end
- opts.on('--update=FILE', '--file=FILE', 'Take update from a file') do |file|
- options[:file]=file
- end
- options[:verbose] = false
- opts.on( '-v', '--verbose', 'Verbose' ) do
- options[:verbose] = true
- end
- opts.on( '--version', 'Print version and exit' ) do
- print "#{SOH_NAME} #{SOH_VERSION}\n"
- exit
- end
- opts.on( '-h', '--help', 'Display this screen and exit' ) do
- puts opts
- exit
- end
- end
-
- begin optparse.parse!
- rescue OptionParser::InvalidArgument => e
- warn e
- exit
- end
-
- $verbose = options[:verbose]
- $print_http = $verbose
-
- service = options[:service]
- warn_exit 'No service specified. Required --service=URI',1 if service.nil?
-
- update=nil
- update_file=options[:file]
-
- if update_file.nil? && ARGV.size == 0
- then
- warn_exit 'No update specified.',1
- end
- if update_file.nil?
- update = ARGV.shift
- if update.match(/^@/)
- update_file = update[1..-1]
- update = nil
- end
- end
-
- print "SPARQL-Update #{service}\n" if $verbose
- args={}
-
- # Reads in the file :-(
- if update.nil?
- then
- update = open(update_file, 'rb'){|f| f.read}
- else
- update = string_or_file(update)
- end
-
- if by_raw_post
- SPARQL_update(service, update, args)
- else
- SPARQL_update_by_form(service, update, args)
- end
- exit(0)
-end
-
-## -------
-
-case $cmd
-when "s-http", "sparql-http", "soh"
- $banner="#{$cmd} [get|post|put|delete] datasetURI graph [file]"
- cmd_soh
-when "s-get", "s-head", "s-put", "s-delete", "s-post"
-
- case $cmd
- when "s-get", "s-head", "s-delete"
- $banner="#{$cmd} datasetURI graph"
- when "s-put", "s-post"
- $banner="#{$cmd} datasetURI graph file"
- end
- cmd2 = $cmd.sub(/^s-/, '').upcase
- cmd_soh cmd2
-
-when "s-query", "sparql-query"
- cmd_sparql_query
-when "s-update", "sparql-update"
- cmd_sparql_update true
-when "s-update-form", "sparql-update-form"
- cmd_sparql_update false
-else
- warn_exit "Unknown: "+$cmd, 1
-end
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/jena-fuseki-dist/bin/s-get
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-dist/bin/s-get b/jena-fuseki2/jena-fuseki-dist/bin/s-get
deleted file mode 100755
index 0e3a807..0000000
--- a/jena-fuseki2/jena-fuseki-dist/bin/s-get
+++ /dev/null
@@ -1,707 +0,0 @@
-#!/usr/bin/env ruby
-# -*- coding: utf-8 -*-
-
-# 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.
-
-# SPARQL HTTP Update, client.
-
-require 'optparse'
-require 'net/http'
-require 'uri'
-require 'cgi'
-require 'pp'
-require 'ostruct'
-
-# ToDo
-# Allow a choice of media type for GET
-# --accept "content-type" (and abbreviations)
-# --header "Add:this"
-# --user, --password
-# Basic authentication: request.basic_auth("username", "password")
-# Follow redirects => 301: puts response["location"] # All headers are lowercase?
-
-SOH_NAME="SOH"
-SOH_VERSION="0.0.0"
-
-$proxy = ENV['http_proxy'] ? URI.parse(ENV['http_proxy']) : OpenStruct.new
-
-# What about direct naming?
-
-# Names
-$mtTurtle = 'text/turtle;charset=utf-8'
-$mtRDF = 'application/rdf+xml'
-$mtText = 'text/plain'
-$mtNQuads = 'text/n-quads'
-$mtTriG = 'application/trig'
-$mtSparqlResultsX = 'application/sparql-results+xml'
-$mtSparqlResultsJ = 'application/sparql-results+json'
-$mtAppJSON = 'application/json'
-$mtAppXML = 'application/xml'
-$mtSparqlResultsTSV = 'application/sparql-results+tsv'
-$mtSparqlResultsCSV = 'application/sparql-results+csv'
-$mtSparqlUpdate = 'application/sparql-update'
-$mtWWWForm = 'application/x-www-form-urlencoded'
-$mtSparqlQuery = "application/sparql-query" ;
-
-# Global media type table.
-$fileMediaTypes = {}
-$fileMediaTypes['ttl'] = $mtTurtle
-$fileMediaTypes['n3'] = 'text/n3; charset=utf-8'
-$fileMediaTypes['nt'] = $mtText
-$fileMediaTypes['rdf'] = $mtRDF
-$fileMediaTypes['owl'] = $mtRDF
-$fileMediaTypes['nq'] = $mtNQuads
-$fileMediaTypes['trig'] = $mtTriG
-
-# Global charset : no entry means "don't set"
-$charsetUTF8 = 'utf-8'
-$charset = {}
-$charset[$mtTurtle] = 'utf-8'
-$charset[$mtText] = 'ascii'
-$charset[$mtTriG] = 'utf-8'
-$charset[$mtNQuads] = 'ascii'
-
-# Headers
-
-$hContentType = 'Content-Type'
-# $hContentEncoding = 'Content-Encoding'
-$hContentLength = 'Content-Length'
-# $hContentLocation = 'Content-Location'
-# $hContentRange = 'Content-Range'
-
-$hAccept = 'Accept'
-$hAcceptCharset = 'Accept-Charset'
-$hAcceptEncoding = 'Accept-Encoding'
-$hAcceptRanges = 'Accept-Ranges'
-
-$headers = { "User-Agent" => "#{SOH_NAME}/Fuseki #{SOH_VERSION}"}
-$print_http = false
-
-# Default for GET
-# At least allow anythign (and hope!)
-$accept_rdf="#{$mtRDF};q=0.9 , #{$mtTurtle}"
-# For SPARQL query
-$accept_results="#{$mtSparqlResultsJ} , #{$mtSparqlResultsX};q=0.9 , #{$accept_rdf}"
-
-# Accept any in case of trouble.
-$accept_rdf="#{$accept_rdf} , */*;q=0.1"
-$accept_results="#{$accept_results} , */*;q=0.1"
-
-# The media type usually forces the charset.
-$accept_charset=nil
-
-## Who we are.
-## Two styles:
-## s-query .....
-## soh query .....
-
-$cmd = File.basename($0)
-if $cmd == 'soh'
-then
- $cmd = (ARGV.size == 0) ? 'soh' : ARGV.shift
-end
-
-if ! $cmd.start_with?('s-') && $cmd != 'soh'
- $cmd = 's-'+$cmd
-end
-
-## --------
-
-def GET(dataset, graph)
- print "GET #{dataset} #{graph}\n" if $verbose
- requestURI = target(dataset, graph)
- headers = {}
- headers.merge!($headers)
- headers[$hAccept] = $accept_rdf
- headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
- get_worker(requestURI, headers)
-end
-
-def get_worker(requestURI, headers)
- uri = URI.parse(requestURI)
- request = Net::HTTP::Get.new(uri.request_uri)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- response_print_body(uri, request)
-end
-
-def HEAD(dataset, graph)
- print "HEAD #{dataset} #{graph}\n" if $verbose
- requestURI = target(dataset, graph)
- headers = {}
- headers.merge!($headers)
- headers[$hAccept] = $accept_rdf
- headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
- uri = URI.parse(requestURI)
- request = Net::HTTP::Head.new(uri.request_uri)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def PUT(dataset, graph, file)
- print "PUT #{dataset} #{graph} #{file}\n" if $verbose
- send_body(dataset, graph, file, Net::HTTP::Put)
-end
-
-def POST(dataset, graph, file)
- print "POST #{dataset} #{graph} #{file}\n" if $verbose
- send_body(dataset, graph, file, Net::HTTP::Post)
-end
-
-def DELETE(dataset, graph)
- print "DELETE #{dataset} #{graph}\n" if $verbose
- requestURI = target(dataset, graph)
- uri = URI.parse(requestURI)
- request = Net::HTTP::Delete.new(uri.request_uri)
- headers = {}
- headers.merge!($headers)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def uri_escape(string)
- CGI.escape(string)
-end
-
-def target(dataset, graph)
- return dataset+"?default" if graph == "default"
- return dataset+"?graph="+uri_escape(graph)
-end
-
-def send_body(dataset, graph, file, method)
- mt = content_type(file)
- headers = {}
- headers.merge!($headers)
- headers[$hContentType] = mt
- headers[$hContentLength] = File.size(file).to_s
- ## p headers
-
- requestURI = target(dataset, graph)
- uri = URI.parse(requestURI)
-
- request = method.new(uri.request_uri)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- request.body_stream = File.open(file)
- response_no_body(uri, request)
-end
-
-def response_no_body(uri, request)
- http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
- http.read_timeout = nil
- # check we can connect.
- begin http.start
- rescue Exception => e
- # puts e.message
- #puts e.backtrace.inspect
- warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
- end
- response = http.request(request)
- print_http_response(response)
- case response
- when Net::HTTPSuccess, Net::HTTPRedirection
- # OK
- when Net::HTTPNotFound
- warn_exit "404 Not found: #{uri}", 9
- #print response.body
- else
- warn_exit "#{response.code} #{response.message} #{uri}", 9
- # Unreachable
- response.error!
- end
- # NO BODY IN RESPONSE
-end
-
-def response_print_body(uri, request)
- http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
- http.read_timeout = nil
- # check we can connect.
- begin http.start
- rescue => e
- #puts e.backtrace.inspect
- #print e.class
- warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
- end
-
- # Add a blank line if headers were output.
- print "\n" if $http_print ;
-
- begin
- response = http.request(request) { |res|
- print_http_response(res)
- #puts res.code
- res.read_body do |segment|
- print segment
- end
- }
- case response
- when Net::HTTPSuccess, Net::HTTPRedirection
- # OK
- when Net::HTTPNotFound
- warn_exit "404 Not found: #{uri}", 9
- #print response.body
- else
- warn_exit "#{response.code}: #{uri}", 9
- # Unreachable
- response.error!
- end
- rescue EOFError => e
- warn_exit "IO Error: "+e.message, 3
- end
-end
-
-def print_http_request(uri, request)
- return unless $print_http
- #print "Request\n"
- print request.method," ",uri, "\n"
- print_headers(" ",request)
-end
-
-def print_http_response(response)
- return unless $print_http
- #print "Response\n"
- print response.code, " ", response.message, "\n"
- print_headers(" ",response)
-end
-
-def print_headers(marker, headers)
- headers.each do |k,v|
- k = k.split('-').map{|w| w.capitalize}.join('-')+':'
- printf "%s%-20s %s\n",marker,k,v
- end
-end
-
-def content_type(file)
- file =~ /\.([^.]*)$/
- ext = $1
- mt = $fileMediaTypes[ext]
- cs = $charset[mt]
- mt = mt+';charset='+cs if ! cs.nil?
- return mt
-end
-
-def charset(content_type)
- return $charset[content_type]
-end
-
-def warn_exit(msg, rc)
- warn msg
- exit rc ;
-end
-
-def parseURI(uri_string)
- begin
- return URI.parse(uri_string).to_s
- rescue URI::InvalidURIError => err
- warn_exit "Bad URI: <#{uri_string}>", 2
- end
-end
-
-## ---- Command
-
-def cmd_soh(command=nil)
- ## Command line
- options = {}
- optparse = OptionParser.new do |opts|
- # Set a banner, displayed at the top
- # of the help screen.
- case $cmd
- when "s-http", "sparql-http", "soh"
- banner="$cmd [get|post|put|delete] datasetURI graph [file]"
- when "s-get", "s-head", "s-delete"
- banner="$cmd datasetURI graph"
- end
-
- opts.banner = $banner
- # Define the options, and what they do
-
- options[:verbose] = false
- opts.on( '-v', '--verbose', 'Verbose' ) do
- options[:verbose] = true
- end
-
- options[:version] = false
- opts.on( '--version', 'Print version and exit' ) do
- print "#{SOH_NAME} #{SOH_VERSION}\n"
- exit
- end
-
- # This displays the help screen, all programs are
- # assumed to have this option.
- opts.on( '-h', '--help', 'Display this screen and exit' ) do
- puts opts
- exit
- end
- end
-
- begin optparse.parse!
- rescue OptionParser::InvalidArgument => e
- warn e
- exit
- end
-
- $verbose = options[:verbose]
- $print_http = $verbose
-
- if command.nil?
- if ARGV.size == 0
- warn "No command given: expected one of 'get', 'put', 'post', 'delete', 'query' or 'update'"
- exit 1
- end
- cmdPrint=ARGV.shift
- command=cmdPrint.upcase
- else
- cmdPrint=command
- end
-
- case command
- when "HEAD", "GET", "DELETE"
- requiredFile=false
- when "PUT", "POST"
- requiredFile=true
- when "QUERY"
- cmd_sparql_query
- when "UPDATE"
- cmd_sparql_update
- else
- warn_exit "Unknown command: #{command}", 2
- end
-
- if requiredFile
- then
- if ARGV.size != 3
- warn_exit "Required: dataset URI, graph URI (or 'default') and file", 1
- end
- else
- if ARGV.size != 2
- warn_exit "Required: dataset URI and graph URI (or 'default')", 1
- end
- end
-
- dataset=parseURI(ARGV.shift)
- # Relative URI?
- graph=parseURI(ARGV.shift)
- file=""
- if requiredFile
- then
- file = ARGV.shift if requiredFile
- if ! File.exist?(file)
- warn_exit "No such file: "+file, 3
- end
- if File.directory?(file)
- warn_exit "File is a directory: "+file, 3
- end
- end
-
- case command
- when "GET"
- GET(dataset, graph)
- when "HEAD"
- HEAD(dataset, graph)
- when "PUT"
- PUT(dataset, graph, file)
- when "DELETE"
- DELETE(dataset, graph)
- when "POST"
- POST(dataset, graph, file)
- else
- warn_exit "Internal error: Unknown command: #{cmd}", 2
- end
- exit 0
-end
-
-## --------
-def string_or_file(arg)
- return arg if ! arg.match(/^@/)
- a=(arg[1..-1])
- open(a, 'rb'){|f| f.read}
-end
-
-## -------- SPARQL Query
-
-## Choose method
-def SPARQL_query(service, query, query_file, forcePOST=false, args2={})
- if ! query_file.nil?
- query = open(query_file, 'rb'){|f| f.read}
- end
- if forcePOST || query.length >= 2*1024
- SPARQL_query_POST(service, query, args2)
- else
- SPARQL_query_GET(service, query, args2)
- end
-end
-
-## By GET
-
-def SPARQL_query_GET(service, query, args2)
- args = { "query" => query }
- args.merge!(args2)
- qs=args.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
- action="#{service}?#{qs}"
- headers={}
- headers.merge!($headers)
- headers[$hAccept]=$accept_results
- get_worker(action, headers)
-end
-
-## By POST
-
-def SPARQL_query_POST(service, query, args2)
- # DRY - body/no body for each of request and response.
- post_params={ "query" => query }
- post_params.merge!(args2)
- uri = URI.parse(service)
- headers={}
- headers.merge!($headers)
- headers[$hAccept]=$accept_results
- execute_post_form_body(uri, headers, post_params)
-end
-
-def execute_post_form_body(uri, headers, post_params)
- request = Net::HTTP::Post.new(uri.request_uri)
- qs=post_params.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
- headers[$hContentType] = $mtWWWForm
- headers[$hContentLength] = qs.length.to_s
- request.initialize_http_header(headers)
- request.body = qs
- print_http_request(uri, request)
- response_print_body(uri, request)
-end
-
-# Usage: -v --help --file= --query=
-def cmd_sparql_query
- options={}
- optparse = OptionParser.new do |opts|
- opts.banner = "Usage: #{$cmd} [--query QUERY] [--service URI] [--post] 'query' | @file"
- opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
- options[:service]=uri
- end
- opts.on('--query=FILE','--file=FILE', 'Take query from a file') do |file|
- options[:file]=file
- end
- opts.on('--output=TYPE', [:json,:xml,:text,:csv,:tsv],
- 'Set the output argument') do |type|
- options[:output]=type
- end
- opts.on('--accept=TYPE', [:json,:xml,:text,:csv,:tsv],
- 'Set the accept header type') do |type|
- options[:accept]=type
- end
- options[:verbose] = false
- opts.on( '--post', 'Force use of POST' ) do
- options[:post] = true
- end
- opts.on( '-v', '--verbose', 'Verbose' ) do
- options[:verbose] = true
- end
- opts.on( '--version', 'Print version and exit' ) do
- print "#{SOH_NAME} #{SOH_VERSION}\n"
- exit
- end
- opts.on( '-h', '--help', 'Display this screen and exit' ) do
- puts opts
- exit
- end
- end
-
- begin optparse.parse!
- rescue OptionParser::InvalidArgument, OptionParser::InvalidOption => e
- warn e
- exit 1
- end
-
- $verbose = options[:verbose]
- $print_http = $verbose
- usePOST = options[:post]
-
- service = options[:service]
- warn_exit 'No service specified. Required --service=URI',1 if service.nil?
-
- # Query
- query=nil
- query_file=options[:file]
- if query_file.nil? && ARGV.size == 0
- then
- warn_exit 'No query specified.',1
- end
- if query_file.nil?
- query = ARGV.shift
- if query.match(/^@/)
- query_file = query[1..-1]
- query = nil
- end
- end
-
- # --output ==> output= (non-standard)
- args={}
- case options[:output]
- when nil
- when "json","xml","text","csv","tsv"
- args['output'] = options[:output]
- when :json,:xml,:text,:csv,:tsv
- args['output'] = options[:output].to_s
- else
- warn_exit "Unrecognized output type: "+options[:output],2
- end
-
- # --accept
- # options[:accept]
-
- print "SPARQL #{service}\n" if $verbose
- #args={"output"=>"text"}
- SPARQL_query(service, query, query_file, usePOST, args)
- exit(0)
-end
-
-## -------- SPARQL Update
-
-# Update sent as a WWW form.
-def SPARQL_update_by_form(service, update, args2={})
- args = {}
- args.merge!(args2)
- headers={}
- headers.merge!($headers)
- # args? encode?
- body="update="+uri_escape(update)
- headers[$hContentType] = $mtWWWForm
- headers[$hContentLength] = body.length.to_s
- uri = URI.parse(service)
- execute_post_form(uri, headers, body)
-end
-
-# DRY - query form.
-def execute_post_form(uri, headers, body)
- request = Net::HTTP::Post.new(uri.request_uri)
- request.initialize_http_header(headers)
- request.body = body
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def SPARQL_update(service, update, args2={})
- args = {}
- args.merge!(args2)
- headers={}
- headers.merge!($headers)
- headers[$hContentType] = $mtSparqlUpdate
- uri = URI.parse(service)
- request = Net::HTTP::Post.new(uri.request_uri)
- request.initialize_http_header(headers)
- request.body = update
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def cmd_sparql_update(by_raw_post=true)
- # Share with cmd_sparql_query
- options={}
- optparse = OptionParser.new do |opts|
- opts.banner = "Usage: #{$cmd} [--file REQUEST] [--service URI] 'request' | @file"
- opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
- options[:service]=uri
- end
- opts.on('--update=FILE', '--file=FILE', 'Take update from a file') do |file|
- options[:file]=file
- end
- options[:verbose] = false
- opts.on( '-v', '--verbose', 'Verbose' ) do
- options[:verbose] = true
- end
- opts.on( '--version', 'Print version and exit' ) do
- print "#{SOH_NAME} #{SOH_VERSION}\n"
- exit
- end
- opts.on( '-h', '--help', 'Display this screen and exit' ) do
- puts opts
- exit
- end
- end
-
- begin optparse.parse!
- rescue OptionParser::InvalidArgument => e
- warn e
- exit
- end
-
- $verbose = options[:verbose]
- $print_http = $verbose
-
- service = options[:service]
- warn_exit 'No service specified. Required --service=URI',1 if service.nil?
-
- update=nil
- update_file=options[:file]
-
- if update_file.nil? && ARGV.size == 0
- then
- warn_exit 'No update specified.',1
- end
- if update_file.nil?
- update = ARGV.shift
- if update.match(/^@/)
- update_file = update[1..-1]
- update = nil
- end
- end
-
- print "SPARQL-Update #{service}\n" if $verbose
- args={}
-
- # Reads in the file :-(
- if update.nil?
- then
- update = open(update_file, 'rb'){|f| f.read}
- else
- update = string_or_file(update)
- end
-
- if by_raw_post
- SPARQL_update(service, update, args)
- else
- SPARQL_update_by_form(service, update, args)
- end
- exit(0)
-end
-
-## -------
-
-case $cmd
-when "s-http", "sparql-http", "soh"
- $banner="#{$cmd} [get|post|put|delete] datasetURI graph [file]"
- cmd_soh
-when "s-get", "s-head", "s-put", "s-delete", "s-post"
-
- case $cmd
- when "s-get", "s-head", "s-delete"
- $banner="#{$cmd} datasetURI graph"
- when "s-put", "s-post"
- $banner="#{$cmd} datasetURI graph file"
- end
- cmd2 = $cmd.sub(/^s-/, '').upcase
- cmd_soh cmd2
-
-when "s-query", "sparql-query"
- cmd_sparql_query
-when "s-update", "sparql-update"
- cmd_sparql_update true
-when "s-update-form", "sparql-update-form"
- cmd_sparql_update false
-else
- warn_exit "Unknown: "+$cmd, 1
-end
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/jena-fuseki-dist/bin/s-head
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-dist/bin/s-head b/jena-fuseki2/jena-fuseki-dist/bin/s-head
deleted file mode 100755
index 0e3a807..0000000
--- a/jena-fuseki2/jena-fuseki-dist/bin/s-head
+++ /dev/null
@@ -1,707 +0,0 @@
-#!/usr/bin/env ruby
-# -*- coding: utf-8 -*-
-
-# 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.
-
-# SPARQL HTTP Update, client.
-
-require 'optparse'
-require 'net/http'
-require 'uri'
-require 'cgi'
-require 'pp'
-require 'ostruct'
-
-# ToDo
-# Allow a choice of media type for GET
-# --accept "content-type" (and abbreviations)
-# --header "Add:this"
-# --user, --password
-# Basic authentication: request.basic_auth("username", "password")
-# Follow redirects => 301: puts response["location"] # All headers are lowercase?
-
-SOH_NAME="SOH"
-SOH_VERSION="0.0.0"
-
-$proxy = ENV['http_proxy'] ? URI.parse(ENV['http_proxy']) : OpenStruct.new
-
-# What about direct naming?
-
-# Names
-$mtTurtle = 'text/turtle;charset=utf-8'
-$mtRDF = 'application/rdf+xml'
-$mtText = 'text/plain'
-$mtNQuads = 'text/n-quads'
-$mtTriG = 'application/trig'
-$mtSparqlResultsX = 'application/sparql-results+xml'
-$mtSparqlResultsJ = 'application/sparql-results+json'
-$mtAppJSON = 'application/json'
-$mtAppXML = 'application/xml'
-$mtSparqlResultsTSV = 'application/sparql-results+tsv'
-$mtSparqlResultsCSV = 'application/sparql-results+csv'
-$mtSparqlUpdate = 'application/sparql-update'
-$mtWWWForm = 'application/x-www-form-urlencoded'
-$mtSparqlQuery = "application/sparql-query" ;
-
-# Global media type table.
-$fileMediaTypes = {}
-$fileMediaTypes['ttl'] = $mtTurtle
-$fileMediaTypes['n3'] = 'text/n3; charset=utf-8'
-$fileMediaTypes['nt'] = $mtText
-$fileMediaTypes['rdf'] = $mtRDF
-$fileMediaTypes['owl'] = $mtRDF
-$fileMediaTypes['nq'] = $mtNQuads
-$fileMediaTypes['trig'] = $mtTriG
-
-# Global charset : no entry means "don't set"
-$charsetUTF8 = 'utf-8'
-$charset = {}
-$charset[$mtTurtle] = 'utf-8'
-$charset[$mtText] = 'ascii'
-$charset[$mtTriG] = 'utf-8'
-$charset[$mtNQuads] = 'ascii'
-
-# Headers
-
-$hContentType = 'Content-Type'
-# $hContentEncoding = 'Content-Encoding'
-$hContentLength = 'Content-Length'
-# $hContentLocation = 'Content-Location'
-# $hContentRange = 'Content-Range'
-
-$hAccept = 'Accept'
-$hAcceptCharset = 'Accept-Charset'
-$hAcceptEncoding = 'Accept-Encoding'
-$hAcceptRanges = 'Accept-Ranges'
-
-$headers = { "User-Agent" => "#{SOH_NAME}/Fuseki #{SOH_VERSION}"}
-$print_http = false
-
-# Default for GET
-# At least allow anythign (and hope!)
-$accept_rdf="#{$mtRDF};q=0.9 , #{$mtTurtle}"
-# For SPARQL query
-$accept_results="#{$mtSparqlResultsJ} , #{$mtSparqlResultsX};q=0.9 , #{$accept_rdf}"
-
-# Accept any in case of trouble.
-$accept_rdf="#{$accept_rdf} , */*;q=0.1"
-$accept_results="#{$accept_results} , */*;q=0.1"
-
-# The media type usually forces the charset.
-$accept_charset=nil
-
-## Who we are.
-## Two styles:
-## s-query .....
-## soh query .....
-
-$cmd = File.basename($0)
-if $cmd == 'soh'
-then
- $cmd = (ARGV.size == 0) ? 'soh' : ARGV.shift
-end
-
-if ! $cmd.start_with?('s-') && $cmd != 'soh'
- $cmd = 's-'+$cmd
-end
-
-## --------
-
-def GET(dataset, graph)
- print "GET #{dataset} #{graph}\n" if $verbose
- requestURI = target(dataset, graph)
- headers = {}
- headers.merge!($headers)
- headers[$hAccept] = $accept_rdf
- headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
- get_worker(requestURI, headers)
-end
-
-def get_worker(requestURI, headers)
- uri = URI.parse(requestURI)
- request = Net::HTTP::Get.new(uri.request_uri)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- response_print_body(uri, request)
-end
-
-def HEAD(dataset, graph)
- print "HEAD #{dataset} #{graph}\n" if $verbose
- requestURI = target(dataset, graph)
- headers = {}
- headers.merge!($headers)
- headers[$hAccept] = $accept_rdf
- headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
- uri = URI.parse(requestURI)
- request = Net::HTTP::Head.new(uri.request_uri)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def PUT(dataset, graph, file)
- print "PUT #{dataset} #{graph} #{file}\n" if $verbose
- send_body(dataset, graph, file, Net::HTTP::Put)
-end
-
-def POST(dataset, graph, file)
- print "POST #{dataset} #{graph} #{file}\n" if $verbose
- send_body(dataset, graph, file, Net::HTTP::Post)
-end
-
-def DELETE(dataset, graph)
- print "DELETE #{dataset} #{graph}\n" if $verbose
- requestURI = target(dataset, graph)
- uri = URI.parse(requestURI)
- request = Net::HTTP::Delete.new(uri.request_uri)
- headers = {}
- headers.merge!($headers)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def uri_escape(string)
- CGI.escape(string)
-end
-
-def target(dataset, graph)
- return dataset+"?default" if graph == "default"
- return dataset+"?graph="+uri_escape(graph)
-end
-
-def send_body(dataset, graph, file, method)
- mt = content_type(file)
- headers = {}
- headers.merge!($headers)
- headers[$hContentType] = mt
- headers[$hContentLength] = File.size(file).to_s
- ## p headers
-
- requestURI = target(dataset, graph)
- uri = URI.parse(requestURI)
-
- request = method.new(uri.request_uri)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- request.body_stream = File.open(file)
- response_no_body(uri, request)
-end
-
-def response_no_body(uri, request)
- http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
- http.read_timeout = nil
- # check we can connect.
- begin http.start
- rescue Exception => e
- # puts e.message
- #puts e.backtrace.inspect
- warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
- end
- response = http.request(request)
- print_http_response(response)
- case response
- when Net::HTTPSuccess, Net::HTTPRedirection
- # OK
- when Net::HTTPNotFound
- warn_exit "404 Not found: #{uri}", 9
- #print response.body
- else
- warn_exit "#{response.code} #{response.message} #{uri}", 9
- # Unreachable
- response.error!
- end
- # NO BODY IN RESPONSE
-end
-
-def response_print_body(uri, request)
- http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
- http.read_timeout = nil
- # check we can connect.
- begin http.start
- rescue => e
- #puts e.backtrace.inspect
- #print e.class
- warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
- end
-
- # Add a blank line if headers were output.
- print "\n" if $http_print ;
-
- begin
- response = http.request(request) { |res|
- print_http_response(res)
- #puts res.code
- res.read_body do |segment|
- print segment
- end
- }
- case response
- when Net::HTTPSuccess, Net::HTTPRedirection
- # OK
- when Net::HTTPNotFound
- warn_exit "404 Not found: #{uri}", 9
- #print response.body
- else
- warn_exit "#{response.code}: #{uri}", 9
- # Unreachable
- response.error!
- end
- rescue EOFError => e
- warn_exit "IO Error: "+e.message, 3
- end
-end
-
-def print_http_request(uri, request)
- return unless $print_http
- #print "Request\n"
- print request.method," ",uri, "\n"
- print_headers(" ",request)
-end
-
-def print_http_response(response)
- return unless $print_http
- #print "Response\n"
- print response.code, " ", response.message, "\n"
- print_headers(" ",response)
-end
-
-def print_headers(marker, headers)
- headers.each do |k,v|
- k = k.split('-').map{|w| w.capitalize}.join('-')+':'
- printf "%s%-20s %s\n",marker,k,v
- end
-end
-
-def content_type(file)
- file =~ /\.([^.]*)$/
- ext = $1
- mt = $fileMediaTypes[ext]
- cs = $charset[mt]
- mt = mt+';charset='+cs if ! cs.nil?
- return mt
-end
-
-def charset(content_type)
- return $charset[content_type]
-end
-
-def warn_exit(msg, rc)
- warn msg
- exit rc ;
-end
-
-def parseURI(uri_string)
- begin
- return URI.parse(uri_string).to_s
- rescue URI::InvalidURIError => err
- warn_exit "Bad URI: <#{uri_string}>", 2
- end
-end
-
-## ---- Command
-
-def cmd_soh(command=nil)
- ## Command line
- options = {}
- optparse = OptionParser.new do |opts|
- # Set a banner, displayed at the top
- # of the help screen.
- case $cmd
- when "s-http", "sparql-http", "soh"
- banner="$cmd [get|post|put|delete] datasetURI graph [file]"
- when "s-get", "s-head", "s-delete"
- banner="$cmd datasetURI graph"
- end
-
- opts.banner = $banner
- # Define the options, and what they do
-
- options[:verbose] = false
- opts.on( '-v', '--verbose', 'Verbose' ) do
- options[:verbose] = true
- end
-
- options[:version] = false
- opts.on( '--version', 'Print version and exit' ) do
- print "#{SOH_NAME} #{SOH_VERSION}\n"
- exit
- end
-
- # This displays the help screen, all programs are
- # assumed to have this option.
- opts.on( '-h', '--help', 'Display this screen and exit' ) do
- puts opts
- exit
- end
- end
-
- begin optparse.parse!
- rescue OptionParser::InvalidArgument => e
- warn e
- exit
- end
-
- $verbose = options[:verbose]
- $print_http = $verbose
-
- if command.nil?
- if ARGV.size == 0
- warn "No command given: expected one of 'get', 'put', 'post', 'delete', 'query' or 'update'"
- exit 1
- end
- cmdPrint=ARGV.shift
- command=cmdPrint.upcase
- else
- cmdPrint=command
- end
-
- case command
- when "HEAD", "GET", "DELETE"
- requiredFile=false
- when "PUT", "POST"
- requiredFile=true
- when "QUERY"
- cmd_sparql_query
- when "UPDATE"
- cmd_sparql_update
- else
- warn_exit "Unknown command: #{command}", 2
- end
-
- if requiredFile
- then
- if ARGV.size != 3
- warn_exit "Required: dataset URI, graph URI (or 'default') and file", 1
- end
- else
- if ARGV.size != 2
- warn_exit "Required: dataset URI and graph URI (or 'default')", 1
- end
- end
-
- dataset=parseURI(ARGV.shift)
- # Relative URI?
- graph=parseURI(ARGV.shift)
- file=""
- if requiredFile
- then
- file = ARGV.shift if requiredFile
- if ! File.exist?(file)
- warn_exit "No such file: "+file, 3
- end
- if File.directory?(file)
- warn_exit "File is a directory: "+file, 3
- end
- end
-
- case command
- when "GET"
- GET(dataset, graph)
- when "HEAD"
- HEAD(dataset, graph)
- when "PUT"
- PUT(dataset, graph, file)
- when "DELETE"
- DELETE(dataset, graph)
- when "POST"
- POST(dataset, graph, file)
- else
- warn_exit "Internal error: Unknown command: #{cmd}", 2
- end
- exit 0
-end
-
-## --------
-def string_or_file(arg)
- return arg if ! arg.match(/^@/)
- a=(arg[1..-1])
- open(a, 'rb'){|f| f.read}
-end
-
-## -------- SPARQL Query
-
-## Choose method
-def SPARQL_query(service, query, query_file, forcePOST=false, args2={})
- if ! query_file.nil?
- query = open(query_file, 'rb'){|f| f.read}
- end
- if forcePOST || query.length >= 2*1024
- SPARQL_query_POST(service, query, args2)
- else
- SPARQL_query_GET(service, query, args2)
- end
-end
-
-## By GET
-
-def SPARQL_query_GET(service, query, args2)
- args = { "query" => query }
- args.merge!(args2)
- qs=args.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
- action="#{service}?#{qs}"
- headers={}
- headers.merge!($headers)
- headers[$hAccept]=$accept_results
- get_worker(action, headers)
-end
-
-## By POST
-
-def SPARQL_query_POST(service, query, args2)
- # DRY - body/no body for each of request and response.
- post_params={ "query" => query }
- post_params.merge!(args2)
- uri = URI.parse(service)
- headers={}
- headers.merge!($headers)
- headers[$hAccept]=$accept_results
- execute_post_form_body(uri, headers, post_params)
-end
-
-def execute_post_form_body(uri, headers, post_params)
- request = Net::HTTP::Post.new(uri.request_uri)
- qs=post_params.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
- headers[$hContentType] = $mtWWWForm
- headers[$hContentLength] = qs.length.to_s
- request.initialize_http_header(headers)
- request.body = qs
- print_http_request(uri, request)
- response_print_body(uri, request)
-end
-
-# Usage: -v --help --file= --query=
-def cmd_sparql_query
- options={}
- optparse = OptionParser.new do |opts|
- opts.banner = "Usage: #{$cmd} [--query QUERY] [--service URI] [--post] 'query' | @file"
- opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
- options[:service]=uri
- end
- opts.on('--query=FILE','--file=FILE', 'Take query from a file') do |file|
- options[:file]=file
- end
- opts.on('--output=TYPE', [:json,:xml,:text,:csv,:tsv],
- 'Set the output argument') do |type|
- options[:output]=type
- end
- opts.on('--accept=TYPE', [:json,:xml,:text,:csv,:tsv],
- 'Set the accept header type') do |type|
- options[:accept]=type
- end
- options[:verbose] = false
- opts.on( '--post', 'Force use of POST' ) do
- options[:post] = true
- end
- opts.on( '-v', '--verbose', 'Verbose' ) do
- options[:verbose] = true
- end
- opts.on( '--version', 'Print version and exit' ) do
- print "#{SOH_NAME} #{SOH_VERSION}\n"
- exit
- end
- opts.on( '-h', '--help', 'Display this screen and exit' ) do
- puts opts
- exit
- end
- end
-
- begin optparse.parse!
- rescue OptionParser::InvalidArgument, OptionParser::InvalidOption => e
- warn e
- exit 1
- end
-
- $verbose = options[:verbose]
- $print_http = $verbose
- usePOST = options[:post]
-
- service = options[:service]
- warn_exit 'No service specified. Required --service=URI',1 if service.nil?
-
- # Query
- query=nil
- query_file=options[:file]
- if query_file.nil? && ARGV.size == 0
- then
- warn_exit 'No query specified.',1
- end
- if query_file.nil?
- query = ARGV.shift
- if query.match(/^@/)
- query_file = query[1..-1]
- query = nil
- end
- end
-
- # --output ==> output= (non-standard)
- args={}
- case options[:output]
- when nil
- when "json","xml","text","csv","tsv"
- args['output'] = options[:output]
- when :json,:xml,:text,:csv,:tsv
- args['output'] = options[:output].to_s
- else
- warn_exit "Unrecognized output type: "+options[:output],2
- end
-
- # --accept
- # options[:accept]
-
- print "SPARQL #{service}\n" if $verbose
- #args={"output"=>"text"}
- SPARQL_query(service, query, query_file, usePOST, args)
- exit(0)
-end
-
-## -------- SPARQL Update
-
-# Update sent as a WWW form.
-def SPARQL_update_by_form(service, update, args2={})
- args = {}
- args.merge!(args2)
- headers={}
- headers.merge!($headers)
- # args? encode?
- body="update="+uri_escape(update)
- headers[$hContentType] = $mtWWWForm
- headers[$hContentLength] = body.length.to_s
- uri = URI.parse(service)
- execute_post_form(uri, headers, body)
-end
-
-# DRY - query form.
-def execute_post_form(uri, headers, body)
- request = Net::HTTP::Post.new(uri.request_uri)
- request.initialize_http_header(headers)
- request.body = body
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def SPARQL_update(service, update, args2={})
- args = {}
- args.merge!(args2)
- headers={}
- headers.merge!($headers)
- headers[$hContentType] = $mtSparqlUpdate
- uri = URI.parse(service)
- request = Net::HTTP::Post.new(uri.request_uri)
- request.initialize_http_header(headers)
- request.body = update
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def cmd_sparql_update(by_raw_post=true)
- # Share with cmd_sparql_query
- options={}
- optparse = OptionParser.new do |opts|
- opts.banner = "Usage: #{$cmd} [--file REQUEST] [--service URI] 'request' | @file"
- opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
- options[:service]=uri
- end
- opts.on('--update=FILE', '--file=FILE', 'Take update from a file') do |file|
- options[:file]=file
- end
- options[:verbose] = false
- opts.on( '-v', '--verbose', 'Verbose' ) do
- options[:verbose] = true
- end
- opts.on( '--version', 'Print version and exit' ) do
- print "#{SOH_NAME} #{SOH_VERSION}\n"
- exit
- end
- opts.on( '-h', '--help', 'Display this screen and exit' ) do
- puts opts
- exit
- end
- end
-
- begin optparse.parse!
- rescue OptionParser::InvalidArgument => e
- warn e
- exit
- end
-
- $verbose = options[:verbose]
- $print_http = $verbose
-
- service = options[:service]
- warn_exit 'No service specified. Required --service=URI',1 if service.nil?
-
- update=nil
- update_file=options[:file]
-
- if update_file.nil? && ARGV.size == 0
- then
- warn_exit 'No update specified.',1
- end
- if update_file.nil?
- update = ARGV.shift
- if update.match(/^@/)
- update_file = update[1..-1]
- update = nil
- end
- end
-
- print "SPARQL-Update #{service}\n" if $verbose
- args={}
-
- # Reads in the file :-(
- if update.nil?
- then
- update = open(update_file, 'rb'){|f| f.read}
- else
- update = string_or_file(update)
- end
-
- if by_raw_post
- SPARQL_update(service, update, args)
- else
- SPARQL_update_by_form(service, update, args)
- end
- exit(0)
-end
-
-## -------
-
-case $cmd
-when "s-http", "sparql-http", "soh"
- $banner="#{$cmd} [get|post|put|delete] datasetURI graph [file]"
- cmd_soh
-when "s-get", "s-head", "s-put", "s-delete", "s-post"
-
- case $cmd
- when "s-get", "s-head", "s-delete"
- $banner="#{$cmd} datasetURI graph"
- when "s-put", "s-post"
- $banner="#{$cmd} datasetURI graph file"
- end
- cmd2 = $cmd.sub(/^s-/, '').upcase
- cmd_soh cmd2
-
-when "s-query", "sparql-query"
- cmd_sparql_query
-when "s-update", "sparql-update"
- cmd_sparql_update true
-when "s-update-form", "sparql-update-form"
- cmd_sparql_update false
-else
- warn_exit "Unknown: "+$cmd, 1
-end
http://git-wip-us.apache.org/repos/asf/jena/blob/02286cf3/jena-fuseki2/jena-fuseki-dist/bin/s-post
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-dist/bin/s-post b/jena-fuseki2/jena-fuseki-dist/bin/s-post
deleted file mode 100755
index 0e3a807..0000000
--- a/jena-fuseki2/jena-fuseki-dist/bin/s-post
+++ /dev/null
@@ -1,707 +0,0 @@
-#!/usr/bin/env ruby
-# -*- coding: utf-8 -*-
-
-# 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.
-
-# SPARQL HTTP Update, client.
-
-require 'optparse'
-require 'net/http'
-require 'uri'
-require 'cgi'
-require 'pp'
-require 'ostruct'
-
-# ToDo
-# Allow a choice of media type for GET
-# --accept "content-type" (and abbreviations)
-# --header "Add:this"
-# --user, --password
-# Basic authentication: request.basic_auth("username", "password")
-# Follow redirects => 301: puts response["location"] # All headers are lowercase?
-
-SOH_NAME="SOH"
-SOH_VERSION="0.0.0"
-
-$proxy = ENV['http_proxy'] ? URI.parse(ENV['http_proxy']) : OpenStruct.new
-
-# What about direct naming?
-
-# Names
-$mtTurtle = 'text/turtle;charset=utf-8'
-$mtRDF = 'application/rdf+xml'
-$mtText = 'text/plain'
-$mtNQuads = 'text/n-quads'
-$mtTriG = 'application/trig'
-$mtSparqlResultsX = 'application/sparql-results+xml'
-$mtSparqlResultsJ = 'application/sparql-results+json'
-$mtAppJSON = 'application/json'
-$mtAppXML = 'application/xml'
-$mtSparqlResultsTSV = 'application/sparql-results+tsv'
-$mtSparqlResultsCSV = 'application/sparql-results+csv'
-$mtSparqlUpdate = 'application/sparql-update'
-$mtWWWForm = 'application/x-www-form-urlencoded'
-$mtSparqlQuery = "application/sparql-query" ;
-
-# Global media type table.
-$fileMediaTypes = {}
-$fileMediaTypes['ttl'] = $mtTurtle
-$fileMediaTypes['n3'] = 'text/n3; charset=utf-8'
-$fileMediaTypes['nt'] = $mtText
-$fileMediaTypes['rdf'] = $mtRDF
-$fileMediaTypes['owl'] = $mtRDF
-$fileMediaTypes['nq'] = $mtNQuads
-$fileMediaTypes['trig'] = $mtTriG
-
-# Global charset : no entry means "don't set"
-$charsetUTF8 = 'utf-8'
-$charset = {}
-$charset[$mtTurtle] = 'utf-8'
-$charset[$mtText] = 'ascii'
-$charset[$mtTriG] = 'utf-8'
-$charset[$mtNQuads] = 'ascii'
-
-# Headers
-
-$hContentType = 'Content-Type'
-# $hContentEncoding = 'Content-Encoding'
-$hContentLength = 'Content-Length'
-# $hContentLocation = 'Content-Location'
-# $hContentRange = 'Content-Range'
-
-$hAccept = 'Accept'
-$hAcceptCharset = 'Accept-Charset'
-$hAcceptEncoding = 'Accept-Encoding'
-$hAcceptRanges = 'Accept-Ranges'
-
-$headers = { "User-Agent" => "#{SOH_NAME}/Fuseki #{SOH_VERSION}"}
-$print_http = false
-
-# Default for GET
-# At least allow anythign (and hope!)
-$accept_rdf="#{$mtRDF};q=0.9 , #{$mtTurtle}"
-# For SPARQL query
-$accept_results="#{$mtSparqlResultsJ} , #{$mtSparqlResultsX};q=0.9 , #{$accept_rdf}"
-
-# Accept any in case of trouble.
-$accept_rdf="#{$accept_rdf} , */*;q=0.1"
-$accept_results="#{$accept_results} , */*;q=0.1"
-
-# The media type usually forces the charset.
-$accept_charset=nil
-
-## Who we are.
-## Two styles:
-## s-query .....
-## soh query .....
-
-$cmd = File.basename($0)
-if $cmd == 'soh'
-then
- $cmd = (ARGV.size == 0) ? 'soh' : ARGV.shift
-end
-
-if ! $cmd.start_with?('s-') && $cmd != 'soh'
- $cmd = 's-'+$cmd
-end
-
-## --------
-
-def GET(dataset, graph)
- print "GET #{dataset} #{graph}\n" if $verbose
- requestURI = target(dataset, graph)
- headers = {}
- headers.merge!($headers)
- headers[$hAccept] = $accept_rdf
- headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
- get_worker(requestURI, headers)
-end
-
-def get_worker(requestURI, headers)
- uri = URI.parse(requestURI)
- request = Net::HTTP::Get.new(uri.request_uri)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- response_print_body(uri, request)
-end
-
-def HEAD(dataset, graph)
- print "HEAD #{dataset} #{graph}\n" if $verbose
- requestURI = target(dataset, graph)
- headers = {}
- headers.merge!($headers)
- headers[$hAccept] = $accept_rdf
- headers[$hAcceptCharset] = $accept_charset unless $accept_charset.nil?
- uri = URI.parse(requestURI)
- request = Net::HTTP::Head.new(uri.request_uri)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def PUT(dataset, graph, file)
- print "PUT #{dataset} #{graph} #{file}\n" if $verbose
- send_body(dataset, graph, file, Net::HTTP::Put)
-end
-
-def POST(dataset, graph, file)
- print "POST #{dataset} #{graph} #{file}\n" if $verbose
- send_body(dataset, graph, file, Net::HTTP::Post)
-end
-
-def DELETE(dataset, graph)
- print "DELETE #{dataset} #{graph}\n" if $verbose
- requestURI = target(dataset, graph)
- uri = URI.parse(requestURI)
- request = Net::HTTP::Delete.new(uri.request_uri)
- headers = {}
- headers.merge!($headers)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def uri_escape(string)
- CGI.escape(string)
-end
-
-def target(dataset, graph)
- return dataset+"?default" if graph == "default"
- return dataset+"?graph="+uri_escape(graph)
-end
-
-def send_body(dataset, graph, file, method)
- mt = content_type(file)
- headers = {}
- headers.merge!($headers)
- headers[$hContentType] = mt
- headers[$hContentLength] = File.size(file).to_s
- ## p headers
-
- requestURI = target(dataset, graph)
- uri = URI.parse(requestURI)
-
- request = method.new(uri.request_uri)
- request.initialize_http_header(headers)
- print_http_request(uri, request)
- request.body_stream = File.open(file)
- response_no_body(uri, request)
-end
-
-def response_no_body(uri, request)
- http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
- http.read_timeout = nil
- # check we can connect.
- begin http.start
- rescue Exception => e
- # puts e.message
- #puts e.backtrace.inspect
- warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
- end
- response = http.request(request)
- print_http_response(response)
- case response
- when Net::HTTPSuccess, Net::HTTPRedirection
- # OK
- when Net::HTTPNotFound
- warn_exit "404 Not found: #{uri}", 9
- #print response.body
- else
- warn_exit "#{response.code} #{response.message} #{uri}", 9
- # Unreachable
- response.error!
- end
- # NO BODY IN RESPONSE
-end
-
-def response_print_body(uri, request)
- http = Net::HTTP::Proxy($proxy.host,$proxy.port).new(uri.host, uri.port)
- http.read_timeout = nil
- # check we can connect.
- begin http.start
- rescue => e
- #puts e.backtrace.inspect
- #print e.class
- warn_exit "Failed to connect: #{uri.host}:#{uri.port}: #{e.message}", 3
- end
-
- # Add a blank line if headers were output.
- print "\n" if $http_print ;
-
- begin
- response = http.request(request) { |res|
- print_http_response(res)
- #puts res.code
- res.read_body do |segment|
- print segment
- end
- }
- case response
- when Net::HTTPSuccess, Net::HTTPRedirection
- # OK
- when Net::HTTPNotFound
- warn_exit "404 Not found: #{uri}", 9
- #print response.body
- else
- warn_exit "#{response.code}: #{uri}", 9
- # Unreachable
- response.error!
- end
- rescue EOFError => e
- warn_exit "IO Error: "+e.message, 3
- end
-end
-
-def print_http_request(uri, request)
- return unless $print_http
- #print "Request\n"
- print request.method," ",uri, "\n"
- print_headers(" ",request)
-end
-
-def print_http_response(response)
- return unless $print_http
- #print "Response\n"
- print response.code, " ", response.message, "\n"
- print_headers(" ",response)
-end
-
-def print_headers(marker, headers)
- headers.each do |k,v|
- k = k.split('-').map{|w| w.capitalize}.join('-')+':'
- printf "%s%-20s %s\n",marker,k,v
- end
-end
-
-def content_type(file)
- file =~ /\.([^.]*)$/
- ext = $1
- mt = $fileMediaTypes[ext]
- cs = $charset[mt]
- mt = mt+';charset='+cs if ! cs.nil?
- return mt
-end
-
-def charset(content_type)
- return $charset[content_type]
-end
-
-def warn_exit(msg, rc)
- warn msg
- exit rc ;
-end
-
-def parseURI(uri_string)
- begin
- return URI.parse(uri_string).to_s
- rescue URI::InvalidURIError => err
- warn_exit "Bad URI: <#{uri_string}>", 2
- end
-end
-
-## ---- Command
-
-def cmd_soh(command=nil)
- ## Command line
- options = {}
- optparse = OptionParser.new do |opts|
- # Set a banner, displayed at the top
- # of the help screen.
- case $cmd
- when "s-http", "sparql-http", "soh"
- banner="$cmd [get|post|put|delete] datasetURI graph [file]"
- when "s-get", "s-head", "s-delete"
- banner="$cmd datasetURI graph"
- end
-
- opts.banner = $banner
- # Define the options, and what they do
-
- options[:verbose] = false
- opts.on( '-v', '--verbose', 'Verbose' ) do
- options[:verbose] = true
- end
-
- options[:version] = false
- opts.on( '--version', 'Print version and exit' ) do
- print "#{SOH_NAME} #{SOH_VERSION}\n"
- exit
- end
-
- # This displays the help screen, all programs are
- # assumed to have this option.
- opts.on( '-h', '--help', 'Display this screen and exit' ) do
- puts opts
- exit
- end
- end
-
- begin optparse.parse!
- rescue OptionParser::InvalidArgument => e
- warn e
- exit
- end
-
- $verbose = options[:verbose]
- $print_http = $verbose
-
- if command.nil?
- if ARGV.size == 0
- warn "No command given: expected one of 'get', 'put', 'post', 'delete', 'query' or 'update'"
- exit 1
- end
- cmdPrint=ARGV.shift
- command=cmdPrint.upcase
- else
- cmdPrint=command
- end
-
- case command
- when "HEAD", "GET", "DELETE"
- requiredFile=false
- when "PUT", "POST"
- requiredFile=true
- when "QUERY"
- cmd_sparql_query
- when "UPDATE"
- cmd_sparql_update
- else
- warn_exit "Unknown command: #{command}", 2
- end
-
- if requiredFile
- then
- if ARGV.size != 3
- warn_exit "Required: dataset URI, graph URI (or 'default') and file", 1
- end
- else
- if ARGV.size != 2
- warn_exit "Required: dataset URI and graph URI (or 'default')", 1
- end
- end
-
- dataset=parseURI(ARGV.shift)
- # Relative URI?
- graph=parseURI(ARGV.shift)
- file=""
- if requiredFile
- then
- file = ARGV.shift if requiredFile
- if ! File.exist?(file)
- warn_exit "No such file: "+file, 3
- end
- if File.directory?(file)
- warn_exit "File is a directory: "+file, 3
- end
- end
-
- case command
- when "GET"
- GET(dataset, graph)
- when "HEAD"
- HEAD(dataset, graph)
- when "PUT"
- PUT(dataset, graph, file)
- when "DELETE"
- DELETE(dataset, graph)
- when "POST"
- POST(dataset, graph, file)
- else
- warn_exit "Internal error: Unknown command: #{cmd}", 2
- end
- exit 0
-end
-
-## --------
-def string_or_file(arg)
- return arg if ! arg.match(/^@/)
- a=(arg[1..-1])
- open(a, 'rb'){|f| f.read}
-end
-
-## -------- SPARQL Query
-
-## Choose method
-def SPARQL_query(service, query, query_file, forcePOST=false, args2={})
- if ! query_file.nil?
- query = open(query_file, 'rb'){|f| f.read}
- end
- if forcePOST || query.length >= 2*1024
- SPARQL_query_POST(service, query, args2)
- else
- SPARQL_query_GET(service, query, args2)
- end
-end
-
-## By GET
-
-def SPARQL_query_GET(service, query, args2)
- args = { "query" => query }
- args.merge!(args2)
- qs=args.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
- action="#{service}?#{qs}"
- headers={}
- headers.merge!($headers)
- headers[$hAccept]=$accept_results
- get_worker(action, headers)
-end
-
-## By POST
-
-def SPARQL_query_POST(service, query, args2)
- # DRY - body/no body for each of request and response.
- post_params={ "query" => query }
- post_params.merge!(args2)
- uri = URI.parse(service)
- headers={}
- headers.merge!($headers)
- headers[$hAccept]=$accept_results
- execute_post_form_body(uri, headers, post_params)
-end
-
-def execute_post_form_body(uri, headers, post_params)
- request = Net::HTTP::Post.new(uri.request_uri)
- qs=post_params.collect { |k,v| "#{k}=#{uri_escape(v)}" }.join('&')
- headers[$hContentType] = $mtWWWForm
- headers[$hContentLength] = qs.length.to_s
- request.initialize_http_header(headers)
- request.body = qs
- print_http_request(uri, request)
- response_print_body(uri, request)
-end
-
-# Usage: -v --help --file= --query=
-def cmd_sparql_query
- options={}
- optparse = OptionParser.new do |opts|
- opts.banner = "Usage: #{$cmd} [--query QUERY] [--service URI] [--post] 'query' | @file"
- opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
- options[:service]=uri
- end
- opts.on('--query=FILE','--file=FILE', 'Take query from a file') do |file|
- options[:file]=file
- end
- opts.on('--output=TYPE', [:json,:xml,:text,:csv,:tsv],
- 'Set the output argument') do |type|
- options[:output]=type
- end
- opts.on('--accept=TYPE', [:json,:xml,:text,:csv,:tsv],
- 'Set the accept header type') do |type|
- options[:accept]=type
- end
- options[:verbose] = false
- opts.on( '--post', 'Force use of POST' ) do
- options[:post] = true
- end
- opts.on( '-v', '--verbose', 'Verbose' ) do
- options[:verbose] = true
- end
- opts.on( '--version', 'Print version and exit' ) do
- print "#{SOH_NAME} #{SOH_VERSION}\n"
- exit
- end
- opts.on( '-h', '--help', 'Display this screen and exit' ) do
- puts opts
- exit
- end
- end
-
- begin optparse.parse!
- rescue OptionParser::InvalidArgument, OptionParser::InvalidOption => e
- warn e
- exit 1
- end
-
- $verbose = options[:verbose]
- $print_http = $verbose
- usePOST = options[:post]
-
- service = options[:service]
- warn_exit 'No service specified. Required --service=URI',1 if service.nil?
-
- # Query
- query=nil
- query_file=options[:file]
- if query_file.nil? && ARGV.size == 0
- then
- warn_exit 'No query specified.',1
- end
- if query_file.nil?
- query = ARGV.shift
- if query.match(/^@/)
- query_file = query[1..-1]
- query = nil
- end
- end
-
- # --output ==> output= (non-standard)
- args={}
- case options[:output]
- when nil
- when "json","xml","text","csv","tsv"
- args['output'] = options[:output]
- when :json,:xml,:text,:csv,:tsv
- args['output'] = options[:output].to_s
- else
- warn_exit "Unrecognized output type: "+options[:output],2
- end
-
- # --accept
- # options[:accept]
-
- print "SPARQL #{service}\n" if $verbose
- #args={"output"=>"text"}
- SPARQL_query(service, query, query_file, usePOST, args)
- exit(0)
-end
-
-## -------- SPARQL Update
-
-# Update sent as a WWW form.
-def SPARQL_update_by_form(service, update, args2={})
- args = {}
- args.merge!(args2)
- headers={}
- headers.merge!($headers)
- # args? encode?
- body="update="+uri_escape(update)
- headers[$hContentType] = $mtWWWForm
- headers[$hContentLength] = body.length.to_s
- uri = URI.parse(service)
- execute_post_form(uri, headers, body)
-end
-
-# DRY - query form.
-def execute_post_form(uri, headers, body)
- request = Net::HTTP::Post.new(uri.request_uri)
- request.initialize_http_header(headers)
- request.body = body
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def SPARQL_update(service, update, args2={})
- args = {}
- args.merge!(args2)
- headers={}
- headers.merge!($headers)
- headers[$hContentType] = $mtSparqlUpdate
- uri = URI.parse(service)
- request = Net::HTTP::Post.new(uri.request_uri)
- request.initialize_http_header(headers)
- request.body = update
- print_http_request(uri, request)
- response_no_body(uri, request)
-end
-
-def cmd_sparql_update(by_raw_post=true)
- # Share with cmd_sparql_query
- options={}
- optparse = OptionParser.new do |opts|
- opts.banner = "Usage: #{$cmd} [--file REQUEST] [--service URI] 'request' | @file"
- opts.on('--service=URI', '--server=URI', 'SPARQL endpoint') do |uri|
- options[:service]=uri
- end
- opts.on('--update=FILE', '--file=FILE', 'Take update from a file') do |file|
- options[:file]=file
- end
- options[:verbose] = false
- opts.on( '-v', '--verbose', 'Verbose' ) do
- options[:verbose] = true
- end
- opts.on( '--version', 'Print version and exit' ) do
- print "#{SOH_NAME} #{SOH_VERSION}\n"
- exit
- end
- opts.on( '-h', '--help', 'Display this screen and exit' ) do
- puts opts
- exit
- end
- end
-
- begin optparse.parse!
- rescue OptionParser::InvalidArgument => e
- warn e
- exit
- end
-
- $verbose = options[:verbose]
- $print_http = $verbose
-
- service = options[:service]
- warn_exit 'No service specified. Required --service=URI',1 if service.nil?
-
- update=nil
- update_file=options[:file]
-
- if update_file.nil? && ARGV.size == 0
- then
- warn_exit 'No update specified.',1
- end
- if update_file.nil?
- update = ARGV.shift
- if update.match(/^@/)
- update_file = update[1..-1]
- update = nil
- end
- end
-
- print "SPARQL-Update #{service}\n" if $verbose
- args={}
-
- # Reads in the file :-(
- if update.nil?
- then
- update = open(update_file, 'rb'){|f| f.read}
- else
- update = string_or_file(update)
- end
-
- if by_raw_post
- SPARQL_update(service, update, args)
- else
- SPARQL_update_by_form(service, update, args)
- end
- exit(0)
-end
-
-## -------
-
-case $cmd
-when "s-http", "sparql-http", "soh"
- $banner="#{$cmd} [get|post|put|delete] datasetURI graph [file]"
- cmd_soh
-when "s-get", "s-head", "s-put", "s-delete", "s-post"
-
- case $cmd
- when "s-get", "s-head", "s-delete"
- $banner="#{$cmd} datasetURI graph"
- when "s-put", "s-post"
- $banner="#{$cmd} datasetURI graph file"
- end
- cmd2 = $cmd.sub(/^s-/, '').upcase
- cmd_soh cmd2
-
-when "s-query", "sparql-query"
- cmd_sparql_query
-when "s-update", "sparql-update"
- cmd_sparql_update true
-when "s-update-form", "sparql-update-form"
- cmd_sparql_update false
-else
- warn_exit "Unknown: "+$cmd, 1
-end