#!/bin/sh
#
# SPDX-License-Identifier: CDDL-1.0
#
# Copyright 2025 Peter Tribble
#
# build jproc
#
# Usage:
#
# ./build
#    Builds all the java classes, and recompiles the native library.
#
# ./build jni
#    (Re)Creates the jni header file. Only needed if the native interface
#    changes, which it shouldn't
#
# ./build javadoc
#    Generates the javadoc
#
# ./build clean
#    Removes all the class files, ready for distribution
#
# ./build pmd
#    Runs the pmd static code analysis tool, if it's installed
#
# ./build spotbugs
#    Runs the spotbugs static code analysis tool, if it's installed
#
# ./build packages [deps]
#    Creates SVR4 packages
#
# ./build jproc.war
#    Creates a war file to run an XMLRPC server with tomcat
#    See README.SERVER for details of how to run it
#
# ./build jprest.war
#    Creates a war file to run a RESTful server with tomcat
#    See jersey/README.JERSEY for details of how to run it
#

#
# explicitly build with jdk11
#
PATH=/usr/jdk/instances/jdk11/bin:$PATH
export PATH

JPDIR=$(dirname "$0")
LIBDIR=${JPDIR}/lib
JARLIBDIR=${LIBDIR}/java
ARCHLIBDIR=${LIBDIR}/$(/usr/bin/isainfo -k)

JSONJAR=${JARLIBDIR}/openjson-1.0.13.jar
JINGLEJAR=${JARLIBDIR}/jingle.jar
JUMBLEJAR=${JARLIBDIR}/jumble.jar
JPJAR=${JARLIBDIR}/jproc.jar
JPAPIJAR=${JARLIBDIR}/jproc-api.jar
REMOTEJARS=${JARLIBDIR}/xmlrpc-common-3.1.3.jar:${JARLIBDIR}/xmlrpc-server-3.1.3.jar:${JARLIBDIR}/xmlrpc-client-3.1.3.jar:${JARLIBDIR}/jmdns-3.6.2.jar
BUILDJARS=${JSONJAR}:${JINGLEJAR}:${JUMBLEJAR}:${REMOTEJARS}

#
# run
# ./build pmd
# to use this, you must have pmd in your path
#
# new PMD version 7 only has categories, configured in pmd-ruleset.xml
#
PMDRULES="./pmd-ruleset.xml"
PMDCACHE="${HOME}/.pmd/cache.jproc"

#
# This is to build a RESTful server using jersey.
#
JERSEYDIR="../jaxrs-ri"
JAXRSJAR="../${JERSEYDIR}/api/jakarta.ws.rs-api-2.1.6.jar"

case $1 in
jni)
	javac uk/co/petertribble/jproc/api/NativeJProc.java
	javah -jni uk.co.petertribble.jproc.api.NativeJProc
	exit 0
	;;
javadoc)
	rm -fr javadoc
	mkdir javadoc
	javadoc -classpath "${BUILDJARS}":. -d javadoc -Xdoclint:all uk.co.petertribble.jproc.api uk.co.petertribble.jproc.client uk.co.petertribble.jproc.demo uk.co.petertribble.jproc.gui uk.co.petertribble.jproc.parse uk.co.petertribble.jproc.server uk.co.petertribble.jproc.util
	exit 0
	;;
clean)
	rm -f $(find uk/co -type f -name '*.class')
	rm -f $(find . -type f -name '*~')
	rm -fr javadoc
	rm -f jproc.war
	rm -f jprest.war
	exit 0
	;;
pmd)
	if [ ! -d "${HOME}/.pmd" ]; then
	    mkdir -p "${HOME}/.pmd"
	fi
	pmd check --cache "${PMDCACHE}" -d uk -R ${PMDRULES} --use-version java-11 --aux-classpath $(echo lib/java/* | sed 's= =:=g') 2>/dev/null
	(cd jersey || exit 1; pmd check --cache "${PMDCACHE}" -d uk -R ../${PMDRULES} --use-version java-11 --aux-classpath ../lib/java/jproc.jar:${JAXRSJAR} 2>/dev/null)
	pmd check --cache "${PMDCACHE}".html -d help/*.html -R category/html/bestpractices.xml 2>/dev/null
	exit 0
	;;
spotbugs)
	#
	# spotbugs works on the class files, so those need to be available
	#
	javac -Xlint -Xlint:-rawtypes -classpath .:"${BUILDJARS}" uk/co/petertribble/jproc/api/*.java uk/co/petertribble/jproc/demo/*.java uk/co/petertribble/jproc/gui/*.java uk/co/petertribble/jproc/server/*.java uk/co/petertribble/jproc/client/*.java uk/co/petertribble/jproc/parse/*.java
	spotbugs -auxclasspath $(echo lib/java/* | sed 's= =:=g') uk
	rm -f $(find uk/co -type f -name '*.class')
	exit 0
	;;
packages)
	sed s:INSTALLED=false:INSTALLED=true: jproc > jproc.installed
	./mkproto i386 $2 > prototype.i386
	./mkproto sparc $2 > prototype.sparc
	pkgmk -d /tmp -f prototype.i386 -r $(pwd) TRIBjproc
	pkgtrans -s /tmp /tmp/TRIBjproc-i386.pkg TRIBjproc
	rm -fr /tmp/TRIBjproc
	pkgmk -d /tmp -f prototype.sparc -r $(pwd) TRIBjproc
	pkgtrans -s /tmp /tmp/TRIBjproc-sparc.pkg TRIBjproc
	rm -fr /tmp/TRIBjproc
	ls -l /tmp/TRIBjproc-sparc.pkg /tmp/TRIBjproc-i386.pkg
	rm prototype.i386 prototype.sparc
	rm jproc.installed
	rm -f depend
	exit 0
	;;
jproc.war)
	# this is the vanilla war, which will enable tomcat
	# to be a jkstat server
	mkdir war
	cd war || exit 1
	mkdir -p WEB-INF/lib org/apache/xmlrpc/webserver
	cp -p ../WEB-INF/XmlRpcServlet.properties org/apache/xmlrpc/webserver/XmlRpcServlet.properties
	jar cf WEB-INF/lib/props.jar org
	rm -fr org
	# only copy the jars we need
	cp ../lib/java/jproc.jar ../lib/java/ws* ../lib/java/xmlrpc* ../lib/java/commons-logging* WEB-INF/lib
	cp ../WEB-INF/web.xml WEB-INF
	# create the war file
	jar cf ../jproc.war *
	cd ..
	rm -fr war
	exit 0
	;;
jprest.war)
	# this is an extended war using jersey, allowing RESTful services
	if [ ! -d "${JERSEYDIR}" ]; then
	    echo "Unable to find jersey, exiting..."
	    exit 1
	fi
	cd jersey || exit 1
	if [ ! -f "${JAXRSJAR}" ]; then
	    echo "Unable to find javax.ws.rs jar, exiting..."
	    exit 1
	fi
	javac -Xlint -Xlint:-rawtypes -classpath ../lib/java/jproc.jar:${JAXRSJAR} uk/co/petertribble/jprest/*.java
	cd ..
	mkdir war
	cd war || exit 1
	mkdir -p WEB-INF/lib org/apache/xmlrpc/webserver
	cp -p ../WEB-INF/XmlRpcServlet.properties org/apache/xmlrpc/webserver/XmlRpcServlet.properties
	jar cf WEB-INF/lib/props.jar org
	rm -fr org
	# only copy the jars we need
	cp ../lib/java/jproc.jar ../lib/java/ws* ../lib/java/xmlrpc* ../lib/java/commons-logging* WEB-INF/lib
	cp ../${JERSEYDIR}/lib/*.jar WEB-INF/lib
	cp ../${JERSEYDIR}/api/*.jar WEB-INF/lib
	cp ../${JERSEYDIR}/ext/*.jar WEB-INF/lib
	cp ../jersey/web.xml WEB-INF/web.xml
	mkdir -p WEB-INF/classes/uk/co/petertribble/jprest
	cp ../jersey/uk/co/petertribble/jprest/*.class WEB-INF/classes/uk/co/petertribble/jprest
	# create the war file
	jar cf ../jprest.war *
	cd ..
	rm -fr war
	rm -f jersey/uk/co/petertribble/jprest/*.class
	exit 0
	;;
esac

javac -Xlint -Xlint:-rawtypes -classpath .:"${BUILDJARS}" uk/co/petertribble/jproc/api/*.java uk/co/petertribble/jproc/demo/*.java uk/co/petertribble/jproc/gui/*.java uk/co/petertribble/jproc/server/*.java uk/co/petertribble/jproc/client/*.java uk/co/petertribble/jproc/parse/*.java

JINCLUDE=/usr/jdk/instances/jdk11

#
# compiling 64-bit objects is more complex
#
case $(isainfo -k) in
amd64)
    cc -Kpic -shared -m64 -I${JINCLUDE}/include -I${JINCLUDE}/include/solaris -h libproc_jni.so -lproject -o "${ARCHLIBDIR}"/libproc_jni.so uk_co_petertribble_jproc_api_NativeJProc.c
    ;;
sparcv9)
    cc -xcode=pic13 -shared -m64 -I${JINCLUDE}/include -I${JINCLUDE}/include/solaris -h libproc_jni.so -lproject -o "${ARCHLIBDIR}"/libproc_jni.so uk_co_petertribble_jproc_api_NativeJProc.c
    ;;
esac

jar -cmf jproc.manifest "${JPJAR}" help/*.html help/CDDL.txt properties/jproc.properties $(find uk/co -name '*.class')

jar -cf "${JPAPIJAR}" $(find uk/co/petertribble/jproc/api -name '*.class')

rm -f $(find uk/co -type f -name '*.class')
