# -*- mode: cmake; coding: utf-8; cmake-tab-width: 4; indent-tabs-mode: nil; -*- vim:fenc=utf-8:ft=cmake:et:sw=4:ts=4:sts=4
cmake_minimum_required(VERSION 2.8.6)

if ( ENABLE_SWIG_JAVA )

    function(SET_NDS_JAVA_LIBRARY_DIR BUILD_TYPE)
        if (WIN32)
            string(TOUPPER ${BUILD_TYPE} BUILD_TYPE_UPPER)
            set( NDS_LIBRARY_DIR $ENV{PATH} )
            list( INSERT NDS_LIBRARY_DIR 0 "${CMAKE_BINARY_DIR}/bin/${BUILD_TYPE}" )
            set( TMP_NDS_LIBRARY_DIR "" )
            foreach( TMP ${NDS_LIBRARY_DIR} )
                file( TO_NATIVE_PATH ${TMP} TMP )
                string( REPLACE "\\" "\\\\" TMP ${TMP} )
                string( LENGTH "${TMP_NDS_LIBRARY_DIR}" L )
                if( $L LESS 1 )
                    set( TMP_NDS_LIBRARY_DIR ${TMP} )
                else( $L LESS 1 )
                    set( TMP_NDS_LIBRARY_DIR "${TMP_NDS_LIBRARY_DIR}\\\\;${TMP}" )
                endif( $L LESS 1 )
            endforeach( TMP )
            #join( ${TMP_NDS_LIBRARY_DIR} ";" NDS_LIBRARY_DIR )
            set( NDS_LIBRARY_DIR ${TMP_NDS_LIBRARY_DIR} )
            #get_target_property( NDS_LIBRARY_DIR nds2JNI LIBRARY_OUTPUT_DIRECTORY )
            set(BUILD_TYPE_UPPER "_${BUILD_TYPE_UPPER}")
        else (WIN32)
            set(BUILD_TYPE_UPPER "")
            get_target_property( NDS_LIBRARY_DIR nds2 LIBRARY_OUTPUT_DIRECTORY )
        endif(WIN32)
        set( NDS_LIBRARY${BUILD_TYPE_UPPER}_DIR "${NDS_LIBRARY_DIR}"
            CACHE INTERNAL "Internal" )
        set( NDS_LIBRARY_DIR "${NDS_LIBRARY_DIR}"
            CACHE INTERNAL "Internal" )
    endfunction(SET_NDS_JAVA_LIBRARY_DIR )

    set(NDS2_JAR_PACKAGING FALSE
        CACHE PATH "True if the Java bindings should be distributed as a jar file." )


    include_directories( BEFORE
        ${CMAKE_CURRENT_BINARY_DIR}
        ${CMAKE_CURRENT_SOURCE_DIR}
        ${CMAKE_CURRENT_BINARY_DIR}/../../common/module
        ${CMAKE_CURRENT_SOURCE_DIR}/../../common/module
        ${nds2-client_INCLUDE_DIRS}
        ${JNI_INCLUDE_PATH}
        ${JAVA_INCLUDE_PATH}
        ${JAVA_INCLUDE_PATH2}
        )
    include_directories(AFTER "/usr/include")


    set(INTERFACE_FILE "nds_java.i")
    set(WRAPPER_FILE "nds2_wrap.cc")
    set(CMAKE_JNI_TARGET true)
    set(built_java_sources
        nds2/availability.java
        nds2/availability_list_type.java
        nds2/availabilityListType.java
        nds2/buffer.java
	      nds2/channel.java
        nds2/channel_names_type.java
	      nds2/connection.java
	      nds2/connection_iterator.java
        nds2/epoch.java
        nds2/epochs_type.java
        nds2/nds2.java
        nds2/segment.java
        nds2/segment_list_type.java
        nds2/simple_availability_list_type.java
        nds2/simple_segment.java
        nds2/simple_segment_list_type.java
        nds2/SWIGTYPE_p_channel__hash_type.java
        nds2/vectorEpochs.java
        nds2/vectorSegment.java
        nds2/vectorSimpleSegment.java
        nds2/vectorSimpleSegmentListType.java
        nds2/channel_predicate.java
        nds2/request_period.java
        nds2/parameters.java
	      nds2/nds2JNI.java)
    set(built_java_classes "")
    set(pathed_built_java_sources "")
    foreach(_NDS_FILE ${built_java_sources})
        string(REGEX REPLACE "^nds2/" ""
            _built_java_class ${_NDS_FILE})
        string(REGEX REPLACE ".java$" ".class"
            _built_java_class ${_built_java_class})
        set(built_java_classes ${built_java_classes} ${_built_java_class})
        set( pathed_built_java_sources
            ${pathed_built_java_sources}
            "${CMAKE_CURRENT_BINARY_DIR}/${_NDS_FILE}" )
    endforeach(_NDS_FILE ${built_java_sources})

    add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/nds2/connection_iterator.java
        COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/connection_iterator.java ${CMAKE_CURRENT_BINARY_DIR}/nds2/connection_iterator.java
        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
        )

    set(CMAKE_SWIG_FLAGS -O -package nds2)
    set(CMAKE_SWIG_OUTDIR nds2)
    set_property(SOURCE ${INTERFACE_FILE} PROPERTY CPLUSPLUS ON)
    message( STATUS "Java_VERSION_MAJOR: ${Java_VERSION_MAJOR}")
    set(CMAKE_JAVA_COMPILE_FLAGS -source 1.7 -target 1.7 )
    set(_build_java_sources_cmd "")

    set_source_files_properties(${WRAPPER_FILE} PROPERTIES GENERATED true)
    set(CMAKE_JAVAC_WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
    set(CMAKE_JAVA_CLASS_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/nds2)
    set_source_files_properties(${built_java_sources} PROPERTIES GENERATED true)

    # -------------------------------------------------------------------
    # swig_add_module(nds2JNI java ${INTERFACE_FILE})
    # -------------------------------------------------------------------
    add_custom_command(
        OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${WRAPPER_FILE}"
        DEPENDS
        COMMAND ${CMAKE_COMMAND}
        ARGS    -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_SWIG_OUTDIR}
        COMMAND ${SWIG_EXECUTABLE}
        ARGS    -java -c++ ${CMAKE_SWIG_FLAGS}
        -I${CMAKE_CURRENT_BINARY_DIR}
        -I${CMAKE_CURRENT_SOURCE_DIR}
        -I${PROJECT_BINARY_DIR}/common/module
        -I${PROJECT_SOURCE_DIR}/common/module
        -o ${WRAPPER_FILE}
        -outdir ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_SWIG_OUTDIR}
        ${INTERFACE_FILE}
        )
    # -------------------------------------------------------------------
    # swig_link_libraries(nds2JNI -static-libstdc++ ${JNI_LIBRARIES} $<TARGET_OBJECTS:ndswrapcxx_obj> ndsclient)
    # -------------------------------------------------------------------
    add_library( nds2JNI SHARED
        "${CMAKE_CURRENT_BINARY_DIR}/${WRAPPER_FILE}"
        )
    target_link_libraries( nds2JNI
        -static-libstdc++
        ${CONLIBNDSCXX_OBJECTS}
        ${JNI_LIBRARIES}
        nds::daqc
        )
    if( WIN32 )
        target_link_libraries( nds2JNI nds::cxx Ws2_32 )
    endif( WIN32 )

    target_requires_cpp11(nds2JNI PUBLIC)
    if (WIN32)
        #................................................................
        # Windows
        #................................................................
        add_custom_command(TARGET nds2JNI POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy
            $<TARGET_FILE_DIR:nds2JNI>/$<TARGET_FILE_NAME:nds2JNI> ${CMAKE_CURRENT_BINARY_DIR}/libnds2JNI.jnilib)
    else (WIN32)
        #................................................................
        # Un*x / OSX
        #................................................................
        set_target_properties(nds2JNI
    	      PROPERTIES
            LIBRARY_OUTPUT_DIRECTORY nds2
    	      PREFIX lib
    	      SUFFIX .jnilib)
        if ( APPLE )
            set_target_properties(nds2JNI
    	          PROPERTIES
                INSTALL_RPATH "${CMAKE_INSTALL_FULL_LIBDIR}"
                BUILD_WITH_INSTALL_RPATH TRUE )
        endif ( APPLE )
    endif(WIN32)

    #--------------------------------------------------------------------
    # Build the JAR library
    #--------------------------------------------------------------------
    add_jar(nds2 ${built_java_sources})
    add_dependencies(nds2 nds2JNI)
    #--------------------------------------------------------------------
    # Build java documentation
    #--------------------------------------------------------------------
    if( NOT WIN32 )
        create_javadoc(
            nds2
            FILES ${pathed_built_java_sources}
            CLASSPATH ${CMAKE_JAVA_INCLUDE_PATH}
            INSTALLPATH ${CMAKE_INSTALL_DATADIR}/nds2-client/java
            WINDOWTITLE "NDS2 Client Interface"
            DOCTITLE "<h1>NDS2 Client Interface</h1>"
            AUTHOR TRUE
            USE TRUE
            VERSION TRUE
            )
        add_dependencies( nds2_javadoc nds2 )
    endif( NOT WIN32 )

    #--------------------------------------------------------------------
    # Create JAR of documentation
    #--------------------------------------------------------------------
    if( NOT WIN32 )
        add_custom_target(nds2_javadoc_jar
            ALL
            COMMAND ${CMAKE_COMMAND} -E echo ${JAVA_ARCHIVE} -cvf ${CMAKE_CURRENT_BINARY_DIR}/nds2_javadoc.jar "."
    	      COMMAND ${JAVA_ARCHIVE} -cvf ${CMAKE_CURRENT_BINARY_DIR}/nds2_javadoc.jar "."
    	      WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/javadoc/nds2"
    	      DEPENDS nds2_javadoc)
    endif( NOT WIN32 )
    #--------------------------------------------------------------------
    # Add the JNI library to the jar archive
    #--------------------------------------------------------------------
    add_custom_target(nds2JNIinclusion
        ALL
        COMMAND ${CMAKE_COMMAND} -E copy
        $<TARGET_FILE_DIR:nds2JNI>/$<TARGET_FILE_NAME:nds2JNI> "${CMAKE_CURRENT_BINARY_DIR}/nds2"
    	  COMMAND ${JAVA_ARCHIVE} uvf ${CMAKE_CURRENT_BINARY_DIR}/nds2.jar "nds2/$<TARGET_FILE_NAME:nds2JNI>"
    	  DEPENDS nds2)
    set( FILENAME_NDS2_JAR "${CMAKE_CURRENT_BINARY_DIR}/nds2.jar" )
    #====================================================================
    # Report the configuration
    #====================================================================
    configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/nds2-client-java.cfg.in
        ${CMAKE_CURRENT_BINARY_DIR}/nds2-client-java.cfg
	      @ONLY )
    #====================================================================
    # Distribution rules
    #====================================================================
    if( NOT WIN32)
        install(
            FILES ${CMAKE_CURRENT_BINARY_DIR}/nds2-client-java.cfg
            DESTINATION ${CMAKE_INSTALL_FULL_SYSCONFDIR}/${PROJECT_BASENAME}
            COMPONENT JAVA
            )
    endif( NOT WIN32)

    install(
        FILES "${FILENAME_NDS2_JAR}"
        RENAME "nds2.jar"
	      DESTINATION ${CMAKE_INSTALL_LIBDIR}/nds2-client/java
	      COMPONENT JAVA
        )
    if ( NOT WIN32 )
        install(
            FILES ${CMAKE_CURRENT_BINARY_DIR}/nds2_javadoc.jar
            DESTINATION ${CMAKE_INSTALL_LIBDIR}/nds2-client/java
            COMPONENT JAVA
            )
    endif ( NOT WIN32 )
    foreach(_NDS_FILE ${built_java_classes})
	      install(
            FILES ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/nds2.dir/nds2/${_NDS_FILE}
	          DESTINATION ${CMAKE_INSTALL_LIBDIR}/nds2-client/java/nds2
	          COMPONENT JAVA)
    endforeach(_NDS_FILE)

    install(TARGETS nds2JNI
	      DESTINATION ${CMAKE_INSTALL_LIBDIR}/java/nds2
	      COMPONENT JAVA)
    if (WIN32)
        install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libnds2JNI.jnilib
	          DESTINATION ${CMAKE_INSTALL_LIBDIR}/java/nds2
            COMPONENT JAVA)
    endif(WIN32)

    set_nds_java_library_dir( "Release" )
    set_nds_java_library_dir( "Debug" )

ENDIF ( ENABLE_SWIG_JAVA )
