http://git-wip-us.apache.org/repos/asf/jena/blob/470ee4d7/jena-fuseki2/dist/NOTICE ---------------------------------------------------------------------- diff --git a/jena-fuseki2/dist/NOTICE b/jena-fuseki2/dist/NOTICE deleted file mode 100644 index a840c0b..0000000 --- a/jena-fuseki2/dist/NOTICE +++ /dev/null @@ -1,216 +0,0 @@ -Apache Jena - module Fuseki -Copyright 2011-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: - - 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/470ee4d7/jena-fuseki2/dwim ---------------------------------------------------------------------- diff --git a/jena-fuseki2/dwim b/jena-fuseki2/dwim deleted file mode 100755 index a541688..0000000 --- a/jena-fuseki2/dwim +++ /dev/null @@ -1,19 +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. - -curl -XPOST --header "Content-type: text/trig" --data-binary @D.trig \ - http://localhost:3030/ds/data http://git-wip-us.apache.org/repos/asf/jena/blob/470ee4d7/jena-fuseki2/dwim-upload ---------------------------------------------------------------------- diff --git a/jena-fuseki2/dwim-upload b/jena-fuseki2/dwim-upload deleted file mode 100755 index 903561d..0000000 --- a/jena-fuseki2/dwim-upload +++ /dev/null @@ -1,48 +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. - -# How to do a file upload in curl - -# GSP strict -U='http://localhost:3030/ds/data?graph=http://example/G' -# PUT -## curl --upload-file D.ttl --header 'Content-Type: text/turtle' "$U" - -# POST -curl -XPOST --upload-file D.ttl --header 'Content-Type: text/turtle' "$U" - -# GSP strict / file upload -## curl -F '[email protected]' http://localhost:3030/ds/data - -# Quads to GSP - -## curl -F '[email protected]' http://localhost:3030/ds/data -## curl -F '[email protected]' http://localhost:3030/ds/data - -# Quads to graph : NGs in data ignored -# curl -F '[email protected]' 'http://localhost:3030/ds/data?default' -#curl -F '[email protected]' 'http://localhost:3030/ds/data?graph=http://example/G' - -# Dataset -## curl -F '[email protected]' http://localhost:3030/ds - -# Upload service -## curl -F '[email protected]' -F 'name=http://graph/' 'http://localhost:3030/ds/upload' - - -echo "==== Dataset" -curl http://localhost:3030/ds http://git-wip-us.apache.org/repos/asf/jena/blob/470ee4d7/jena-fuseki2/fuseki ---------------------------------------------------------------------- diff --git a/jena-fuseki2/fuseki b/jena-fuseki2/fuseki deleted file mode 100644 index 9cc1fe8..0000000 --- a/jena-fuseki2/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/470ee4d7/jena-fuseki2/fuseki-server ---------------------------------------------------------------------- diff --git a/jena-fuseki2/fuseki-server b/jena-fuseki2/fuseki-server deleted file mode 100755 index 679b3bd..0000000 --- a/jena-fuseki2/fuseki-server +++ /dev/null @@ -1,64 +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" "$@" http://git-wip-us.apache.org/repos/asf/jena/blob/470ee4d7/jena-fuseki2/fuseki-server.bat ---------------------------------------------------------------------- diff --git a/jena-fuseki2/fuseki-server.bat b/jena-fuseki2/fuseki-server.bat deleted file mode 100644 index 5881660..0000000 --- a/jena-fuseki2/fuseki-server.bat +++ /dev/null @@ -1,19 +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 %* http://git-wip-us.apache.org/repos/asf/jena/blob/470ee4d7/jena-fuseki2/jena-fuseki-core/pom.xml ---------------------------------------------------------------------- diff --git a/jena-fuseki2/jena-fuseki-core/pom.xml b/jena-fuseki2/jena-fuseki-core/pom.xml new file mode 100644 index 0000000..efe35ec --- /dev/null +++ b/jena-fuseki2/jena-fuseki-core/pom.xml @@ -0,0 +1,301 @@ +<?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> + <parent> + <groupId>org.apache.jena</groupId> + <artifactId>jena-fuseki</artifactId> + <version>2.0.0-SNAPSHOT</version> + <relativePath>../</relativePath> + </parent> + + <name>Apache Jena Fuseki - Server engine</name> + <artifactId>jena-fuseki-core</artifactId> + + <!-- We make the JAR file so that the shade plugin includes it. + The war:war goal is added to the package phase. + --> + <packaging>jar</packaging> + <description>Fuseki is a SPARQL 1.1 Server which provides query, update and graph store protocol endpoints that can be used to expose triple stores over HTTP</description> + <url>http://jena.apache.org/</url> + + + <!-- Need if the parent is a snapshot --> + <repositories> + <repository> + <id>apache.snapshots</id> + <name>Apache Snapshot Repository</name> + <url>http://repository.apache.org/snapshots</url> + <releases> + <enabled>false</enabled> + </releases> + </repository> + </repositories> + + <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> + <this.root>${project.artifactId}-${project.version}</this.root> + + <server.jar.name>${this.root}-server</server.jar.name> + <!-- Eventually, move to jena-parent --> + <ver.jetty>9.1.1.v20140108</ver.jetty> + <ver.shiro>1.2.2</ver.shiro> + + <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-arq</artifactId> + <version>2.12.2-SNAPSHOT</version> + </dependency> + + <dependency> + <groupId>org.apache.jena</groupId> + <artifactId>jena-arq</artifactId> + <version>2.12.2-SNAPSHOT</version> + <classifier>tests</classifier> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.apache.jena</groupId> + <artifactId>jena-core</artifactId> + <version>2.12.2-SNAPSHOT</version> + </dependency> + + <dependency> + <groupId>org.apache.jena</groupId> + <artifactId>jena-tdb</artifactId> + <version>1.1.2-SNAPSHOT</version> + </dependency> + + <!-- + <dependency> + <groupId>org.apache.jena</groupId> + <artifactId>sdb</artifactId> + <version>${ver.sdb}</version> + <optional>true</optional> + </dependency> + --> + + <dependency> + <groupId>org.apache.jena</groupId> + <artifactId>jena-text</artifactId> + <version>1.1.2-SNAPSHOT</version> + <exclusions> + <!-- + Get this via commons-fileupload and also via jena-text/sol4j + --> + <exclusion> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + </exclusion> + </exclusions> + </dependency> + + <dependency> + <groupId>org.apache.jena</groupId> + <artifactId>jena-spatial</artifactId> + <version>1.1.2-SNAPSHOT</version> + </dependency> + + <dependency> + <groupId>org.apache.shiro</groupId> + <artifactId>shiro-core</artifactId> + <version>${ver.shiro}</version> + </dependency> + + <dependency> + <groupId>org.apache.shiro</groupId> + <artifactId>shiro-web</artifactId> + <version>${ver.shiro}</version> + </dependency> + + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.apache.httpcomponents</groupId> + <artifactId>httpclient</artifactId> + <exclusions> + <!-- Replace with slf4j adapter --> + <exclusion> + <groupId>commons-logging</groupId> + <artifactId>commons-logging</artifactId> + </exclusion> + </exclusions> + </dependency> + + <dependency> + <groupId>commons-fileupload</groupId> + <artifactId>commons-fileupload</artifactId> + </dependency> + + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-webapp</artifactId> + <version>${ver.jetty}</version> + </dependency> + + + <!-- + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-runner</artifactId> + <version>${ver.jetty}</version> + </dependency> + --> + + <!-- Development and standalone jar (if built) --> + <!-- Jetty's useful servlets, inc compression --> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-servlets</artifactId> + <version>${ver.jetty}</version> + </dependency> + + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + </dependency> + + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-log4j12</artifactId> + </dependency> + + <!-- Intercept any uses of Jakarta Commons Logging e.g. Apache Common HTTP client. --> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>jcl-over-slf4j</artifactId> + </dependency> + + <!-- Needed because the Fuseki command line and the test suite reset logging levels --> + <dependency> + <groupId>log4j</groupId> + <artifactId>log4j</artifactId> + <exclusions> + <exclusion> + <groupId>javax.jms</groupId> + <artifactId>jms</artifactId> + </exclusion> + <exclusion> + <groupId>com.sun.jdmk</groupId> + <artifactId>jmxtools</artifactId> + </exclusion> + <exclusion> + <groupId>com.sun.jmx</groupId> + <artifactId>jmxri</artifactId> + </exclusion> + <exclusion> + <groupId>javax.mail</groupId> + <artifactId>mail</artifactId> + </exclusion> + </exclusions> + </dependency> + </dependencies> + + <build> + <resources> + <resource> + <filtering>false</filtering> + <directory>src/main/resources</directory> + <excludes> + <exclude>org/apache/jena/fuseki/fuseki-properties.xml</exclude> + </excludes> + </resource> + <resource> + <filtering>true</filtering> + <directory>src/main/resources</directory> + <includes> + <include>org/apache/jena/fuseki/fuseki-properties.xml</include> + </includes> + </resource> + </resources> + + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-source-plugin</artifactId> + <executions> + <execution> + <id>attach-sources</id> + <phase>package</phase> + <goals> + <goal>jar-no-fork</goal> + </goals> + </execution> + </executions> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <configuration> + <includes> + <include>**/TS_*.java</include> + </includes> + </configuration> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-dependency-plugin</artifactId> + <configuration> + <overWriteReleases>false</overWriteReleases> + <overWriteIfNewer>true</overWriteIfNewer> + </configuration> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-resources-plugin</artifactId> + <configuration> + <encoding>UTF-8</encoding> + </configuration> + </plugin> + + </plugins> + + </build> + +</project> http://git-wip-us.apache.org/repos/asf/jena/blob/470ee4d7/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/DEF.java ---------------------------------------------------------------------- diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/DEF.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/DEF.java new file mode 100644 index 0000000..8d8495a --- /dev/null +++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/DEF.java @@ -0,0 +1,79 @@ +/* + * 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. + */ + +package org.apache.jena.fuseki; + +import org.apache.jena.atlas.web.AcceptList ; +import org.apache.jena.atlas.web.MediaType ; +import static org.apache.jena.riot.WebContent.* ; + +public class DEF +{ + public static final MediaType acceptRDFXML = MediaType.create(contentTypeRDFXML) ; + public static final MediaType acceptNQuads = MediaType.create(contentTypeNQuads) ; + public static final MediaType acceptRSXML = MediaType.create(contentTypeResultsXML) ; + public static final MediaType acceptJSON = MediaType.create(contentTypeJSON) ; + + public static final AcceptList jsonOffer = AcceptList.create(contentTypeJSON) ; + + public static final AcceptList rdfOffer = AcceptList.create(contentTypeTurtle, + contentTypeTurtleAlt1, + contentTypeTurtleAlt2, + contentTypeNTriples, + contentTypeNTriplesAlt, + contentTypeRDFXML, + contentTypeJSONLD, + contentTypeRDFJSON, + contentTypeRDFThrift + ) ; + + public static final AcceptList quadsOffer = AcceptList.create(contentTypeTriG, + contentTypeTriGAlt1, + contentTypeTriGAlt2, + contentTypeJSONLD, + contentTypeNQuads, + contentTypeNQuadsAlt1, + contentTypeNQuadsAlt2 + ) ; + + // Offer for SELECT + public static final AcceptList rsOfferTable = AcceptList.create(contentTypeResultsJSON, + contentTypeTextCSV, + contentTypeTextTSV, + contentTypeResultsXML, + contentTypeResultsThrift, + contentTypeTextPlain + ) ; + + // Offer for ASK + public static final AcceptList rsOfferBoolean = AcceptList.create(contentTypeResultsJSON, + contentTypeTextCSV, + contentTypeTextTSV, + contentTypeResultsXML, + contentTypeTextPlain + ) ; + + + // Names for services in the default configuration + public static final String ServiceQuery = "query" ; + public static final String ServiceQueryAlt = "sparql" ; + public static final String ServiceUpdate = "update" ; + public static final String ServiceData = "data" ; + public static final String ServiceUpload = "upload" ; + public static final String ServiceGeneralQuery = "/sparql" ; +} http://git-wip-us.apache.org/repos/asf/jena/blob/470ee4d7/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/Fuseki.java ---------------------------------------------------------------------- diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/Fuseki.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/Fuseki.java new file mode 100644 index 0000000..0f42219 --- /dev/null +++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/Fuseki.java @@ -0,0 +1,227 @@ +/* + * 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. + */ + +package org.apache.jena.fuseki ; + +import java.util.Calendar ; +import java.util.TimeZone ; +import java.util.concurrent.TimeUnit ; + +import org.apache.jena.riot.RIOT ; +import org.apache.jena.riot.system.stream.LocatorFTP ; +import org.apache.jena.riot.system.stream.LocatorHTTP ; +import org.apache.jena.riot.system.stream.StreamManager ; +import org.slf4j.Logger ; +import org.slf4j.LoggerFactory ; + +import com.hp.hpl.jena.query.ARQ ; +import com.hp.hpl.jena.sparql.SystemARQ ; +import com.hp.hpl.jena.sparql.lib.Metadata ; +import com.hp.hpl.jena.sparql.mgt.SystemInfo ; +import com.hp.hpl.jena.sparql.util.Context ; +import com.hp.hpl.jena.sparql.util.MappingRegistry ; +import com.hp.hpl.jena.sparql.util.Utils ; +import com.hp.hpl.jena.tdb.TDB ; +import com.hp.hpl.jena.tdb.transaction.TransactionManager ; + +public class Fuseki { + // General fixed constants. + // See also FusekiServer for the naming on the filesystem + + /** Path to ??? */ + static public String PATH = "org.apache.jena.fuseki" ; + + /** a unique IRI for the Fuseki namespace */ + static public String FusekiIRI = "http://jena.apache.org/Fuseki" ; + + /** + * a unique IRI including the symbol notation for which properties should be + * appended + */ + static public String FusekiSymbolIRI = "http://jena.apache.org/fuseki#" ; + + /** Default location of the pages for the Fuseki UI */ + static public String PagesStatic = "pages" ; + + /** Dummy base URi string for parsing SPARQL Query and Update requests */ + static public final String BaseParserSPARQL = "http://server/unset-base/" ; + + /** Dummy base URi string for parsing SPARQL Query and Update requests */ + static public final String BaseUpload = "http://server/unset-base/" ; + + /** + * A relative resources path to the location of + * <code>fuseki-properties.xml</code> file. + */ + static private String metadataLocation = "org/apache/jena/fuseki/fuseki-properties.xml" ; + + /** + * Object which holds metadata specified within + * {@link Fuseki#metadataLocation} + */ + static private Metadata metadata = initMetadata() ; + + private static Metadata initMetadata() { + Metadata m = new Metadata() ; + // m.addMetadata(metadataDevLocation) ; + m.addMetadata(metadataLocation) ; + return m ; + } + + /** The name of the Fuseki server. Set to the string <code>Fuseki</code> by default. */ + static public final String NAME = "Fuseki" ; + + /** Version of this Fuseki instance */ + static public final String VERSION = metadata.get(PATH + ".version", "development") ; + + /** Date when Fuseki was built */ + static public final String BUILD_DATE = metadata.get(PATH + ".build.datetime", "unknown") ; + + /** An identifier for the HTTP Fuseki server instance */ + static public final String serverHttpName = NAME + " (" + VERSION + ")" ; + + /** Loger name for operations */ + public static final String actionLogName = PATH + ".Fuseki" ; + + /** Instance of log for operations */ + public static final Logger actionLog = LoggerFactory.getLogger(actionLogName) ; + + /** Logger name for standard webserver log file request log */ + public static final String requestLogName = PATH + ".Request" ; + + // See HttpAction.finishRequest. + // Normally OFF + /** Instance of a log for requests: format is NCSA. */ + public static final Logger requestLog = LoggerFactory.getLogger(requestLogName) ; + + /** Admin log file for operations. */ + public static final String adminLogName = PATH + ".Admin" ; + + /** Instance of log for operations. */ + public static final Logger adminLog = LoggerFactory.getLogger(adminLogName) ; + + /** Admin log file for operations. */ + public static final String builderLogName = PATH + ".Builder" ; + + /** Instance of log for operations. */ + public static final Logger builderLog = LoggerFactory.getLogger(builderLogName) ; + + /** Validation log file for operations. */ + public static final String validationLogName = PATH + ".Validate" ; + + /** Instance of log for validation. */ + public static final Logger validationLog = LoggerFactory.getLogger(adminLogName) ; + + /** Actual log file for general server messages. */ + public static final String serverLogName = PATH + ".Server" ; + + /** Instance of log for general server messages. */ + public static final Logger serverLog = LoggerFactory.getLogger(serverLogName) ; + + /** Logger used for the servletContent.log operations (if settable -- depends on environment) */ + public static final String servletRequestLogName = PATH + ".Servlet" ; + + /** Actual log file for config server messages. */ + public static final String configLogName = PATH + ".Config" ; + + /** Instance of log for config server messages. */ + public static final Logger configLog = LoggerFactory.getLogger(configLogName) ; + + /** Instance of log for config server message s */ + public static boolean verboseLogging = false ; + + /** + * An instance of management for stream opening, including redirecting + * through a location mapper whereby a name (e.g. URL) is redirected to + * another name (e.g. local file). + * */ + public static final StreamManager webStreamManager ; + static { + webStreamManager = new StreamManager() ; + // Only know how to handle http URLs + webStreamManager.addLocator(new LocatorHTTP()) ; + webStreamManager.addLocator(new LocatorFTP()) ; + } + + /** Default (and development) root of the Fuseki installation for fixed files. */ + public static String DFT_FUSEKI_HOME = "." ; + /** Default (and development) root of the varying files in this deployment. */ + public static String DFT_FUSEKI_BASE = "." ; + + private static boolean initialized = false ; + + // Serevr start time and uptime. + private static final long startMillis = System.currentTimeMillis() ; + // Hide server locale + private static final Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("00:00")) ; + static { cal.setTimeInMillis(startMillis) ; } // Exactly the same start point! + + private static final String startDateTime = Utils.calendarToXSDDateTimeString(cal) ; + + /** Return the number of milliseconds since the server started */ + public static long serverUptimeMillis() { + return System.currentTimeMillis() - startMillis ; + } + + /** Server uptime in seconds */ + public static long serverUptimeSeconds() { + long x = System.currentTimeMillis() - startMillis ; + return TimeUnit.MILLISECONDS.toSeconds(x) ; + } + + /** XSD DateTime for when the server started */ + public static String serverStartedAt() { + return startDateTime ; + } + + /** + * Initialize an instance of the Fuseki server stack. + */ + public synchronized static void init() { + if ( initialized ) + return ; + initialized = true ; + // FusekiEnv.setEnvironment() ; + FusekiLogging.setLogging() ; + ARQ.init() ; + SystemInfo sysInfo = new SystemInfo(FusekiIRI, PATH, VERSION, BUILD_DATE) ; + SystemARQ.registerSubSystem(sysInfo) ; + RIOT.init() ; + TDB.init() ; + MappingRegistry.addPrefixMapping("fuseki", FusekiSymbolIRI) ; + + TDB.setOptimizerWarningFlag(false) ; + // Don't set TDB batch commits. + // This can be slower, but it less memory hungry and more predictable. + TransactionManager.QueueBatchSize = 0 ; + } + + /** + * Get server global {@link com.hp.hpl.jena.sparql.util.Context}. + * + * @return {@link com.hp.hpl.jena.query.ARQ#getContext()} + */ + public static Context getContext() { + return ARQ.getContext() ; + } + + // Force a call to init. + static { + init() ; + } +} http://git-wip-us.apache.org/repos/asf/jena/blob/470ee4d7/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiCmd.java ---------------------------------------------------------------------- diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiCmd.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiCmd.java new file mode 100644 index 0000000..5746394 --- /dev/null +++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiCmd.java @@ -0,0 +1,49 @@ +/** + * 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. + */ + +package org.apache.jena.fuseki; + +import java.lang.reflect.Method ; + +public class FusekiCmd { + public static void main(String[] args) { + // Must NOT use any logging. The command processor sets that up. + System.err.println("Deprecated: Use org.apache.jena.fuseki.cmd.FusekiCmd") ; + try { + // A + callByRefection("org.apache.jena.fuseki.cmd.FusekiCmd", "main", args) ; + } catch (ClassNotFoundException | NoSuchMethodException ex) { + System.err.println("Failed to find the command processor: "+ ex.getMessage()) ; + } catch (Exception ex) { + System.err.println("Failed to invoke the command processor: "+ ex.getMessage()) ; + ex.printStackTrace(System.err) ; + } + } + + // Call a static of no arguments by reflection. + private static void callByRefection(String className, String staticMethod, String[] args) + throws Exception + { + Class<? > cls = Class.forName(className) ; + // Pass up : ClassNotFoundException + + Method m = cls.getMethod(staticMethod, String[].class) ; + m.invoke(null, (Object)args) ; + } +} + http://git-wip-us.apache.org/repos/asf/jena/blob/470ee4d7/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiConfigException.java ---------------------------------------------------------------------- diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiConfigException.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiConfigException.java new file mode 100644 index 0000000..5e1b018 --- /dev/null +++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiConfigException.java @@ -0,0 +1,28 @@ +/* + * 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. + */ + +package org.apache.jena.fuseki; + + +public class FusekiConfigException extends FusekiException +{ + public FusekiConfigException(String msg, Throwable cause) { super(msg, cause) ; } + public FusekiConfigException(String msg) { super(msg) ; } + public FusekiConfigException(Throwable cause) { super(cause) ; } + public FusekiConfigException() { super() ; } +} http://git-wip-us.apache.org/repos/asf/jena/blob/470ee4d7/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiException.java ---------------------------------------------------------------------- diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiException.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiException.java new file mode 100644 index 0000000..04953ce --- /dev/null +++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiException.java @@ -0,0 +1,29 @@ +/* + * 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. + */ + +package org.apache.jena.fuseki; + +import com.hp.hpl.jena.sparql.ARQException ; + +public class FusekiException extends ARQException +{ + public FusekiException(String msg, Throwable cause) { super(msg, cause) ; } + public FusekiException(String msg) { super(msg) ; } + public FusekiException(Throwable cause) { super(cause) ; } + public FusekiException() { super() ; } +} http://git-wip-us.apache.org/repos/asf/jena/blob/470ee4d7/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiLib.java ---------------------------------------------------------------------- diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiLib.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiLib.java new file mode 100644 index 0000000..52024d4 --- /dev/null +++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiLib.java @@ -0,0 +1,258 @@ +/* + * 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. + */ + +package org.apache.jena.fuseki; + +import java.util.Iterator ; + +import javax.servlet.http.HttpServletRequest ; + +import org.apache.jena.atlas.lib.MultiMap ; +import org.apache.jena.atlas.lib.MultiMapToList ; +import org.apache.jena.atlas.web.ContentType ; +import org.apache.jena.fuseki.server.SystemState ; +import org.apache.jena.fuseki.servlets.HttpAction ; +import org.apache.jena.riot.Lang ; +import org.apache.jena.riot.RDFLanguages ; + +import com.hp.hpl.jena.graph.Graph ; +import com.hp.hpl.jena.graph.Node ; +import com.hp.hpl.jena.graph.Triple ; +import com.hp.hpl.jena.query.* ; +import com.hp.hpl.jena.rdf.model.Literal ; +import com.hp.hpl.jena.rdf.model.Model ; +import com.hp.hpl.jena.rdf.model.RDFNode ; +import com.hp.hpl.jena.rdf.model.Resource ; +import com.hp.hpl.jena.shared.PrefixMapping ; +import com.hp.hpl.jena.sparql.core.DatasetGraph ; +import com.hp.hpl.jena.sparql.core.Quad ; +import com.hp.hpl.jena.sparql.util.Convert ; +import com.hp.hpl.jena.vocabulary.RDFS ; + +public class FusekiLib { + // ==> ActionLib + + /** Get the content type of an action or return the default. + * @param action + * @return ContentType + */ + public static ContentType getContentType(HttpAction action) { + return getContentType(action.request) ; + } + + /** Get the content type of an action or return the default. + * @param request + * @return ContentType + */ + public static ContentType getContentType(HttpServletRequest request) { + String contentTypeHeader = request.getContentType() ; + if ( contentTypeHeader == null ) + return null ; + return ContentType.create(contentTypeHeader) ; + } + + /** Get the incoming Lang based on Content-Type of an action. + * @param action + * @param dft Default if no "Content-Type:" found. + * @return ContentType + */ + public static Lang getLangFromAction(HttpAction action, Lang dft) { + String contentTypeHeader = action.request.getContentType() ; + if ( contentTypeHeader == null ) + return dft ; + return RDFLanguages.contentTypeToLang(contentTypeHeader) ; + } + + static String fmtRequest(HttpServletRequest request) { + StringBuffer sbuff = new StringBuffer() ; + sbuff.append(request.getMethod()) ; + sbuff.append(" ") ; + sbuff.append(Convert.decWWWForm(request.getRequestURL())) ; + + String qs = request.getQueryString() ; + if ( qs != null ) { + String tmp = request.getQueryString() ; + tmp = Convert.decWWWForm(tmp) ; + tmp = tmp.replace('\n', ' ') ; + tmp = tmp.replace('\r', ' ') ; + sbuff.append("?").append(tmp) ; + } + return sbuff.toString() ; + } + + /** Parse the query string - do not process the body even for a form */ + public static MultiMap<String, String> parseQueryString(HttpServletRequest req) { + MultiMap<String, String> map = MultiMapToList.create() ; + + // Don't use ServletRequest.getParameter or getParamterNames + // as that reads form data. This code parses just the query string. + if ( req.getQueryString() != null ) { + String[] params = req.getQueryString().split("&") ; + for (int i = 0; i < params.length; i++) { + String p = params[i] ; + String[] x = p.split("=", 2) ; + String name = null ; + String value = null ; + + if ( x.length == 0 ) { // No "=" + name = p ; + value = "" ; + } else if ( x.length == 1 ) { // param= + name = x[0] ; + value = "" ; + } else { // param=value + name = x[0] ; + value = x[1] ; + } + map.put(name, value) ; + } + } + return map ; + } + + public static String safeParameter(HttpServletRequest request, String pName) { + String value = request.getParameter(pName) ; + value = value.replace("\r", "") ; + value = value.replace("\n", "") ; + return value ; + } + + // Do the addition directly on the dataset + public static void addDataInto(Graph data, DatasetGraph dsg, Node graphName) { + // Prefixes? + if ( graphName == null ) + graphName = Quad.defaultGraphNodeGenerated ; + + Iterator<Triple> iter = data.find(Node.ANY, Node.ANY, Node.ANY) ; + for (; iter.hasNext();) { + Triple t = iter.next() ; + dsg.add(graphName, t.getSubject(), t.getPredicate(), t.getObject()) ; + } + + PrefixMapping pmapSrc = data.getPrefixMapping() ; + PrefixMapping pmapDest = dsg.getDefaultGraph().getPrefixMapping() ; + pmapDest.setNsPrefixes(pmapSrc) ; + } + + public static void addDataInto(DatasetGraph src, DatasetGraph dest) { + Iterator<Quad> iter = src.find(Node.ANY, Node.ANY, Node.ANY, Node.ANY) ; + for (; iter.hasNext();) { + Quad q = iter.next() ; + dest.add(q) ; + } + + PrefixMapping pmapSrc = src.getDefaultGraph().getPrefixMapping() ; + PrefixMapping pmapDest = dest.getDefaultGraph().getPrefixMapping() ; + pmapDest.withDefaultMappings(pmapSrc) ; + } + + // ---- Helper code + public static ResultSet query(String string, Model m) { + return query(string, m, null, null) ; + } + + public static ResultSet query(String string, Dataset ds) { + return query(string, ds, null, null) ; + } + + public static ResultSet query(String string, Model m, String varName, RDFNode value) { + Query query = QueryFactory.create(SystemState.PREFIXES + string) ; + QuerySolutionMap initValues = null ; + if ( varName != null ) + initValues = querySolution(varName, value) ; + try ( QueryExecution qExec = QueryExecutionFactory.create(query, m, initValues) ) { + return ResultSetFactory.copyResults(qExec.execSelect()) ; + } + } + + public static ResultSet query(String string, Dataset ds, String varName, RDFNode value) { + Query query = QueryFactory.create(SystemState.PREFIXES + string) ; + QuerySolutionMap initValues = null ; + if ( varName != null ) + initValues = querySolution(varName, value) ; + try ( QueryExecution qExec = QueryExecutionFactory.create(query, ds, initValues) ) { + return ResultSetFactory.copyResults(qExec.execSelect()) ; + } + } + + private static QuerySolutionMap querySolution(String varName, RDFNode value) { + QuerySolutionMap qsm = new QuerySolutionMap() ; + querySolution(qsm, varName, value) ; + return qsm ; + } + + public static QuerySolutionMap querySolution(QuerySolutionMap qsm, String varName, RDFNode value) { + qsm.add(varName, value) ; + return qsm ; + } + + public static RDFNode getOne(Resource svc, String property) { + ResultSet rs = FusekiLib.query("SELECT * { ?svc " + property + " ?x}", svc.getModel(), "svc", svc) ; + if ( !rs.hasNext() ) + throw new FusekiConfigException("No property '" + property + "' for service " + FusekiLib.nodeLabel(svc)) ; + RDFNode x = rs.next().get("x") ; + if ( rs.hasNext() ) + throw new FusekiConfigException("Multiple properties '" + property + "' for service " + FusekiLib.nodeLabel(svc)) ; + return x ; + } + + // Node presentation + public static String nodeLabel(RDFNode n) { + if ( n == null ) + return "<null>" ; + if ( n instanceof Resource ) + return strForResource((Resource)n) ; + + Literal lit = (Literal)n ; + return lit.getLexicalForm() ; + } + + // XXX Lib + public static String strForResource(Resource r) { + return strForResource(r, r.getModel()) ; + } + + // XXX Lib + public static String strForResource(Resource r, PrefixMapping pm) { + if ( r == null ) + return "NULL " ; + if ( r.hasProperty(RDFS.label) ) { + RDFNode n = r.getProperty(RDFS.label).getObject() ; + if ( n instanceof Literal ) + return ((Literal)n).getString() ; + } + + if ( r.isAnon() ) + return "<<blank node>>" ; + + if ( pm == null ) + pm = r.getModel() ; + + return strForURI(r.getURI(), pm) ; + } + + public static String strForURI(String uri, PrefixMapping pm) { + if ( pm != null ) { + String x = pm.shortForm(uri) ; + + if ( !x.equals(uri) ) + return x ; + } + return "<" + uri + ">" ; + } +} http://git-wip-us.apache.org/repos/asf/jena/blob/470ee4d7/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiLogging.java ---------------------------------------------------------------------- diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiLogging.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiLogging.java new file mode 100644 index 0000000..1add2b2 --- /dev/null +++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiLogging.java @@ -0,0 +1,171 @@ +/** + * 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. + */ + +package org.apache.jena.fuseki; + +import java.io.File ; +import java.net.URL ; + +import org.apache.jena.atlas.lib.StrUtils ; +import org.apache.jena.atlas.logging.LogCtl ; +import org.apache.jena.fuseki.server.FusekiEnv ; +import org.apache.jena.riot.SysRIOT ; +import org.apache.log4j.PropertyConfigurator ; +import org.apache.log4j.helpers.Loader ; + +public class FusekiLogging +{ + // This class must not have static constants, or otherwise not use "Fuseki.*" + // or any class else where that might kick off logging. Otherwise, the + // setLogging is poiintless (it's already set). + // PlanB - reinitialize logging regardless on first call. + + // Set logging. + // 1/ Use log4j.configuration if defined. + // 2/ Use file:log4j.properties if exists + // 3/ Use log4j.properties on the classpath. + // 4/ Use built-in org/apache/jena/fuseki/log4j.properties on the classpath. + // 5/ Use Built in string + + /** Places for the log4j properties file at (3) */ + private static final String[] resourcesForLog4jProperties = { + "log4j.properties", + "org/apache/jena/fuseki/log4j.properties" + } ; + + private static final boolean LogLogging = false ; + private static boolean loggingInitialized = false ; + + public static synchronized void setLogging() { + if ( loggingInitialized ) + return ; + loggingInitialized = true ; + FusekiEnv.setEnvironment() ; + + logLogging("Fuseki logging") ; + // No loggers have been created but configuration may have been set up. + String x = System.getProperty("log4j.configuration", null) ; + logLogging("log4j.configuration = %s", x) ; + + if ( x != null ) { + // log4j wil initialize in the usual way. This includes avalue of + // "set", which indicates that logging was set before by some other Jena code. + if ( x.equals("set") ) + Fuseki.serverLog.warn("Fuseki logging: Unexpected: Log4j was setup by someother part of Jena") ; + return ; + } + logLogging("Fuseki logging - setup") ; + // Look for a log4j.properties in the current working directory + // and an existing FUSEKI_BASE for easy customization. + String fn1 = "log4j.properties" ; + String fn2 = null ; + + if ( FusekiEnv.FUSEKI_BASE != null ) + fn2 = FusekiEnv.FUSEKI_BASE.toString()+"/log4j.properties" ; + if ( attempt(fn1) ) return ; + if ( attempt(fn2) ) return ; + + // Try classpath + for ( String resourceName : resourcesForLog4jProperties ) { + // The log4j general initialization is done in a class static + // in LogManager so it can't be called again in any sensible manner. + // Instead, we include the same basic mechanism ... + logLogging("Fuseki logging - classpath %s", resourceName) ; + URL url = Loader.getResource(resourceName) ; + if ( url != null ) { + PropertyConfigurator.configure(url) ; + logLogging("Fuseki logging - found via classpath %s", url) ; + System.setProperty("log4j.configuration", url.toString()) ; + return ; + } + } + // Use builtin. + logLogging("Fuseki logging - Fallback log4j.properties string") ; + String dftLog4j = log4JsetupFallback() ; + LogCtl.resetLogging(dftLog4j); + // Stop anything attempting to do it again. + System.setProperty("log4j.configuration", "set") ; + } + + private static boolean attempt(String fn) { + try { + File f = new File(fn) ; + if ( f.exists() ) { + logLogging("Fuseki logging - found file:log4j.properties") ; + PropertyConfigurator.configure(fn) ; + System.setProperty("log4j.configuration", "file:" + fn) ; + return true ; + } + } + catch (Throwable th) {} + return false ; + } + + private static void logLogging(String fmt, Object ... args) { + if ( LogLogging ) { + System.out.printf(fmt, args) ; + System.out.println() ; + } + } + + private static String log4JsetupFallback() { + return StrUtils.strjoinNL + // Preferred: classes/log4j.properties, from src/main/resources/log4j.properties + // Keep these in-step. Different usages cause different logging initalizations; + // if the jar is rebundled, it may loose the associated log4.properties file. + ("## Plain output to stdout", + "log4j.appender.jena.plainstdout=org.apache.log4j.ConsoleAppender", + "log4j.appender.jena.plainstdout.target=System.out", + "log4j.appender.jena.plainstdout.layout=org.apache.log4j.PatternLayout", + "log4j.appender.jena.plainstdout.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] %-10c{1} %-5p %m%n", + //"log4j.appender.jena.plainstdout.layout.ConversionPattern=%d{HH:mm:ss} %-10c{1} %-5p %m%n", + + "# Unadorned, for the requests log.", + "log4j.appender.fuseki.plain=org.apache.log4j.ConsoleAppender", + "log4j.appender.fuseki.plain.target=System.out", + "log4j.appender.fuseki.plain.layout=org.apache.log4j.PatternLayout", + "log4j.appender.fuseki.plain.layout.ConversionPattern=%m%n", + + "## Most things", + "log4j.rootLogger=INFO, jena.plainstdout", + "log4j.logger.com.hp.hpl.jena=WARN", + "log4j.logger.org.openjena=WARN", + "log4j.logger.org.apache.jena=WARN", + + "# Fuseki System logs.", + "log4j.logger." + Fuseki.serverLogName + "=INFO", + "log4j.logger." + Fuseki.actionLogName + "=INFO", + "log4j.logger." + Fuseki.adminLogName + "=INFO", + "log4j.logger." + Fuseki.validationLogName + "=INFO", + "log4j.logger." + Fuseki.configLogName + "=INFO", + + "log4j.logger.org.apache.jena.tdb.loader=INFO", + "log4j.logger.org.eclipse.jetty=WARN" , + "log4j.logger.org.apache.shiro=WARN", + + "# NCSA Request Access log", + "log4j.additivity."+Fuseki.requestLogName + "=false", + "log4j.logger."+Fuseki.requestLogName + "=OFF, fuseki.plain", + + "## Parser output", + "log4j.additivity" + SysRIOT.riotLoggerName + "=false", + "log4j.logger." + SysRIOT.riotLoggerName + "=INFO, plainstdout" + ) ; + } +} + http://git-wip-us.apache.org/repos/asf/jena/blob/470ee4d7/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiNotFoundException.java ---------------------------------------------------------------------- diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiNotFoundException.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiNotFoundException.java new file mode 100644 index 0000000..be9be90 --- /dev/null +++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiNotFoundException.java @@ -0,0 +1,26 @@ +/* + * 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. + */ + +package org.apache.jena.fuseki; + +import org.apache.jena.web.HttpSC ; + +public class FusekiNotFoundException extends FusekiRequestException +{ + public FusekiNotFoundException(String msg) { super(HttpSC.NOT_FOUND_404, msg) ; } +} http://git-wip-us.apache.org/repos/asf/jena/blob/470ee4d7/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiRequestException.java ---------------------------------------------------------------------- diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiRequestException.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiRequestException.java new file mode 100644 index 0000000..e197be2 --- /dev/null +++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiRequestException.java @@ -0,0 +1,57 @@ +/* + * 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. + */ + +package org.apache.jena.fuseki; + +import org.apache.jena.web.HttpSC ; + + +public class FusekiRequestException extends FusekiException +{ + public static FusekiRequestException create(int code, String msg) + { + if ( code == HttpSC.NOT_FOUND_404 ) + return new FusekiNotFoundException(msg) ; + return new FusekiRequestException(code, msg) ; + } + + private final int statusCode ; + private final String responseMessage ; + protected FusekiRequestException(int code, String msg) + { + super(msg) ; + this.statusCode = code ; + responseMessage = msg ; + } + + public int getStatusCode() + { + return statusCode ; + } + + public String getResponseMessage() + { + return responseMessage ; + } + + @Override + public String toString() + { + return "HTTP: "+statusCode+" "+getMessage() ; + } +} http://git-wip-us.apache.org/repos/asf/jena/blob/470ee4d7/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/async/AsyncPool.java ---------------------------------------------------------------------- diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/async/AsyncPool.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/async/AsyncPool.java new file mode 100644 index 0000000..1d98ff2 --- /dev/null +++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/async/AsyncPool.java @@ -0,0 +1,97 @@ +/** + * 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. + */ + +package org.apache.jena.fuseki.async; + +import static java.lang.String.format ; + +import java.util.* ; +import java.util.concurrent.* ; + +import org.apache.jena.fuseki.Fuseki ; +import org.apache.jena.fuseki.server.DataService ; + +/** The set of currently active async tasks */ +public class AsyncPool +{ + private static int nMaxThreads = 4 ; + private static int MAX_FINISHED = 20 ; + + // See Executors.newCachedThreadPool and Executors.newFixedThreadPool + private ExecutorService executor = new ThreadPoolExecutor(0, nMaxThreads, + 120L, TimeUnit.SECONDS, + new LinkedBlockingQueue<Runnable>()) ; + private final Object mutex = new Object() ; + private long counter = 0 ; + private Map<String, AsyncTask> runningTasks = new LinkedHashMap<>() ; + private Map<String, AsyncTask> finishedTasks = new LinkedHashMap<>() ; + + private static AsyncPool instance = new AsyncPool() ; + public static AsyncPool get() + { return instance ; } + + private AsyncPool() { } + + public AsyncTask submit(Runnable task, String displayName, DataService dataService) { + synchronized(mutex) { + String taskId = Long.toString(++counter) ; + Fuseki.serverLog.info(format("Task : %s : %s",taskId, displayName)) ; + Callable<Object> c = Executors.callable(task) ; + AsyncTask asyncTask = new AsyncTask(c, this, taskId, displayName, dataService) ; + Future<Object> x = executor.submit(asyncTask) ; + runningTasks.put(taskId, asyncTask) ; + return asyncTask ; + } + } + + public Collection<AsyncTask> tasks() { + synchronized(mutex) { + List<AsyncTask> x = new ArrayList<>(runningTasks.size()+finishedTasks.size()) ; + x.addAll(runningTasks.values()) ; + x.addAll(finishedTasks.values()) ; + return x ; + } + } + + public void finished(AsyncTask task) { + synchronized(mutex) { + String id = task.getTaskId() ; + runningTasks.remove(id) ; + while ( finishedTasks.size() >= MAX_FINISHED ) + finishedTasks.remove(task.getTaskId()) ; + finishedTasks.put(id, task) ; + } + } + + public AsyncTask getRunningTask(String taskId) { + synchronized(mutex) { + return runningTasks.get(taskId) ; + } + } + + /** Get for any state */ + public AsyncTask getTask(String taskId) { + synchronized(mutex) { + AsyncTask task = runningTasks.get(taskId) ; + if ( task != null ) + return task ; + return finishedTasks.get(taskId) ; + } + } +} +
