# The purpose of this CMakeLists.txt is to compile all listed JAVA examples
# during build time (ensuring that ALL examples compile against their
# dependency JAVA packages).

find_package(Java REQUIRED)
include(UseJava)

# Add a JAVA example target for the provided JAVA source file which depends
# on UPM JAVA targets.
#
# Usage:
#   add_example(example_class_name upm_target_dependency_list)
#
# Parameters:
#   example_class_name: JAVA class name.  This name MUST match the JAVA
#                       example file name.
#                       <example_class_name>.java
#   upm_target_dependency_list: One or more UPM library targets.  This
#                       function assumes a javaupm_<target> also exists.
#
# Examples:
#   # Creates SensorFooExample JAVA target, depends on target: sensorfoo,
#   # and will add upm_sensorfoo.jar to the javac classpath.
#   add_example(SensorFooExample sensorfoo)
#
#   # Creates SensorFooExample JAVA target, depends on targets: sensorfoo,
#   # and interfaces and will add both upm_sensorfoo.jar and upm_interfaces.jar
#   # to the javac classpath.
#   add_example(SensorFooExample "sensorfoo;interfaces"")
#
function(add_example example_class_name dependency_list)
    set(example_file "${example_class_name}.java")

    # Build a list of all dependency jar files
    set(jar_file_list "")

    # Build a list of all dependency java target names
    set(java_targets_list "")

    # Iterate over the dependencies
    foreach(dependency ${dependency_list})
        set(java_target "javaupm_${dependency}")

        # Append to the targets list
        list(APPEND java_targets_list ${java_target})

        # If a dependency target does NOT exist, print a warning and skip
        if (NOT TARGET ${java_target})
            message(STATUS "Example ${example_file} is missing a required CMake target (${java_target}), skipping...")
            return()
        endif()

        # Get the jar for this java_target (saved as a property)
        get_target_property(jar_file ${java_target} JAR_FILE_ABSOLUTE)

        # Append to the jar list
        list(APPEND jar_file_list ${jar_file})
    endforeach()

    # Add the jar/s
    add_jar(${example_class_name} SOURCES ${example_file} INCLUDE_JARS ${jar_file_list})

    # Add a dependency from this jar to all dependency java targets
    add_dependencies(${example_class_name} ${java_targets_list})
endfunction()

add_example(A110X_Example "a110x;new_interfaces")
add_example(A110X_intr_Example "a110x;new_interfaces")
add_example(Ad8232_Example ad8232)
add_example(ADC121C021_Example adc121c021)
add_example(Ads1015_Example "ads1x15;interfaces")
add_example(Ads1115_Example ads1x15)
add_example(Adxl345_Example adxl345)
add_example(AM2315_Example "am2315;new_interfaces")
add_example(APA102_Example apa102)
add_example(Apds9002_Example "apds9002;new_interfaces")
add_example(BH1750_Example "bh1750;new_interfaces")
add_example(BISS0001_Example "biss0001;new_interfaces")
add_example(BMA250E_Example bma250e)
add_example(BMC150_Example bmx055)
add_example(BME280_Example "bmp280;new_interfaces")
add_example(BMG160_Example bmg160)
add_example(BMI055_Example bmx055)
add_example(BMI160_Example bmi160)
add_example(BMM150_Example bmm150)
add_example(BMP280_Example "bmp280;new_interfaces")
add_example(BMPX8X_Example "bmpx8x;new_interfaces")
add_example(BMX055_Example bmx055)
add_example(BNO055_Example bno055)
add_example(Button_Example button)
add_example(Button_intr_Example button)
add_example(Buzzer_Example buzzer)
add_example(CJQ4435_Example cjq4435)
add_example(Collision_Example "collision;new_interfaces")
add_example(CWLSXXA_Example cwlsxxa)
add_example(DFREC_Example dfrec)
add_example(DFRORP_Example dfrorp)
add_example(DS1307_Example ds1307)
add_example(ECEZO_Example ecezo)
add_example(ECS1030_Example ecs1030)
add_example(EHR_Example "ehr;;new_interfaces")
add_example(Emg_Example emg)
add_example(ENC03R_Example enc03r)
add_example(ES08A_Example "servo;interfaces")
add_example(FlexSensor_Example flex)
add_example(Gp2y0a_Example gp2y0a)
add_example(GroveButton_Example grove)
add_example(GroveButton_intr_Example grove)
add_example(GroveEHR_Example "groveehr;new_interfaces")
add_example(GroveEmg_Example groveemg)
add_example(GroveGsr_Example grovegsr)
add_example(GroveLEDBar_Example my9221)
add_example(GroveLED_Example grove)
add_example(GroveLed_multi_Example grove)
add_example(GroveLight_Example "grove;new_interfaces")
add_example(GroveLineFinder_Example grovelinefinder)
add_example(GroveMD_Example grovemd)
add_example(GroveMoisture_Example "grovemoisture;new_interfaces")
add_example(GroveMQ3_Example gas)
add_example(GroveMQ9_Example gas)
add_example(GroveO2_Example groveo2)
add_example(GroveQTouch_Example at42qt1070)
add_example(GroveRelay_Example grove)
add_example(GroveRotary_Example grove)
add_example(GROVESCAM_Example grovescam)
add_example(GroveSlide_Example grove)
add_example(GroveSpeaker_Example grovespeaker)
add_example(GroveTemp_Example "grove;new_interfaces")
add_example(GroveVDiv_Example grovevdiv)
add_example(GroveWater_Example grovewater)
add_example(GroveWFS_Example grovewfs)
add_example(Gsr_Example gsr)
add_example(GUVAS12D_Example guvas12d)
add_example(H3LIS331DL_Example h3lis331dl)
add_example(HCSR04_Example "hcsr04;new_interfaces")
add_example(HKA5_Example hka5)
add_example(HM11_Example hm11)
add_example(Hmc5883l_Example hmc5883l)
add_example(HMTRP_Example hmtrp)
add_example(HP20x_Example "hp20x;new_interfaces")
add_example(HTU21D_Example "htu21d;new_interfaces")
add_example(Itg3200_Example itg3200)
add_example(Jhd1313m1_Example jhd1313m1)
add_example(Jhd1313m1_lcd_Example jhd1313m1)
add_example(Joystick12_Example joystick12)
add_example(KX122_Example kx122)
add_example(KXTJ3_Example kxtj3)
add_example(Lcm1602_i2c_Example lcm1602)
add_example(Lcm1602_parallel_Example lcm1602)
add_example(LDT0028_Example ldt0028)
add_example(LE910_Example uartat)
add_example(LED_Example led)
add_example(Light_Example "light;new_interfaces")
add_example(LineFinder_Example linefinder)
add_example(LIS2DS12_Example lis2ds12)
add_example(LoL_Example lol)
add_example(LSM303AGR_Example lsm303agr)
add_example(LSM303D_Example lsm303d)
add_example(LSM303DLH_Example lsm303dlh)
add_example(LSM6DS3H_Example lsm6ds3h)
add_example(LSM6DSL_Example lsm6dsl)
add_example(M24LR64E_Example m24lr64e)
add_example(MAX30100_Example max30100)
add_example(MAX31855_Example max31855)
add_example(MAX44000_Example max44000)
add_example(MAX5487_Example max5487)
add_example(MAXds3231m_Example maxds3231m)
add_example(MB704X_Example "mb704x;new_interfaces")
add_example(MCP2515_Example mcp2515)
add_example(MCP2515_TXRX_Example mcp2515)
add_example(MD_Example md)
add_example(MHZ16_Example mhz16)
add_example(Microphone_Example mic)
add_example(MMA7361_Example mma7361)
add_example(MMA7455_Example mma7455)
add_example(MMA7660_Example mma7660)
add_example(Moisture_Example "moisture;new_interfaces")
add_example(MPL3115A2_Example "mpl3115a2;new_interfaces")
add_example(MPR121_Example mpr121)
add_example(MPU9150_Example mpu9150)
add_example(MQ2_Example gas)
add_example(MQ303A_Example mq303a)
add_example(MQ5_Example gas)
add_example(MS5803_Example "ms5803;new_interfaces")
add_example(NMEAGPS_Example nmea_gps)
add_example(NMEAGPS_I2C_Example nmea_gps)
add_example(NRF24L01_receiver_Example nrf24l01)
add_example(NRF24L01_transmitter_Example nrf24l01)
add_example(NUNCHUCK_Example nunchuck)
add_example(O2_Example o2)
add_example(OTP538U_Example otp538u)
add_example(P9813_Example p9813)
add_example(PPD42NS_Example ppd42ns)
add_example(Pulsensor_Example pulsensor)
add_example(Relay_Example relay)
add_example(RFR359F_Example "rfr359f;new_interfaces")
add_example(RN2903_Example rn2903)
add_example(RN2903_P2P_RX_Example rn2903)
add_example(RN2903_P2P_TX_Example rn2903)
add_example(RotaryEncoder_Example rotaryencoder)
add_example(Rotary_Example rotary)
add_example(RPR220_Example rpr220)
add_example(RPR220_intr_Example rpr220)
add_example(SCAM_Example scam)
add_example(SensorTemplate_Example sensortemplate)
add_example(SHT1X_Example "sht1x;new_interfaces")
add_example(Slide_Example slide)
add_example(SM130_Example sm130)
add_example(Speaker_Example speaker)
add_example(SpeakerPWM_Example speaker)
add_example(SSD1308_oled_Example lcd)
add_example(SSD1327_oled_Example lcd)
add_example(ST7735_Example st7735)
add_example(TEAMS_Example teams)
add_example(Temperature_Example temperature)
add_example(TEX00_Example tex00)
add_example(Th02_Example "th02;new_interfaces")
add_example(TM1637_Example tm1637)
add_example(TP401_Example gas)
add_example(TSL2561_Example "tsl2561;new_interfaces")
add_example(TTP223_Example ttp223)
add_example(ULN200XA_Example uln200xa)
add_example(VDiv_Example vdiv)
add_example(VEML6070_Example veml6070)
add_example(Water_Example water)
add_example(WaterLevelSensor_Example waterlevel)
add_example(WFS_Example wfs)
add_example(WT5001_Example wt5001)
add_example(YG1006_Example yg1006)
add_example(ZFM20_Example zfm20)

if(SWIG_VERSION VERSION_GREATER 3.0.8)
    add_example(BME280_Interface_Example "bmp280;new_interfaces")
    add_example(IMS_Example "ims;new_interfaces")
    add_example(RHUSB_Example "rhusb;new_interfaces")
endif()

if (OPENZWAVE_FOUND)
    add_example(AeotecDSB09104_Example ozw)
    add_example(AeotecDW2E_Example ozw)
    add_example(AeotecSDG2_Example ozw)
    add_example(AeotecSS6_Example ozw)
    add_example(TZEMT400_Example ozw)
endif()

if (MODBUS_FOUND)
    add_example(H803X_Example h803x)
endif()

if (BACNET_FOUND)
    add_example(E50HX_Example e50hx)
    add_example(T8100_Example t8100)
    add_example(TB7300_Example tb7300)
endif()

if (JPEG_FOUND)
    add_example(VCAP_Example vcap)
endif()

if (NOT ANDROID)
    add_example(StepMotor_Example stepmotor)
endif ()
