#!/bin/sh
#
# SPDX-License-Identifier: CDDL-1.0
#
# Copyright 2025 Peter Tribble
#
# build jkstat
#
# 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 jkstat.war
#    Creates a war file to run an XMLRPC server with tomcat
#    See README.SERVER for details of how to run it
#
# ./build jkrest.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

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

JFJAR=${JARLIBDIR}/jfreechart-1.5.6.jar
JSONJAR=${JARLIBDIR}/openjson-1.0.13.jar
JINGLEJAR=${JARLIBDIR}/jingle.jar
JUMBLEJAR=${JARLIBDIR}/jumble.jar
JSTRIPJAR=${JARLIBDIR}/jstripchart.jar
JKJAR=${JARLIBDIR}/jkstat.jar
JKAPIJAR=${JARLIBDIR}/jkstat-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=${JFJAR}:${JSONJAR}:${JINGLEJAR}:${JUMBLEJAR}:${JSTRIPJAR}:${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.jkstat"

#
# 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/jkstat/api/NativeJKstat.java
	javah -jni uk.co.petertribble.jkstat.api.NativeJKstat
	exit 0
	;;
javadoc)
	rm -fr javadoc
	mkdir javadoc
	javadoc -classpath "${BUILDJARS}":. -d javadoc -Xdoclint:all uk.co.petertribble.jkstat.api uk.co.petertribble.jkstat.browser uk.co.petertribble.jkstat.gui uk.co.petertribble.jkstat.demo uk.co.petertribble.jkstat.util uk.co.petertribble.jkstat.client uk.co.petertribble.jkstat.server uk.co.petertribble.jkstat.parse
	exit 0
	;;
clean)
	rm -f $(find uk/co -type f -name '*.class')
	rm -f $(find . -type f -name '*~')
	rm -fr javadoc
	rm -f jkstat.war
	rm -f jkrest.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/jkstat.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 -classpath .:"${BUILDJARS}" uk/co/petertribble/jkstat/*/*.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: jkstat > jkstat.installed
	./mkproto i386 $2 > prototype.i386
	./mkproto sparc $2 > prototype.sparc
	pkgmk -d /tmp -f prototype.i386 -r $(pwd) TRIBjkstat
	pkgtrans -s /tmp /tmp/TRIBjkstat-i386.pkg TRIBjkstat
	rm -fr /tmp/TRIBjkstat
	pkgmk -d /tmp -f prototype.sparc -r $(pwd) TRIBjkstat
	pkgtrans -s /tmp /tmp/TRIBjkstat-sparc.pkg TRIBjkstat
	rm -fr /tmp/TRIBjkstat
	ls -lh /tmp/TRIBjkstat-sparc.pkg /tmp/TRIBjkstat-i386.pkg
	rm prototype.i386 prototype.sparc
	rm jkstat.installed
	rm -f depend
	exit 0
	;;
jkstat.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/jkstat.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 ../jkstat.war *
	cd ..
	rm -fr war
	exit 0
	;;
jkrest.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 -classpath ../lib/java/jkstat.jar:${JAXRSJAR} uk/co/petertribble/jkrest/*.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/jkstat.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/jkrest
	cp ../jersey/uk/co/petertribble/jkrest/*.class WEB-INF/classes/uk/co/petertribble/jkrest
	cp -p ../jersey/index.html .
	cp -pr ../jskstat/* .
	# create the war file
	jar cf ../jkrest.war *
	cd ..
	rm -fr war
	rm -f jersey/uk/co/petertribble/jkrest/*.class
	exit 0
	;;
esac

javac -Xlint -classpath .:"${BUILDJARS}" uk/co/petertribble/jkstat/*/*.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 libkstat_jni.so -lkstat -o "${ARCHLIBDIR}"/libkstat_jni.so uk_co_petertribble_jkstat_api_NativeJKstat.c
    ;;
sparcv9)
    cc -xcode=pic13 -shared -m64 -I${JINCLUDE}/include -I${JINCLUDE}/include/solaris -h libkstat_jni.so -lkstat -o "${ARCHLIBDIR}"/libkstat_jni.so uk_co_petertribble_jkstat_api_NativeJKstat.c
    ;;
esac

jar -cmf jkstat.manifest "${JKJAR}" help/* pixmaps/* properties/jkstat.properties $(find uk/co -name '*.class')

jar -cf "${JKAPIJAR}" $(find uk/co/petertribble/jkstat/api -name '*.class') uk/co/petertribble/jkstat/util/NumericStringComparator.class

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