#!/bin/bash
set -e
geoladrisVersion="7.0.0"
USAGE="""
usage: $0 [-d
] [-v geoladris_version] [-s]
Creates a new Geoladris application from a directory of resources.
The directory may contain the following files/directories:
- build.json File containing the description of the application (see below).
- config Directory with the application configuration
(see https://geoladris.github.io/doc/user/config/).
- context.xml Context file to be used by Tomcat (see
https://tomcat.apache.org/tomcat-8.0-doc/config/context.html).
Options:
-d Directory to use for building. It must contain a build.json
descriptor and a default_config directory; default is the
current directory.
-v Geoladris version for plugins without a version; default is
${geoladrisVersion}.
build.json must contain a JSON object with the following properties:
- name Application's name; default is 'demo'.
- version Application's version; default is '1.0.0'.
- plugins An array of strings; each string has this format
[groupId:]pluginId[:version].
groupId is optional; default is geoladris group ids.
version is optional; default is '${geoladrisVersion}'
- repositories A JSON object containing extra repositories for
plugins. Keys are repository names; values are
repository URLs.
Minimal example:
{
\"plugins\" : [ \"base\" ]
}
Complete example:
{
\"name\" : \"demo\",
\"version\" : \"1.0.0\",
\"plugins\" : [
\"base\",
\"mygroup:myplugin:1.0.0\"
],
\"maven_repositories\" : {
\"example-releases\" : \"http://example.com/repository/releases/\",
\"example-snapshots\" : \"http://example.com/repository/snapshots/\"
}
}
"""
deploy="false"
dir=$PWD
while getopts ":hpv:d:" opt; do
case $opt in
h)
echo "$USAGE"
exit 0
;;
v)
geoladrisVersion="$OPTARG"
;;
d)
dir="$OPTARG"
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
esac
done
buildJson="$dir/build.json"
configDir="$dir/config"
workDir="$dir/.geoladris"
log="$dir/geoladris.log"
if [ ! -f "${buildJson}" ]; then
echo "$dir must be a directory containing a build.json file"
exit 1
fi
mvn -version > $log
echo >> $log
echo "[INFO] Generating directories..."
rm -rf ${workDir}
mkdir ${workDir}
mkdir -p "${workDir}/src/main/webapp/WEB-INF"
mkdir -p "${workDir}/src/main/webapp/META-INF"
if [ -d "${configDir}" ]; then
cp -r ${configDir} "${workDir}/src/main/webapp/WEB-INF/default_config"
fi
function getOpt {
ret=`jq -r "$1" "${buildJson}" | sed '/null/d'`
if [ -n "${ret}" ]; then
echo ${ret}
else
echo $2
fi
}
name=`getOpt ".name" "demo"`
version=`getOpt ".version" "1.0.0"`
plugins=`jq -r '.plugins[]' ${buildJson} 2> /dev/null`
if [ -z "${plugins}" ]; then
echo "[ERROR] build.json must have a 'plugins' property with an array containing at least one plugin"
exit 2
fi
echo "[INFO] Generating Java dependency files..."
###########
# pom.xml #
###########
pom=${workDir}/pom.xml
cat >> ${pom} << EOF
4.0.0
com.github.geoladris
${name}
${version}
war
UTF-8
v8.9.4
v1.3.2
EOF
# Extra repositories
repoNames=`jq -r '.maven_repositories | keys[]' ${buildJson} 2> /dev/null | sed '/null/d'`
for repoName in ${repoNames}; do
repoUrl=`jq -r ".maven_repositories | .[\"${repoName}\"]" ${buildJson}`
cat >> ${pom} << EOF
${repoName}
${repoUrl}
EOF
done
cat >> ${pom} << EOF
EOF
# Dependencies
cat >> ${pom} << EOF
EOF
set +e
for plugin in ${plugins}; do
pluginGroup=`echo ${plugin} | cut -s -d: -f 1`
pluginName=`echo ${plugin} | cut -s -d: -f 2`
pluginVersion=`echo ${plugin} | cut -s -d: -f 3`
if [ -z "${pluginGroup}" -o -z "${pluginName}" -o -z "${pluginVersion}" ]; then
pluginGroup="com.github.geoladris.plugins"
pluginName=${plugin}
pluginVersion=${geoladrisVersion}
fi
echo >> $log
echo ">> Checking dependency ${pluginGroup}:${pluginName}:${pluginVersion}" >> $log
mvn dependency:get -Dartifact=${pluginGroup}:${pluginName}:${pluginVersion} >> $log
if [ $? == 0 ]; then
cat >> ${pom} << EOF
${pluginGroup}
${pluginName}
${pluginVersion}
EOF
else
echo "[WARN] Invalid Java dependency: ${pluginGroup}:${pluginName}:${pluginVersion}"
fi
done
echo >> $log
set -e
# Build
cat >> ${pom} << 'EOF'
com.github.eirslett
frontend-maven-plugin
1.6
install-node-and-yarn
install-node-and-yarn
${node.version}
${yarn.version}
yarn install
yarn
install
yarn-build
yarn
prepare-package
run build
EOF
################
# package.json #
################
echo "[INFO] Generating JavaScript dependency files..."
cat > "${workDir}/package.json" << EOF
{
"name": "${name}",
"version": "${version}",
"dependencies": {
"@geoladris/geojson": "dev",
"@geoladris/core": "dev",
"@csgis-geoladris/ui": "1.0.0-alpha.2"
},
"devDependencies": {
"requirejs": "^2.1.8"
},
"scripts": {
"build": "gl-build-app.js && r.js -o .requirejs-build.js"
}
}
EOF
echo >> $log
echo ">> Installing node and yarn..." >> $log
mvn -f ${pom} process-resources >> $log
echo >> $log
set +e
for plugin in ${plugins}; do
pluginOrg=`echo ${plugin} | cut -s -d: -f 1`
pluginName=`echo ${plugin} | cut -s -d: -f 2`
pluginVersion=`echo ${plugin} | cut -s -d: -f 3`
if [ -z "${pluginOrg}${pluginName}${pluginVersion}" ]; then
dep="@geoladris/${plugin}@dev"
else
dep=@${pluginOrg}/${pluginName}@${pluginVersion}
fi
echo >> $log
echo "Adding ${dep} with yarn..." >> $log
${workDir}/node/yarn/dist/bin/yarn add --non-interactive --cwd "${workDir}" "${dep}" >> $log 2>> $log
if [ $? != 0 ]; then
echo "[WARN] Invalid JavaScript dependency: ${dep}"
fi
done
echo >> $log
set -e
###########
# web.xml #
###########
if [ -f "${dir}/web.xml" ]; then
cp "${dir}/web.xml" "${workDir}/src/main/webapp/WEB-INF/web.xml"
else
cat > "${workDir}/src/main/webapp/WEB-INF/web.xml" << 'EOF'
proxyPropPath
/proxy.properties
HttpProxy
it.geosolutions.httpproxy.HTTPProxy
HttpProxy
/proxy
Application database
jdbc/geoladris
javax.sql.DataSource
Container
EOF
fi
###############
# context.xml #
###############
cat > "${workDir}/src/main/webapp/META-INF/context.xml" << 'EOF'
WEB-INF/web.xml
EOF
#########
# Build #
#########
echo "[INFO] Packaging..."
echo "Building with Maven..." >> $log
mvn -f ${pom} package >> $log
cp ${workDir}/target/*.war ${workDir}/../
rm -rf ${workDir}
echo "[INFO] Done."