diff --git a/TAPLib/docker/Dockerfile b/TAPLib/docker/Dockerfile new file mode 100644 index 00000000..0f89b2d0 --- /dev/null +++ b/TAPLib/docker/Dockerfile @@ -0,0 +1,71 @@ +FROM tomcat:7-jre8-alpine +LABEL maintainer="gregory.mantelet@astro.unistra.fr" \ + description="Container running a TAP service with a given configuration." \ + taplib.version="2.4beta" + +# Set the correct timezone: +RUN apk add --no-cache tzdata +#ENV TZ=Europe/Paris # already declared in the file `.env` of docker-compose.yml + +# Install GNU-sed (required by start-tap.sh): +RUN apk add --no-cache sed + +# Install wget (to download the required libraries): +RUN apk add --no-cache wget + +################################################################################ +# +# CONFIGURE TOMCAT +# + +# Add the user `admin` able to access to the Tomcat's Web GUI: +COPY tomcat/tomcat-users.xml /usr/local/tomcat/conf/tomcat-users.xml + +# Load all Tomcat shared libraries (JDBC drivers + SLF4J): +COPY tomcat/shared-libs/* /usr/local/tomcat/lib/ + +# Remove the default webapps (docs, examples, ...): +RUN rm -rf /usr/local/tomcat/webapps/examples/ \ + /usr/local/tomcat/webapps/docs/ \ + /usr/local/tomcat/webapps/host-manager + +# Get the HTTP port: +ARG HTTP_PORT=8080 + +# Open some ports inside the Docker network: +EXPOSE 8009 +EXPOSE $HTTP_PORT + +################################################################################ +# +# SET UP THE TAP SERVICE +# + +# Load all Web applications to deploy: +COPY tomcat/tap-webapp /usr/local/tomcat/webapps/tap/ + +# Download all required libraries: +RUN wget -O /usr/local/tomcat/webapps/tap/WEB-INF/lib/commons-fileupload.jar \ + 'https://repo1.maven.org/maven2/commons-fileupload/commons-fileupload/1.3.3/commons-fileupload-1.3.3.jar' +RUN wget -O /usr/local/tomcat/webapps/tap/WEB-INF/lib/commons-io.jar \ + 'https://repo1.maven.org/maven2/commons-io/commons-io/2.6/commons-io-2.6.jar' +RUN wget -O /usr/local/tomcat/webapps/tap/WEB-INF/lib/javax-servlet-api.jar \ + 'https://repo1.maven.org/maven2/javax/servlet/javax.servlet-api/3.0.1/javax.servlet-api-3.0.1.jar' +RUN wget -O /usr/local/tomcat/webapps/tap/WEB-INF/lib/json.jar \ + 'https://repo1.maven.org/maven2/org/json/json/20180813/json-20180813.jar' +RUN wget -O /usr/local/tomcat/webapps/tap/WEB-INF/lib/slf4j-api.jar \ + 'https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar' + +# Load the TAP configuration file: +COPY tap.properties /usr/local/tomcat/webapps/tap/WEB-INF/ + +# Create the directory in which all backups, logs and results will be written: +RUN mkdir /data + +# Import the starting script: +COPY ./scripts/tap-starter.sh ./tap-starter.sh +RUN chmod a+x ./tap-starter.sh + +EXPOSE $HTTP_PORT + +CMD ["./tap-starter.sh"] diff --git a/TAPLib/docker/README.md b/TAPLib/docker/README.md new file mode 100644 index 00000000..cefc7065 --- /dev/null +++ b/TAPLib/docker/README.md @@ -0,0 +1,231 @@ +# Introduction + +All files present in this directory aims to create and configure a Docker container running [VOLLT/TAP-Lib](http://cdsportal.u-strasbg.fr/taptuto/index.html). This latter is run using Apache Tomcat. + +Only the TAP service is started. No database and no Web server (e.g. Apache, NginX) is started by this container. + + + +# Get started! + +0. _The following instructions are all relative to the directory containing this `README` file._ + +1. Configure the database connection pool inside `db-pool.env`: + + 1. _Required_ Add the JDBC driver library compatible with your target database in `tomcat/shared-libs/` (or `tomcat/tap-webapp/WEB-INF/lib/`) + + 2. _Required_ Database connection configuration _(here, using JNDI and the pool of connection of Tomcat)_: + + ``` + DB_TYPE=pgsphere # Accepted: postgres, pgsphere, sqlserver, mysql + DB_HOST=my-hostname # Name/IP of the machine hosting the DB + # or 'host.docker.internal' if pointing toward a database + # running in a Docker container + DB_NAME=my-database # Database name + DB_USER=tapuser # User name to use to access the DB for TAP + DB_PASSWORD=tap1234 # Password of this user + DB_POOL_MAX_ACTIVE=20 # [Optional] Max. number of DB conn. active in the pool + DB_POOL_MAX_WAIT=2000 # [Optional] Max. time (ms) to wait before discarding a conn. + ``` + + 3. _[Optional]_ TAP configuration inside `tap.properties`: + + The default `tap.properties` provided here is set with the default values. + + See the documentation inside this file and/or for more information about how to write this configuration file. + + Note that the following properties are automatically set by this container: + + - `database_access` = `jndi` + - `sql_translator` to the value associated with `DB_TYPE` iin `db-pool.env` + - `datasource_jndi_name` = `java:/comp/env/jdbc/tapdb` + + + +2. Build the Docker image: + + ```bash + scripts/build.bash + ``` + + This script will also create `scripts/start.bash` and `scripts/stop.bash`. + + + +3. Start the container: + + ```bash + scripts/run.bash + ``` + + + +4. Test the TAP service in a browser or in a TAP client (e.g. TOPCAT) with the following URL: + + + + * _Example using a Web browser:_ + + ![](img/screenshot_browser.png) + + * _Example using TOPCAT:_ + + ![](img/screenshot_topcat.png) + + + +5. Stop the container: + +```bash +scripts/stop.bash +``` + + + +6. To run again the TAP service, you have two possibilities: + + 1. To create and start a new container: + + ```bash + scripts/run.bash + ``` + + All logs, backups and result files are preserved. The configuration files will be reloaded ; so modifications of `tap.properties` and `db-pool.env` will be taken into account. + + 2. To restart the previous container: + + ```bash + docker start vollt-tap # , where 'vollt-tap' has to be the chosen container name + ``` + + All logs, backups and result files are preserved too. However, modifications of any configuration file will be ignore. + + + +# Update the TAP configuration + +0. Stop the container _if running_: + + ```bash + scripts/stop.bash + ``` + +1. Update the configuration in `db-pool.env` and/or `tap.properties` + +2. Start the container using `start.bash`: + + ```bash + scripts/run.bash + ``` + + + +# Change the image + +Here, "changing the image" mostly means updating the JAR libraries, the Tomcat configuration, updating `scripts/build.bash` or changing `Dockerfile`. + +1. Stop and clean the container: + + ```bash + scripts/clean.bash + ``` + +2. Change the image _(see some examples below)_ + +3. Build the modified image: + + ```bash + scripts/build.bash + ``` + +## Change container/image name, version and port + +The container name, image name, the version and the Tomcat's HTTP port are set when building the image. + +To change one or more of them, change the corresponding variable in `scripts/build.bash`: + +- `IMAGE_NAME` _(default: `vollt-tap`)_ +- `CONTAINER_NAME` _(default: same as `IMAGE_NAME`)_ +- `SHORT_VERSION` _(default: `0.1`)_ +- `LONG_VERSION` _(default: `SHORT_VERSION` followed by `--vollt-tap-2.4beta`)_ +- `TOMCAT_PORT` _(default: `8080`)_ + + + +## Add or change a JAR library + +Libraries loaded in the TAP web-application are all available in `tomcat/tap-webapp/WEB-INF/lib/`. Just apply whatever modifications you want. _Note that by default, only the required libraries are provided._ + +The directory `tomcat/shared-libs/` contains the libraries to share among all Tomcat's web applications. Though in this container there is only a web-application, the JDBC driver for the target database has been in this directory. + + + +## Change the Servlet configuration + +Just modify the file `tomcat/tap-webapp/WEB-INF/web.xml`. + +By default: + +```xml +[...] + + TAP Test Service + tap + tap.config.ConfigurableTAPServlet + + + tap + /* + +[...] +``` + + + +## Change the password of the Tomcat's admin + +Change the file `tomcat/tomcat-users.xml`. + +By default: + +```xml + + + + + + +``` + + + + + +# Docker help + +```bash +# To start a container (if already created before): +docker start vollt-tap + +# To stop a container: +docker stop vollt-tap + +# To list active containers: +docker ps + +# To list active AND inactive containers: +docker ps -a + +# To see the status of a specific container: +docker ps -a -f name='vollt-tap' + +# To list Docker images: +docker images + +# To remove a container: +docker rm vollt-tap + +# To remove an image/tag: +docker rm vollt-tap:latest vollt-tap: +``` + diff --git a/TAPLib/docker/db-pool.env b/TAPLib/docker/db-pool.env new file mode 100644 index 00000000..a09014a4 --- /dev/null +++ b/TAPLib/docker/db-pool.env @@ -0,0 +1,23 @@ +# Type of database. Accepted values: postgres, pgsphere, sqlserver, mysql. +DB_TYPE= + +# Name/IP of the machine hosting the DB. +DB_HOST= + +DB_PORT= + +# Database name. +DB_NAME= + +# User name to use to access the DB for TAP. +DB_USER= + +# Password of this user. +DB_PASSWORD= + +# [Optional] Max. number of DB conn. active in the pool. +DB_POOL_MAX_ACTIVE=20 + +# [Optional] Max. time (ms) to wait before discarding a conn. +DB_POOL_MAX_WAIT=2000 + diff --git a/TAPLib/docker/img/screenshot_browser.png b/TAPLib/docker/img/screenshot_browser.png new file mode 100644 index 00000000..3c9e2218 Binary files /dev/null and b/TAPLib/docker/img/screenshot_browser.png differ diff --git a/TAPLib/docker/img/screenshot_topcat.png b/TAPLib/docker/img/screenshot_topcat.png new file mode 100644 index 00000000..a484c1d7 Binary files /dev/null and b/TAPLib/docker/img/screenshot_topcat.png differ diff --git a/TAPLib/docker/scripts/build.bash b/TAPLib/docker/scripts/build.bash new file mode 100755 index 00000000..dcccae5f --- /dev/null +++ b/TAPLib/docker/scripts/build.bash @@ -0,0 +1,119 @@ +#!/usr/bin/env bash + +# Local port which the Tomcat application should be exported to. +TOMCAT_PORT=8080 + +# Name of the Docker image as it will appear in `docker image ls`. +IMAGE_NAME=vollt-tap + +# Name of the Docker container as it will appear in `docker ps`. +CONTAINER_NAME=$IMAGE_NAME + +SHORT_VERSION="0.1" +LONG_VERSION="$SHORT_VERSION--vollt-tap-2.4beta" + +DIR_BIN="$(dirname $(readlink -f $0))" +DIR_DOCKER="$(dirname $(readlink -f $DIR_BIN))" + + +################################################################################ +# +# Build the Docker image: +# + +echo "Building the Docker image '$IMAGE_NAME'..." +docker build --build-arg HTTP_PORT=$TOMCAT_PORT -t $IMAGE_NAME:$LONG_VERSION $DIR_DOCKER +docker tag $IMAGE_NAME:$LONG_VERSION $IMAGE_NAME:$SHORT_VERSION +docker tag $IMAGE_NAME:$LONG_VERSION $IMAGE_NAME:latest + + +################################################################################ +# +# Write the `run.bash` script: +# + +FILE_RUN="$DIR_BIN/run.bash" +echo "Writing the script '$FILE_RUN'..." +echo "#!/usr/bin/env bash + +# Remove a previous instance of this container: +if [ \$( docker ps -a | grep '$CONTAINER_NAME' | wc -l ) -gt 0 ]; then + echo "INFO: Removing previous instance of this container..." + docker rm '$CONTAINER_NAME' +fi + +docker run -d \\ + -p 8080:$TOMCAT_PORT \\ + --env-file=db-pool.env \\ + -v "$(pwd)/tap-data:/data" \\ + --add-host host.docker.internal:host-gateway \\ + --name '$CONTAINER_NAME' \\ + '$IMAGE_NAME' + +# Wait a bit before testing the container status: +sleep 1 + +# Check it status: +output=\$( docker ps -a -f name='$CONTAINER_NAME' | grep '$CONTAINER_NAME' 2> /dev/null ) +if [ -z \"\$output\" ]; +then + echo "FATAL: No container created!" +else + output=\$( docker ps -f name='$CONTAINER_NAME' | grep '$CONTAINER_NAME' 2> /dev/null ) + if [ -z \"\$output\" ]; + then + echo "ERROR: Container not started! See logs below:" + docker logs '$CONTAINER_NAME' + else + echo "INFO: Container started!" + fi +fi + +" > $FILE_RUN + + +################################################################################ +# +# Write the `stop.bash` script: +# + +FILE_STOP="$DIR_BIN/stop.bash" +echo "Writing the script '$FILE_STOP'..." +echo "#!/usr/bin/env bash +docker stop '$CONTAINER_NAME' +" > $FILE_STOP + + +################################################################################ +# +# Write the `clean.bash` script: +# + +FILE_CLEAN="$DIR_BIN/clean.bash" +echo "Writing the script '$FILE_CLEAN'..." +echo "#!/usr/bin/env bash + +# Stop the container, if running: +echo 'INFO: stopping container \"$CONTAINER_NAME\"...' +docker stop '$CONTAINER_NAME' + +# Remove the container: +echo 'INFO: removing container \"$CONTAINER_NAME\"...' +docker rm '$CONTAINER_NAME' + +# Remove the images: +echo 'INFO: removing all images of \"$IMAGE_NAME\"...' +docker image rm $IMAGE_NAME:latest $IMAGE_NAME:$SHORT_VERSION $IMAGE_NAME:$LONG_VERSION + +# Remove the scripts: +echo 'INFO: removing the auto-generated start, stop and clean scripts...' +rm $FILE_RUN $FILE_STOP $FILE_CLEAN +" > $FILE_CLEAN + +################################################################################ +# +# Give execution permission to both scripts: +# + +chmod u+x $FILE_RUN $FILE_STOP $FILE_CLEAN + diff --git a/TAPLib/docker/scripts/tap-starter.sh b/TAPLib/docker/scripts/tap-starter.sh new file mode 100755 index 00000000..aab3f8d2 --- /dev/null +++ b/TAPLib/docker/scripts/tap-starter.sh @@ -0,0 +1,132 @@ +#!/bin/bash + +WEBAPPS_DIR=/usr/local/tomcat/webapps + + +################################################################################ +# +# CHECK THAT ALL REQUIRED VARIABLES ARE SET +# + +# Database type: +if [ -z "$DB_TYPE" ]; +then + echo "ERROR: Missing database type!" >&2 + echo " You must set the environment variable 'DB_TYPE'." >&2 + echo " Accepted values: 'postgres', 'pgsphere', 'sqlserver', 'mysql'." >&2 + exit 1; +elif [ "$DB_TYPE" != "postgres" \ + -a "$DB_TYPE" != "pgsphere" \ + -a "$DB_TYPE" != "sqlserver" \ + -a "$DB_TYPE" != "mysql" ]; +then + echo "ERROR: Incorrect database type: '$DB_TYPE'!" >&2 + echo " Accepted values: 'postgres', 'pgsphere', 'sqlserver', 'mysql'." >&2 + exit 1; +fi + +# Database name: +if [ -z "$DB_NAME" ]; +then + echo "ERROR: Missing database name!" >&2 + echo " You must sete the environment variable 'DB_NAME'." >&2 + exit 2; +fi + + +################################################################################ +# +# WRITE META-INF/context.xml: +# (i.e. configure the database access and the connection pool) +# + +# Set the output file: +CONTEXT_FILE=$WEBAPPS_DIR/tap/META-INF/context.xml + +# Start the Context and Resource definitions: +echo -e '\n\t $CONTEXT_FILE +# Set the Resource type (SQL's Datasource): +echo -e '\t\ttype="javax.sql.DataSource"' >> $CONTEXT_FILE +# Set the JDBC driver: +case "$DB_TYPE" in + postgres|pgsphere) + echo -e '\t\tdriverClassName="org.postgresql.Driver"' >> $CONTEXT_FILE + ;; + sqlserver) + echo -e '\t\tdriverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"' >> $CONTEXT_FILE + ;; + mysql) + echo -e '\t\tdriverClassName="com.mysql.jdbc.Driver"' >> $CONTEXT_FILE + ;; + *) + echo "ERROR: Incorrect database type: '$DB_TYPE'!" >&2 + echo " Accepted values: 'postgres', 'pgsphere', 'sqlserver', 'mysql'." >&2 + exit 1; +esac +# Set the JDBC URL to access to the TAP database: +if [ -z "$DB_URL" ]; +then + echo -ne '\t\turl="jdbc:' >> $CONTEXT_FILE + if [ "$DB_TYPE" = 'postgres' -o "$DB_TYPE" = 'pgsphere' ]; + then + echo -ne "postgresql:" >> $CONTEXT_FILE + else + echo -ne "$DB_TYPE:" >> $CONTEXT_FILE + fi + if [ -z "$DB_HOST" ]; + then + echo -e "//localhost/$DB_NAME\"" >> $CONTEXT_FILE + else + echo -ne "//$DB_HOST" >> $CONTEXT_FILE + if [ ! -z "$DB_PORT" ]; + then + echo -ne ":$DB_PORT" >> $CONTEXT_FILE + fi + echo -e "/$DB_NAME\"" >> $CONTEXT_FILE + fi +else + echo -e "\t\turl=\"$DB_URL\"" >> $CONTEXT_FILE +fi +# [optional] Set the database User and Password to use: +if [ ! -z "$DB_USER" ]; +then + echo -e "\t\tusername=\"$DB_USER\" password=\"$DB_PASSWORD\"" >> $CONTEXT_FILE +fi +# [optional] Configure the DB connection pool (see all variables `DB_POOL_*`): +env | grep "^DB_POOL_" | while read -r line; +do + propname=`echo "$line" | sed 's/^DB_POOL_\([^=]*\)=.*/\1/' \ + | tr '[:upper:]' '[:lower:]' \ + | sed 's/_\([a-z]\)/\U\1/g'` + propvalue=`echo "$line" | sed 's/[^=]*=\(.*\)/\1/'` + echo -e "\t\t$propname=\"$propvalue\"" >> $CONTEXT_FILE +done +# Close the Resource: +echo -e "\t/>" >> $CONTEXT_FILE +# Close the Context...and finish the META-INF/context.xml file: +echo -e "" >> $CONTEXT_FILE + + +################################################################################ +# +# UPDATE WEB-INF/tap.properties WITH DB CONNECTION INFORMATION +# + +TAP_CONF_FILE=$WEBAPPS_DIR/tap/WEB-INF/tap.properties + +# Set the database access type: +sed -i -e "s/^[[:space:]]*database_access[[:space:]]*=.*$/database_access = jndi/" $TAP_CONF_FILE + +# Set the JNDI datasource name: +sed -i -e "s/^[[:space:]]*database_access[[:space:]]*=.*$/datasource_jndi_name = java:/comp/env/jdbc/tapdb/" $TAP_CONF_FILE + +# Set the ADQL->SQL translator: +sed -i -e "s/^[[:space:]]*sql_translator[[:space:]]*=.*$/sql_translator = ${DB_TYPE}/" $TAP_CONF_FILE + + +################################################################################ +# +# FINALLY START TOMCAT: +# +catalina.sh run + diff --git a/TAPLib/docker/tap.properties b/TAPLib/docker/tap.properties new file mode 100644 index 00000000..76e45854 --- /dev/null +++ b/TAPLib/docker/tap.properties @@ -0,0 +1,858 @@ +################################################################################ +# TAP CONFIGURATION FILE # +# # +# TAP Version: 2.3 # +# Date : # +# Author: # +# # +################################################################################ + +########### +# GENERAL # +########### + +# [OPTIONAL] +# This property lets set a custom home page. +# +# 4 different kinds of value are accepted: +# * nothing (default): the default home page provided by the library (just +# a simple HTML page displaying a list of all available +# TAP resources). +# * name or relative path of a file: this method MUST be chosen if the new +# home page is a JSP file. This file MUST +# be inside the directory WebContent of +# your web application. +# * a URI starting with file://: in this method the local file pointed by +# the URI will be merely returned when the +# home page will be requested. +# * a URL: here, a redirection toward this URL will be made at each request +# on the home page +# * a class name: the class name of an extension of tap.resource.HomePage +# which must replace the default home page resource. This +# class MUST have at least one constructor with exactly one +# parameter not NULL of type tap.resource.TAP. +home_page = + +# [OPTIONAL] +# MIME type of the service home page. +# +# This property is used only if the specified "home_page" is a local file path +# (i.e. if "home_page=file://..."). +# +# If no value is provided "text/html" will be set by default. +# +# Default: text/html +home_page_mime_type = + +############ +# PROVIDER # +############ + +# [OPTIONAL] +# Name of the provider of the TAP Service. +provider_name = + +# [OPTIONAL] +# Description of the TAP Service. +service_description = + +############ +# DATABASE # +############ + +# [MANDATORY] +# Method to use in order to create database connections. +# +# Only two values are supported: +# * jndi: database connections will be supplied by a Datasource whose the +# JNDI name must be given. This method may propose connection +# pooling in function of the datasource configuration. +# * jdbc: the library will create itself connections when they will be +# needed thanks to the below JDBC parameters. This method does not +# propose any connection pooling. +# +# Allowed values: jndi, jdbc. +database_access = jndi + +# [MANDATORY] +# The translator to use in order to translate ADQL to a SQL compatible with the +# used DBMS and its spatial extension. +# +# The TAP library supports only Postgresql (no spatial extension), +# PostgreSQL+PgSphere, SQLServer (no spatial extension), MySQL (no spatial +# extension) and H2 (no spatial extension) for the moment. But you can provide +# your own SQL translator (even if it does not have spatial features), by +# providing the name of a class (within brackets: {...}) that implements +# ADQLTranslator (for instance: {apackage.MyADQLTranslator}) and which have at +# least an empty constructor. +# +# Allowed values: postgres, pgsphere, sqlserver, mysql, h2, a class name +sql_translator = ${DB_TYPE} + +# [OPTIONAL] +# Size of result blocks to fetch from the database when a ADQL query is executed +# in Synchronous mode. +# +# Rather than fetching a query result in a whole, it may be possible to specify +# to the database that results may be retrieved by blocks whose the size can be +# specified with this property. If supported by the DBMS and the JDBC driver, +# this feature may help sparing memory and avoid too much waiting time from the +# TAP /sync users (and thus, avoiding some HTTP client timeouts). +# +# A negative or null value means that the default value of the JDBC driver will +# be used. Generally, it means that the database must wait to have collected all +# data before sending them to the library. +# +# Default: sync_fetch_size=10000 +sync_fetch_size = 10000 + +# [OPTIONAL] +# Size of result blocks to fetch from the database when an ADQL query is +# executed in Asynchronous mode. +# +# Rather than fetching a query result in a whole, it may be possible to specify +# to the database that results may be retrieved by blocks whose the size can be +# specified with this property. If supported by the DBMS and the JDBC driver, +# this feature may help sparing memory. +# +# A negative or null value means that the default value of the JDBC driver will +# be used. Generally, it means that the database must wait to have collected all +# data before sending them to the library. +# +# Default: async_fetch_size=100000 +async_fetch_size = 100000 + +# [OPTIONAL] +# If enabled, this option lets automatically try fixing a query whose parsing +# failed because of a token error. This is particularly useful in the following +# cases: +# +# - when a column/table identifier/alias has an incorrect syntax +# (e.g. `_RAJ2000`, `2mass`) +# - if the name of an ADQL function is used as a column/table identifier/alias +# (e.g. `distance`, `point`, `min`) +# - if the name of a reserved SQL keyword is used as a column/table +# identifier/alias +# (e.g. `public`, `date`, `year`, `user`) +# +# In all these cases, the name/identifier/alias will be surrounded between +# double quotes if the option `fix_on_fail` is enabled. +# +# This feature is also able to fix some incorrect Unicode characters +# (e.g. LaTeX alternatives for underscores, spaces and double/single quotes, +# copy-pasted from a PDF into a TAP query field). +# +# Warning: since this option alters the query provided by the query, it is +# possible that, after fix attempt, the query parses and runs but might +# generate an output different from what was expected. So, if this +# option is enabled, it should made be clear to the user that the TAP +# server might alter the query to make it work. +# +# Note: when an input query is fixed and run successfully, the fixed ADQL query +# is reported in an INFO element named `QUERY_AFTER_AUTO_FIX` inside the +# output VOTable. +# +# Default: fix_on_fail=false +fix_on_fail = false + +############################# +# IF DATABASE ACCESS = JNDI # +############################# + +# [MANDATORY] +# JNDI name of the datasource pointing toward the database to use. +# It should be defined in the web application (e.g. in the META-INF/context.xml +# file in tomcat). +datasource_jndi_name = java:/comp/env/jdbc/tapdb + +############################# +# IF DATABASE ACCESS = JDBC # +############################# + +# [MANDATORY] +# JDBC driver URL pointing toward the database to use. +# +# Note: The username, password or other parameters may be included in it, but +# in this case, the corresponding properties should leave empty or not +# provided at all. +jdbc_url = + +# [OPTIONAL] +# JDBC driver path. +# +# By default, it is guessed in function of the database name provided in the +# jdbc_url property. It MUST be provided if another DBMS is used or if the +# JDBC driver path does not match the following ones: +# * Oracle : oracle.jdbc.OracleDriver +# * PostgreSQL: org.postgresql.Driver +# * MySQL : com.mysql.jdbc.Driver +# * SQLite : org.sqlite.JDBC +# * H2 : org.h2.Driver +#jdbc_driver = + +# [MANDATORY] +# [Mandatory if the username is not already provided in jdbc_url] +# +# Username used to access to the database. +db_username = + +# [MANDATORY] +# [Mandatory if the password is not already provided in jdbc_url] +# +# Password used by db_username to access to the database. +# +# Note: No password encryption can be done in this configuration file for the +# moment. +db_password = + +############ +# METADATA # +############ + +# [MANDATORY] +# Metadata fetching method. +# +# The value of this key defines the way the library will get the list of all +# schemas, tables and columns to publish and all their metadata (e.g. utype, +# description, type, ...). +# +# In its current state, the library proposes three methods: +# 1/ Parse a TableSet XML document and load its content into the database +# schema TAP_SCHEMA (note: this schema is first erased and rebuilt by the +# library). +# 2/ Get all metadata from the database schema TAP_SCHEMA. +# 3/ Build yourself the metadata of your service by creating an extension of +# tap.metadata.TAPMetadata. This extension must have either an empty +# constructor or a constructor with exactly 3 parameters of type +# UWSFileManager, TAPFactory and TAPLog ; if both constructor are +# provided, only the one with parameters will be used. +# +# For the two first methods, it is also possible to specify an extension of +# tap.metadata.TAPMetadata which will wrap a default TAPMetadata objects created +# using the specified methods (i.e. XML tableset or TAP_SCHEMA). In this way, it +# is possible to get the "default" metadata from an XML file or the database +# and then add/remove/modify some of them, or to change the output of the +# 'tables' resource. The extension of tap.metadata.TAPMetadata must have at +# least one constructor with the following parameters: (TAPMetadata) or +# (TAPMetadata, UWSFileManager, TAPFactory, TAPLog). +# +# Allowed values: xml, xml {myTAPMetadata}, db, db {myTAPMetadata} +# or a full class name (between {}). +metadata = db + +# [MANDATORY] +# [Mandatory if the value of "metadata" is "xml".] +# +# Local file path to the TableSet XML document. +# +# The XML document must implement the schema TableSet defined by VODataService. +# The file path must be either an absolute local file path or a file path +# relative to WebContent (i.e. the web application directory in which there are +# WEB-INF and META-INF). +metadata_file = + +# [OPTIONAL] +# [ONLY USED IF metadata = db] +# +# Mapping between TAP_SCHEMA ADQL names and their names in the database. +# +# Any property named exactly (case sensitive) like TAP_SCHEMA items will be +# considered as a mapping between its ADQL name and its DB name. +# +# Examples: "TAP_SCHEMA = TAP_SCHEMA2" +# or "TAP_SCHEMA.columns.column_name = name" +# +# The property value MUST be NOT qualified. Just the item name is required. +# The value will be used as provided (with the same case). +# +# Note: +# The column dbName in the database TAP_SCHEMA declaring the standard +# TAP_SCHEMA entries (e.g. TAP_SCHEMA.schemas.dbName) is now ignored. Thus, +# only the mapping defined here, in the configuration file, is taken into +# account. +# +#TAP_SCHEMA = + +######### +# FILES # +######### + +# [MANDATORY] +# Type of the file manager. +# +# Accepted values are: local (to manage files on the local system). You can also +# add another way to manage files by providing the name (within brackets: {...}) +# of a class implementing TAPFileManager and having at least one constructor +# with only a java.util.Properties parameter. +# +# Allowed values: local, a class name. +file_manager = local + +# [MANDATORY] +# Local file path of the directory in which all TAP files (logs, errors, job +# results, backup, ...) must be. +# +# The file path must be either an absolute local directory path or a directory +# path relative to WebContent (i.e. the web application directory in which there +# are WEB-INF and META-INF). +file_root_path = /data + +# [OPTIONAL] +# Tells whether a directory should be created for each user. +# +# If yes, the user directory will be named with the user ID. In this directory, +# there will be error files, job results and it may be the backup file of the +# user. +# +# Allowed values: true (default), false. +directory_per_user = true + +# [OPTIONAL] +# Tells whether user directories must be grouped. +# +# If yes, directories are grouped by the first letter found in the user ID. +# +# Allowed values: true (default), false. +group_user_dir = true + +# [OPTIONAL] +# The default period (in seconds) to keep query results. +# +# The prefix "default" means here that this value is put by default by the TAP +# Service if the client does not provide a value for it. +# +# The default period MUST be less or equals to the maximum retention period. If +# this rule is not respected, the default retention period is set immediately to +# the maximum retention period. +# +# A negative or null value means there is no restriction on the default +# retention period: job results will be kept forever. Float values are not +# allowed. +# +# Default: 0 (results kept forever). +default_retention_period = 0 + +# [OPTIONAL] +# The maximum period (in seconds) to keep query results. +# +# The prefix "max" means here that the client can not set a retention period +# greater than this one. +# +# The maximum period MUST be greater or equals to the default retention period. +# If this rule is not respected, the default retention period is set immediately +# to the maximum retention period. +# +# A negative or null value means there is no restriction on the maximum +# retention period: the job results will be kept forever. Float values are not +# allowed. +# +# Default: 0 (results kept forever). +max_retention_period = 0 + +############# +# LOG FILES # +############# + +# [OPTIONAL] +# Logging method to use. +# +# Only two possibilities are already implemented. +# +# * default: default logger provided by the library. Any logged message +# will be appended in the file 'service.log' inside the root +# directory of this service (cf property 'file_root_path'). +# +# * slf4j: wrapper for SLF4J (https://www.slf4j.org). All log messages will +# be forwarded to SLF4J. It is up to the implementor to add the +# suitable JAR files in the Java class-path. Exactly two JAR files +# are expected by SLF4J to work as expected: +# - slf4j-api-{version}.jar (the main API) +# - and the slf4j-{binding}-{version}.jar. +# Depending on the chosen SLF4J binding, you may also add another +# JAR file (e.g. Log4J, LogBack, ...) in the Java class-path. +# A configuration file might also be needed. There, it will be +# possible to configure the the following loggers: +# - "tap.service" (general/root purpose log), +# - "tap.service.UWS" (UWS actions), +# - "tap.service.HTTP" (HTTP requests and responses), +# - "tap.service.JOB" (UWS's jobs actions), +# - "tap.service.THREAD" (job's thread actions), +# - "tap.service.TAP" (TAP actions) +# - and "tap.service.DB" (DB actions). +# +# * {...}: a custom logger. A class name MUST be provided +# (between {...}). The specified class must reference +# an implementation of tap.log.TAPLog. This implementation +# must have at least one constructor with a single parameter of +# type uws.service.file.UWSFileManager. +# +# Default: 'default' (i.e. tap.log.DefaultTAPLog) +logger = + +# [OPTIONAL] +# Minimum level that a message must have in order to be logged by the default +# logger. +# +# 5 possible values: +# * DEBUG: every messages are logged. +# * INFO: every messages EXCEPT DEBUG are logged. +# * WARNING: every messages EXCEPT DEBUG and INFO are logged. +# * ERROR: only ERROR and FATAL messages are logged. +# * FATAL: only FATAL messages are logged. +# +# Note: this property is ignored if `logger != default`. +# +# Default: DEBUG (every messages are logged) +min_log_level = + +# [OPTIONAL] +# Frequency of the log file rotation performed by the default logger. +# That's to say, logs will be written in a new file after this period. This +# avoid having too big log files. Old log files are renamed so that highlighting +# its logging period. +# +# The frequency string must respect the following syntax: +# 'D' hh mm: daily schedule at hh:mm +# 'W' dd hh mm: weekly schedule at the given day of the week +# (1:sunday, 2:monday, ..., 7:saturday) at hh:mm +# 'M' dd hh mm: monthly schedule at the given day of the month at hh:mm +# 'h' mm: hourly schedule at the given minute +# 'm': scheduled every minute (for completness :-)) +# +# Where: hh = integer between 0 and 23, +# mm = integer between 0 and 59, +# dd (for 'W') = integer between 1 and 7 +# (1:sunday, 2:monday, ..., 7:saturday), +# dd (for 'M') = integer between 1 and 31. +# +# Warning: The frequency type is case sensitive! Then you should particularly +# pay attention at the case when using the frequency types 'M' +# (monthly) and 'm' (every minute). +# +# Note 1: this property is ignored if the file manager is not any more an +# extension of uws.service.file.LocalUWSFileManager. +# +# Note 2: this property is ignored if `logger != default`. +# +# Default: D 0 0 (daily at midnight) +log_rotation = + +############## +# UWS_BACKUP # +############## + +# [OPTIONAL] +# Frequency at which the UWS service (that's to say, all its users and jobs) +# must be backuped. +# +# Allowed values: never (no backup will never be done ; default), user_action +# (each time a user does a writing action, like creating or +# execution a job), a time (must be positive and not null) in +# milliseconds. +# +# The value user_action can be used ONLY IF backup_by_user=true. +# +# Default: never +backup_frequency = never + +# [OPTIONAL] +# Tells whether the backup must be one file for every user (false), or one file +# for each user (true). This second option should be chosen if your TAP Service +# is organizing its files by user directories ; see the property +# directory_per_user. +# +# This option can be enabled ONLY IF a user identification method is provided ; +# see property user_identifier. +# +# Default: false +backup_by_user = false + +##################### +# ASYNCHRONOUS JOBS # +##################### + +# [OPTIONAL] +# Maximum number of asynchronous jobs that can run simultaneously. +# +# A negative or null value means there is no restriction on the number of +# running asynchronous jobs. +# +# Default: there is no restriction => max_async_jobs=0. +max_async_jobs = 0 + +################### +# QUERY_EXECUTION # +################### + +# [OPTIONAL] +# Default time (in milliseconds) for query execution. +# +# The prefix "default" means here that the execution duration will be this one +# if the client does not set one. +# +# The default duration MUST be less or equals to the maximum execution duration. +# If this rule is not respected, the default execution duration is set +# immediately to the maximum execution duration. +# +# A negative or null value means there is no restriction on the default +# execution duration: the execution could never end. Float values are not +# allowed. +# +# Default: there is no restriction => default_execution_duration=0. +default_execution_duration = 0 + +# [OPTIONAL] +# Maximum time (in milliseconds) for query execution. +# +# The prefix "max" means here that the client can not set a time greater than +# this one. +# +# The maximum duration MUST be greater or equals to the default execution +# duration. If this rule is not respected, the default execution duration is set +# immediately to the maximum execution duration. +# +# A negative or null value means there is no restriction on the maximum +# execution duration: the execution could never end. Float values are not +# allowed. +# +# Default: there is no restriction => max_execution_duration=0. +max_execution_duration = 0 + +########## +# OUTPUT # +########## + +# [OPTIONAL] +# Comma separated list of output formats for query results. +# +# Allowed values are: votable (or 'vot'), fits, text, csv, tsv, json and html. +# +# The VOTable format may be more detailed with the following syntax: +# (serialization,version):mime_type:short_mime_type. +# The MIME type part and the parameters part may be omitted +# (e.g. votable:application/xml:votable , votable(td,1.3)]). +# Empty string values are allowed for each values (e.g. votable():: , +# votable(td)::votable). +# +# The default VOTable format (i.e. serialization and version) is the one defined +# with the short form `votable`. It is be default set to +# `vot(binary,1.3)::votable` (see the special value `ALL` below). To change it +# just define a VOTable format with the short form `votable`. +# +# It is also possible to define a custom Separated Value format, different from +# CSV and TSV, thanks to the following syntax: +# sv(separator):mime_type:short_mime_type. On the contrary to the VOTable +# syntax, the parameter (i.e. separator) MUST BE provided. The MIME type part +# may be omitted ; then the MIME type will be set by default to text/plain. +# +# There is finally a last possible value: a class name of a class implementing +# OutputFormat and having at least one constructor with exactly one parameter of +# type tap.ServiceConnection. +# +# The special value "ALL" will select all formats provided by the library. It is +# equivalent to the following: +# output_formats = vot(binary,1.3)::votable, vot(td,1.3)::votable/td, +# vot(binary,1.3)::votable/b, vot(binary2,1.3)::votable/b2, +# vot(fits,1.3)::votable/fits, fits, csv, tsv, text, html, +# json +# +# Default: ALL +output_formats = ALL + +# [OPTIONAL] +# Default limit for the result output. +# +# The prefix "default" means here that this value will be set if the client does +# not provide one. +# +# This limit can be expressed in only one unit: rows. +# +# A negative value means there is no restriction on this limit. Float values are +# not allowed. +# +# Obviously this limit MUST be less or equal than output_max_limit. +# +# Default: there is no restriction: output_default_limit=-1 +output_default_limit = -1 + +# [OPTIONAL] +# Maximum limit for the result output. The prefix "max" means here that the +# client can not set a limit greater than this one. +# +# This limit can be expressed in only one unit: rows. +# +# A negative value means there is no restriction on this limit. Float values are +# not allowed. +# +# Obviously this limit MUST be greater or equal than output_default_limit. +# +# Default: there is no restriction => output_max_limit=-1 +output_max_limit = -1 + +########## +# UPLOAD # +########## + +# [OPTIONAL] +# Tells whether the Upload must be enabled. +# +# If enabled, files can be uploaded in the file_root_path, the corresponding +# tables can be added inside the UPLOAD_SCHEMA of the database, queried and then +# deleted. +# +# NOTE: Before being stored in the directory file_root_path, it is first +# uploaded in the temporary directory (defined in the JVM ; generally +# `/tmp` on Unix system and `c:\temp` ; it can be changed at start of the +# JVM with the property `java.io.tmpdir`). When the upload is complete, +# the file is finally moved in file_root_path. +# +# Allowed values: true, false (default). +upload_enabled = false + +# [OPTIONAL] +# Maximum limit for the number of uploaded records that can be inserted inside +# the database. +# +# This limit can be expressed with 2 types: rows or bytes. For rows, you just +# have to suffix the value by a "r" (upper- or lower-case), with nothing (by +# default, nothing will mean "rows"). For bytes, you have to suffix the numeric +# value by "b", "kb", "Mb" or "Gb". Here, unit is case sensitive (except for the +# last character: "b"). No other storage unit is allowed. +# +# A negative value means there is no restriction on this limit. Float values are +# not allowed. +# +# IMPORTANT NOTE: the specified limit will be checked at a different step of +# a query processing in function of its unit. +# If expressed in bytes, the file size will be checked when +# uploading the file on disk. Thus, when the uploading file +# starts to exceed the set limit, it will be no longer uploaded +# and the whole request will be immediately rejected. +# On the contrary, if the limit is expressed in rows, it will +# be tested only when ingesting the whole uploaded file +# (whatever is its size) in the database ; so, after it has been +# uploaded. As soon as, the rows insertion in the database +# exceeds the limit, the query is rejected. +# Consequently, a very huge file could potentially be +# completely uploaded before being rejected if this property is +# expressed in rows. Then, it is very important to set the +# property `upload_max_request_size` limiting the size of a +# whole HTTP request in order to better preserve your machine +# from running out of disk space. +# +# Default: upload_max_db_limit=1000000r (i.e. 1 million rows) +upload_max_db_limit = 1000000r + + +# [OPTIONAL] +# Maximum allowed size for a whole HTTP multipart request (i.e. request with +# uploads). +# +# This limit MUST be expressed in bytes. Thus, you have to suffix the numeric +# value by "B", "kB", "MB" or "GB". Here, unit is case sensitive. No other +# storage unit is allowed. +# +# A negative value means there is no restriction on this limit. Float values are +# not allowed. +# +# Warning: It is highly recommended to set this property in order to prevent +# exceeding the disk storage space/quota (especially if +# `upload_max_db_limit` is not set or is set in rows). +# +# Default: upload_max_request_size=250MB +upload_max_request_size = 250MB + +# [OPTIONAL ; DEPRECATED since v2.3] +# Default limit for the number of uploaded records that can be inserted inside +# the database. +# +# This property is DEPRECATED. You should use `upload_max_db_limit` instead. +# If it is set anyway, its value will be used as value for +# `upload_max_db_limit` ONLY IF this latter is not set. +# +# Default: upload_default_db_limit=-1 (i.e. unlimited) +upload_default_db_limit = -1 + +# [OPTIONAL ; DEPRECATED since v2.3] +# Maximum allowed size for the uploaded file. +# +# This property is DEPRECATED. You should use `upload_max_db_limit` with a value +# expressed in bytes if you wanted to limit the size of each uploaded file, or +# `upload_max_request_size` if your goal was to limit the input HTTP request +# size. If it is set anyway, its value will be used as value for +# `upload_max_request_size` ONLY IF this latter is not set. +# +# Default: upload_max_file_size=-1 (i.e. unlimited) +upload_max_file_size = -1 + +####################### +# USER IDENTIFICATION # +####################### + +# [OPTIONAL] +# Class to use in order to identify a user of the TAP service. +# +# The same instance of this class will be used for every request sent to the +# service. +# +# The value of this property MUST be a class name (with brackets: {...}) of a +# class implementing the interface uws.service.UserIdentifier. This class MUST +# have one of its constructors with no parameter. +# +# Default: no identification is performed => all users are then anonymous and +# their jobs can be seen by everybody. +user_identifier = + +###################### +# COORDINATE SYSTEMS # +###################### + +# [OPTIONAL] +# Comma-separated list of all allowed coordinate systems. +# +# Each item of the list be a kind of regular expression respecting the following +# syntax: Frame RefPos Flavor. In other words, it must be a string of exactly 3 +# parts. Each of this part is a single value, a list of allowed values +# or a * meaning all values. A list of values must be indicated between +# parenthesis and values must be separated by a pipe. +# +# Allowed values for Frame are: ICRS, FK4, FK5, J2000, ECLIPTIC, GALACTIC +# and UNKNOWNFRAME. +# Allowed values for RefPos are: BARYCENTER, GEOCENTER, HELIOCENTER, LSR, +# TOPOCENTER, RELOCATABLE and UNKNOWNREFPOS. +# Allowed values for Flavor are: CARTESIAN2, CARTESIAN3 and SPHERICAL2. +# +# If the special value NONE is given instead of a list of allowed coordinate +# systems, no coordinate system will be allowed. And if the list is empty, any +# coordinate system will be allowed. +# +# By default, any coordinate system is allowed. +coordinate_systems = + +############## +# GEOMETRIES # +############## + +# [OPTIONAL] +# Comma-separated list of all allowed geometries. +# +# Each item of the list must be the name (whatever is the case) of an ADQL +# geometrical function (e.g. INTERSECTS, COORDSYS, POINT) to allow. +# If the list is empty (no item), all functions are allowed. And if the special +# value NONE is given, no ADQL function will be allowed. +# +# Default: all ADQL geometrical functions are allowed. +geometries = + +################################# +# USER DEFINED FUNCTIONS (UDFs) # +################################# + +# [OPTIONAL] +# Comma-separated list of all allowed UDFs (User Defined Functions). +# +# Each item of the list must have the following syntax: [fct_signature], +# [fct_signature, className] or [fct_signature, className, description]. +# fct_function is the function signature. Its syntax is the same as in +# TAPRegExt. className is the name of a class extending UserDefinedFunction. +# An instance of this class will replace any reference of a UDF written in an +# ADQL function with the associated signature. A class name must be specified if +# the function to represent has a signature (and more particularly a name) +# different in ADQL and in SQL. description is the human description of the +# function to be displayed in the /capabilities of the TAP service. It must be +# written between double quotes. +# +# Example: udfs = [ivo_healpix_index(hpxOrder integer, ra double, dec double) +# -> bigint, {adql.query.operand.function.healpix.HealpixIndex} +# , "Compute the index of the \"Healpix cell\" containing the +# specified position at the given Healpix order."], +# [trim(txt String) -> String], +# [newFct(x double)->double, {apackage.MyNewFunction}], +# [random() -> DOUBLE,,"Generate a random number."] +# +# If the list is empty (no item), all unknown functions are forbidden. And if +# the special value ANY is given, any unknown function is allowed ; consequently +# the unknown ADQL functions will be translated into SQL as they are in ADQL. +# +# Default: no unknown function is allowed. +udfs = [] + +######################## +# ADDITIONAL RESOURCES # +######################## + +# [OPTIONAL] +# URL of the XSLT stylesheet to link with the XML output of /capabilities. +# +# By default, no XSLT stylesheet is defined. +capabilities_stylesheet = + +# [OPTIONAL] +# URL of the XSLT stylesheet to link with the XML output of /tables. +# +# By default, no XSLT stylesheet is defined. +tables_stylesheet = + +# [OPTIONAL] +# This property lets add an /examples endpoint by specifying an +# XHTML-RDFa document listing TAP query examples using the syntax specified by +# TAPNotes 1.0 DALI 1.0. +# +# 3 different kinds of value are accepted: +# * nothing (default): no /examples endpoint. +# * name or relative path of a file: this method MUST be chosen if the +# endpoint content is a JSP file. This file MUST be inside the directory +# WebContent of your web application. +# * URI starting with file://: in this method the local file pointed by the +# URI will be merely returned when the endpoint will be requested. +# * a URL: here, a redirection toward this URL will be made at each request +# on the endpoint +# +# If you want a custom /examples endpoint (i.e. you do not) +# want to forward/redirect to a file/URL), you can create a class which +# implements TAPResource AND VOSIResource. The function getName() must return +# "examples". Then, just append the classpath to the property +# "additional_resources" of the TAP configuration file. +# +# By default, the TAP service does not have any /examples endpoint. +examples = + +# [OPTIONAL] +# Comma-separated list of additional TAP resources/end-point. +# +# By default, the following standard TAP resources are already existing: /sync, +# /async, /tables, /capabilities and /availability. With this property, you can +# add a custom resource to your TAP service (e.g. /adqlValidator, /admin). +# +# Each item of the list MUST be the name of a class implementing +# tap.resource.TAPResource. This class MUST have at least one constructor with +# exactly one parameter of type tap.resource.TAP. +# +# The string returned by tap.resource.TAPResource.getName() will be the +# resource name, following the root TAP service URL (e.g. if getName() returns +# "foo", then its access URL will "{tapRoot}/foo"). Then, it is possible to +# replace TAP resources already existing by using the same name (e.g. if +# getName() returns "sync", the /sync resource won't be anymore the default Sync +# resource of this library but your new resource). +# +# By default, this list is empty ; only the standard TAP resources exist. +additional_resources = + +###################### +# CUSTOM TAP_FACTORY # +###################### + +# [OPTIONAL] +# Class to use in replacement of the default TAPFactory. +# +# This property must be a class name (given between {...}). It must reference an +# implementation of TAPFactory. This implementation must have at least one +# constructor with exactly one parameter of type ServiceConnection. +# +# It is recommended to extend an existing implementation such as: +# tap.AbstractTAPFactory or tap.config.ConfigurableTAPFactory. +# +# By default, the default TAPFactory (tap.config.ConfigurableTAPFactory) is used +# and may use all properties related to the backup management, the database +# access, the TAP_SCHEMA mapping and the ADQL translation. +tap_factory = diff --git a/TAPLib/docker/tomcat/shared-libs/TODO.txt b/TAPLib/docker/tomcat/shared-libs/TODO.txt new file mode 100644 index 00000000..8bc3f762 --- /dev/null +++ b/TAPLib/docker/tomcat/shared-libs/TODO.txt @@ -0,0 +1,2 @@ +Add in this directory the JAR library for the JDBC driver compatible with your +target database. diff --git a/TAPLib/docker/tomcat/tap-webapp/META-INF/MANIFEST.MF b/TAPLib/docker/tomcat/tap-webapp/META-INF/MANIFEST.MF new file mode 100644 index 00000000..254272e1 --- /dev/null +++ b/TAPLib/docker/tomcat/tap-webapp/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/TAPLib/docker/tomcat/tap-webapp/WEB-INF/lib/stil_3.3-2.jar b/TAPLib/docker/tomcat/tap-webapp/WEB-INF/lib/stil_3.3-2.jar new file mode 100644 index 00000000..68d04aa6 Binary files /dev/null and b/TAPLib/docker/tomcat/tap-webapp/WEB-INF/lib/stil_3.3-2.jar differ diff --git a/TAPLib/docker/tomcat/tap-webapp/WEB-INF/lib/vollt.jar b/TAPLib/docker/tomcat/tap-webapp/WEB-INF/lib/vollt.jar new file mode 100644 index 00000000..ae238d15 Binary files /dev/null and b/TAPLib/docker/tomcat/tap-webapp/WEB-INF/lib/vollt.jar differ diff --git a/TAPLib/docker/tomcat/tap-webapp/WEB-INF/web.xml b/TAPLib/docker/tomcat/tap-webapp/WEB-INF/web.xml new file mode 100644 index 00000000..c7a535d4 --- /dev/null +++ b/TAPLib/docker/tomcat/tap-webapp/WEB-INF/web.xml @@ -0,0 +1,29 @@ + + + TAP Service + + index.html + index.htm + index.jsp + default.html + default.htm + default.jsp + + + + jdbc/testdb + javax.sql.DataSource + Container + + + + TAP Test Service + tap + tap.config.ConfigurableTAPServlet + + + tap + /* + + + diff --git a/TAPLib/docker/tomcat/tomcat-users.xml b/TAPLib/docker/tomcat/tomcat-users.xml new file mode 100644 index 00000000..143f4972 --- /dev/null +++ b/TAPLib/docker/tomcat/tomcat-users.xml @@ -0,0 +1,45 @@ + + + + + + + + + + +