#!/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.

# Not xloader
## xloader (forerly "TDB 1 tdbloader2") is slightly different.
##   The main program is not a java program
##   It is split into several scripts that leverage a mixture of 
##   POSIX and java tools and should be maintained separately

# Not script "jena"
## the "jena" script is slightly different (see end of script).

CMDS=$(cat <<EOF
jena.rdfcat
jena.rdfcompare
jena.rdfcopy
jena.rdfparse
jena.schemagen
arq.rdfdiff
arq.sparql
arq.arq
arq.iri
arq.juuid
arq.rsparql
arq.rset
arq.qparse
arq.uparse
arq.update
arq.rupdate
arq.wwwdec
arq.wwwenc
riotcmd.riot
riotcmd.ntriples
riotcmd.nquads
riotcmd.turtle
riotcmd.trig
riotcmd.infer
riotcmd.utf8
riotcmd.rdfxml
shacl.shacl
shex.shex
tdb.tdbbackup
tdb.tdbdump
tdb.tdbloader
tdb.tdbquery
tdb.tdbstats
tdb.tdbupdate
EOF
)

CMDS2=$(cat <<EOF
jena.version
tdb2.tdbbackup
tdb2.tdbdump
tdb2.tdbcompact
tdb2.tdbloader
tdb2.tdbquery
tdb2.tdbstats
tdb2.tdbupdate
EOF
)

make_bin()
{
    local C=$1
    # Filename.
    CMD=bin/${C#*.}
    sed -e "s!JENA_CMD!$C!" < template.bin > $CMD
}

# These scripts end up with the full name of the command
make_bin_full()
{
    local C=$1
    # Filename.
    CMD="bin/$C"
    sed -e "s!JENA_CMD!$C!" < template.bin > $CMD
}

make_bat()
{
    local C=$1
    # Filename.
    CMD=bat/${C#*.}.bat
    sed -e "s!JENA_CMD!$C!" < template.bat > $CMD
}

make_bat_full()
{
    local C=$1
    # Filename.
    # Replace '.' by '_'
    CMD="$(echo "bat/$C" | sed -e s!\\.!_!g).bat"
    sed -e "s!JENA_CMD!$C!" < template.bat > $CMD
}

for cmd in $CMDS
do
    ## echo $cmd
    make_bin $cmd
    make_bat $cmd
done

for cmd in $CMDS2
do
    ## echo $cmd
    make_bin_full $cmd
    make_bat_full $cmd
done
