From 75916d89c61afd05cf8924b86a0c0ba03df468c0 Mon Sep 17 00:00:00 2001
From: Julien Malik <julien.malik@c-s.fr>
Date: Mon, 13 Jun 2011 21:14:42 +0200
Subject: [PATCH] ENH: wrapping improvements. preliminary Java binding

---
 CMake/UseJava.cmake                 | 825 ++++++++++++++++++++++++++++
 CMake/UseJavaClassFilelist.cmake    |  52 ++
 CMake/UseJavaSymlinks.cmake         |  32 ++
 CMake/UseSWIGLocal.cmake            | 266 +++++++++
 CMakeLists.txt                      |   3 +
 Code/Wrappers/SWIG/CMakeLists.txt   | 203 ++++++-
 Code/Wrappers/SWIG/Java.i           | 125 +++++
 Code/Wrappers/SWIG/Python.i         | 137 ++++-
 Code/Wrappers/SWIG/RefCountMacro.i  |  84 +--
 Code/Wrappers/SWIG/Ruby.i           | 125 +++++
 Code/Wrappers/SWIG/itkBase.i        | 309 +++--------
 Code/Wrappers/SWIG/itkMacro.i       |  17 +
 Code/Wrappers/SWIG/otbApplication.i |  28 +-
 Testing/CMakeLists.txt              |   4 +
 Testing/Java/CMakeLists.txt         |  20 +
 Testing/Java/JavaSmoothingTest.java |  16 +
 16 files changed, 1927 insertions(+), 319 deletions(-)
 create mode 100644 CMake/UseJava.cmake
 create mode 100644 CMake/UseJavaClassFilelist.cmake
 create mode 100644 CMake/UseJavaSymlinks.cmake
 create mode 100644 CMake/UseSWIGLocal.cmake
 create mode 100644 Code/Wrappers/SWIG/Java.i
 create mode 100644 Code/Wrappers/SWIG/Ruby.i
 create mode 100644 Testing/Java/CMakeLists.txt
 create mode 100644 Testing/Java/JavaSmoothingTest.java

diff --git a/CMake/UseJava.cmake b/CMake/UseJava.cmake
new file mode 100644
index 0000000000..3723f2e0c3
--- /dev/null
+++ b/CMake/UseJava.cmake
@@ -0,0 +1,825 @@
+# - Use Module for Java
+# This file provides functions for Java. It is assumed that FindJava.cmake
+# has already been loaded.  See FindJava.cmake for information on how to
+# load Java into your CMake project.
+#
+# Available Functions:
+#
+#  add_jar(TARGET_NAME SRC1 SRC2 .. SRCN RCS1 RCS2 .. RCSN)
+#
+#  This command creates a <TARGET_NAME>.jar. It compiles the given source
+#  files (SRC) and adds the given resource files (RCS) to the jar file.
+#  If only resource files are given then just a jar file is created.
+#
+#  Additional instructions:
+#    To add compile flags to the target you can set these flags with
+#    the following variable:
+#
+#        set(CMAKE_JAVA_COMPILE_FLAGS -nowarn)
+#
+#    To add a path or a jar file to the class path you can do this
+#    with the CMAKE_JAVA_INCLUDE_PATH variable.
+#
+#        set(CMAKE_JAVA_INCLUDE_PATH /usr/share/java/shibboleet.jar)
+#
+#    To use a different output name for the target you can set it with:
+#
+#        set(CMAKE_JAVA_TARGET_OUTPUT_NAME shibboleet.jar)
+#        add_jar(foobar foobar.java)
+#
+#    To add a VERSION to the target output name you can set it using
+#    CMAKE_JAVA_TARGET_VERSION. This will create a jar file with the name
+#    shibboleet-1.0.0.jar and will create a symlink shibboleet.jar
+#    pointing to the jar with the version information.
+#
+#        set(CMAKE_JAVA_TARGET_VERSION 1.2.0)
+#        add_jar(shibboleet shibbotleet.java)
+#
+#     If the target is a JNI library, utilize the following commands to
+#     create a JNI symbolic link:
+#
+#        set(CMAKE_JNI_TARGET TRUE)
+#        set(CMAKE_JAVA_TARGET_VERSION 1.2.0)
+#        add_jar(shibboleet shibbotleet.java)
+#        install_jar(shibboleet ${LIB_INSTALL_DIR}/shibboleet)
+#        install_jni_symlink(shibboleet ${JAVA_LIB_INSTALL_DIR})
+#
+#     If a single target needs to produce more than one jar from its
+#     java source code, to prevent the accumulation of duplicate class
+#     files in subsequent jars, set/reset CMAKE_JAR_CLASSES_PREFIX prior
+#     to calling the add_jar() function:
+#
+#        set(CMAKE_JAR_CLASSES_PREFIX com/redhat/foo)
+#        add_jar(foo foo.java)
+#
+#        set(CMAKE_JAR_CLASSES_PREFIX com/redhat/bar)
+#        add_jar(bar bar.java)
+#
+#  Variables set:
+#    The add_jar() functions sets some variables which can be used in the
+#    same scope where add_jar() is called.
+#
+#    <target>_INSTALL_FILES      The files which should be installed. This
+#                                is used by install_jar().
+#    <target>_JNI_SYMLINK        The JNI symlink which should be
+#                                installed.
+#                                This is used by install_jni_symlink().
+#    <target>_JAR_FILE           The location of the jar file so that you
+#                                can include it.
+#    <target>_CLASS_DIR          The directory where the class files can
+#                                be found. For example to use them with
+#                                javah.
+#
+#   find_jar(
+#            <VAR>
+#            name | NAMES name1 [name2 ...]
+#            [PATHS path1 [path2 ... ENV var]]
+#            [VERSIONS version1 [version2]]
+#            [DOC "cache documentation string"]
+#           )
+#
+#   This command is used to find a full path to the named jar. A cache
+#   entry named by <VAR> is created to stor the result of this command. If
+#   the full path to a jar is found the result is stored in the variable
+#   and the search will not repeated unless the variable is cleared. If
+#   nothing is found, the result will be <VAR>-NOTFOUND, and the search
+#   will be attempted again next time find_jar is invoked with the same
+#   variable.
+#   The name of the full path to a file that is searched for is specified
+#   by the names listed after NAMES argument. Additional search locations
+#   can be specified after the PATHS argument. If you require special a
+#   version of a jar file you can specify it with the VERSIONS argument.
+#   The argument after DOC will be used for the documentation string in
+#   the cache.
+#
+#   install_jar(TARGET_NAME DESTINATION)
+#
+#   This command installs the TARGET_NAME files to the given DESTINATION.
+#   It should be called in the same scope as add_jar() or it will fail.
+#
+#   install_jni_symlink(TARGET_NAME DESTINATION)
+#
+#   This command installs the TARGET_NAME JNI symlinks to the given
+#   DESTINATION. It should be called in the same scope as add_jar()
+#   or it will fail.
+#
+#   create_javadoc
+#
+#     Create jave documentation based on files or packages. For more
+#     details please read the javadoc manpage.
+#
+#     There are two main signatures for create_javadoc. The first
+#     signature works with package names on a path with source files:
+#
+#     create_javadoc(
+#                    <VAR>
+#                    PACKAGES pkg1 [pkg2 ...]
+#                    [SOURCEPATH <sourcepath>]
+#                    [CLASSPATH <classpath>]
+#                    [INSTALLPATH <install path>]
+#                    [DOCTITLE "the documentation title"]
+#                    [WINDOWTITLE "the title of the document"]
+#                    [AUTHOR TRUE|FALSE]
+#                    [USE TRUE|FALSE]
+#                    [VERSION TRUE|FALSE]
+#                   )
+#
+#     Example:
+#     create_javadoc(my_example_doc
+#       PACKAGES com.exmaple.foo com.example.bar
+#       SOURCEPATH ${CMAKE_CURRENT_SOURCE_PATH}
+#       CLASSPATH ${CMAKE_JAVA_INCLUDE_PATH}
+#       WINDOWTITLE "My example"
+#       DOCTITLE "<h1>My example</h1>"
+#       AUTHOR TRUE
+#       USE TRUE
+#       VERSION TRUE
+#     )
+#
+#     The second signature for create_javadoc works on a given list of
+#     files.
+#
+#     create_javadoc(
+#                    <VAR>
+#                    FILES file1 [file2 ...]
+#                    [CLASSPATH <classpath>]
+#                    [INSTALLPATH <install path>]
+#                    [DOCTITLE "the documentation title"]
+#                    [WINDOWTITLE "the title of the document"]
+#                    [AUTHOR TRUE|FALSE]
+#                    [USE TRUE|FALSE]
+#                    [VERSION TRUE|FALSE]
+#                   )
+#
+#     Example:
+#     create_javadoc(my_example_doc
+#       FILES ${example_SRCS}
+#       CLASSPATH ${CMAKE_JAVA_INCLUDE_PATH}
+#       WINDOWTITLE "My example"
+#       DOCTITLE "<h1>My example</h1>"
+#       AUTHOR TRUE
+#       USE TRUE
+#       VERSION TRUE
+#     )
+#
+#     Both signatures share most of the options. These options are the
+#     same as what you can find in the javadoc manpage. Please look at
+#     the manpage for CLASSPATH, DOCTITLE, WINDOWTITLE, AUTHOR, USE and
+#     VERSION.
+#
+#     The documentation will be by default installed to
+#
+#       ${CMAKE_INSTALL_PREFIX}/share/javadoc/<VAR>
+#
+#     if you don't set the INSTALLPATH.
+#
+
+#=============================================================================
+# Copyright 2010-2011 Andreas schneider <asn@redhat.com>
+# Copyright 2010 Ben Boeckel <ben.boeckel@kitware.com>
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+#  License text for the above reference.)
+
+function (__java_copy_file src dest comment)
+    add_custom_command(
+        OUTPUT  ${dest}
+        COMMAND cmake -E copy_if_different
+        ARGS    ${src}
+                ${dest}
+        DEPENDS ${src}
+        COMMENT ${comment})
+endfunction (__java_copy_file src dest comment)
+
+# define helper scripts
+set(_JAVA_CLASS_FILELIST_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/UseJavaClassFilelist.cmake)
+set(_JAVA_SYMLINK_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/UseJavaSymlinks.cmake)
+
+function(add_jar _TARGET_NAME)
+    set(_JAVA_SOURCE_FILES ${ARGN})
+
+    if (LIBRARY_OUTPUT_PATH)
+        set(CMAKE_JAVA_LIBRARY_OUTPUT_PATH ${LIBRARY_OUTPUT_PATH})
+    else (LIBRARY_OUTPUT_PATH)
+        set(CMAKE_JAVA_LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR})
+    endif (LIBRARY_OUTPUT_PATH)
+
+    set(CMAKE_JAVA_INCLUDE_PATH
+        ${CMAKE_JAVA_INCLUDE_PATH}
+        ${CMAKE_CURRENT_SOURCE_DIR}
+        ${CMAKE_JAVA_OBJECT_OUTPUT_PATH}
+        ${CMAKE_JAVA_LIBRARY_OUTPUT_PATH}
+    )
+
+    if (WIN32 AND NOT CYGWIN)
+        set(CMAKE_JAVA_INCLUDE_FLAG_SEP ";")
+    else (WIN32 AND NOT CYGWIN)
+        set(CMAKE_JAVA_INCLUDE_FLAG_SEP ":")
+    endif(WIN32 AND NOT CYGWIN)
+
+    foreach (JAVA_INCLUDE_DIR ${CMAKE_JAVA_INCLUDE_PATH})
+       set(CMAKE_JAVA_INCLUDE_PATH_FINAL "${CMAKE_JAVA_INCLUDE_PATH_FINAL}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${JAVA_INCLUDE_DIR}")
+    endforeach(JAVA_INCLUDE_DIR)
+
+    set(CMAKE_JAVA_CLASS_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${_TARGET_NAME}.dir")
+
+    set(_JAVA_TARGET_OUTPUT_NAME "${_TARGET_NAME}.jar")
+    if (CMAKE_JAVA_TARGET_OUTPUT_NAME AND CMAKE_JAVA_TARGET_VERSION)
+        set(_JAVA_TARGET_OUTPUT_NAME "${CMAKE_JAVA_TARGET_OUTPUT_NAME}-${CMAKE_JAVA_TARGET_VERSION}.jar")
+        set(_JAVA_TARGET_OUTPUT_LINK "${CMAKE_JAVA_TARGET_OUTPUT_NAME}.jar")
+    elseif (CMAKE_JAVA_TARGET_VERSION)
+        set(_JAVA_TARGET_OUTPUT_NAME "${_TARGET_NAME}-${CMAKE_JAVA_TARGET_VERSION}.jar")
+        set(_JAVA_TARGET_OUTPUT_LINK "${_TARGET_NAME}.jar")
+    elseif (CMAKE_JAVA_TARGET_OUTPUT_NAME)
+        set(_JAVA_TARGET_OUTPUT_NAME "${CMAKE_JAVA_TARGET_OUTPUT_NAME}.jar")
+    endif (CMAKE_JAVA_TARGET_OUTPUT_NAME AND CMAKE_JAVA_TARGET_VERSION)
+    # reset
+    set(CMAKE_JAVA_TARGET_OUTPUT_NAME)
+
+    set(_JAVA_CLASS_FILES)
+    set(_JAVA_COMPILE_FILES)
+    set(_JAVA_DEPENDS)
+    set(_JAVA_RESOURCE_FILES)
+    foreach(_JAVA_SOURCE_FILE ${_JAVA_SOURCE_FILES})
+        get_filename_component(_JAVA_EXT ${_JAVA_SOURCE_FILE} EXT)
+        get_filename_component(_JAVA_FILE ${_JAVA_SOURCE_FILE} NAME_WE)
+        get_filename_component(_JAVA_PATH ${_JAVA_SOURCE_FILE} PATH)
+        get_filename_component(_JAVA_FULL ${_JAVA_SOURCE_FILE} ABSOLUTE)
+
+        file(RELATIVE_PATH _JAVA_REL_BINARY_PATH ${CMAKE_CURRENT_BINARY_DIR} ${_JAVA_FULL})
+        file(RELATIVE_PATH _JAVA_REL_SOURCE_PATH ${CMAKE_CURRENT_SOURCE_DIR} ${_JAVA_FULL})
+        string(LENGTH ${_JAVA_REL_BINARY_PATH} _BIN_LEN)
+        string(LENGTH ${_JAVA_REL_SOURCE_PATH} _SRC_LEN)
+        if (${_BIN_LEN} LESS ${_SRC_LEN})
+            set(_JAVA_REL_PATH ${_JAVA_REL_BINARY_PATH})
+        else (${_BIN_LEN} LESS ${_SRC_LEN})
+            set(_JAVA_REL_PATH ${_JAVA_REL_SOURCE_PATH})
+        endif (${_BIN_LEN} LESS ${_SRC_LEN})
+        get_filename_component(_JAVA_REL_PATH ${_JAVA_REL_PATH} PATH)
+
+        if (_JAVA_EXT MATCHES ".java")
+            list(APPEND _JAVA_COMPILE_FILES ${_JAVA_SOURCE_FILE})
+            set(_JAVA_CLASS_FILE "${CMAKE_JAVA_CLASS_OUTPUT_PATH}/${_JAVA_REL_PATH}/${_JAVA_FILE}.class")
+            set(_JAVA_CLASS_FILES ${_JAVA_CLASS_FILES} ${_JAVA_CLASS_FILE})
+
+        elseif (_JAVA_EXT MATCHES ".jar")
+            list(APPEND CMAKE_JAVA_INCLUDE_PATH ${_JAVA_SOURCE_FILE})
+
+        elseif (_JAVA_EXT STREQUAL "")
+            list(APPEND CMAKE_JAVA_INCLUDE_PATH ${JAVA_JAR_TARGET_${_JAVA_SOURCE_FILE}} ${JAVA_JAR_TARGET_${_JAVA_SOURCE_FILE}_CLASSPATH})
+            list(APPEND _JAVA_DEPENDS ${JAVA_JAR_TARGET_${_JAVA_SOURCE_FILE}})
+
+        else (_JAVA_EXT MATCHES ".java")
+            __java_copy_file(${CMAKE_CURRENT_SOURCE_DIR}/${_JAVA_SOURCE_FILE}
+                             ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/${_JAVA_SOURCE_FILE}
+                             "Copying ${_JAVA_SOURCE_FILE} to the build directory")
+            list(APPEND _JAVA_RESOURCE_FILES ${_JAVA_SOURCE_FILE})
+        endif (_JAVA_EXT MATCHES ".java")
+    endforeach(_JAVA_SOURCE_FILE)
+
+    # create an empty java_class_filelist
+    if (NOT EXISTS ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist)
+        file(WRITE ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist "")
+    endif()
+
+    if (_JAVA_COMPILE_FILES)
+        # Compile the java files and create a list of class files
+        add_custom_command(
+            # NOTE: this command generates an artificial dependency file
+            OUTPUT ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_compiled_${_TARGET_NAME}
+            COMMAND ${Java_JAVAC_EXECUTABLE}
+                ${CMAKE_JAVA_COMPILE_FLAGS}
+                -classpath "${CMAKE_JAVA_INCLUDE_PATH_FINAL}"
+                -d ${CMAKE_JAVA_CLASS_OUTPUT_PATH}
+                ${_JAVA_COMPILE_FILES}
+            COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_compiled_${_TARGET_NAME}
+            DEPENDS ${_JAVA_COMPILE_FILES}
+            WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+            COMMENT "Building Java objects for ${_TARGET_NAME}.jar"
+        )
+        add_custom_command(
+            OUTPUT ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist
+            COMMAND ${CMAKE_COMMAND}
+                -DCMAKE_JAVA_CLASS_OUTPUT_PATH=${CMAKE_JAVA_CLASS_OUTPUT_PATH}
+                -DCMAKE_JAR_CLASSES_PREFIX="${CMAKE_JAR_CLASSES_PREFIX}"
+                -P ${_JAVA_CLASS_FILELIST_SCRIPT}
+            DEPENDS ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_compiled_${_TARGET_NAME}
+            WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+        )
+    endif (_JAVA_COMPILE_FILES)
+
+    # create the jar file
+    if (CMAKE_JNI_TARGET)
+        add_custom_command(
+            OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME}
+            COMMAND ${Java_JAR_EXECUTABLE}
+                -cf ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME}
+                ${_JAVA_RESOURCE_FILES} @java_class_filelist
+            COMMAND ${CMAKE_COMMAND}
+                -D_JAVA_TARGET_DIR=${CMAKE_CURRENT_BINARY_DIR}
+                -D_JAVA_TARGET_OUTPUT_NAME=${_JAVA_TARGET_OUTPUT_NAME}
+                -D_JAVA_TARGET_OUTPUT_LINK=${_JAVA_TARGET_OUTPUT_LINK}
+                -P ${_JAVA_SYMLINK_SCRIPT}
+            COMMAND ${CMAKE_COMMAND}
+                -D_JAVA_TARGET_DIR=${CMAKE_CURRENT_BINARY_DIR}
+                -D_JAVA_TARGET_OUTPUT_NAME=${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME}
+                -D_JAVA_TARGET_OUTPUT_LINK=${_JAVA_TARGET_OUTPUT_LINK}
+                -P ${_JAVA_SYMLINK_SCRIPT}
+            DEPENDS ${_JAVA_RESOURCE_FILES} ${_JAVA_DEPENDS} ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist
+            WORKING_DIRECTORY ${CMAKE_JAVA_CLASS_OUTPUT_PATH}
+            COMMENT "Creating Java archive ${_JAVA_TARGET_OUTPUT_NAME}"
+        )
+    else ()
+        add_custom_command(
+            OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME}
+            COMMAND ${Java_JAR_EXECUTABLE}
+                -cf ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME}
+                ${_JAVA_RESOURCE_FILES} @java_class_filelist
+            COMMAND ${CMAKE_COMMAND}
+                -D_JAVA_TARGET_DIR=${CMAKE_CURRENT_BINARY_DIR}
+                -D_JAVA_TARGET_OUTPUT_NAME=${_JAVA_TARGET_OUTPUT_NAME}
+                -D_JAVA_TARGET_OUTPUT_LINK=${_JAVA_TARGET_OUTPUT_LINK}
+                -P ${_JAVA_SYMLINK_SCRIPT}
+            WORKING_DIRECTORY ${CMAKE_JAVA_CLASS_OUTPUT_PATH}
+            DEPENDS ${_JAVA_RESOURCE_FILES} ${_JAVA_DEPENDS} ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist
+            COMMENT "Creating Java archive ${_JAVA_TARGET_OUTPUT_NAME}"
+        )
+    endif (CMAKE_JNI_TARGET)
+
+    # Add the target and make sure we have the latest resource files.
+    add_custom_target(${_TARGET_NAME} ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME})
+
+    set(${_TARGET_NAME}_INSTALL_FILES
+        ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME}
+        PARENT_SCOPE)
+    if (_JAVA_TARGET_OUTPUT_LINK)
+        set(${_TARGET_NAME}_INSTALL_FILES
+            ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME}
+            ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_LINK}
+            PARENT_SCOPE)
+        if (CMAKE_JNI_TARGET)
+            set(${_TARGET_NAME}_JNI_SYMLINK
+                ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_LINK}
+                PARENT_SCOPE)
+        endif (CMAKE_JNI_TARGET)
+    endif (_JAVA_TARGET_OUTPUT_LINK)
+    set(${_TARGET_NAME}_JAR_FILE
+        ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME} PARENT_SCOPE)
+    set(${_TARGET_NAME}_CLASS_DIR
+        ${CMAKE_JAVA_CLASS_OUTPUT_PATH}
+         PARENT_SCOPE)
+endfunction(add_jar)
+
+function(INSTALL_JAR _TARGET_NAME _DESTINATION)
+    if (${_TARGET_NAME}_INSTALL_FILES)
+        install(
+            FILES
+                ${${_TARGET_NAME}_INSTALL_FILES}
+            DESTINATION
+                ${_DESTINATION}
+        )
+    else (${_TARGET_NAME}_INSTALL_FILES)
+        message(SEND_ERROR "The target ${_TARGET_NAME} is not known in this scope.")
+    endif (${_TARGET_NAME}_INSTALL_FILES)
+endfunction(INSTALL_JAR _TARGET_NAME _DESTINATION)
+
+function(INSTALL_JNI_SYMLINK _TARGET_NAME _DESTINATION)
+    if (${_TARGET_NAME}_JNI_SYMLINK)
+        install(
+            FILES
+                ${${_TARGET_NAME}_JNI_SYMLINK}
+            DESTINATION
+                ${_DESTINATION}
+        )
+    else (${_TARGET_NAME}_JNI_SYMLINK)
+        message(SEND_ERROR "The target ${_TARGET_NAME} is not known in this scope.")
+    endif (${_TARGET_NAME}_JNI_SYMLINK)
+endfunction(INSTALL_JNI_SYMLINK _TARGET_NAME _DESTINATION)
+
+function (find_jar VARIABLE)
+    set(_jar_names)
+    set(_jar_files)
+    set(_jar_versions)
+    set(_jar_paths
+        /usr/share/java/
+        /usr/local/share/java/
+        ${Java_JAR_PATHS})
+    set(_jar_doc "NOTSET")
+
+    set(_state "name")
+
+    foreach (arg ${ARGN})
+        if (${_state} STREQUAL "name")
+            if (${arg} STREQUAL "VERSIONS")
+                set(_state "versions")
+            elseif (${arg} STREQUAL "NAMES")
+                set(_state "names")
+            elseif (${arg} STREQUAL "PATHS")
+                set(_state "paths")
+            elseif (${arg} STREQUAL "DOC")
+                set(_state "doc")
+            else (${arg} STREQUAL "NAMES")
+                set(_jar_names ${arg})
+                if (_jar_doc STREQUAL "NOTSET")
+                    set(_jar_doc "Finding ${arg} jar")
+                endif (_jar_doc STREQUAL "NOTSET")
+            endif (${arg} STREQUAL "VERSIONS")
+        elseif (${_state} STREQUAL "versions")
+            if (${arg} STREQUAL "NAMES")
+                set(_state "names")
+            elseif (${arg} STREQUAL "PATHS")
+                set(_state "paths")
+            elseif (${arg} STREQUAL "DOC")
+                set(_state "doc")
+            else (${arg} STREQUAL "NAMES")
+                set(_jar_versions ${_jar_versions} ${arg})
+            endif (${arg} STREQUAL "NAMES")
+        elseif (${_state} STREQUAL "names")
+            if (${arg} STREQUAL "VERSIONS")
+                set(_state "versions")
+            elseif (${arg} STREQUAL "PATHS")
+                set(_state "paths")
+            elseif (${arg} STREQUAL "DOC")
+                set(_state "doc")
+            else (${arg} STREQUAL "VERSIONS")
+                set(_jar_names ${_jar_names} ${arg})
+                if (_jar_doc STREQUAL "NOTSET")
+                    set(_jar_doc "Finding ${arg} jar")
+                endif (_jar_doc STREQUAL "NOTSET")
+            endif (${arg} STREQUAL "VERSIONS")
+        elseif (${_state} STREQUAL "paths")
+            if (${arg} STREQUAL "VERSIONS")
+                set(_state "versions")
+            elseif (${arg} STREQUAL "NAMES")
+                set(_state "names")
+            elseif (${arg} STREQUAL "DOC")
+                set(_state "doc")
+            else (${arg} STREQUAL "VERSIONS")
+                set(_jar_paths ${_jar_paths} ${arg})
+            endif (${arg} STREQUAL "VERSIONS")
+        elseif (${_state} STREQUAL "doc")
+            if (${arg} STREQUAL "VERSIONS")
+                set(_state "versions")
+            elseif (${arg} STREQUAL "NAMES")
+                set(_state "names")
+            elseif (${arg} STREQUAL "PATHS")
+                set(_state "paths")
+            else (${arg} STREQUAL "VERSIONS")
+                set(_jar_doc ${arg})
+            endif (${arg} STREQUAL "VERSIONS")
+        endif (${_state} STREQUAL "name")
+    endforeach (arg ${ARGN})
+
+    if (${_jar_names} STREQUAL "")
+        message(FATAL_ERROR "find_jar: No name to search for given")
+    endif (${_jar_names} STREQUAL "")
+
+    foreach (jar_name ${_jar_names})
+        foreach (version ${_jar_versions})
+            set(_jar_files ${_jar_files} ${jar_name}-${version}.jar)
+        endforeach (version ${_jar_versions})
+        set(_jar_files ${_jar_files} ${jar_name}.jar)
+    endforeach (jar_name ${_jar_names})
+
+    find_file(${VARIABLE}
+        NAMES   ${_jar_files}
+        PATHS   ${_jar_paths}
+        DOC     ${_jar_doc}
+        NO_DEFAULT_PATH)
+endfunction (find_jar VARIABLE)
+
+function(create_javadoc _target)
+    set(_javadoc_packages)
+    set(_javadoc_files)
+    set(_javadoc_sourcepath)
+    set(_javadoc_classpath)
+    set(_javadoc_installpath "${CMAKE_INSTALL_PREFIX}/share/javadoc")
+    set(_javadoc_doctitle)
+    set(_javadoc_windowtitle)
+    set(_javadoc_author FALSE)
+    set(_javadoc_version FALSE)
+    set(_javadoc_use FALSE)
+
+    set(_state "package")
+
+    foreach (arg ${ARGN})
+        if (${_state} STREQUAL "package")
+            if (${arg} STREQUAL "PACKAGES")
+                set(_state "packages")
+            elseif (${arg} STREQUAL "FILES")
+                set(_state "files")
+            elseif (${arg} STREQUAL "SOURCEPATH")
+                set(_state "sourcepath")
+            elseif (${arg} STREQUAL "CLASSPATH")
+                set(_state "classpath")
+            elseif (${arg} STREQUAL "INSTALLPATH")
+                set(_state "installpath")
+            elseif (${arg} STREQUAL "DOCTITLE")
+                set(_state "doctitle")
+            elseif (${arg} STREQUAL "WINDOWTITLE")
+                set(_state "windowtitle")
+            elseif (${arg} STREQUAL "AUTHOR")
+                set(_state "author")
+            elseif (${arg} STREQUAL "USE")
+                set(_state "use")
+            elseif (${arg} STREQUAL "VERSION")
+                set(_state "version")
+            else ()
+                set(_javadoc_packages ${arg})
+                set(_state "packages")
+            endif ()
+        elseif (${_state} STREQUAL "packages")
+            if (${arg} STREQUAL "FILES")
+                set(_state "files")
+            elseif (${arg} STREQUAL "SOURCEPATH")
+                set(_state "sourcepath")
+            elseif (${arg} STREQUAL "CLASSPATH")
+                set(_state "classpath")
+            elseif (${arg} STREQUAL "INSTALLPATH")
+                set(_state "installpath")
+            elseif (${arg} STREQUAL "DOCTITLE")
+                set(_state "doctitle")
+            elseif (${arg} STREQUAL "WINDOWTITLE")
+                set(_state "windowtitle")
+            elseif (${arg} STREQUAL "AUTHOR")
+                set(_state "author")
+            elseif (${arg} STREQUAL "USE")
+                set(_state "use")
+            elseif (${arg} STREQUAL "VERSION")
+                set(_state "version")
+            else ()
+                list(APPEND _javadoc_packages ${arg})
+            endif ()
+        elseif (${_state} STREQUAL "files")
+            if (${arg} STREQUAL "PACKAGES")
+                set(_state "packages")
+            elseif (${arg} STREQUAL "SOURCEPATH")
+                set(_state "sourcepath")
+            elseif (${arg} STREQUAL "CLASSPATH")
+                set(_state "classpath")
+            elseif (${arg} STREQUAL "INSTALLPATH")
+                set(_state "installpath")
+            elseif (${arg} STREQUAL "DOCTITLE")
+                set(_state "doctitle")
+            elseif (${arg} STREQUAL "WINDOWTITLE")
+                set(_state "windowtitle")
+            elseif (${arg} STREQUAL "AUTHOR")
+                set(_state "author")
+            elseif (${arg} STREQUAL "USE")
+                set(_state "use")
+            elseif (${arg} STREQUAL "VERSION")
+                set(_state "version")
+            else ()
+                list(APPEND _javadoc_files ${arg})
+            endif ()
+        elseif (${_state} STREQUAL "sourcepath")
+            if (${arg} STREQUAL "PACKAGES")
+                set(_state "packages")
+            elseif (${arg} STREQUAL "FILES")
+                set(_state "files")
+            elseif (${arg} STREQUAL "CLASSPATH")
+                set(_state "classpath")
+            elseif (${arg} STREQUAL "INSTALLPATH")
+                set(_state "installpath")
+            elseif (${arg} STREQUAL "DOCTITLE")
+                set(_state "doctitle")
+            elseif (${arg} STREQUAL "WINDOWTITLE")
+                set(_state "windowtitle")
+            elseif (${arg} STREQUAL "AUTHOR")
+                set(_state "author")
+            elseif (${arg} STREQUAL "USE")
+                set(_state "use")
+            elseif (${arg} STREQUAL "VERSION")
+                set(_state "version")
+            else ()
+                list(APPEND _javadoc_sourcepath ${arg})
+            endif ()
+        elseif (${_state} STREQUAL "classpath")
+            if (${arg} STREQUAL "PACKAGES")
+                set(_state "packages")
+            elseif (${arg} STREQUAL "FILES")
+                set(_state "files")
+            elseif (${arg} STREQUAL "SOURCEPATH")
+                set(_state "sourcepath")
+            elseif (${arg} STREQUAL "INSTALLPATH")
+                set(_state "installpath")
+            elseif (${arg} STREQUAL "DOCTITLE")
+                set(_state "doctitle")
+            elseif (${arg} STREQUAL "WINDOWTITLE")
+                set(_state "windowtitle")
+            elseif (${arg} STREQUAL "AUTHOR")
+                set(_state "author")
+            elseif (${arg} STREQUAL "USE")
+                set(_state "use")
+            elseif (${arg} STREQUAL "VERSION")
+                set(_state "version")
+            else ()
+                list(APPEND _javadoc_classpath ${arg})
+            endif ()
+        elseif (${_state} STREQUAL "installpath")
+            if (${arg} STREQUAL "PACKAGES")
+                set(_state "packages")
+            elseif (${arg} STREQUAL "FILES")
+                set(_state "files")
+            elseif (${arg} STREQUAL "SOURCEPATH")
+                set(_state "sourcepath")
+            elseif (${arg} STREQUAL "DOCTITLE")
+                set(_state "doctitle")
+            elseif (${arg} STREQUAL "WINDOWTITLE")
+                set(_state "windowtitle")
+            elseif (${arg} STREQUAL "AUTHOR")
+                set(_state "author")
+            elseif (${arg} STREQUAL "USE")
+                set(_state "use")
+            elseif (${arg} STREQUAL "VERSION")
+                set(_state "version")
+            else ()
+                set(_javadoc_installpath ${arg})
+            endif ()
+        elseif (${_state} STREQUAL "doctitle")
+            if (${arg} STREQUAL "PACKAGES")
+                set(_state "packages")
+            elseif (${arg} STREQUAL "FILES")
+                set(_state "files")
+            elseif (${arg} STREQUAL "SOURCEPATH")
+                set(_state "sourcepath")
+            elseif (${arg} STREQUAL "INSTALLPATH")
+                set(_state "installpath")
+            elseif (${arg} STREQUAL "CLASSPATH")
+                set(_state "classpath")
+            elseif (${arg} STREQUAL "WINDOWTITLE")
+                set(_state "windowtitle")
+            elseif (${arg} STREQUAL "AUTHOR")
+                set(_state "author")
+            elseif (${arg} STREQUAL "USE")
+                set(_state "use")
+            elseif (${arg} STREQUAL "VERSION")
+                set(_state "version")
+            else ()
+                set(_javadoc_doctitle ${arg})
+            endif ()
+        elseif (${_state} STREQUAL "windowtitle")
+            if (${arg} STREQUAL "PACKAGES")
+                set(_state "packages")
+            elseif (${arg} STREQUAL "FILES")
+                set(_state "files")
+            elseif (${arg} STREQUAL "SOURCEPATH")
+                set(_state "sourcepath")
+            elseif (${arg} STREQUAL "CLASSPATH")
+                set(_state "classpath")
+            elseif (${arg} STREQUAL "INSTALLPATH")
+                set(_state "installpath")
+            elseif (${arg} STREQUAL "DOCTITLE")
+                set(_state "doctitle")
+            elseif (${arg} STREQUAL "AUTHOR")
+                set(_state "author")
+            elseif (${arg} STREQUAL "USE")
+                set(_state "use")
+            elseif (${arg} STREQUAL "VERSION")
+                set(_state "version")
+            else ()
+                set(_javadoc_windowtitle ${arg})
+            endif ()
+        elseif (${_state} STREQUAL "author")
+            if (${arg} STREQUAL "PACKAGES")
+                set(_state "packages")
+            elseif (${arg} STREQUAL "FILES")
+                set(_state "files")
+            elseif (${arg} STREQUAL "SOURCEPATH")
+                set(_state "sourcepath")
+            elseif (${arg} STREQUAL "CLASSPATH")
+                set(_state "classpath")
+            elseif (${arg} STREQUAL "INSTALLPATH")
+                set(_state "installpath")
+            elseif (${arg} STREQUAL "DOCTITLE")
+                set(_state "doctitle")
+            elseif (${arg} STREQUAL "WINDOWTITLE")
+                set(_state "windowtitle")
+            elseif (${arg} STREQUAL "AUTHOR")
+                set(_state "author")
+            elseif (${arg} STREQUAL "USE")
+                set(_state "use")
+            elseif (${arg} STREQUAL "VERSION")
+                set(_state "version")
+            else ()
+                set(_javadoc_author ${arg})
+            endif ()
+        elseif (${_state} STREQUAL "use")
+            if (${arg} STREQUAL "PACKAGES")
+                set(_state "packages")
+            elseif (${arg} STREQUAL "FILES")
+                set(_state "files")
+            elseif (${arg} STREQUAL "SOURCEPATH")
+                set(_state "sourcepath")
+            elseif (${arg} STREQUAL "CLASSPATH")
+                set(_state "classpath")
+            elseif (${arg} STREQUAL "INSTALLPATH")
+                set(_state "installpath")
+            elseif (${arg} STREQUAL "DOCTITLE")
+                set(_state "doctitle")
+            elseif (${arg} STREQUAL "WINDOWTITLE")
+                set(_state "windowtitle")
+            elseif (${arg} STREQUAL "AUTHOR")
+                set(_state "author")
+            elseif (${arg} STREQUAL "USE")
+                set(_state "use")
+            elseif (${arg} STREQUAL "VERSION")
+                set(_state "version")
+            else ()
+                set(_javadoc_use ${arg})
+            endif ()
+        elseif (${_state} STREQUAL "version")
+            if (${arg} STREQUAL "PACKAGES")
+                set(_state "packages")
+            elseif (${arg} STREQUAL "FILES")
+                set(_state "files")
+            elseif (${arg} STREQUAL "SOURCEPATH")
+                set(_state "sourcepath")
+            elseif (${arg} STREQUAL "CLASSPATH")
+                set(_state "classpath")
+            elseif (${arg} STREQUAL "INSTALLPATH")
+                set(_state "installpath")
+            elseif (${arg} STREQUAL "DOCTITLE")
+                set(_state "doctitle")
+            elseif (${arg} STREQUAL "WINDOWTITLE")
+                set(_state "windowtitle")
+            elseif (${arg} STREQUAL "AUTHOR")
+                set(_state "author")
+            elseif (${arg} STREQUAL "USE")
+                set(_state "use")
+            elseif (${arg} STREQUAL "VERSION")
+                set(_state "version")
+            else ()
+                set(_javadoc_version ${arg})
+            endif ()
+        endif (${_state} STREQUAL "package")
+    endforeach (arg ${ARGN})
+
+    set(_javadoc_builddir ${CMAKE_CURRENT_BINARY_DIR}/javadoc/${_target})
+    set(_javadoc_options -d ${_javadoc_builddir})
+
+    if (_javadoc_sourcepath)
+        set(_start TRUE)
+        foreach(_path ${_javadoc_sourcepath})
+            if (_start)
+                set(_sourcepath ${_path})
+                set(_start FALSE)
+            else (_start)
+                set(_sourcepath ${_sourcepath}:${_path})
+            endif (_start)
+        endforeach(_path ${_javadoc_sourcepath})
+        set(_javadoc_options ${_javadoc_options} -sourcepath ${_sourcepath})
+    endif (_javadoc_sourcepath)
+
+    if (_javadoc_classpath)
+        set(_start TRUE)
+        foreach(_path ${_javadoc_classpath})
+            if (_start)
+                set(_classpath ${_path})
+                set(_start FALSE)
+            else (_start)
+                set(_classpath ${_classpath}:${_path})
+            endif (_start)
+        endforeach(_path ${_javadoc_classpath})
+        set(_javadoc_options ${_javadoc_options} -classpath "${_classpath}")
+    endif (_javadoc_classpath)
+
+    if (_javadoc_doctitle)
+        set(_javadoc_options ${_javadoc_options} -doctitle '${_javadoc_doctitle}')
+    endif (_javadoc_doctitle)
+
+    if (_javadoc_windowtitle)
+        set(_javadoc_options ${_javadoc_options} -windowtitle '${_javadoc_windowtitle}')
+    endif (_javadoc_windowtitle)
+
+    if (_javadoc_author)
+        set(_javadoc_options ${_javadoc_options} -author)
+    endif (_javadoc_author)
+
+    if (_javadoc_use)
+        set(_javadoc_options ${_javadoc_options} -use)
+    endif (_javadoc_use)
+
+    if (_javadoc_version)
+        set(_javadoc_options ${_javadoc_options} -version)
+    endif (_javadoc_version)
+
+    add_custom_target(${_target}_javadoc ALL
+        COMMAND ${Java_JAVADOC_EXECUTABLE} ${_javadoc_options}
+                            ${_javadoc_files}
+                            ${_javadoc_packages}
+        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+    )
+
+    install(
+        DIRECTORY ${_javadoc_builddir}
+        DESTINATION ${_javadoc_installpath}
+    )
+endfunction(create_javadoc)
diff --git a/CMake/UseJavaClassFilelist.cmake b/CMake/UseJavaClassFilelist.cmake
new file mode 100644
index 0000000000..c842bf71a4
--- /dev/null
+++ b/CMake/UseJavaClassFilelist.cmake
@@ -0,0 +1,52 @@
+#
+# This script create a list of compiled Java class files to be added to a
+# jar file. This avoids including cmake files which get created in the
+# binary directory.
+#
+
+#=============================================================================
+# Copyright 2010-2011 Andreas schneider <asn@redhat.com>
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+#  License text for the above reference.)
+
+if (CMAKE_JAVA_CLASS_OUTPUT_PATH)
+    if (EXISTS "${CMAKE_JAVA_CLASS_OUTPUT_PATH}")
+
+        set(_JAVA_GLOBBED_FILES)
+        if (CMAKE_JAR_CLASSES_PREFIX)
+            foreach(JAR_CLASS_PREFIX ${CMAKE_JAR_CLASSES_PREFIX})
+                message(STATUS "JAR_CLASS_PREFIX: ${JAR_CLASS_PREFIX}")
+
+                file(GLOB_RECURSE _JAVA_GLOBBED_TMP_FILES "${CMAKE_JAVA_CLASS_OUTPUT_PATH}/${JAR_CLASS_PREFIX}/*.class")
+                if (_JAVA_GLOBBED_TMP_FILES)
+                    list(APPEND _JAVA_GLOBBED_FILES ${_JAVA_GLOBBED_TMP_FILES})
+                endif (_JAVA_GLOBBED_TMP_FILES)
+            endforeach(JAR_CLASS_PREFIX ${CMAKE_JAR_CLASSES_PREFIX})
+        else()
+            file(GLOB_RECURSE _JAVA_GLOBBED_FILES "${CMAKE_JAVA_CLASS_OUTPUT_PATH}/*.class")
+        endif (CMAKE_JAR_CLASSES_PREFIX)
+
+        set(_JAVA_CLASS_FILES)
+        # file(GLOB_RECURSE foo RELATIVE) is broken so we need this.
+        foreach(_JAVA_GLOBBED_FILE ${_JAVA_GLOBBED_FILES})
+            file(RELATIVE_PATH _JAVA_CLASS_FILE ${CMAKE_JAVA_CLASS_OUTPUT_PATH} ${_JAVA_GLOBBED_FILE})
+            set(_JAVA_CLASS_FILES ${_JAVA_CLASS_FILES}${_JAVA_CLASS_FILE}\n)
+        endforeach(_JAVA_GLOBBED_FILE ${_JAVA_GLOBBED_FILES})
+
+        # write to file
+        file(WRITE ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist ${_JAVA_CLASS_FILES})
+
+    else (EXISTS "${CMAKE_JAVA_CLASS_OUTPUT_PATH}")
+        message(SEND_ERROR "FATAL: Java class output path doesn't exist")
+    endif (EXISTS "${CMAKE_JAVA_CLASS_OUTPUT_PATH}")
+else (CMAKE_JAVA_CLASS_OUTPUT_PATH)
+    message(SEND_ERROR "FATAL: Can't find CMAKE_JAVA_CLASS_OUTPUT_PATH")
+endif (CMAKE_JAVA_CLASS_OUTPUT_PATH)
diff --git a/CMake/UseJavaSymlinks.cmake b/CMake/UseJavaSymlinks.cmake
new file mode 100644
index 0000000000..c66ee1ea19
--- /dev/null
+++ b/CMake/UseJavaSymlinks.cmake
@@ -0,0 +1,32 @@
+#
+# Helper script for UseJava.cmake
+#
+
+#=============================================================================
+# Copyright 2010-2011 Andreas schneider <asn@redhat.com>
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+#  License text for the above reference.)
+
+if (UNIX AND _JAVA_TARGET_OUTPUT_LINK)
+    if (_JAVA_TARGET_OUTPUT_NAME)
+        find_program(LN_EXECUTABLE
+            NAMES
+                ln
+        )
+
+        execute_process(
+            COMMAND ${LN_EXECUTABLE} -sf "${_JAVA_TARGET_OUTPUT_NAME}" "${_JAVA_TARGET_OUTPUT_LINK}"
+            WORKING_DIRECTORY ${_JAVA_TARGET_DIR}
+        )
+    else (_JAVA_TARGET_OUTPUT_NAME)
+        message(SEND_ERROR "FATAL: Can't find _JAVA_TARGET_OUTPUT_NAME")
+    endif (_JAVA_TARGET_OUTPUT_NAME)
+endif (UNIX AND _JAVA_TARGET_OUTPUT_LINK)
diff --git a/CMake/UseSWIGLocal.cmake b/CMake/UseSWIGLocal.cmake
new file mode 100644
index 0000000000..98bcc99511
--- /dev/null
+++ b/CMake/UseSWIGLocal.cmake
@@ -0,0 +1,266 @@
+# - SWIG module for CMake
+# Defines the following macros:
+#   SWIG_ADD_MODULE(name language [ files ])
+#     - Define swig module with given name and specified language
+#   SWIG_LINK_LIBRARIES(name [ libraries ])
+#     - Link libraries to swig module
+# All other macros are for internal use only.
+# To get the actual name of the swig module,
+# use: ${SWIG_MODULE_${name}_REAL_NAME}.
+# Set Source files properties such as CPLUSPLUS and SWIG_FLAGS to specify
+# special behavior of SWIG. Also global CMAKE_SWIG_FLAGS can be used to add
+# special flags to all swig calls.
+# Another special variable is CMAKE_SWIG_OUTDIR, it allows one to specify 
+# where to write all the swig generated module (swig -outdir option)
+# The name-specific variable SWIG_MODULE_<name>_EXTRA_DEPS may be used
+# to specify extra dependencies for the generated modules.
+# If the source file generated by swig need some special flag you can use
+# SET_SOURCE_FILES_PROPERTIES( ${swig_generated_file_fullname}
+#        PROPERTIES COMPILE_FLAGS "-bla")
+
+
+#=============================================================================
+# Copyright 2004-2009 Kitware, Inc.
+# Copyright 2009 Mathieu Malaterre <mathieu.malaterre@gmail.com>
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distributed this file outside of CMake, substitute the full
+#  License text for the above reference.)
+
+SET(SWIG_CXX_EXTENSION "cxx")
+SET(SWIG_EXTRA_LIBRARIES "")
+
+SET(SWIG_PYTHON_EXTRA_FILE_EXTENSION "py")
+
+#
+# For given swig module initialize variables associated with it
+#
+MACRO(SWIG_MODULE_INITIALIZE name language)
+  STRING(TOUPPER "${language}" swig_uppercase_language)
+  STRING(TOLOWER "${language}" swig_lowercase_language)
+  SET(SWIG_MODULE_${name}_LANGUAGE "${swig_uppercase_language}")
+  SET(SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG "${swig_lowercase_language}")
+
+  IF("x${SWIG_MODULE_${name}_LANGUAGE}x" MATCHES "^xUNKNOWNx$")
+    MESSAGE(FATAL_ERROR "SWIG Error: Language \"${language}\" not found")
+  ENDIF("x${SWIG_MODULE_${name}_LANGUAGE}x" MATCHES "^xUNKNOWNx$")
+
+  SET(SWIG_MODULE_${name}_REAL_NAME "${name}")
+  IF("x${SWIG_MODULE_${name}_LANGUAGE}x" MATCHES "^xPYTHONx$")
+    # when swig is used without the -interface it will produce in the module.py
+    # a 'import _modulename' statement, which implies having a corresponding 
+    # _modulename.so (*NIX), _modulename.pyd (Win32).
+    SET(SWIG_MODULE_${name}_REAL_NAME "_${name}")
+  ENDIF("x${SWIG_MODULE_${name}_LANGUAGE}x" MATCHES "^xPYTHONx$")
+  IF("x${SWIG_MODULE_${name}_LANGUAGE}x" MATCHES "^xRUBYx$")
+    STRING(TOLOWER "${name}" ruby_module_name)
+    SET(SWIG_MODULE_${name}_REAL_NAME "${ruby_module_name}")
+  ENDIF("x${SWIG_MODULE_${name}_LANGUAGE}x" MATCHES "^xRUBYx$")
+  IF("x${SWIG_MODULE_${name}_LANGUAGE}x" MATCHES "^xPERLx$")
+    SET(SWIG_MODULE_${name}_EXTRA_FLAGS "-shadow")
+  ENDIF("x${SWIG_MODULE_${name}_LANGUAGE}x" MATCHES "^xPERLx$")
+ENDMACRO(SWIG_MODULE_INITIALIZE)
+
+#
+# For a given language, input file, and output file, determine extra files that
+# will be generated. This is internal swig macro.
+#
+
+MACRO(SWIG_GET_EXTRA_OUTPUT_FILES language outfiles generatedpath infile)
+  GET_SOURCE_FILE_PROPERTY(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename
+    ${infile} SWIG_MODULE_NAME)
+  IF(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename STREQUAL "NOTFOUND")
+    GET_FILENAME_COMPONENT(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename "${infile}" NAME_WE)
+  ENDIF(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename STREQUAL "NOTFOUND")
+  FOREACH(it ${SWIG_${language}_EXTRA_FILE_EXTENSION})
+    SET(${outfiles} ${${outfiles}}
+      "${generatedpath}/${SWIG_GET_EXTRA_OUTPUT_FILES_module_basename}.${it}")
+  ENDFOREACH(it)
+ENDMACRO(SWIG_GET_EXTRA_OUTPUT_FILES)
+
+#
+# Take swig (*.i) file and add proper custom commands for it
+#
+MACRO(SWIG_ADD_SOURCE_TO_MODULE name outfiles infile)
+  SET(swig_full_infile ${infile})
+  GET_FILENAME_COMPONENT(swig_source_file_path "${infile}" PATH)
+  GET_FILENAME_COMPONENT(swig_source_file_name_we "${infile}" NAME_WE)
+  GET_SOURCE_FILE_PROPERTY(swig_source_file_generated ${infile} GENERATED)
+  GET_SOURCE_FILE_PROPERTY(swig_source_file_cplusplus ${infile} CPLUSPLUS)
+  GET_SOURCE_FILE_PROPERTY(swig_source_file_flags ${infile} SWIG_FLAGS)
+  IF("${swig_source_file_flags}" STREQUAL "NOTFOUND")
+    SET(swig_source_file_flags "")
+  ENDIF("${swig_source_file_flags}" STREQUAL "NOTFOUND")
+  SET(swig_source_file_fullname "${infile}")
+  IF(${swig_source_file_path} MATCHES "^${CMAKE_CURRENT_SOURCE_DIR}")
+    STRING(REGEX REPLACE 
+      "^${CMAKE_CURRENT_SOURCE_DIR}" ""
+      swig_source_file_relative_path
+      "${swig_source_file_path}")
+  ELSE(${swig_source_file_path} MATCHES "^${CMAKE_CURRENT_SOURCE_DIR}")
+    IF(${swig_source_file_path} MATCHES "^${CMAKE_CURRENT_BINARY_DIR}")
+      STRING(REGEX REPLACE 
+        "^${CMAKE_CURRENT_BINARY_DIR}" ""
+        swig_source_file_relative_path
+        "${swig_source_file_path}")
+      SET(swig_source_file_generated 1)
+    ELSE(${swig_source_file_path} MATCHES "^${CMAKE_CURRENT_BINARY_DIR}")
+      SET(swig_source_file_relative_path "${swig_source_file_path}")
+      IF(swig_source_file_generated)
+        SET(swig_source_file_fullname "${CMAKE_CURRENT_BINARY_DIR}/${infile}")
+      ELSE(swig_source_file_generated)
+        SET(swig_source_file_fullname "${CMAKE_CURRENT_SOURCE_DIR}/${infile}")
+      ENDIF(swig_source_file_generated)
+    ENDIF(${swig_source_file_path} MATCHES "^${CMAKE_CURRENT_BINARY_DIR}")
+  ENDIF(${swig_source_file_path} MATCHES "^${CMAKE_CURRENT_SOURCE_DIR}")
+
+  SET(swig_generated_file_fullname
+    "${CMAKE_CURRENT_BINARY_DIR}")
+  IF(swig_source_file_relative_path)
+    SET(swig_generated_file_fullname
+      "${swig_generated_file_fullname}/${swig_source_file_relative_path}")
+  ENDIF(swig_source_file_relative_path)
+  # If CMAKE_SWIG_OUTDIR was specified then pass it to -outdir
+  IF(CMAKE_SWIG_OUTDIR)
+    SET(swig_outdir ${CMAKE_SWIG_OUTDIR})
+    # it may not exist, so create it:
+    file(MAKE_DIRECTORY ${CMAKE_SWIG_OUTDIR})
+  ELSE(CMAKE_SWIG_OUTDIR)
+    SET(swig_outdir ${CMAKE_CURRENT_BINARY_DIR})
+  ENDIF(CMAKE_SWIG_OUTDIR)
+  SWIG_GET_EXTRA_OUTPUT_FILES(${SWIG_MODULE_${name}_LANGUAGE}
+    swig_extra_generated_files
+    "${swig_outdir}"
+    "${infile}")
+  SET(swig_generated_file_fullname
+    "${swig_generated_file_fullname}/${swig_source_file_name_we}")
+  # add the language into the name of the file (i.e. TCL_wrap)
+  # this allows for the same .i file to be wrapped into different languages
+  SET(swig_generated_file_fullname
+    "${swig_generated_file_fullname}${SWIG_MODULE_${name}_LANGUAGE}_wrap")
+
+  IF(swig_source_file_cplusplus)
+    SET(swig_generated_file_fullname
+      "${swig_generated_file_fullname}.${SWIG_CXX_EXTENSION}")
+  ELSE(swig_source_file_cplusplus)
+    SET(swig_generated_file_fullname
+      "${swig_generated_file_fullname}.c")
+  ENDIF(swig_source_file_cplusplus)
+
+  #MESSAGE("Full path to source file: ${swig_source_file_fullname}")
+  #MESSAGE("Full path to the output file: ${swig_generated_file_fullname}")
+  GET_DIRECTORY_PROPERTY(cmake_include_directories INCLUDE_DIRECTORIES)
+  SET(swig_include_dirs)
+  FOREACH(it ${cmake_include_directories})
+    SET(swig_include_dirs ${swig_include_dirs} "-I${it}")
+  ENDFOREACH(it)
+
+  SET(swig_special_flags)
+  # default is c, so add c++ flag if it is c++
+  IF(swig_source_file_cplusplus)
+    SET(swig_special_flags ${swig_special_flags} "-c++")
+  ENDIF(swig_source_file_cplusplus)
+  SET(swig_extra_flags)
+  IF(SWIG_MODULE_${name}_EXTRA_FLAGS)
+    SET(swig_extra_flags ${swig_extra_flags} ${SWIG_MODULE_${name}_EXTRA_FLAGS})
+  ENDIF(SWIG_MODULE_${name}_EXTRA_FLAGS)
+  ADD_CUSTOM_COMMAND(
+    OUTPUT "${swig_generated_file_fullname}" ${swig_extra_generated_files}
+    COMMAND "${SWIG_EXECUTABLE}"
+    ARGS "-${SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG}"
+    ${swig_source_file_flags}
+    ${CMAKE_SWIG_FLAGS}
+    -outdir ${swig_outdir}
+    ${swig_special_flags}
+    ${swig_extra_flags}
+    ${swig_include_dirs}
+    -o "${swig_generated_file_fullname}"
+    "${swig_source_file_fullname}"
+    MAIN_DEPENDENCY "${swig_source_file_fullname}"
+    DEPENDS ${SWIG_MODULE_${name}_EXTRA_DEPS}
+    COMMENT "Swig source to generate ${SWIG_MODULE_${name}_LANGUAGE} wrapping") 
+  SET_SOURCE_FILES_PROPERTIES("${swig_generated_file_fullname}" ${swig_extra_generated_files}
+    PROPERTIES GENERATED 1)
+  SET(${outfiles} "${swig_generated_file_fullname}" ${swig_extra_generated_files})
+ENDMACRO(SWIG_ADD_SOURCE_TO_MODULE)
+
+#
+# Create Swig module
+#
+MACRO(SWIG_ADD_MODULE name language)
+  SWIG_MODULE_INITIALIZE(${name} ${language})
+  SET(swig_dot_i_sources)
+  SET(swig_other_sources)
+  FOREACH(it ${ARGN})
+    IF(${it} MATCHES ".*\\.i$")
+      SET(swig_dot_i_sources ${swig_dot_i_sources} "${it}")
+    ELSE(${it} MATCHES ".*\\.i$")
+      SET(swig_other_sources ${swig_other_sources} "${it}")
+    ENDIF(${it} MATCHES ".*\\.i$")
+  ENDFOREACH(it)
+
+  SET(swig_generated_sources)
+  FOREACH(it ${swig_dot_i_sources})
+    SWIG_ADD_SOURCE_TO_MODULE(${name} swig_generated_source ${it})
+    SET(swig_generated_sources ${swig_generated_sources} "${swig_generated_source}")
+  ENDFOREACH(it)
+  GET_DIRECTORY_PROPERTY(swig_extra_clean_files ADDITIONAL_MAKE_CLEAN_FILES)
+  SET_DIRECTORY_PROPERTIES(PROPERTIES
+    ADDITIONAL_MAKE_CLEAN_FILES "${swig_extra_clean_files};${swig_generated_sources}")
+  ADD_LIBRARY(${SWIG_MODULE_${name}_REAL_NAME}
+    MODULE
+    ${swig_generated_sources}
+    ${swig_other_sources})
+  STRING(TOLOWER "${language}" swig_lowercase_language)
+  IF ("${swig_lowercase_language}" STREQUAL "java")
+    IF (APPLE)
+        # In java you want:
+        #      System.loadLibrary("LIBRARY");
+        # then JNI will look for a library whose name is platform dependent, namely
+        #   MacOS  : libLIBRARY.jnilib
+        #   Windows: LIBRARY.dll
+        #   Linux  : libLIBRARY.so
+        SET_TARGET_PROPERTIES (${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES SUFFIX ".jnilib")
+      ENDIF (APPLE)
+  ENDIF ("${swig_lowercase_language}" STREQUAL "java")
+  IF ("${swig_lowercase_language}" STREQUAL "python")
+    # this is only needed for the python case where a _modulename.so is generated
+    SET_TARGET_PROPERTIES(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES PREFIX "")
+    # Python extension modules on Windows must have the extension ".pyd"
+    # instead of ".dll" as of Python 2.5.  Older python versions do support
+    # this suffix.
+    # http://docs.python.org/whatsnew/ports.html#SECTION0001510000000000000000
+    # <quote>
+    # Windows: .dll is no longer supported as a filename extension for extension modules.
+    # .pyd is now the only filename extension that will be searched for.
+    # </quote>
+    IF(WIN32 AND NOT CYGWIN)
+      SET_TARGET_PROPERTIES(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES SUFFIX ".pyd")
+    ENDIF(WIN32 AND NOT CYGWIN)
+  ENDIF ("${swig_lowercase_language}" STREQUAL "python")
+  IF ("${swig_lowercase_language}" STREQUAL "ruby")
+    SET_TARGET_PROPERTIES(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES PREFIX "")
+    IF(APPLE)
+      SET_TARGET_PROPERTIES(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES SUFFIX ".bundle")
+      SET_TARGET_PROPERTIES(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES COMPILE_FLAGS "-bundle")
+    ENDIF(APPLE)
+  ENDIF ("${swig_lowercase_language}" STREQUAL "ruby")
+ENDMACRO(SWIG_ADD_MODULE)
+
+#
+# Like TARGET_LINK_LIBRARIES but for swig modules
+#
+MACRO(SWIG_LINK_LIBRARIES name)
+  IF(SWIG_MODULE_${name}_REAL_NAME)
+    TARGET_LINK_LIBRARIES(${SWIG_MODULE_${name}_REAL_NAME} ${ARGN})
+  ELSE(SWIG_MODULE_${name}_REAL_NAME)
+    MESSAGE(SEND_ERROR "Cannot find Swig library \"${name}\".")
+  ENDIF(SWIG_MODULE_${name}_REAL_NAME)
+ENDMACRO(SWIG_LINK_LIBRARIES name)
+
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 43286e412c..c5760673c1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -45,6 +45,9 @@ MARK_AS_ADVANCED(TCL_TCLSH DART_ROOT)
 IF(BUILD_TESTING)
   ENABLE_TESTING()
   
+  # configure the test driver
+  FIND_PROGRAM(OTB_TEST_DRIVER otbTestDriver PATHS ${OTB_DIR}/bin ${OTB_DIR}/../../bin DOC "Path to the otbTestDriver executable from OTB")
+  
   FIND_PATH(OTB_DATA_ROOT README-OTB-Data PATHS $ENV{OTB_DATA_ROOT} ${OTB_SOURCE_DIR}/../OTB-Data)
   MARK_AS_ADVANCED(OTB_DATA_ROOT)
   
diff --git a/Code/Wrappers/SWIG/CMakeLists.txt b/Code/Wrappers/SWIG/CMakeLists.txt
index 43ba3f73c7..e8f3971292 100644
--- a/Code/Wrappers/SWIG/CMakeLists.txt
+++ b/Code/Wrappers/SWIG/CMakeLists.txt
@@ -1,15 +1,196 @@
-INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})
-INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
 
-SET(CMAKE_SWIG_FLAGS "")
+macro(check_PIC_flag Language)
+  if ( UNIX AND NOT APPLE )
+    if ( NOT ${CMAKE_CXX_FLAGS} MATCHES "-fPIC")
+      message ( FATAL_ERROR "${Language} wrapping requires CMAKE_CXX_FLAGS (or equivalent) to include -fPIC and ITK built with this flag" )
+    endif()
+  endif()
+endmacro()
 
-FILE(GLOB swigfiles "*.i")
-FOREACH(swigfile ${swigfiles})
-    SET_SOURCE_FILES_PROPERTIES(${swigfile} PROPERTIES CPLUSPLUS ON)
-    SET_SOURCE_FILES_PROPERTIES(${swigfile} PROPERTIES SWIG_FLAGS "-includeall")
-ENDFOREACH(swigfile ${swigfiles})
 
-set(SWIG_MODULE_otbApplication_EXTRA_DEPS itkBase.i itkMacro.i RefCountMacro.i)
+#
+# Setup the option for each laguage
+#
+option ( WRAP_LUA "Wrap Lua" OFF )
+
+
+find_package ( PythonLibs )
+find_package ( PythonInterp )
+if ( PYTHONLIBS_FOUND AND PYTHONINTERP_FOUND )
+  set( WRAP_PYTHON_DEFAULT ON )
+else ( PYTHONLIBS_FOUND AND PYTHONINTERP_FOUND )
+  set( WRAP_PYTHON_DEFAULT OFF )
+endif ( PYTHONLIBS_FOUND AND PYTHONINTERP_FOUND )
+check_PIC_flag ( Python )
+option( WRAP_PYTHON "Wrap Python" ${WRAP_PYTHON_DEFAULT} )
+
+find_package ( Java COMPONENTS Development Runtime)
+find_package ( JNI  )
+if ( JAVA_FOUND AND JNI_FOUND )
+  set( WRAP_JAVA_DEFAULT ON )
+else ( ${JAVA_FOUND} AND JNI_FOUND )
+  set( WRAP_JAVA_DEFAULT OFF )
+endif ( JAVA_FOUND AND JNI_FOUND )
+check_PIC_flag ( Java )
+option ( WRAP_JAVA "Wrap Java" ${WRAP_JAVA_DEFAULT} )
+
+find_package ( TCL )
+if ( TCL_FOUND )
+  set ( WRAP_TCL_DEFAULT ON )
+else ( TCL_FOUND )
+  set ( WRAP_TCL_DEFAULT OFF )
+endif ( TCL_FOUND )
+#option ( WRAP_TCL "Wrap Tcl" ${WRAP_TCL_DEFAULT} )
+option ( WRAP_TCL "Wrap Tcl" OFF )
+
+find_package ( Ruby )
+if ( RUBY_FOUND )
+  set ( WRAP_RUBY_DEFAULT ON )
+else ( RUBY_FOUND )
+  set ( WRAP_RUBY_DEFAULT OFF )
+endif ( RUBY_FOUND )
+check_PIC_flag ( Ruby )
+#option ( WRAP_RUBY "Wrap Ruby" ${WRAP_RUBY_DEFAULT} )
+option ( WRAP_RUBY "Wrap Ruby" OFF )
+
+#
+# General SWIG configuration
+#
+if ( WRAP_LUA OR WRAP_PYTHON OR WRAP_JAVA OR WRAP_CSHARP OR WRAP_TCL OR WRAP_R OR WRAP_RUBY )
+  find_package ( SWIG 2 REQUIRED )
+  include ( UseSWIGLocal )
+  set_source_files_properties ( otbApplication.i PROPERTIES CPLUSPLUS ON )
+  file ( GLOB SWIG_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/*/*.h)
+
+  set ( SWIG_HEADERS ${SWIG_HEADERS}
+    ${CMAKE_CURRENT_SOURCE_DIR}/itkBase.i
+    ${CMAKE_CURRENT_SOURCE_DIR}/itkMacro.i
+    ${CMAKE_CURRENT_SOURCE_DIR}/RefCountMacro.i
+
+    ${CMAKE_CURRENT_SOURCE_DIR}/Python.i
+    ${CMAKE_CURRENT_SOURCE_DIR}/Java.i
+#    ${CMAKE_CURRENT_SOURCE_DIR}/CSharp.i
+#    ${CMAKE_CURRENT_SOURCE_DIR}/CSharpTypemapHelper.i
+#    ${CMAKE_CURRENT_SOURCE_DIR}/Lua.i
+#    ${CMAKE_CURRENT_SOURCE_DIR}/Tcl.i
+     )
+
+  set ( SWIG_MODULE_otbApplication_EXTRA_DEPS ${SWIG_HEADERS} )
+  
+  include_directories ( ${CMAKE_CURRENT_SOURCE_DIR} )
+
+endif()
+
+#
+# python SWIG configuration
+#
+if ( WRAP_PYTHON )
+  find_package ( PythonLibs REQUIRED )
+  find_package ( PythonInterp REQUIRED )
+  include_directories ( ${PYTHON_INCLUDE_DIR} )
+
+  # Run swig
+  set(CMAKE_SWIG_FLAGS ${CMAKE_SWIG_GLOBAL_FLAGS})
+  set(CMAKE_SWIG_OUTDIR ${CMAKE_CURRENT_BINARY_DIR})
+  set(SWIG_MODULE_otbApplication_EXTRA_DEPS OTBWrapperCore ${SWIG_HEADERS})
+  SWIG_add_module ( otbApplication python otbApplication.i otbApplicationPYTHON_wrap.cxx )
+  SWIG_link_libraries ( otbApplication ${PYTHON_LIBRARIES} OTBWrapperCore)
+  set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/otbApplicationPYTHON_wrap.cxx COMPILE_FLAGS "-w")
+
+endif()
+
+#
+# JAVA SWIG configuration
+#
+if ( WRAP_JAVA )
+  find_package ( Java REQUIRED )
+  find_package ( JNI REQUIRED )
+  include_directories ( ${JAVA_INCLUDE_PATH} ${JNI_INCLUDE_DIRS} )
+
+  # Make sure the nested directory structure exists
+  set(JAVA_SOURCE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/org/otb/application)
+  set(JAVA_BINARY_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/build)
+  file(MAKE_DIRECTORY ${JAVA_SOURCE_DIRECTORY})
+  file(MAKE_DIRECTORY ${JAVA_BINARY_DIRECTORY})
+
+  # Nicely write the bridge code in org/itk/simple
+  set(CMAKE_SWIG_OUTDIR ${JAVA_SOURCE_DIRECTORY})
+  set(CMAKE_SWIG_FLAGS -package "org.otb.application" ${CMAKE_SWIG_GLOBAL_FLAGS})
+  set(SWIG_MODULE_otbApplicationJava_EXTRA_DEPS OTBWrapperCore  ${SWIG_HEADERS})
+  SWIG_add_module ( otbApplicationJava java otbApplication.i otbApplicationJAVA_wrap.cxx)
+  SWIG_link_libraries(otbApplicationJava OTBWrapperCore)
+  set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/otbApplicationJAVA_wrap.cxx COMPILE_FLAGS "-w")
+
+  # Add target for org.otb.Application.jar
+  add_custom_target(org_otb_Application_jar ALL DEPENDS org.otb.application.jar)
+
+  # Add custom command and target to compile the generated files and put them in a jar file
+  # Make sure the commands depend on the output library from SWIG
+  add_custom_command(
+    OUTPUT org.otb.application.jar
+    COMMENT "Creating jar file..."
+    COMMAND ${Java_JAVAC_EXECUTABLE} -d ${JAVA_BINARY_DIRECTORY} ${JAVA_SOURCE_DIRECTORY}/*.java
+    COMMAND ${Java_JAR_EXECUTABLE} cf ${CMAKE_CURRENT_BINARY_DIR}/org.otb.application.jar -C ${JAVA_BINARY_DIRECTORY} org
+    DEPENDS ${SWIG_MODULE_otbApplication_REAL_NAME} otbApplicationJava OTBWrapperCore
+    )
+
+  # Get the location of the extension directory
+  string(REGEX REPLACE "include"  "jre/lib/ext" JAVA_EXTENSION_DIR ${JAVA_INCLUDE_PATH} )
+
+  # Add the install target
+  install(FILES ${CMAKE_CURRENT_BINARY_DIR}/org.otb.application.jar DESTINATION ${JAVA_EXTENSION_DIR})
+
+endif()
+
+#
+# lua SWIG configuration
+#
+if ( WRAP_LUA )
+  option ( USE_SYSTEM_LUA "Use a system provided lua" OFF )
+
+  if ( USE_SYSTEM_LUA )
+    find_package ( Lua51 REQUIRED )
+    include_directories ( ${LUA_INCLUDE_DIR} )
+    set ( LUA_LIB ${LUA_LIBRARIES} )
+  else()
+    set ( LUA_LIB lua5 )
+    include_directories ( ${otbApplication_SOURCE_DIR}/Utilities/lua-5.1.4/src )
+  endif()
+
+
+  # Run swig
+  set(CMAKE_SWIG_FLAGS ${CMAKE_SWIG_GLOBAL_FLAGS})
+  set(CMAKE_SWIG_OUTDIR ${CMAKE_CURRENT_BINARY_DIR})
+  set(SWIG_MODULE_otbApplicationLua_EXTRA_DEPS OTBWrapperCore ${SWIG_HEADERS})
+  SWIG_module_initialize ( otbApplicationLua lua )
+  SWIG_add_source_to_module ( otbApplicationLua swig_generated_source otbApplication.i ${SWIG_HEADERS} )
+  set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/otbApplicationLUA_wrap.cxx COMPILE_FLAGS "-w")
+
+  add_executable ( otbApplicationLua otbApplicationLuaMain.cxx otbApplicationLUA_wrap.cxx )
+  target_link_libraries ( otbApplicationLua ${LUA_LIB} OTBWrapperCore )
+
+  if ( UNIX )
+    target_link_libraries ( otbApplicationLua curses )
+  endif()
+
+endif()
+
+#
+# ruby SWIG configuration
+#
+if ( WRAP_RUBY )
+  find_package ( Ruby REQUIRED )
+  include_directories ( ${RUBY_INCLUDE_DIRS} )
+
+  # Run swig
+  set(CMAKE_SWIG_FLAGS -autorename -module otbApplication ${CMAKE_SWIG_GLOBAL_FLAGS})
+  set(CMAKE_SWIG_OUTDIR ${CMAKE_CURRENT_BINARY_DIR})
+  set(SWIG_MODULE_otbApplication_EXTRA_DEPS OTBWrapperCore ${SWIG_HEADERS})
+  SWIG_MODULE_INITIALIZE ( otbApplication ruby )
+
+  SWIG_add_module ( otbApplication ruby otbApplication.i otbApplicationRUBY_wrap.cxx )
+  SWIG_link_libraries ( otbApplication ${RUBY_LIBRARY} OTBWrapperCore)
+  set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/otbApplicationRUBY_wrap.cxx COMPILE_FLAGS "-w")
+
+endif()
 
-SWIG_ADD_MODULE(otbApplication python otbApplication.i )
-SWIG_LINK_LIBRARIES(otbApplication ${PYTHON_LIBRARIES} OTBWrapperCore)
diff --git a/Code/Wrappers/SWIG/Java.i b/Code/Wrappers/SWIG/Java.i
new file mode 100644
index 0000000000..aaef5aeea4
--- /dev/null
+++ b/Code/Wrappers/SWIG/Java.i
@@ -0,0 +1,125 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#if SWIGJAVA
+
+%ignore CreateAnother;
+%ignore Delete;
+%ignore Register;
+%ignore UnRegister;
+%ignore GetReferenceCount;
+%ignore SetReferenceCount;
+%ignore DebugOn;
+%ignore DebugOff;
+%ignore GetDebug;
+%ignore SetDebug;
+%ignore GetMTime;
+%ignore Modified;
+%ignore SetGlobalWarningDisplay;
+%ignore GetGlobalWarningDisplay;
+%ignore GlobalWarningDisplayOn;
+%ignore GlobalWarningDisplayOff;
+
+%ignore New;
+
+
+//######################################################################
+// Simulating smart pointers in SWIG
+// This gets rid of wrapping ITK smart pointers.
+
+// TODO: always tell swig we're the owner
+// TODO: itk classes with no New() must be marked as abstract
+%define DECLARE_REF_COUNT_CLASS(itkClass)
+
+  class itkClass##_Pointer
+  {
+     public:
+       itkClass##_Pointer();
+       itkClass##_Pointer(itkClass##_Pointer const & p);
+       itkClass##_Pointer(itkClass * p);
+       ~itkClass##_Pointer();
+       itkClass * operator->() const;
+       bool IsNotNull() const;
+       bool IsNull() const;
+       itkClass * GetPointer() const;
+       bool operator<(itkClass##_Pointer const & r) const;
+       bool operator>(itkClass##_Pointer const & r) const;
+       bool operator<=(itkClass##_Pointer const & r) const;
+       bool operator>=(itkClass##_Pointer const & r) const;
+       itkClass##_Pointer & operator=(itkClass##_Pointer const & r);
+       itkClass##_Pointer & operator=(itkClass## * r);
+//       itkClass * Print(std::ostream & os) const;
+     private:
+       void Register();
+       void UnRegister();
+     protected:
+  };
+
+
+  // Extend the itk classtype defined for wrapping to simulate a smart pointer in SWIG.
+  // Also, make the ctor public to make the 'new' operator available in java
+  %extend itkClass {
+    public:
+    itkClass() {
+      typedef ::itk::SmartPointer<itkLightObject> Pointer;
+      Pointer smtPtr = itkClass::New().GetPointer();
+      itkClass *rawPtr = dynamic_cast<itkClass *>(smtPtr.GetPointer());
+      rawPtr->Register();
+      return rawPtr;
+    };
+    ~itkClass() {
+      self->UnRegister();
+    };
+  }
+/*
+  %typemap(out) itkClass * {
+    itkClass* ptrRaw = $1;
+    if (ptrRaw) {
+      ptrRaw->Register();
+    }
+    *(itkClass **)&$result = ptrRaw;
+  }
+*/  
+  %typemap(out) itkClass##_Pointer {
+    itkClass* ptrRaw = $1.GetPointer();
+    if (ptrRaw) {
+      ptrRaw->Register();
+    }
+    *(itkClass **)&$result = ptrRaw;
+  }
+  
+  %typemap(out) itkClass##_Pointer & {
+    itkClass* ptrRaw = (*$1).GetPointer();
+    if (ptrRaw) {
+      ptrRaw->Register();
+    }
+    *(itkClass **)&$result = ptrRaw;
+  }
+
+  // Do not wrap the corresponding itkSmartPointer
+  %ignore itkClass##_Pointer;
+  
+%enddef
+
+%pragma(java) jniclasscode=%{
+  static {
+    System.loadLibrary ( "otbApplicationJava" );
+  }
+%}
+
+
+#endif
diff --git a/Code/Wrappers/SWIG/Python.i b/Code/Wrappers/SWIG/Python.i
index 7f06fbee1c..ae718b0b46 100644
--- a/Code/Wrappers/SWIG/Python.i
+++ b/Code/Wrappers/SWIG/Python.i
@@ -1,5 +1,117 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
 #if SWIGPYTHON
 
+%ignore CreateAnother;
+%ignore Delete;
+%ignore Register;
+%ignore UnRegister;
+%ignore GetReferenceCount;
+%ignore SetReferenceCount;
+%ignore DebugOn;
+%ignore DebugOff;
+%ignore GetDebug;
+%ignore SetDebug;
+%ignore GetMTime;
+%ignore Modified;
+%ignore SetGlobalWarningDisplay;
+%ignore GetGlobalWarningDisplay;
+%ignore GlobalWarningDisplayOn;
+%ignore GlobalWarningDisplayOff;
+
+
+
+// This macro replaces the use of itk::SmartPointer.
+// class_name is class name without namespace qualifiers.
+// Reference: http://www.nabble.com/attachment/16653644/0/SwigRefCount.i
+%define DECLARE_REF_COUNT_CLASS(class_name)
+
+  class class_name##_Pointer
+  {
+     public:
+       class_name##_Pointer();
+       class_name##_Pointer(class_name##_Pointer const & p);
+       class_name##_Pointer(class_name * p);
+       ~class_name##_Pointer();
+       class_name * operator->() const;
+       bool IsNotNull() const;
+       bool IsNull() const;
+       class_name * GetPointer() const;
+       bool operator<(class_name##_Pointer const & r) const;
+       bool operator>(class_name##_Pointer const & r) const;
+       bool operator<=(class_name##_Pointer const & r) const;
+       bool operator>=(class_name##_Pointer const & r) const;
+       class_name##_Pointer & operator=(class_name##_Pointer const & r);
+       class_name##_Pointer & operator=(class_name## * r);
+//       class_name * Print(std::ostream & os) const;
+     private:
+       void Register();
+       void UnRegister();
+     protected:
+  };
+
+  // pointers and references
+  %typemap(out) class_name *, class_name & {
+    // always tell SWIG_NewPointerObj we're the owner
+    $result = SWIG_NewPointerObj((void *) $1, $1_descriptor, 1);
+    if ($1) {
+      $1->Register();
+    }
+  }
+
+  // transform smart pointers in raw pointers
+  %typemap(out) class_name##_Pointer {
+    // get the raw pointer from the smart pointer
+    class_name * ptr = $1;
+    // always tell SWIG_NewPointerObj we're the owner
+    $result = SWIG_NewPointerObj((void *) ptr, $descriptor(class_name *), 1);
+    // register the object, it it exists
+    if (ptr) {
+      ptr->Register();
+    }
+  }
+
+  // transform smart pointers in raw pointers
+  %typemap(out) class_name##_Pointer & {
+    // get the raw pointer from the smart pointer
+    class_name * ptr = *$1;
+    // always tell SWIG_NewPointerObj we're the owner
+    $result = SWIG_NewPointerObj((void *) ptr, $descriptor(class_name *), 1);
+    // register the object, it it exists
+    if (ptr) {
+      ptr->Register();
+    }
+  }
+
+  %extend class_name {
+    public:
+
+    // make "deletion" in scripting language just decrement ref. count
+    ~class_name() {self->UnRegister();};
+
+    }
+
+  %ignore class_name::~class_name;
+  
+  %ignore class_name##_Pointer;
+
+%enddef
+
 
 %typemap(out)  unsigned char &, const unsigned char &, signed char &, const signed char &, unsigned short &, const unsigned short &, signed short &, const signed short &, unsigned int &, const unsigned int &, signed int &, const signed int &, signed long &, const signed long &, unsigned long &, const unsigned long &
   {$result = PyInt_FromLong( *$1 );}
@@ -19,12 +131,23 @@
     PyList_SetItem( $result, i, PyString_FromString( it->c_str() ) );
     }
   }
-  
-%extend itkLightObject {
-      %pythoncode %{  
-        def __str__( self ):
-          return self.ToString()
-      %}
-}
 
+ // Add a ToString shortcut to all itkLightObject
+ // This will make it easier for string conversion in target languages
+ %extend itkLightObject {
+    public:
+    std::string ToString() {
+      std::ostringstream o;
+      self->Print(o);
+      return o.str();
+    }
+  }
+
+  %extend itkLightObject {
+        %pythoncode %{  
+          def __str__( self ):
+            return self.ToString()
+        %}
+  }
+  
 #endif
diff --git a/Code/Wrappers/SWIG/RefCountMacro.i b/Code/Wrappers/SWIG/RefCountMacro.i
index d25cee4056..741058d37e 100644
--- a/Code/Wrappers/SWIG/RefCountMacro.i
+++ b/Code/Wrappers/SWIG/RefCountMacro.i
@@ -1,79 +1,21 @@
+/*=========================================================================
 
-%include <exception.i>
-%include <typemaps.i>
-
-// This macro replaces the use of itk::SmartPointer.
-// class_name is class name without namespace qualifiers.
-// Reference: http://www.nabble.com/attachment/16653644/0/SwigRefCount.i
-%define DECLARE_REF_COUNT_CLASS(class_name)
-
-  class class_name##_Pointer
-  {
-     public:
-       class_name##_Pointer();
-       class_name##_Pointer(class_name##_Pointer const & p);
-       class_name##_Pointer(class_name * p);
-       ~class_name##_Pointer();
-       class_name * operator->() const;
-       bool IsNotNull() const;
-       bool IsNull() const;
-       class_name * GetPointer() const;
-       bool operator<(class_name##_Pointer const & r) const;
-       bool operator>(class_name##_Pointer const & r) const;
-       bool operator<=(class_name##_Pointer const & r) const;
-       bool operator>=(class_name##_Pointer const & r) const;
-       class_name##_Pointer & operator=(class_name##_Pointer const & r);
-       class_name##_Pointer & operator=(class_name## * r);
-//       class_name * Print(std::ostream & os) const;
-     private:
-       void Register();
-       void UnRegister();
-     protected:
-  };
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
 
-  // pointers and references
-  %typemap(out) class_name *, class_name & {
-    // always tell SWIG_NewPointerObj we're the owner
-    $result = SWIG_NewPointerObj((void *) $1, $1_descriptor, 1);
-    if ($1) {
-      $1->Register();
-    }
-  }
 
-  // transform smart pointers in raw pointers
-  %typemap(out) class_name##_Pointer {
-    // get the raw pointer from the smart pointer
-    class_name * ptr = $1;
-    // always tell SWIG_NewPointerObj we're the owner
-    $result = SWIG_NewPointerObj((void *) ptr, $descriptor(class_name *), 1);
-    // register the object, it it exists
-    if (ptr) {
-      ptr->Register();
-    }
-  }
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
 
-  // transform smart pointers in raw pointers
-  %typemap(out) class_name##_Pointer & {
-    // get the raw pointer from the smart pointer
-    class_name * ptr = *$1;
-    // always tell SWIG_NewPointerObj we're the owner
-    $result = SWIG_NewPointerObj((void *) ptr, $descriptor(class_name *), 1);
-    // register the object, it it exists
-    if (ptr) {
-      ptr->Register();
-    }
-  }
 
-  %extend class_name {
-    public:
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
 
-    // make "deletion" in scripting language just decrement ref. count
-    ~class_name() {self->UnRegister();};
+=========================================================================*/
 
-    }
-
-  %ignore class_name::~class_name;
-  
-  %ignore class_name##_Pointer;
+%include <exception.i>
+%include <typemaps.i>
 
-%enddef
diff --git a/Code/Wrappers/SWIG/Ruby.i b/Code/Wrappers/SWIG/Ruby.i
new file mode 100644
index 0000000000..050042a3dd
--- /dev/null
+++ b/Code/Wrappers/SWIG/Ruby.i
@@ -0,0 +1,125 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#if SWIGRUBY
+
+%ignore CreateAnother;
+%ignore Delete;
+%ignore Register;
+%ignore UnRegister;
+%ignore GetReferenceCount;
+%ignore SetReferenceCount;
+%ignore DebugOn;
+%ignore DebugOff;
+%ignore GetDebug;
+%ignore SetDebug;
+%ignore GetMTime;
+%ignore Modified;
+%ignore SetGlobalWarningDisplay;
+%ignore GetGlobalWarningDisplay;
+%ignore GlobalWarningDisplayOn;
+%ignore GlobalWarningDisplayOff;
+
+%ignore New;
+
+
+//######################################################################
+// Simulating smart pointers in SWIG
+// This gets rid of wrapping ITK smart pointers.
+
+// TODO: always tell swig we're the owner
+// TODO: itk classes with no New() must be marked as abstract
+%define DECLARE_REF_COUNT_CLASS(itkClass)
+
+  class itkClass##_Pointer
+  {
+     public:
+       itkClass##_Pointer();
+       itkClass##_Pointer(itkClass##_Pointer const & p);
+       itkClass##_Pointer(itkClass * p);
+       ~itkClass##_Pointer();
+       itkClass * operator->() const;
+       bool IsNotNull() const;
+       bool IsNull() const;
+       itkClass * GetPointer() const;
+       bool operator<(itkClass##_Pointer const & r) const;
+       bool operator>(itkClass##_Pointer const & r) const;
+       bool operator<=(itkClass##_Pointer const & r) const;
+       bool operator>=(itkClass##_Pointer const & r) const;
+       itkClass##_Pointer & operator=(itkClass##_Pointer const & r);
+       itkClass##_Pointer & operator=(itkClass## * r);
+//       itkClass * Print(std::ostream & os) const;
+     private:
+       void Register();
+       void UnRegister();
+     protected:
+  };
+
+
+  // Extend the itk classtype defined for wrapping to simulate a smart pointer in SWIG.
+  // Also, make the ctor public to make the 'new' operator available in java
+  %extend itkClass {
+    public:
+    itkClass() {
+      typedef ::itk::SmartPointer<itkLightObject> Pointer;
+      Pointer smtPtr = itkClass::New().GetPointer();
+      itkClass *rawPtr = dynamic_cast<itkClass *>(smtPtr.GetPointer());
+      rawPtr->Register();
+      return rawPtr;
+    };
+    ~itkClass() {
+      self->UnRegister();
+    };
+  }
+/*
+  %typemap(out) itkClass * {
+    itkClass* ptrRaw = $1;
+    if (ptrRaw) {
+      ptrRaw->Register();
+    }
+    *(itkClass **)&$result = ptrRaw;
+  }
+*/  
+  %typemap(out) itkClass##_Pointer {
+    itkClass* ptrRaw = $1.GetPointer();
+    if (ptrRaw) {
+      ptrRaw->Register();
+    }
+    *(itkClass **)&$result = ptrRaw;
+  }
+  
+  %typemap(out) itkClass##_Pointer & {
+    itkClass* ptrRaw = (*$1).GetPointer();
+    if (ptrRaw) {
+      ptrRaw->Register();
+    }
+    *(itkClass **)&$result = ptrRaw;
+  }
+
+  // Do not wrap the corresponding itkSmartPointer
+  %ignore itkClass##_Pointer;
+  
+%enddef
+
+%pragma(java) jniclasscode=%{
+  static {
+    System.loadLibrary ( "otbApplicationJava" );
+  }
+%}
+
+
+#endif
diff --git a/Code/Wrappers/SWIG/itkBase.i b/Code/Wrappers/SWIG/itkBase.i
index b6b49ff388..bf1de473a8 100644
--- a/Code/Wrappers/SWIG/itkBase.i
+++ b/Code/Wrappers/SWIG/itkBase.i
@@ -1,3 +1,21 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+
 // kindly stolen from the build files of OTB-Wrapping (Typedefs/itkBase.includes, Typedefs/wrap_ITKCommonBase.i)
 
 %include "RefCountMacro.i"
@@ -5,30 +23,45 @@
 %include <exception.i>
 %include <typemaps.i>
 
-%include <std_iostream.i>
-%include <std_sstream.i>
-%include <std_string.i>
-%include <std_vector.i>
-%include <std_list.i>
-
 
+// Customize exception handling
+%exception {
+  try {
+    $action
+  } catch( itk::ExceptionObject &ex ) {
+    char error_msg[256];
+    sprintf( error_msg, "Exception thrown in SimpleITK $symname: %s", ex.what() );
+    SWIG_exception( SWIG_RuntimeError, error_msg );
+  } catch( ... ) {
+    SWIG_exception( SWIG_UnknownError, "Unknown exception thrown in SimpleITK $symname" );
+  }
+}
+/*
 %exception {
   try {
     $action
   } catch (const std::out_of_range& e) {
-    SWIG_exception_fail(SWIG_IndexError, e.what());
+    SWIG_exception(SWIG_IndexError, e.what());
   } catch( const std::exception &ex ) {
     SWIG_exception( SWIG_RuntimeError, ex.what() );
   } catch (...) {
     SWIG_exception( SWIG_UnknownError, "Unknown exception thrown in otbApplication $symname" );
   }
 }
+*/
+
+// Some code from STL
+// Do not wrap if not necessary as it really slows down compilation
 
+//%include <std_iostream.i>
+//%include <std_sstream.i>
+%include <std_string.i>
+//%include <std_vector.i>
+//%include <std_list.i>
 
-// some code from stl
 
 //%template(vectorstring)   std::vector< std::string >;
-%template(liststring)     std::list< std::string >;
+//%template(liststring)     std::list< std::string >;
 
 //%template(vectorB)        std::vector< bool >;
 //%template(vectorUC)       std::vector< unsigned char >;
@@ -69,15 +102,15 @@
  class itkLightObject {
    public:
      static itkLightObject_Pointer New();
-//     virtual itkLightObject_Pointer CreateAnother() const;
+     virtual itkLightObject_Pointer CreateAnother() const;
      virtual void Delete();
      virtual char const * GetNameOfClass() const;
      void Print(std::ostream & os, itkIndent indent = 0) const;
-//     static void BreakOnError();
-//     virtual void Register() const;
-//     virtual void UnRegister() const;
-//     virtual int GetReferenceCount() const;
-//     virtual void SetReferenceCount(int arg0);
+     static void BreakOnError();
+     virtual void Register() const;
+     virtual void UnRegister() const;
+     virtual int GetReferenceCount() const;
+     virtual void SetReferenceCount(int arg0);
    private:
      itkLightObject(itkLightObject const & arg0);
      void operator=(itkLightObject const & arg0);
@@ -90,34 +123,24 @@
  };
  DECLARE_REF_COUNT_CLASS( itkLightObject )
  
- // add a ToString shortcut to all itkLightObject
- %extend itkLightObject {
-    public:
-    std::string ToString() {
-      std::ostringstream o;
-      self->Print(o);
-      return o.str();
-    }
-  }
- 
  class itkObject : public itkLightObject {
    public:
      static itkObject_Pointer New();
      virtual itkLightObject_Pointer CreateAnother() const;
      virtual char const * GetNameOfClass() const;
-//     virtual void DebugOn() const;
-//     virtual void DebugOff() const;
-//     bool GetDebug() const;
-//     void SetDebug(bool debugFlag) const;
-//     virtual unsigned long GetMTime() const;
-//     virtual void Modified() const;
-//     virtual void Register() const;
-//     virtual void UnRegister() const;
-//     virtual void SetReferenceCount(int arg0);
-//     static void SetGlobalWarningDisplay(bool flag);
-//     static bool GetGlobalWarningDisplay();
-//     static void GlobalWarningDisplayOn();
-//     static void GlobalWarningDisplayOff();
+     virtual void DebugOn() const;
+     virtual void DebugOff() const;
+     bool GetDebug() const;
+     void SetDebug(bool debugFlag) const;
+     virtual unsigned long GetMTime() const;
+     virtual void Modified() const;
+     virtual void Register() const;
+     virtual void UnRegister() const;
+     virtual void SetReferenceCount(int arg0);
+     static void SetGlobalWarningDisplay(bool flag);
+     static bool GetGlobalWarningDisplay();
+     static void GlobalWarningDisplayOn();
+     static void GlobalWarningDisplayOff();
      unsigned long AddObserver(itkEventObject const & event, itkCommand * arg1);
 //     unsigned long AddObserver(itkEventObject const & event, itkCommand * arg1) const;
      itkCommand * GetCommand(unsigned long tag);
@@ -230,199 +253,35 @@
      virtual void PrintTrailer(std::ostream & os, itkIndent indent) const;
  };
 
+%define DECLARE_itkEventObject_CLASS(class_name, superclass_name)
 
- class itkNoEvent : public itkEventObject {
-   public:
-     itkNoEvent();
-     ~itkNoEvent();
-     virtual char const * GetEventName() const;
-     virtual bool CheckEvent(itkEventObject const * e) const;
-     virtual itkEventObject * MakeObject() const;
-     itkNoEvent(itkNoEvent const & s);
-   private:
-     void operator=(itkNoEvent const & arg0);
-   protected:
- };
-
-
- class itkAnyEvent : public itkEventObject {
-   public:
-     itkAnyEvent();
-     ~itkAnyEvent();
-     virtual char const * GetEventName() const;
-     virtual bool CheckEvent(itkEventObject const * e) const;
-     virtual itkEventObject * MakeObject() const;
-     itkAnyEvent(itkAnyEvent const & s);
-   private:
-     void operator=(itkAnyEvent const & arg0);
-   protected:
- };
-
-
- class itkDeleteEvent : public itkAnyEvent {
-   public:
-     itkDeleteEvent();
-     ~itkDeleteEvent();
-     virtual char const * GetEventName() const;
-     virtual bool CheckEvent(itkEventObject const * e) const;
-     virtual itkEventObject * MakeObject() const;
-     itkDeleteEvent(itkDeleteEvent const & s);
-   private:
-     void operator=(itkDeleteEvent const & arg0);
-   protected:
- };
-
-
- class itkEndEvent : public itkAnyEvent {
-   public:
-     itkEndEvent();
-     ~itkEndEvent();
-     virtual char const * GetEventName() const;
-     virtual bool CheckEvent(itkEventObject const * e) const;
-     virtual itkEventObject * MakeObject() const;
-     itkEndEvent(itkEndEvent const & s);
-   private:
-     void operator=(itkEndEvent const & arg0);
-   protected:
- };
-
-
- class itkExitEvent : public itkAnyEvent {
-   public:
-     itkExitEvent();
-     ~itkExitEvent();
-     virtual char const * GetEventName() const;
-     virtual bool CheckEvent(itkEventObject const * e) const;
-     virtual itkEventObject * MakeObject() const;
-     itkExitEvent(itkExitEvent const & s);
-   private:
-     void operator=(itkExitEvent const & arg0);
-   protected:
- };
-
-
- class itkIterationEvent : public itkAnyEvent {
-   public:
-     itkIterationEvent();
-     ~itkIterationEvent();
-     virtual char const * GetEventName() const;
-     virtual bool CheckEvent(itkEventObject const * e) const;
-     virtual itkEventObject * MakeObject() const;
-     itkIterationEvent(itkIterationEvent const & s);
-   private:
-     void operator=(itkIterationEvent const & arg0);
-   protected:
- };
-
-
- class itkModifiedEvent : public itkAnyEvent {
-   public:
-     itkModifiedEvent();
-     ~itkModifiedEvent();
-     virtual char const * GetEventName() const;
-     virtual bool CheckEvent(itkEventObject const * e) const;
-     virtual itkEventObject * MakeObject() const;
-     itkModifiedEvent(itkModifiedEvent const & s);
-   private:
-     void operator=(itkModifiedEvent const & arg0);
-   protected:
- };
-
-
- class itkPickEvent : public itkAnyEvent {
-   public:
-     itkPickEvent();
-     ~itkPickEvent();
-     virtual char const * GetEventName() const;
-     virtual bool CheckEvent(itkEventObject const * e) const;
-     virtual itkEventObject * MakeObject() const;
-     itkPickEvent(itkPickEvent const & s);
-   private:
-     void operator=(itkPickEvent const & arg0);
-   protected:
- };
-
-
- class itkProgressEvent : public itkAnyEvent {
-   public:
-     itkProgressEvent();
-     ~itkProgressEvent();
-     virtual char const * GetEventName() const;
-     virtual bool CheckEvent(itkEventObject const * e) const;
-     virtual itkEventObject * MakeObject() const;
-     itkProgressEvent(itkProgressEvent const & s);
-   private:
-     void operator=(itkProgressEvent const & arg0);
-   protected:
- };
-
-
- class itkStartEvent : public itkAnyEvent {
-   public:
-     itkStartEvent();
-     ~itkStartEvent();
-     virtual char const * GetEventName() const;
-     virtual bool CheckEvent(itkEventObject const * e) const;
-     virtual itkEventObject * MakeObject() const;
-     itkStartEvent(itkStartEvent const & s);
-   private:
-     void operator=(itkStartEvent const & arg0);
-   protected:
- };
-
-
- class itkStartPickEvent : public itkPickEvent {
-   public:
-     itkStartPickEvent();
-     ~itkStartPickEvent();
-     virtual char const * GetEventName() const;
-     virtual bool CheckEvent(itkEventObject const * e) const;
-     virtual itkEventObject * MakeObject() const;
-     itkStartPickEvent(itkStartPickEvent const & s);
-   private:
-     void operator=(itkStartPickEvent const & arg0);
-   protected:
- };
-
-
- class itkUserEvent : public itkAnyEvent {
-   public:
-     itkUserEvent();
-     ~itkUserEvent();
-     virtual char const * GetEventName() const;
-     virtual bool CheckEvent(itkEventObject const * e) const;
-     virtual itkEventObject * MakeObject() const;
-     itkUserEvent(itkUserEvent const & s);
-   private:
-     void operator=(itkUserEvent const & arg0);
-   protected:
- };
-
-
- class itkAbortCheckEvent : public itkPickEvent {
-   public:
-     itkAbortCheckEvent();
-     ~itkAbortCheckEvent();
-     virtual char const * GetEventName() const;
-     virtual bool CheckEvent(itkEventObject const * e) const;
-     virtual itkEventObject * MakeObject() const;
-     itkAbortCheckEvent(itkAbortCheckEvent const & s);
-   private:
-     void operator=(itkAbortCheckEvent const & arg0);
-   protected:
- };
-
-
- class itkEndPickEvent : public itkPickEvent {
+ class class_name : public superclass_name {
    public:
-     itkEndPickEvent();
-     ~itkEndPickEvent();
+     class_name();
+     ~class_name();
      virtual char const * GetEventName() const;
      virtual bool CheckEvent(itkEventObject const * e) const;
      virtual itkEventObject * MakeObject() const;
-     itkEndPickEvent(itkEndPickEvent const & s);
+     class_name(class_name const & s);
    private:
-     void operator=(itkEndPickEvent const & arg0);
+     void operator=(class_name const & arg0);
    protected:
  };
 
+%enddef
+
+DECLARE_itkEventObject_CLASS(itkNoEvent,         itkEventObject)
+DECLARE_itkEventObject_CLASS(itkAnyEvent,        itkEventObject)
+DECLARE_itkEventObject_CLASS(itkDeleteEvent,     itkAnyEvent)
+DECLARE_itkEventObject_CLASS(itkEndEvent,        itkAnyEvent)
+DECLARE_itkEventObject_CLASS(itkExitEvent,       itkAnyEvent)
+DECLARE_itkEventObject_CLASS(itkIterationEvent,  itkAnyEvent)
+DECLARE_itkEventObject_CLASS(itkModifiedEvent,   itkAnyEvent)
+DECLARE_itkEventObject_CLASS(itkPickEvent,       itkAnyEvent)
+DECLARE_itkEventObject_CLASS(itkProgressEvent,   itkAnyEvent)
+DECLARE_itkEventObject_CLASS(itkStartEvent,      itkAnyEvent)
+DECLARE_itkEventObject_CLASS(itkStartPickEvent,  itkPickEvent)
+DECLARE_itkEventObject_CLASS(itkUserEvent,       itkAnyEvent)
+DECLARE_itkEventObject_CLASS(itkAbortCheckEvent, itkPickEvent)
+DECLARE_itkEventObject_CLASS(itkEndPickEvent,    itkPickEvent)
+DECLARE_itkEventObject_CLASS(itkUserEvent,       itkAnyEvent)
diff --git a/Code/Wrappers/SWIG/itkMacro.i b/Code/Wrappers/SWIG/itkMacro.i
index 59c15e159c..3cf1333fdf 100644
--- a/Code/Wrappers/SWIG/itkMacro.i
+++ b/Code/Wrappers/SWIG/itkMacro.i
@@ -1,3 +1,20 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
 
 %define itkSetStringMacro(name)
   void Set##name (const char* _arg);
diff --git a/Code/Wrappers/SWIG/otbApplication.i b/Code/Wrappers/SWIG/otbApplication.i
index a27c423abe..e53e91a6ef 100644
--- a/Code/Wrappers/SWIG/otbApplication.i
+++ b/Code/Wrappers/SWIG/otbApplication.i
@@ -1,17 +1,36 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+
 %module otbApplication
  
+
  %{
 #include "itkBase.includes"
 #include "otbWrapperSWIGIncludes.h"
  %}
 
-
-%include "itkMacro.i"
-%include "itkBase.i"
-
 // Langage specific extension
 %include "Python.i"
+%include "Java.i"
+%include "Ruby.i"
 
+%include "itkMacro.i"
+%include "itkBase.i"
 
 namespace otb
 {
@@ -87,7 +106,6 @@ private:
 
 };
 DECLARE_REF_COUNT_CLASS( Parameter )
-DECLARE_REF_COUNT_CLASS_LANGAGEEXTENSION( Parameter )
 
 class ParameterGroup : public Parameter
 {
diff --git a/Testing/CMakeLists.txt b/Testing/CMakeLists.txt
index 553715f16c..5664f7ef8b 100644
--- a/Testing/CMakeLists.txt
+++ b/Testing/CMakeLists.txt
@@ -1,3 +1,7 @@
+SET(TEMP ${CMAKE_BINARY_DIR}/Testing/Temporary)
+FILE(MAKE_DIRECTORY ${TEMP})
+
 add_subdirectory(Core)
 add_subdirectory(Python)
+add_subdirectory(Java)
 add_subdirectory(QtWidget)
\ No newline at end of file
diff --git a/Testing/Java/CMakeLists.txt b/Testing/Java/CMakeLists.txt
new file mode 100644
index 0000000000..e1f424e9fb
--- /dev/null
+++ b/Testing/Java/CMakeLists.txt
@@ -0,0 +1,20 @@
+include( UseJava )
+
+SET(TEST_DRIVER "${OTB_TEST_DRIVER}"
+    --add-before-env LD_LIBRARY_PATH        "${CMAKE_BINARY_DIR}/Code/Wrappers/SWIG" 
+    --add-before-env ITK_AUTOLOAD_PATH "${CMAKE_BINARY_DIR}/Example"
+)
+
+set( CMAKE_JAVA_INCLUDE_PATH ${OTB-Wrapper_BINARY_DIR}/Code/Wrappers/SWIG/org.otb.application.jar )
+add_jar( JavaSmoothingTest JavaSmoothingTest.java )
+
+
+
+SET(JAVA_COMMAND "${JAVACOMMAND}" -Djava.library.path=${OTB-Wrapper_BINARY_DIR}/Code/Wrappers/SWIG)
+
+
+add_test( NAME jaTvJavaSmoothingTest
+          COMMAND ${TEST_DRIVER} Execute
+          ${JAVA_COMMAND} -cp ${CMAKE_JAVA_INCLUDE_PATH}:JavaSmoothingTest.jar SmoothingTest
+          ${OTB_DATA_ROOT}/Input/ToulouseExtract_WithGeom.tif
+          ${TEMP}/ToulouseExtract_WithGeom_ )
diff --git a/Testing/Java/JavaSmoothingTest.java b/Testing/Java/JavaSmoothingTest.java
new file mode 100644
index 0000000000..5d21ce9089
--- /dev/null
+++ b/Testing/Java/JavaSmoothingTest.java
@@ -0,0 +1,16 @@
+/*
+ * Example on the use of the Smoothing 
+ */
+ 
+import org.otb.application.*;
+
+
+class SmoothingTest {
+
+  public static void main( String argv[] ) {
+
+    System.out.println( "Available applications : " + Registry.GetAvailableApplications() );
+
+  }
+
+}
\ No newline at end of file
-- 
GitLab