dnl
dnl Licensed to the Apache Software Foundation (ASF) under one or more
dnl contributor license agreements.  See the NOTICE file distributed with
dnl this work for additional information regarding copyright ownership.
dnl The ASF licenses this file to You under the Apache License, Version 2.0
dnl (the "License"); you may not use this file except in compliance with
dnl the License.  You may obtain a copy of the License at
dnl
dnl     http://www.apache.org/licenses/LICENSE-2.0
dnl
dnl Unless required by applicable law or agreed to in writing, software
dnl distributed under the License is distributed on an "AS IS" BASIS,
dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
dnl See the License for the specific language governing permissions and
dnl limitations under the License.
dnl

dnl --------------------------------------------------------------------------
dnl Author Henri Gomez <hgomez@apache.org>
dnl
dnl Inspired by Pier works on webapp m4 macros :)
dnl 
dnl Version $Id$
dnl --------------------------------------------------------------------------

dnl --------------------------------------------------------------------------
dnl JK_JDK
dnl
dnl Detection of JDK location and Java Platform (1.1, 1.2, 1.3, 1.4)
dnl result goes in JAVA_HOME / JAVA_PLATFORM (1 -> 1.1, 2 -> 1.2 and higher)
dnl 
dnl --------------------------------------------------------------------------
AC_DEFUN(
  [JK_JNI],
  [
    AC_ARG_WITH(jni,
      [  --with-jni               Build jni support],
      [
		case "${withval}" in
		  y | yes | true) use_jni=true ;;
		  n | no | false) use_jni=false ;;
	    *) use_jni=true ;;
	      esac

		if ${TEST} "${use_jni}" = "true"; then
		  HAVE_JNI="-DHAVE_JNI"
		  JNI_BUILD="jni-build"
		fi
      ])
  ])

AC_DEFUN(
  [JK_JDK],
  [
    if ${TEST} "${use_jni}" = "true"; then
      tempval=""
      AC_MSG_CHECKING([for JDK location (please wait)])
      if ${TEST} -n "${JAVA_HOME}" ; then
        JAVA_HOME_ENV="${JAVA_HOME}"
      else
        JAVA_HOME_ENV=""
      fi

      JAVA_HOME=""
      JAVA_PLATFORM=""

      AC_ARG_WITH(
        [java-home],
        [  --with-java-home=DIR     Location of JDK directory.],
        [

        # This stuff works if the command line parameter --with-java-home was
        # specified, so it takes priority rightfully.
  
        tempval=${withval}

        if ${TEST} ! -d "${tempval}" ; then
            AC_MSG_ERROR(Not a directory: ${tempval})
        fi
  
        JAVA_HOME=${tempval}
        AC_MSG_RESULT(${JAVA_HOME})
      ],
      [
        # This works if the parameter was NOT specified, so it's a good time
        # to see what the enviroment says.
        # Since Sun uses JAVA_HOME a lot, we check it first and ignore the
        # JAVA_HOME, otherwise just use whatever JAVA_HOME was specified.

        if ${TEST} -n "${JAVA_HOME_ENV}" ; then
          JAVA_HOME=${JAVA_HOME_ENV}
          AC_MSG_RESULT(${JAVA_HOME_ENV} from environment)
        fi
      ])

      if ${TEST} -z "${JAVA_HOME}" ; then

        # Oh well, nobody set neither JAVA_HOME nor JAVA_HOME, have to guess
        # The following code is based on the code submitted by Henner Zeller
        # for ${srcdir}/src/scripts/package/rpm/ApacheJServ.spec
        # Two variables will be set as a result:
        #
        # JAVA_HOME
        # JAVA_PLATFORM
        AC_MSG_CHECKING([Try to guess JDK location])

        for JAVA_PREFIX in /usr/local /usr/local/lib /usr /usr/lib /opt /usr/java ; do

          for JAVA_PLATFORM in 4 3 2 1 ; do

            for subversion in .9 .8 .7 .6 .5 .4 .3 .2 .1 "" ; do

              for VARIANT in IBMJava2- java java- jdk jdk-; do
                GUESS="${JAVA_PREFIX}/${VARIANT}1.${JAVA_PLATFORM}${subversion}"
dnl             AC_MSG_CHECKING([${GUESS}])
                if ${TEST} -d "${GUESS}/bin" & ${TEST} -d "${GUESS}/include" ; then
                  JAVA_HOME="${GUESS}"
                  AC_MSG_RESULT([${GUESS}])
                  break
                fi
              done

              if ${TEST} -n "${JAVA_HOME}" ; then
                break;
              fi

            done

            if ${TEST} -n "${JAVA_HOME}" ; then
              break;
            fi

          done

          if ${TEST} -n "${JAVA_HOME}" ; then
            break;
          fi

        done

        if ${TEST} ! -n "${JAVA_HOME}" ; then
          AC_MSG_ERROR(can't locate a valid JDK location)
        fi

      fi

      if ${TEST} -n "${JAVA_PLATFORM}"; then
        AC_MSG_RESULT(Java Platform detected - 1.${JAVA_PLATFORM})
      else
        AC_MSG_CHECKING(Java platform)
      fi

      AC_ARG_WITH(java-platform,
       [  --with-java-platform[=2] Force the Java platorm
                                   (value is 1 for 1.1.x or 2 for 1.2.x or greater)],
       [
          case "${withval}" in
            "1"|"2")
              JAVA_PLATFORM=${withval}
              ;;
            *)
              AC_MSG_ERROR(invalid java platform provided)
              ;;
          esac
       ],
       [
          if ${TEST} -n "${JAVA_PLATFORM}"; then
            AC_MSG_RESULT(Java Platform detected - 1.${JAVA_PLATFORM})
          else
            AC_MSG_CHECKING(Java platform)
          fi
       ])

       AC_MSG_RESULT(${JAVA_PLATFORM})

      unset tempval
    else
      # no jni, then make sure JAVA_HOME is not picked up from env
      JAVA_HOME=""
      JAVA_PLATFORM=""
    fi
  ])


AC_DEFUN(
  [JK_JDK_OS],
  [
    if ${TEST} "${use_jni}" = "true"; then
      tempval=""
      OS=""
      AC_ARG_WITH(os-type,
        [  --with-os-type[=SUBDIR]  Location of JDK os-type subdirectory.],
        [
          tempval=${withval}

          if ${TEST} ! -d "${JAVA_HOME}/${tempval}" ; then
            AC_MSG_ERROR(Not a directory: ${JAVA_HOME}/${tempval})
          fi

          OS = ${tempval}
        ],
        [   
          AC_MSG_CHECKING(os_type directory)
          if ${TEST} -f ${JAVA_HOME}/include/jni_md.h; then
            OS=""
          else
            for f in ${JAVA_HOME}/include/*/jni_md.h; do
              if ${TEST} -f $f; then
                OS=`dirname ${f}`
                OS=`basename ${OS}`
                echo " ${OS}"
              fi
            done
            if ${TEST} -z "${OS}"; then
              AC_MSG_RESULT(Cannot find jni_md.h in ${JAVA_HOME}/${OS})
              AC_MSG_ERROR(You should retry --with-os-type=SUBDIR)
            fi
          fi
        ])
    fi
  ])

dnl vi:set sts=2 sw=2 autoindent:

