# Copyright 2006-2008 The FLWOR Foundation.n
# 
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# 
# http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

  INCLUDE (CMakeJavaInformation )
  MESSAGE(STATUS "SWIG: Generating XQJ API")

  FILE(GLOB ZORBA_XQJ_SOURCES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/*.java")
  FOREACH(ZORBA_XQJ_SOURCE ${ZORBA_XQJ_SOURCES})
    CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/${ZORBA_XQJ_SOURCE}"  "${CMAKE_CURRENT_BINARY_DIR}/${ZORBA_XQJ_SOURCE}" COPYONLY)
  ENDFOREACH(ZORBA_XQJ_SOURCE ${ZORBA_API_HEADERS})

  #SWIG Java: Generating XQJ TCK Tests
  FILE(GLOB ZORBA_XQJ_TCK RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/tck/" "${CMAKE_CURRENT_SOURCE_DIR}/tck/*.*")
  FOREACH(ZORBA_XQJ_TCK_FILE ${ZORBA_XQJ_TCK})
    CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/tck/${ZORBA_XQJ_TCK_FILE}"  "${CMAKE_CURRENT_BINARY_DIR}/tck/${ZORBA_XQJ_TCK_FILE}" COPYONLY)
  ENDFOREACH(ZORBA_XQJ_TCK_FILE ${ZORBA_API_HEADERS})

  #SWIG Java: Generating XQJ Tests
  FILE(GLOB ZORBA_XQJ_TESTS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/managers/" "${CMAKE_CURRENT_SOURCE_DIR}/managers/*.*")
  FOREACH(ZORBA_XQJ_TEST ${ZORBA_XQJ_TESTS})
    CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/managers/${ZORBA_XQJ_TEST}"  "${CMAKE_CURRENT_BINARY_DIR}/managers/${ZORBA_XQJ_TEST}" COPYONLY)
  ENDFOREACH(ZORBA_XQJ_TEST ${ZORBA_API_HEADERS})

  #SWIG Java: Processing XQ
  FILE(GLOB ZORBA_XQJ_TESTS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/managers/" "${CMAKE_CURRENT_SOURCE_DIR}/managers/*.xq")
  FOREACH(ZORBA_XQJ_TEST ${ZORBA_XQJ_TESTS})
    CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/managers/${ZORBA_XQJ_TEST}"  "${CMAKE_CURRENT_BINARY_DIR}/managers/${ZORBA_XQJ_TEST}")
  ENDFOREACH(ZORBA_XQJ_TEST ${ZORBA_API_HEADERS})
  
FIND_PACKAGE (Java COMPONENTS Development)

IF (Java_JAVAC_EXECUTABLE)

  # TESTING...
  SET (XQJ_LOAD_PATH "${CMAKE_BINARY_DIR}/swig/xqj")
  SET (JAVA_LOAD_PATH "${CMAKE_BINARY_DIR}/swig/java")
  SET (JAVA_DLL_PATH "${CMAKE_BINARY_DIR}/swig/java")
  SET (ZORBA_SIMPLE_STORE "${CMAKE_BINARY_DIR}/src")
  
  IF(WIN32)
    IF (MSVC_IDE)
      SET (JAVA_DLL_PATH "${CMAKE_BINARY_DIR}/swig/java/${CMAKE_BUILD_TYPE}")
      SET (ZORBA_SIMPLE_STORE "${CMAKE_BINARY_DIR}/src/${CMAKE_BUILD_TYPE}")
    ENDIF (MSVC_IDE)
    #Convert to backslashes for windows
    STRING(REGEX REPLACE "/" "\\\\" JAVA_DLL_PATH ${JAVA_DLL_PATH}) 
    STRING(REGEX REPLACE "/" "\\\\" XQJ_LOAD_PATH ${XQJ_LOAD_PATH}) 
    STRING(REGEX REPLACE "/" "\\\\" JAVA_LOAD_PATH ${JAVA_LOAD_PATH}) 
    STRING(REGEX REPLACE "/" "\\\\" ZORBA_SIMPLE_STORE ${ZORBA_SIMPLE_STORE}) 
    #Copying tck batch
    CONFIGURE_FILE (${CMAKE_CURRENT_SOURCE_DIR}/tck/xqj_test.bat.in ${CMAKE_CURRENT_BINARY_DIR}/xqj_test.bat)
    ADD_TEST ("swig_xqj" xqj_test.bat)
    SET_TESTS_PROPERTIES("swig_xqj" PROPERTIES FAIL_REGULAR_EXPRESSION "Failures;Errors")
  ELSE(WIN32)
    MESSAGE (STATUS "Copying tck batch...")
    IF (NOT DEFINED Java_JAVA_EXECUTABLE)
      SET(Java_JAVA_EXECUTABLE ${JAVA_RUNTIME})
      SET(Java_JAR_EXECUTABLE ${JAVA_ARCHIVE})
      SET(Java_JAVAC_EXECUTABLE ${JAVA_COMPILE})
    ENDIF (NOT DEFINED Java_JAVA_EXECUTABLE)
    CONFIGURE_FILE (${CMAKE_CURRENT_SOURCE_DIR}/tck/xqj_test.sh.in ${CMAKE_CURRENT_BINARY_DIR}/xqj_test.sh)  
    EXECUTE_PROCESS(COMMAND chmod +x "${CMAKE_CURRENT_BINARY_DIR}/xqj_test.sh")
    EXECUTE_PROCESS(COMMAND chmod +x "${CMAKE_CURRENT_BINARY_DIR}/tck/junit-4.9.jar")
    EXECUTE_PROCESS(COMMAND chmod +x "${CMAKE_CURRENT_BINARY_DIR}/tck/xqjapi.jar")
    EXECUTE_PROCESS(COMMAND chmod +x "${CMAKE_CURRENT_BINARY_DIR}/tck/xqjtck.jar")
    EXECUTE_PROCESS(COMMAND chmod +x "${CMAKE_CURRENT_BINARY_DIR}/tck/zorba.properties")
    ADD_TEST ("swig_xqj" xqj_test.sh)
    SET_TESTS_PROPERTIES("swig_xqj" PROPERTIES FAIL_REGULAR_EXPRESSION "Failures;Errors")
  ENDIF(WIN32)

  # JAR GENERATION
  FILE(GLOB XQJ_SWIG_FILES "${CMAKE_CURRENT_BINARY_DIR}/*.java")
  
  COMPARE_VERSION_STRINGS (${CMAKE_VERSION} "2.8.6" RESULT)
  IF (${RESULT} GREATER -1)
    INCLUDE (UseJava)
    SET(CMAKE_JAVA_INCLUDE_PATH  ${CMAKE_JAVA_INCLUDE_PATH} ${ZORBA_JAVA_JAR} "${CMAKE_CURRENT_BINARY_DIR}/tck/xqjapi.jar") # JAVA_SWIG_FILES is predefined in Java binding
    ADD_JAR(zorba_xqj ${XQJ_SWIG_FILES})
    ADD_DEPENDENCIES(zorba_xqj zorba_api_java)
    SET_TARGET_PROPERTIES (zorba_xqj PROPERTIES FOLDER "APIs" OUTPUT_NAME "zorba_xqj" PROJECT_LABEL "XQJ")
  ELSE (${RESULT} GREATER -1)
    IF (WIN32)
      STRING(REGEX REPLACE "/" "\\\\" ZORBA_JAVA_JAR ${ZORBA_JAVA_JAR}) 
      STRING(REGEX REPLACE "/" "\\\\" ZORBA_XQJ_JAR ${CMAKE_CURRENT_BINARY_DIR}) 
      SET(XQJ_CLASSPATH "${ZORBA_JAVA_JAR}\;${ZORBA_XQJ_JAR}\\tck\\xqjapi.jar")
    ELSE (WIN32)
      SET(XQJ_CLASSPATH "${ZORBA_JAVA_JAR}:${CMAKE_CURRENT_BINARY_DIR}/tck/xqjapi.jar")
    ENDIF (WIN32)
    MESSAGE(STATUS "XQJ CLASSPATH " ${XQJ_CLASSPATH})
    ADD_LIBRARY(XQJ dummy.c)
    SET_TARGET_PROPERTIES (XQJ PROPERTIES FOLDER "APIs" OUTPUT_NAME "zorba_xqj" PROJECT_LABEL "XQJ")
    ADD_DEPENDENCIES(XQJ zorba_api_java)
    ADD_CUSTOM_COMMAND(TARGET XQJ
                     POST_BUILD
                     COMMAND cmake -E echo "Compiling XQJ files..."
                     COMMAND ${Java_JAVAC_EXECUTABLE} -cp ${XQJ_CLASSPATH} *.java -d ${CMAKE_CURRENT_BINARY_DIR}
                     COMMAND cmake -E echo "Creating jar file..."
                     COMMAND ${Java_JAR_EXECUTABLE} cf zorba_xqj.jar org
    )
  ENDIF (${RESULT} GREATER -1)

  # Install section
  SET(XQJ_JAR_FILE "${CMAKE_CURRENT_BINARY_DIR}/zorba_xqj.jar")
  SET(XQJAPI_JAR_FILE "${CMAKE_CURRENT_BINARY_DIR}/tck/xqjapi.jar")
  IF(NOT WIN32)
    IF (${CMAKE_INSTALL_PREFIX} EQUAL "/usr/local")
      SET (JAVA_SITEARCH_DIR "/usr/share/java")
    ELSE (${CMAKE_INSTALL_PREFIX} EQUAL "/usr/local")
      SET (JAVA_SITEARCH_DIR ${CMAKE_INSTALL_PREFIX}/share/java)
    ENDIF (${CMAKE_INSTALL_PREFIX} EQUAL "/usr/local")
    INSTALL(FILES ${XQJ_JAR_FILE} DESTINATION ${JAVA_SITEARCH_DIR})
    INSTALL(FILES ${XQJAPI_JAR_FILE} DESTINATION ${JAVA_SITEARCH_DIR})
  ELSE(NOT WIN32)
    INSTALL(FILES ${XQJ_JAR_FILE} DESTINATION share/xqj COMPONENT "XQJ_SWIG")
    INSTALL(FILES ${XQJAPI_JAR_FILE} DESTINATION share/xqj COMPONENT "XQJ_SWIG")
  ENDIF(NOT WIN32)
  
ELSEIF (Java_JAVAC_EXECUTABLE)
  MESSAGE ( STATUS "SWIG Java: Not generating XQJ API because JNI headers not found.")
ENDIF (Java_JAVAC_EXECUTABLE)
