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

if ( ENABLE_SWIG_JAVA )
    include(${SWIG_USE_FILE})

    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 )
            message( STATUS "NDS_LIBRARY_DIR: ${NDS_LIBRARY_DIR}" )
            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 "/usr/include")
    include_directories(BEFORE ${JAVA_INCLUDE_PATH2})
    include_directories(BEFORE ${JAVA_INCLUDE_PATH})
    include_directories(BEFORE ${JNI_INCLUDE_PATH})
    include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR})
    include_directories(BEFORE ${PROJECT_SOURCE_DIR}/swig)
    include_directories(BEFORE ${PROJECT_SOURCE_DIR}/swig/common/module)
    include_directories(BEFORE ${PROJECT_BINARY_DIR}/swig/common/module)
    include_directories(BEFORE ${PROJECT_BINARY_DIR}/src/client)

    set(INTERFACE_FILE "nds_java.i")
    set(CMAKE_JNI_TARGET true)
    set(built_java_sources
        nds2/availability.java
        nds2/availability_list_type.java
        nds2/availabilityListType.java
        nds2/buffer.java
#        nds2/buffersType.java
#        nds2/buffers_type.java
	nds2/channel.java
        nds2/channel_names_type.java
#        nds2/channel_vector.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/SWIGTYPE_p_std__vectorT_std__shared_ptrT_buffer_t_t.java
#        nds2/vectorBuffers.java
        nds2/vectorEpochs.java
        nds2/vectorSegment.java
        nds2/vectorSimpleSegment.java
        nds2/vectorSimpleSegmentListType.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})


    set(CMAKE_SWIG_FLAGS -O -package nds2)
    set(CMAKE_SWIG_OUTDIR nds2)
    set_property(SOURCE ${INTERFACE_FILE} PROPERTY CPLUSPLUS ON)
    set(CMAKE_JAVA_COMPILE_FLAGS -source 1.5 -target 1.5)
    set(_build_java_sources_cmd "")
    
    set_source_files_properties(nds2_wrap.cc 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})
    swig_link_libraries(nds2JNI ${JNI_LIBRARIES} ndswrapcxx)
    if ( APPLE )
        swig_add_module(nds2JNI_rpath java ${INTERFACE_FILE})
        swig_link_libraries(nds2JNI_rpath ${JNI_LIBRARIES} ndswrapcxx)
    endif ( APPLE )
    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_rpath
    	        PROPERTIES
                    BUILD_WITH_INSTALL_RPATH TRUE
                    LIBRARY_OUTPUT_DIRECTORY rpath/nds2
                    OUTPUT_NAME nds2JNI
    	            PREFIX lib
    	            SUFFIX .jnilib)
        endif ( APPLE )
    endif(WIN32)

    #--------------------------------------------------------------------
    # Build the JAR library
    #--------------------------------------------------------------------
    add_jar(nds2 ${built_java_sources})
    add_dependencies(nds2 nds2JNI)
    if ( APPLE )
        add_jar(nds2_rpath ${built_java_sources})
        add_dependencies(nds2_rpath nds2JNI_rpath)
    endif ( APPLE )
    #--------------------------------------------------------------------
    # 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)
    if ( APPLE )
        add_custom_target(nds2JNIinclusion_rpath
            ALL
            COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/rpath/nds2/"
            COMMAND ${CMAKE_COMMAND} -E copy
                $<TARGET_FILE_DIR:nds2JNI_rpath>/$<TARGET_FILE_NAME:nds2JNI_rpath> "${CMAKE_CURRENT_BINARY_DIR}/rpath/nds2"
    	    COMMAND ${JAVA_ARCHIVE} uvf ${CMAKE_CURRENT_BINARY_DIR}/nds2_rpath.jar -C "${CMAKE_CURRENT_BINARY_DIR}/rpath" "nds2/$<TARGET_FILE_NAME:nds2JNI_rpath>"
    	        DEPENDS nds2_rpath)
        set( FILENAME_NDS2_JAR "${CMAKE_CURRENT_BINARY_DIR}/nds2_rpath.jar" )
    else ( APPLE )
        set( FILENAME_NDS2_JAR "${CMAKE_CURRENT_BINARY_DIR}/nds2.jar" )
    endif ( APPLE )
    #====================================================================
    # 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
    #====================================================================
    cpack_add_component(JAVA
	    DISPLAY_NAME "JAVA extensions"
	    DESCRIPTION
	      "Pieces needed to use the nds2 client from JAVA"
	    GROUP Runtime)

    install(
        FILES ${CMAKE_CURRENT_BINARY_DIR}/nds2-client-java.cfg
        DESTINATION ${CMAKE_INSTALL_FULL_SYSCONFDIR}/${PROJECT_NAME}
        COMPONENT applications
        )

    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 )
