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