From 2b0f49d3ba60b4a720405b754e15930247626d0e Mon Sep 17 00:00:00 2001 From: Vishal Karnik Date: Mon, 18 May 2020 19:28:27 +0530 Subject: [PATCH 01/14] Schema and specification for Garmin devices. --- .../garmin/garmin_generic_accelerometer.avsc | 43 +++++++++ .../passive/garmin/garmin_generic_ascent.avsc | 48 ++++++++++ .../garmin/garmin_generic_calories.avsc | 28 ++++++ .../garmin/garmin_generic_heartrate.avsc | 43 +++++++++ .../garmin_generic_heartratevariability.avsc | 23 +++++ .../garmin/garmin_generic_intensity.avsc | 43 +++++++++ .../garmin/garmin_generic_respiration.avsc | 23 +++++ .../passive/garmin/garmin_generic_spo2.avsc | 23 +++++ .../passive/garmin/garmin_generic_steps.avsc | 28 ++++++ .../passive/garmin/garmin_generic_stress.avsc | 23 +++++ .../passive/garmin_generic-1.0.0.yml | 87 +++++++++++++++++++ 11 files changed, 412 insertions(+) create mode 100644 commons/passive/garmin/garmin_generic_accelerometer.avsc create mode 100644 commons/passive/garmin/garmin_generic_ascent.avsc create mode 100644 commons/passive/garmin/garmin_generic_calories.avsc create mode 100644 commons/passive/garmin/garmin_generic_heartrate.avsc create mode 100644 commons/passive/garmin/garmin_generic_heartratevariability.avsc create mode 100644 commons/passive/garmin/garmin_generic_intensity.avsc create mode 100644 commons/passive/garmin/garmin_generic_respiration.avsc create mode 100644 commons/passive/garmin/garmin_generic_spo2.avsc create mode 100644 commons/passive/garmin/garmin_generic_steps.avsc create mode 100644 commons/passive/garmin/garmin_generic_stress.avsc create mode 100644 specifications/passive/garmin_generic-1.0.0.yml diff --git a/commons/passive/garmin/garmin_generic_accelerometer.avsc b/commons/passive/garmin/garmin_generic_accelerometer.avsc new file mode 100644 index 00000000..fbefc062 --- /dev/null +++ b/commons/passive/garmin/garmin_generic_accelerometer.avsc @@ -0,0 +1,43 @@ +{ + "namespace":"org.radarcns.passive.garmin", + "type":"record", + "name":"GarminGenericAccelerometer", + "doc":"Data from accelerometer sensor.", + "fields":[ + { + "name":"time", + "type":"double", + "doc":"Device timestamp in UTC (s)." + }, + { + "name":"timestamp13", + "type":"double", + "doc":"Device timestamp13 in UTC (s)." + }, + { + "name":"timeReceived", + "type":"double", + "doc":"Device receiver timestamp in UTC (s)." + }, + { + "name":"x", + "type":"float", + "doc":"Acceleration in the x-axis (g)." + }, + { + "name":"y", + "type":"float", + "doc":"Acceleration in the y-axis (g)." + }, + { + "name":"z", + "type":"float", + "doc":"Acceleration in the z-axis (g)." + }, + { + "name":"actualSamplingRate", + "type" : "int", + "doc":"Actual sampling rate." + } + ] +} diff --git a/commons/passive/garmin/garmin_generic_ascent.avsc b/commons/passive/garmin/garmin_generic_ascent.avsc new file mode 100644 index 00000000..f2e57b10 --- /dev/null +++ b/commons/passive/garmin/garmin_generic_ascent.avsc @@ -0,0 +1,48 @@ +{ + "name":"GarminGenericAscent", + "type":"record", + "namespace":"org.radarcns.passive.garmin", + "doc":"Provides the real time Ascent data i.e Floor related data..", + "fields":[ + { + "name":"currentFloorsClimbed", + "type":"int", + "doc":"Current floors climbed." + }, + { + "name":"currentFloorsDescended", + "type":"int", + "doc":"Current floors descended." + }, + { + "name":"currentMetersClimbed", + "type":"int", + "doc":"Current meters climbed." + }, + { + "name":"currentMetersDescended", + "type":"int", + "doc":"Current meters descended." + }, + { + "name":"floorsClimbedGoal", + "type":"int", + "doc":"Floors climbed goal." + }, + { + "name":"metersClimbedGoal", + "type":"int", + "doc":"Meters climbed goal." + }, + { + "name":"time", + "type":"double", + "doc":"Last updated time." + }, + { + "name":"timeReceived", + "type":"double", + "doc":"Device receiver timestamp in UTC (s)." + } + ] +} diff --git a/commons/passive/garmin/garmin_generic_calories.avsc b/commons/passive/garmin/garmin_generic_calories.avsc new file mode 100644 index 00000000..573bba2c --- /dev/null +++ b/commons/passive/garmin/garmin_generic_calories.avsc @@ -0,0 +1,28 @@ +{ + "name":"GarminGenericCalories", + "type":"record", + "namespace":"org.radarcns.passive.garmin", + "doc":"Gives the information about the calories consumed.", + "fields":[ + { + "name":"currentActiveCalories", + "type":"int", + "doc":"Current active calories." + }, + { + "name":"currentTotalCalories", + "type":"int", + "doc":"Current total calories." + }, + { + "name":"time", + "type":"double", + "doc":"Last updated time." + }, + { + "name":"timeReceived", + "type":"double", + "doc":"Device receiver timestamp in UTC (s)." + } + ] +} diff --git a/commons/passive/garmin/garmin_generic_heartrate.avsc b/commons/passive/garmin/garmin_generic_heartrate.avsc new file mode 100644 index 00000000..b5cac713 --- /dev/null +++ b/commons/passive/garmin/garmin_generic_heartrate.avsc @@ -0,0 +1,43 @@ +{ + "name":"GarminGenericHeartRate", + "type":"record", + "namespace":"org.radarcns.passive.garmin", + "doc":"Provides the data about real time Heart rate data.", + "fields":[ + { + "name":"currentHeartRate", + "type":"int", + "doc":"Current heart rate." + }, + { + "name":"currentRestingHeartRate", + "type":"int", + "doc":"Current resting heart rate." + }, + { + "name":"dailyHighHeartRate", + "type":"int", + "doc":"Daily high heart rate." + }, + { + "name":"dailyLowHeartRate", + "type":"int", + "doc":"Daily low heart rate." + }, + { + "name":"heartRateSource", + "type":"string", + "doc":"Heart rate source." + }, + { + "name":"time", + "type":"double", + "doc":"Last updated time." + }, + { + "name":"timeReceived", + "type":"double", + "doc":"Device receiver timestamp in UTC (s)." + } + ] +} diff --git a/commons/passive/garmin/garmin_generic_heartratevariability.avsc b/commons/passive/garmin/garmin_generic_heartratevariability.avsc new file mode 100644 index 00000000..38ecd5cc --- /dev/null +++ b/commons/passive/garmin/garmin_generic_heartratevariability.avsc @@ -0,0 +1,23 @@ +{ + "name":"GarminGenericHeartRateVariability", + "type":"record", + "namespace":"org.radarcns.passive.garmin", + "doc":"Provides the variation in the time interval between consecutive heartbeats in milliseconds.", + "fields":[ + { + "name":"heartRateVariability", + "type":"int", + "doc":"Heart rate variability received from Garmin device." + }, + { + "name":"time", + "type":"double", + "doc":"Last updated time." + }, + { + "name":"timeReceived", + "type":"double", + "doc":"Device receiver timestamp in UTC (s)." + } + ] +} diff --git a/commons/passive/garmin/garmin_generic_intensity.avsc b/commons/passive/garmin/garmin_generic_intensity.avsc new file mode 100644 index 00000000..1cbd3135 --- /dev/null +++ b/commons/passive/garmin/garmin_generic_intensity.avsc @@ -0,0 +1,43 @@ +{ + "name":"GarminGenericIntensity", + "type":"record", + "namespace":"org.radarcns.passive.garmin", + "doc":"Data from Garmin device.", + "fields":[ + { + "name":"currentHeartRate", + "type":"int", + "doc":"Current heart rate." + }, + { + "name":"currentRestingHeartRate", + "type":"int", + "doc":"Current resting heart rate." + }, + { + "name":"dailyHighHeartRate", + "type":"int", + "doc":"Daily high heart rate." + }, + { + "name":"dailyLowHeartRate", + "type":"int", + "doc":"Daily low heart rate." + }, + { + "name":"heartRateSource", + "type":"string", + "doc":"Heart rate source." + }, + { + "name":"time", + "type":"double", + "doc":"Last updated time." + }, + { + "name":"timeReceived", + "type":"double", + "doc":"Device receiver timestamp in UTC (s)." + } + ] +} diff --git a/commons/passive/garmin/garmin_generic_respiration.avsc b/commons/passive/garmin/garmin_generic_respiration.avsc new file mode 100644 index 00000000..ebdb149d --- /dev/null +++ b/commons/passive/garmin/garmin_generic_respiration.avsc @@ -0,0 +1,23 @@ +{ + "name":"GarminGenericRespiration", + "type":"record", + "namespace":"org.radarcns.passive.garmin", + "doc":"Provides the data about real time Respiration data.", + "fields":[ + { + "name":"respirationRate", + "type":"int", + "doc":"Respiration rate." + }, + { + "name":"time", + "type":"double", + "doc":"Last updated time." + }, + { + "name":"timeReceived", + "type":"double", + "doc":"Device receiver timestamp in UTC (s)." + } + ] +} diff --git a/commons/passive/garmin/garmin_generic_spo2.avsc b/commons/passive/garmin/garmin_generic_spo2.avsc new file mode 100644 index 00000000..ae15e2bb --- /dev/null +++ b/commons/passive/garmin/garmin_generic_spo2.avsc @@ -0,0 +1,23 @@ +{ + "name":"GarminGenericSpo2", + "type":"record", + "namespace":"org.radarcns.passive.garmin", + "doc":"Provides the real time Spo2 data.", + "fields":[ + { + "name":"spo2Reading", + "type":"int", + "doc":"SPO2 reading." + }, + { + "name":"time", + "type":"double", + "doc":"Last updated time." + }, + { + "name":"timeReceived", + "type":"double", + "doc":"Device receiver timestamp in UTC (s)." + } + ] +} diff --git a/commons/passive/garmin/garmin_generic_steps.avsc b/commons/passive/garmin/garmin_generic_steps.avsc new file mode 100644 index 00000000..770bf6fe --- /dev/null +++ b/commons/passive/garmin/garmin_generic_steps.avsc @@ -0,0 +1,28 @@ +{ + "name":"GarminGenericSteps", + "type":"record", + "namespace":"org.radarcns.passive.garmin", + "doc":"Steps provides the data about real time steps.", + "fields":[ + { + "name":"currentStepCount", + "type":"int", + "doc":"Current step count." + }, + { + "name":"currentStepGoal", + "type":"int", + "doc":"Current step goal." + }, + { + "name":"time", + "type":"double", + "doc":"Last updated time." + }, + { + "name":"timeReceived", + "type":"double", + "doc":"Device receiver timestamp in UTC (s)." + } + ] +} diff --git a/commons/passive/garmin/garmin_generic_stress.avsc b/commons/passive/garmin/garmin_generic_stress.avsc new file mode 100644 index 00000000..e46b78fc --- /dev/null +++ b/commons/passive/garmin/garmin_generic_stress.avsc @@ -0,0 +1,23 @@ +{ + "name":"GarminGenericStress", + "type":"record", + "namespace":"org.radarcns.passive.garmin", + "doc":"Provides the data about real time Stress data.", + "fields":[ + { + "name":"stressScore", + "type":"int", + "doc":"Stress score." + }, + { + "name":"time", + "type":"double", + "doc":"Last updated time." + }, + { + "name":"timeReceived", + "type":"double", + "doc":"Device receiver timestamp in UTC (s)." + } + ] +} diff --git a/specifications/passive/garmin_generic-1.0.0.yml b/specifications/passive/garmin_generic-1.0.0.yml new file mode 100644 index 00000000..822b7204 --- /dev/null +++ b/specifications/passive/garmin_generic-1.0.0.yml @@ -0,0 +1,87 @@ +#====================================== Garmin all device =====================================# + +vendor: Garmin +model: Generic +version: 1.0.0 +app_provider: .garmin.GenericServiceProvider +data: + - + type: STEPS + sample_rate: + dynamic: true + unit: NON_DIMENSIONAL + processing_state: VENDOR + topic: android_garmin_generic_steps + value_schema: .passive.garmin.GarminGenericSteps + - + type: HEART_RATE_VARIABILITY + sample_rate: + dynamic: true + unit: SECOND + processing_state: VENDOR + topic: android_garmin_generic_heart_rate_variability + value_schema: .passive.garmin.GarminGenericHeartRateVariability + - + type: STRESS + sample_rate: + dynamic: true + unit: NON_DIMENSIONAL + processing_state: VENDOR + topic: android_garmin_generic_stress + value_schema: .passive.garmin.GarminGenericStress + - + type: ASCENT + sample_rate: + dynamic: true + unit: NON_DIMENSIONAL + processing_state: VENDOR + topic: android_garmin_generic_ascent + value_schema: .passive.garmin.GarminGenericAscent + - + type: SPO2 + sample_rate: + dynamic: true + unit: NON_DIMENSIONAL + processing_state: VENDOR + topic: android_garmin_generic_spo2 + value_schema: .passive.garmin.GarminGenericSpo2 + - + type: RESPIRATION + sample_rate: + dynamic: true + unit: NON_DIMENSIONAL + processing_state: VENDOR + topic: android_garmin_generic_respiration + value_schema: .passive.garmin.GarminGenericRespiration + - + type: HEART_RATE + sample_rate: + dynamic: true + unit: NON_DIMENSIONAL + processing_state: VENDOR + topic: android_garmin_generic_heart_rate + value_schema: .passive.garmin.GarminGenericHeartRate + - + type: INTENSITY + sample_rate: + dynamic: true + unit: NON_DIMENSIONAL + processing_state: VENDOR + topic: android_garmin_generic_intensity + value_schema: .passive.garmin.GarminGenericIntensity + - + type: CALORIES + sample_rate: + dynamic: true + unit: NON_DIMENSIONAL + processing_state: VENDOR + topic: android_garmin_generic_calories + value_schema: .passive.garmin.GarminGenericCalories + - + type: ACCELEROMETER + sample_rate: + dynamic: true + unit: NON_DIMENSIONAL + processing_state: VENDOR + topic: android_garmin_felix6_accelerometer + value_schema: .passive.garmin.GarminGenericAccelerometer From 2de6625264a7f31e79b02cb473c3355501d433ed Mon Sep 17 00:00:00 2001 From: Vishal Karnik Date: Thu, 21 May 2020 14:50:08 +0530 Subject: [PATCH 02/14] Updated as per comments received from Joris and Yatharth on PR https://github.com/RADAR-base/RADAR-Schemas/pull/218 --- .../garmin/garmin_generic_accelerometer.avsc | 19 ++++---- .../passive/garmin/garmin_generic_ascent.avsc | 41 ++++++++--------- .../garmin/garmin_generic_calories.avsc | 22 +++++----- .../garmin/garmin_generic_heartrate.avsc | 33 +++++++------- .../garmin_generic_heartratevariability.avsc | 27 +++++++----- .../garmin/garmin_generic_intensity.avsc | 44 +++++++++---------- .../garmin/garmin_generic_respiration.avsc | 23 +++++----- .../passive/garmin/garmin_generic_spo2.avsc | 26 +++++------ .../passive/garmin/garmin_generic_steps.avsc | 31 ++++++------- .../passive/garmin/garmin_generic_stress.avsc | 23 +++++----- .../passive/garmin_generic-1.0.0.yml | 1 + 11 files changed, 153 insertions(+), 137 deletions(-) diff --git a/commons/passive/garmin/garmin_generic_accelerometer.avsc b/commons/passive/garmin/garmin_generic_accelerometer.avsc index fbefc062..120663db 100644 --- a/commons/passive/garmin/garmin_generic_accelerometer.avsc +++ b/commons/passive/garmin/garmin_generic_accelerometer.avsc @@ -5,20 +5,23 @@ "doc":"Data from accelerometer sensor.", "fields":[ { + "name":"time", "type":"double", "doc":"Device timestamp in UTC (s)." }, + { + + "name":"timeReceived", + "type":"double", + "doc":"Device receiver timestamp in UTC (s)." + }, { "name":"timestamp13", "type":"double", - "doc":"Device timestamp13 in UTC (s)." - }, - { - "name":"timeReceived", - "type":"double", - "doc":"Device receiver timestamp in UTC (s)." + "doc":"A timestamp13 value which is a 13 bit local time, the time when this sample was gathered from the Garmin device (useful for calculating jitter in the streaming data)." }, + { "name":"x", "type":"float", @@ -35,9 +38,9 @@ "doc":"Acceleration in the z-axis (g)." }, { - "name":"actualSamplingRate", + "name":"samplingRate", "type" : "int", - "doc":"Actual sampling rate." + "doc": "Sampling rate." } ] } diff --git a/commons/passive/garmin/garmin_generic_ascent.avsc b/commons/passive/garmin/garmin_generic_ascent.avsc index f2e57b10..412ae9c5 100644 --- a/commons/passive/garmin/garmin_generic_ascent.avsc +++ b/commons/passive/garmin/garmin_generic_ascent.avsc @@ -2,27 +2,37 @@ "name":"GarminGenericAscent", "type":"record", "namespace":"org.radarcns.passive.garmin", - "doc":"Provides the real time Ascent data i.e Floor related data..", + "doc":"Provides the real time Ascent data i.e Floor related data.", "fields":[ - { - "name":"currentFloorsClimbed", + { + "name":"time", + "type":"double", + "doc":"Last updated time." + }, + { + "name":"timeReceived", + "type":"double", + "doc":"Device receiver timestamp in UTC (s)." + }, + { + "name":"floorsClimbed", "type":"int", - "doc":"Current floors climbed." + "doc":"Number of floors climbed since midnight as computed by Garmin." }, { - "name":"currentFloorsDescended", + "name":"floorsDescended", "type":"int", - "doc":"Current floors descended." + "doc":"Number of floors descended since midnight as computed by Garmin." }, { - "name":"currentMetersClimbed", + "name":"metersClimbed", "type":"int", - "doc":"Current meters climbed." + "doc":"Total number of distance climbed in meters since midnight as computed by Garmin." }, { - "name":"currentMetersDescended", + "name":"metersDescended", "type":"int", - "doc":"Current meters descended." + "doc":"Total number of distance descended in meters since midnight as computed by Garmin." }, { "name":"floorsClimbedGoal", @@ -33,16 +43,7 @@ "name":"metersClimbedGoal", "type":"int", "doc":"Meters climbed goal." - }, - { - "name":"time", - "type":"double", - "doc":"Last updated time." - }, - { - "name":"timeReceived", - "type":"double", - "doc":"Device receiver timestamp in UTC (s)." } + ] } diff --git a/commons/passive/garmin/garmin_generic_calories.avsc b/commons/passive/garmin/garmin_generic_calories.avsc index 573bba2c..512b0b0b 100644 --- a/commons/passive/garmin/garmin_generic_calories.avsc +++ b/commons/passive/garmin/garmin_generic_calories.avsc @@ -4,6 +4,17 @@ "namespace":"org.radarcns.passive.garmin", "doc":"Gives the information about the calories consumed.", "fields":[ + + { + "name":"time", + "type":"double", + "doc":"Last updated time." + }, + { + "name":"timeReceived", + "type":"double", + "doc":"Device receiver timestamp in UTC (s)." + }, { "name":"currentActiveCalories", "type":"int", @@ -13,16 +24,7 @@ "name":"currentTotalCalories", "type":"int", "doc":"Current total calories." - }, - { - "name":"time", - "type":"double", - "doc":"Last updated time." - }, - { - "name":"timeReceived", - "type":"double", - "doc":"Device receiver timestamp in UTC (s)." } + ] } diff --git a/commons/passive/garmin/garmin_generic_heartrate.avsc b/commons/passive/garmin/garmin_generic_heartrate.avsc index b5cac713..cb1386ac 100644 --- a/commons/passive/garmin/garmin_generic_heartrate.avsc +++ b/commons/passive/garmin/garmin_generic_heartrate.avsc @@ -4,40 +4,43 @@ "namespace":"org.radarcns.passive.garmin", "doc":"Provides the data about real time Heart rate data.", "fields":[ + + { + "name":"time", + "type":"double", + "doc":"Last updated time." + }, + { + "name":"timeReceived", + "type":"double", + "doc":"Device receiver timestamp in UTC (s)." + }, + { "name":"currentHeartRate", "type":"int", - "doc":"Current heart rate." + "doc":"Current heart rate (bpm)." }, { "name":"currentRestingHeartRate", "type":"int", - "doc":"Current resting heart rate." + "doc":"Current resting heart rate (bpm)." }, { "name":"dailyHighHeartRate", "type":"int", - "doc":"Daily high heart rate." + "doc":"Daily high heart rate (bpm)." }, { "name":"dailyLowHeartRate", "type":"int", - "doc":"Daily low heart rate." + "doc":"Daily low heart rate (bpm)." }, { "name":"heartRateSource", "type":"string", - "doc":"Heart rate source." - }, - { - "name":"time", - "type":"double", - "doc":"Last updated time." - }, - { - "name":"timeReceived", - "type":"double", - "doc":"Device receiver timestamp in UTC (s)." + "doc":"Heart rate source. Possible values are NO_SOURCE, HR_STRAP, OHR_NO_LOCK, OHR_LOCKED." } + ] } diff --git a/commons/passive/garmin/garmin_generic_heartratevariability.avsc b/commons/passive/garmin/garmin_generic_heartratevariability.avsc index 38ecd5cc..9e3d2824 100644 --- a/commons/passive/garmin/garmin_generic_heartratevariability.avsc +++ b/commons/passive/garmin/garmin_generic_heartratevariability.avsc @@ -2,22 +2,25 @@ "name":"GarminGenericHeartRateVariability", "type":"record", "namespace":"org.radarcns.passive.garmin", - "doc":"Provides the variation in the time interval between consecutive heartbeats in milliseconds.", + "doc":"Provides the variation in the time interval between consecutive heartbeats.", "fields":[ + + + { + "name":"time", + "type":"double", + "doc":"Last updated time." + }, + { + "name":"timeReceived", + "type":"double", + "doc":"Device receiver timestamp in UTC (s)." + }, { "name":"heartRateVariability", "type":"int", - "doc":"Heart rate variability received from Garmin device." - }, - { - "name":"time", - "type":"double", - "doc":"Last updated time." - }, - { - "name":"timeReceived", - "type":"double", - "doc":"Device receiver timestamp in UTC (s)." + "doc":"Heart rate variability received from Garmin device in milliseconds." } + ] } diff --git a/commons/passive/garmin/garmin_generic_intensity.avsc b/commons/passive/garmin/garmin_generic_intensity.avsc index 1cbd3135..c9af61ed 100644 --- a/commons/passive/garmin/garmin_generic_intensity.avsc +++ b/commons/passive/garmin/garmin_generic_intensity.avsc @@ -2,42 +2,42 @@ "name":"GarminGenericIntensity", "type":"record", "namespace":"org.radarcns.passive.garmin", - "doc":"Data from Garmin device.", + "doc":"Intensity data from Garmin device.", "fields":[ + { + "name":"time", + "type":"double", + "doc":"Last updated time." + }, + { + "name":"timeReceived", + "type":"double", + "doc":"Device receiver timestamp in UTC (s)." + }, { - "name":"currentHeartRate", + "name":"totalDailyMinutes", "type":"int", - "doc":"Current heart rate." + "doc":"Total Daily Minutes." }, { - "name":"currentRestingHeartRate", + "name":"dailyModerateMinutes", "type":"int", - "doc":"Current resting heart rate." + "doc":"Daily Moderate Minutes." }, { - "name":"dailyHighHeartRate", + "name":"dailyVigorousMinutes", "type":"int", - "doc":"Daily high heart rate." + "doc":"Daily Vigorous Minutes." }, { - "name":"dailyLowHeartRate", + "name":"totalWeeklyMinutes", "type":"int", - "doc":"Daily low heart rate." + "doc":"Total Weekly Minutes." }, { - "name":"heartRateSource", - "type":"string", - "doc":"Heart rate source." - }, - { - "name":"time", - "type":"double", - "doc":"Last updated time." - }, - { - "name":"timeReceived", - "type":"double", - "doc":"Device receiver timestamp in UTC (s)." + "name":"weeklyGoal", + "type":"int", + "doc":"Weekly Goal." } ] } diff --git a/commons/passive/garmin/garmin_generic_respiration.avsc b/commons/passive/garmin/garmin_generic_respiration.avsc index ebdb149d..d546d777 100644 --- a/commons/passive/garmin/garmin_generic_respiration.avsc +++ b/commons/passive/garmin/garmin_generic_respiration.avsc @@ -4,20 +4,21 @@ "namespace":"org.radarcns.passive.garmin", "doc":"Provides the data about real time Respiration data.", "fields":[ + { + "name":"time", + "type":"double", + "doc":"Last updated time." + }, + { + "name":"timeReceived", + "type":"double", + "doc":"Device receiver timestamp in UTC (s)." + }, { "name":"respirationRate", "type":"int", - "doc":"Respiration rate." - }, - { - "name":"time", - "type":"double", - "doc":"Last updated time." - }, - { - "name":"timeReceived", - "type":"double", - "doc":"Device receiver timestamp in UTC (s)." + "doc":"Respiration rate in BPM." } + ] } diff --git a/commons/passive/garmin/garmin_generic_spo2.avsc b/commons/passive/garmin/garmin_generic_spo2.avsc index ae15e2bb..9efd9943 100644 --- a/commons/passive/garmin/garmin_generic_spo2.avsc +++ b/commons/passive/garmin/garmin_generic_spo2.avsc @@ -2,22 +2,22 @@ "name":"GarminGenericSpo2", "type":"record", "namespace":"org.radarcns.passive.garmin", - "doc":"Provides the real time Spo2 data.", + "doc":"Provides the real time SpO2 data.", "fields":[ + { + "name":"time", + "type":"double", + "doc":"Last updated time." + }, + { + "name":"timeReceived", + "type":"double", + "doc":"Device receiver timestamp in UTC (s)." + }, { - "name":"spo2Reading", + "name":"spO2", "type":"int", - "doc":"SPO2 reading." - }, - { - "name":"time", - "type":"double", - "doc":"Last updated time." - }, - { - "name":"timeReceived", - "type":"double", - "doc":"Device receiver timestamp in UTC (s)." + "doc":"SpO2 reading as received from Garmin device in %." } ] } diff --git a/commons/passive/garmin/garmin_generic_steps.avsc b/commons/passive/garmin/garmin_generic_steps.avsc index 770bf6fe..31b4bf2b 100644 --- a/commons/passive/garmin/garmin_generic_steps.avsc +++ b/commons/passive/garmin/garmin_generic_steps.avsc @@ -2,27 +2,28 @@ "name":"GarminGenericSteps", "type":"record", "namespace":"org.radarcns.passive.garmin", - "doc":"Steps provides the data about real time steps.", + "doc":"Steps provides the data about real time steps since midnight.", "fields":[ + { + "name":"time", + "type":"double", + "doc":"Last updated time." + }, + { + "name":"timeReceived", + "type":"double", + "doc":"Device receiver timestamp in UTC (s)." + }, { - "name":"currentStepCount", + "name":"stepCount", "type":"int", - "doc":"Current step count." + "doc":"Step count since midnight as calculated by Garmin device." }, { - "name":"currentStepGoal", + "name":"stepGoal", "type":"int", - "doc":"Current step goal." - }, - { - "name":"time", - "type":"double", - "doc":"Last updated time." - }, - { - "name":"timeReceived", - "type":"double", - "doc":"Device receiver timestamp in UTC (s)." + "doc":"Step goal per day." } + ] } diff --git a/commons/passive/garmin/garmin_generic_stress.avsc b/commons/passive/garmin/garmin_generic_stress.avsc index e46b78fc..c3c573dc 100644 --- a/commons/passive/garmin/garmin_generic_stress.avsc +++ b/commons/passive/garmin/garmin_generic_stress.avsc @@ -4,20 +4,21 @@ "namespace":"org.radarcns.passive.garmin", "doc":"Provides the data about real time Stress data.", "fields":[ + { + "name":"time", + "type":"double", + "doc":"Last updated time." + }, + { + "name":"timeReceived", + "type":"double", + "doc":"Device receiver timestamp in UTC (s)." + }, { "name":"stressScore", "type":"int", - "doc":"Stress score." - }, - { - "name":"time", - "type":"double", - "doc":"Last updated time." - }, - { - "name":"timeReceived", - "type":"double", - "doc":"Device receiver timestamp in UTC (s)." + "doc":"Stress score as calculated by Garmin device. Value is in between 1 to 100." } + ] } diff --git a/specifications/passive/garmin_generic-1.0.0.yml b/specifications/passive/garmin_generic-1.0.0.yml index 822b7204..6e757ce5 100644 --- a/specifications/passive/garmin_generic-1.0.0.yml +++ b/specifications/passive/garmin_generic-1.0.0.yml @@ -4,6 +4,7 @@ vendor: Garmin model: Generic version: 1.0.0 app_provider: .garmin.GenericServiceProvider +doc: Data provided using Garmin companion SKD. Supported models are vívofit® 3/4, vívosmart® 3/4, vívoactive® 3/4, vívomove® HR/3, vívosport®, Venu™, Forerunner® series, fēnix® 5 series, fēnix® 6 series, Instinct®, tactix® Charlie, MARQ® data: - type: STEPS From c78ff79a278fa47fff7974ad700de6e79b4734a9 Mon Sep 17 00:00:00 2001 From: Vishal Karnik Date: Thu, 21 May 2020 18:43:40 +0530 Subject: [PATCH 03/14] corrected the topic name to generic. --- specifications/passive/garmin_generic-1.0.0.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/specifications/passive/garmin_generic-1.0.0.yml b/specifications/passive/garmin_generic-1.0.0.yml index 6e757ce5..d4e6ed41 100644 --- a/specifications/passive/garmin_generic-1.0.0.yml +++ b/specifications/passive/garmin_generic-1.0.0.yml @@ -84,5 +84,7 @@ data: dynamic: true unit: NON_DIMENSIONAL processing_state: VENDOR - topic: android_garmin_felix6_accelerometer + topic: android_garmin_generic_accelerometer value_schema: .passive.garmin.GarminGenericAccelerometer + + From 131497d8d3f8748470f581658c0eb3dd1e913e4c Mon Sep 17 00:00:00 2001 From: Vishal Karnik Date: Fri, 22 May 2020 17:04:59 +0530 Subject: [PATCH 04/14] Schema to capture Device information coming from Garmin device. --- .../garmin/garmin_generic_device_info.avsc | 45 +++++++++++++++++++ .../passive/garmin_generic-1.0.0.yml | 9 +++- 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 commons/passive/garmin/garmin_generic_device_info.avsc diff --git a/commons/passive/garmin/garmin_generic_device_info.avsc b/commons/passive/garmin/garmin_generic_device_info.avsc new file mode 100644 index 00000000..fe9d3487 --- /dev/null +++ b/commons/passive/garmin/garmin_generic_device_info.avsc @@ -0,0 +1,45 @@ +{ + "name": "GarminGenericDeviceInfo", + "type": "record", + "namespace": "org.radarcns.passive.garmin", + "doc":"Device information for Garmin devices.", + "fields": [ + + { + "name":"time", + "type":"double", + "doc":"Last updated time." + }, + { + "name":"timeReceived", + "type":"double", + "doc":"Device receiver timestamp in UTC (s)." + }, + + { + "name": "macAddress", + "type": "string", + "doc":"MAC address as received from Garmin device." + }, + { + "name": "connectionState", + "type": "string", + "doc":"Connection state values. TBD - Mayur to update probable values received from Garmin." + }, + { + "name": "deviceModel", + "type": "string", + "doc":"Device model. Supported model are listed on Garmin site - https://developer.garmin.com/health-sdk/overview/." + }, + { + "name": "firmwareVersion", + "type": "int", + "doc":"Firmware version of Garmin device." + }, + { + "name": "friendlyName", + "type": "string", + "doc":"Friendly name of the device." + } + ] +} diff --git a/specifications/passive/garmin_generic-1.0.0.yml b/specifications/passive/garmin_generic-1.0.0.yml index d4e6ed41..dbd9a382 100644 --- a/specifications/passive/garmin_generic-1.0.0.yml +++ b/specifications/passive/garmin_generic-1.0.0.yml @@ -86,5 +86,12 @@ data: processing_state: VENDOR topic: android_garmin_generic_accelerometer value_schema: .passive.garmin.GarminGenericAccelerometer - + - + type: DEVICEINFO + sample_rate: + dynamic: true + unit: NON_DIMENSIONAL + processing_state: VENDOR + topic: android_garmin_generic_device_info + value_schema: .passive.garmin.GarminGenericDeviceInfo From cd05b01b3beedc7a5475d74458927853aba8fbae Mon Sep 17 00:00:00 2001 From: Vishal Karnik Date: Fri, 22 May 2020 20:10:15 +0530 Subject: [PATCH 05/14] Specification updated to include Garmin website link. Schema updated to remove current word. --- commons/passive/garmin/garmin_generic_calories.avsc | 8 ++++---- commons/passive/garmin/garmin_generic_heartrate.avsc | 8 ++++---- specifications/passive/garmin_generic-1.0.0.yml | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/commons/passive/garmin/garmin_generic_calories.avsc b/commons/passive/garmin/garmin_generic_calories.avsc index 512b0b0b..0fb9d50d 100644 --- a/commons/passive/garmin/garmin_generic_calories.avsc +++ b/commons/passive/garmin/garmin_generic_calories.avsc @@ -16,14 +16,14 @@ "doc":"Device receiver timestamp in UTC (s)." }, { - "name":"currentActiveCalories", + "name":"activeCalories", "type":"int", - "doc":"Current active calories." + "doc":"Active calories." }, { - "name":"currentTotalCalories", + "name":"totalCalories", "type":"int", - "doc":"Current total calories." + "doc":"Total calories." } ] diff --git a/commons/passive/garmin/garmin_generic_heartrate.avsc b/commons/passive/garmin/garmin_generic_heartrate.avsc index cb1386ac..c73bdee8 100644 --- a/commons/passive/garmin/garmin_generic_heartrate.avsc +++ b/commons/passive/garmin/garmin_generic_heartrate.avsc @@ -17,14 +17,14 @@ }, { - "name":"currentHeartRate", + "name":"heartRate", "type":"int", - "doc":"Current heart rate (bpm)." + "doc":"Heart rate (bpm)." }, { - "name":"currentRestingHeartRate", + "name":"restingHeartRate", "type":"int", - "doc":"Current resting heart rate (bpm)." + "doc":"Resting heart rate (bpm)." }, { "name":"dailyHighHeartRate", diff --git a/specifications/passive/garmin_generic-1.0.0.yml b/specifications/passive/garmin_generic-1.0.0.yml index dbd9a382..1970f84e 100644 --- a/specifications/passive/garmin_generic-1.0.0.yml +++ b/specifications/passive/garmin_generic-1.0.0.yml @@ -4,7 +4,7 @@ vendor: Garmin model: Generic version: 1.0.0 app_provider: .garmin.GenericServiceProvider -doc: Data provided using Garmin companion SKD. Supported models are vívofit® 3/4, vívosmart® 3/4, vívoactive® 3/4, vívomove® HR/3, vívosport®, Venu™, Forerunner® series, fēnix® 5 series, fēnix® 6 series, Instinct®, tactix® Charlie, MARQ® +doc: Data provided using Garmin companion SKD. Supported model are listed on Garmin site - https://developer.garmin.com/health-sdk/overview/ data: - type: STEPS From 73c79541fca34af69ef84bab8c4240282323eb78 Mon Sep 17 00:00:00 2001 From: Vishal Karnik Date: Mon, 25 May 2020 10:31:47 +0530 Subject: [PATCH 06/14] updated connections state values - DISCONNECTED, CONNECTING, CONNECTED; --- commons/passive/garmin/garmin_generic_device_info.avsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commons/passive/garmin/garmin_generic_device_info.avsc b/commons/passive/garmin/garmin_generic_device_info.avsc index fe9d3487..6fb8c7b8 100644 --- a/commons/passive/garmin/garmin_generic_device_info.avsc +++ b/commons/passive/garmin/garmin_generic_device_info.avsc @@ -24,7 +24,7 @@ { "name": "connectionState", "type": "string", - "doc":"Connection state values. TBD - Mayur to update probable values received from Garmin." + "doc":"Connection state values. Possible states - DISCONNECTED, CONNECTING, CONNECTED." }, { "name": "deviceModel", From afa5ef55857f366f7f4ffdb437ebb4d1e5a175b5 Mon Sep 17 00:00:00 2001 From: Vishal Karnik Date: Mon, 25 May 2020 10:33:30 +0530 Subject: [PATCH 07/14] Corrected the typo in SDK. --- specifications/passive/garmin_generic-1.0.0.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specifications/passive/garmin_generic-1.0.0.yml b/specifications/passive/garmin_generic-1.0.0.yml index 1970f84e..92b18145 100644 --- a/specifications/passive/garmin_generic-1.0.0.yml +++ b/specifications/passive/garmin_generic-1.0.0.yml @@ -4,7 +4,7 @@ vendor: Garmin model: Generic version: 1.0.0 app_provider: .garmin.GenericServiceProvider -doc: Data provided using Garmin companion SKD. Supported model are listed on Garmin site - https://developer.garmin.com/health-sdk/overview/ +doc: Data provided using Garmin companion SDK. Supported model are listed on Garmin site - https://developer.garmin.com/health-sdk/overview/ data: - type: STEPS From 9eec73fc6de350342e3b92631d32e5affd6739ee Mon Sep 17 00:00:00 2001 From: Pauline Conde Date: Mon, 1 Jun 2020 17:53:25 +0100 Subject: [PATCH 08/14] Bump dev version --- java-sdk/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java-sdk/build.gradle b/java-sdk/build.gradle index 53893e38..4703c093 100644 --- a/java-sdk/build.gradle +++ b/java-sdk/build.gradle @@ -17,7 +17,7 @@ subprojects { apply plugin: 'idea' // Configuration - version = '0.5.9' + version = '0.5.10-SNAPSHOT' group = 'org.radarcns' ext.githubRepoName = 'RADAR-base/RADAR-Schemas' From 1d1586d4cfcc94ae196dbef0fba19508d66b70e6 Mon Sep 17 00:00:00 2001 From: Vishal Karnik Date: Wed, 10 Jun 2020 11:34:11 +0530 Subject: [PATCH 09/14] converted to enums. --- commons/passive/garmin/garmin_generic_heartrate.avsc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/commons/passive/garmin/garmin_generic_heartrate.avsc b/commons/passive/garmin/garmin_generic_heartrate.avsc index c73bdee8..8b2db859 100644 --- a/commons/passive/garmin/garmin_generic_heartrate.avsc +++ b/commons/passive/garmin/garmin_generic_heartrate.avsc @@ -36,11 +36,13 @@ "type":"int", "doc":"Daily low heart rate (bpm)." }, - { - "name":"heartRateSource", - "type":"string", - "doc":"Heart rate source. Possible values are NO_SOURCE, HR_STRAP, OHR_NO_LOCK, OHR_LOCKED." - } + + {"name": "heartRateSource", "type": { + "name": "Source", + "type": "enum", + "doc": "Possible connection state values - UNKNOWN, NO_SOURCE, HR_STRAP, OHR_NO_LOCK, OHR_LOCKED.", + "symbols": ["NO_SOURCE", "HR_STRAP", "OHR_NO_LOCK" , "OHR_LOCKED"] + }, "doc": "Source from where the heart rate is measured.", "default": "UNKNOWN"} ] } From 264ba13fd154fba6cdde757c1d97a039cce5f457 Mon Sep 17 00:00:00 2001 From: Vishal Karnik Date: Wed, 10 Jun 2020 12:21:48 +0530 Subject: [PATCH 10/14] updated documentation part for each schema type. --- commons/passive/garmin/garmin_generic_calories.avsc | 2 +- commons/passive/garmin/garmin_generic_device_info.avsc | 2 +- commons/passive/garmin/garmin_generic_heartrate.avsc | 4 ++-- commons/passive/garmin/garmin_generic_intensity.avsc | 8 ++++---- commons/passive/garmin/garmin_generic_steps.avsc | 2 +- commons/passive/garmin/garmin_generic_stress.avsc | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/commons/passive/garmin/garmin_generic_calories.avsc b/commons/passive/garmin/garmin_generic_calories.avsc index 0fb9d50d..e24247c2 100644 --- a/commons/passive/garmin/garmin_generic_calories.avsc +++ b/commons/passive/garmin/garmin_generic_calories.avsc @@ -18,7 +18,7 @@ { "name":"activeCalories", "type":"int", - "doc":"Active calories." + "doc":"Active calorie numbers are what is burned throughout the day only while doing physical, non-sedentary, activity such as walking or working out. Garmin devices calculate active calories based on the activity level, type of activity, age, height, weight, gender, and heart rate (if available)." }, { "name":"totalCalories", diff --git a/commons/passive/garmin/garmin_generic_device_info.avsc b/commons/passive/garmin/garmin_generic_device_info.avsc index ffb33c0f..d0b7ff1e 100644 --- a/commons/passive/garmin/garmin_generic_device_info.avsc +++ b/commons/passive/garmin/garmin_generic_device_info.avsc @@ -21,7 +21,7 @@ "doc": "Possible connection state values - UNKNOWN, DISCONNECTED, CONNECTING, CONNECTED.", "symbols": ["DISCONNECTED", "CONNECTING", "CONNECTED" , "UNKNOWN"] }, "doc": "Garmin device connection state.", "default": "UNKNOWN"}, - + { "name":"deviceModel", "type":"string", diff --git a/commons/passive/garmin/garmin_generic_heartrate.avsc b/commons/passive/garmin/garmin_generic_heartrate.avsc index 8b2db859..b995f7bb 100644 --- a/commons/passive/garmin/garmin_generic_heartrate.avsc +++ b/commons/passive/garmin/garmin_generic_heartrate.avsc @@ -29,12 +29,12 @@ { "name":"dailyHighHeartRate", "type":"int", - "doc":"Daily high heart rate (bpm)." + "doc":"Daily high heart rate (bpm). High and low heart rate are simply the highest and lowest individual HR values recorded daily up to a given point, when the RestingHeartRate message is written. Resting heart rate itself is calculated algorithmically based on recordings taken during periods of sustained low motion. 'Daily' values provided by the SDK are always reset at midnight of the local user-day." }, { "name":"dailyLowHeartRate", "type":"int", - "doc":"Daily low heart rate (bpm)." + "doc":"Daily low heart rate (bpm). High and low heart rate are simply the highest and lowest individual HR values recorded daily up to a given point, when the RestingHeartRate message is written. Resting heart rate itself is calculated algorithmically based on recordings taken during periods of sustained low motion. 'Daily' values provided by the SDK are always reset at midnight of the local user-day." }, {"name": "heartRateSource", "type": { diff --git a/commons/passive/garmin/garmin_generic_intensity.avsc b/commons/passive/garmin/garmin_generic_intensity.avsc index c9af61ed..dfb99d16 100644 --- a/commons/passive/garmin/garmin_generic_intensity.avsc +++ b/commons/passive/garmin/garmin_generic_intensity.avsc @@ -2,7 +2,7 @@ "name":"GarminGenericIntensity", "type":"record", "namespace":"org.radarcns.passive.garmin", - "doc":"Intensity data from Garmin device.", + "doc":"Intensity data from Garmin device. Garmin devices compare your heartrate data to determine intensity level. It compares resting heartrate with current heartrate to determine Vigorous or Moderate intensity level. No specific ranges or algorithm specified.", "fields":[ { "name":"time", @@ -17,17 +17,17 @@ { "name":"totalDailyMinutes", "type":"int", - "doc":"Total Daily Minutes." + "doc":"Total Daily Minutes. Garmin devices accumulate intensity minutes throughout the day. This is what is available for current total daily minutes. This value indicates intensity minutes accumulated till that point of the day." }, { "name":"dailyModerateMinutes", "type":"int", - "doc":"Daily Moderate Minutes." + "doc":"Daily Moderate Minutes. Garmin devices accumulate intensity minutes throughout the day. This is what is available for current total daily minutes. This value indicates intensity minutes accumulated till that point of the day." }, { "name":"dailyVigorousMinutes", "type":"int", - "doc":"Daily Vigorous Minutes." + "doc":"Daily Vigorous Minutes. Garmin devices accumulate intensity minutes throughout the day. This is what is available for current total daily minutes. This value indicates intensity minutes accumulated till that point of the day." }, { "name":"totalWeeklyMinutes", diff --git a/commons/passive/garmin/garmin_generic_steps.avsc b/commons/passive/garmin/garmin_generic_steps.avsc index 31b4bf2b..4528efe8 100644 --- a/commons/passive/garmin/garmin_generic_steps.avsc +++ b/commons/passive/garmin/garmin_generic_steps.avsc @@ -17,7 +17,7 @@ { "name":"stepCount", "type":"int", - "doc":"Step count since midnight as calculated by Garmin device." + "doc":"Step count since midnight as calculated by Garmin device. 'Daily' values provided by the SDK are always reset at midnight of the local user-day." }, { "name":"stepGoal", diff --git a/commons/passive/garmin/garmin_generic_stress.avsc b/commons/passive/garmin/garmin_generic_stress.avsc index 46bea877..23df433d 100644 --- a/commons/passive/garmin/garmin_generic_stress.avsc +++ b/commons/passive/garmin/garmin_generic_stress.avsc @@ -2,7 +2,7 @@ "name":"GarminGenericStress", "type":"record", "namespace":"org.radarcns.passive.garmin", - "doc":"Provides the data about real time Stress data.", + "doc":"Provides the data about real time Stress data. When using the stress level feature, the device uses heart rate data to determine the interval between each heart beat. The variable length of time in between each heart beat is regulated by the body's autonomic nervous system. The less variability between beats equals higher stress levels, whereas the increase in variability indicates less stress.", "fields":[ { "name":"time", From cb0e945cceba6c7c32a562639b46f7709576b29c Mon Sep 17 00:00:00 2001 From: Vishal Karnik Date: Wed, 10 Jun 2020 14:51:50 +0530 Subject: [PATCH 11/14] Updated documentation for HR source values. --- commons/passive/garmin/garmin_generic_heartrate.avsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/commons/passive/garmin/garmin_generic_heartrate.avsc b/commons/passive/garmin/garmin_generic_heartrate.avsc index b995f7bb..42f840c2 100644 --- a/commons/passive/garmin/garmin_generic_heartrate.avsc +++ b/commons/passive/garmin/garmin_generic_heartrate.avsc @@ -40,8 +40,8 @@ {"name": "heartRateSource", "type": { "name": "Source", "type": "enum", - "doc": "Possible connection state values - UNKNOWN, NO_SOURCE, HR_STRAP, OHR_NO_LOCK, OHR_LOCKED.", - "symbols": ["NO_SOURCE", "HR_STRAP", "OHR_NO_LOCK" , "OHR_LOCKED"] + "doc": "Possible connection state values - UNKNOWN (heart rate is recorded with value for source that is not understood), NO_SOURCE (Heart rate is received but no source is recorded), HR_STRAP(hear rate is read from heart rate strap), OHR_NO_LOCK (Indicates that the reading is from watch with optical heart rate sensor not locked), OHR_LOCKED (Indicates that the reading is from watch with optical heart rate sensor locked).", + "symbols": [ "UNKNOWN", "NO_SOURCE", "HR_STRAP", "OHR_NO_LOCK" , "OHR_LOCKED"] }, "doc": "Source from where the heart rate is measured.", "default": "UNKNOWN"} ] From e5521eb82c95dd7c323921495f5af3415517d65c Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Wed, 10 Jun 2020 13:39:38 +0200 Subject: [PATCH 12/14] Update dependencies --- java-sdk/build.gradle | 12 +- java-sdk/config/checkstyle/checkstyle.xml | 16 +- java-sdk/gradle/wrapper/gradle-wrapper.jar | Bin 58695 -> 58910 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- java-sdk/gradlew | 2 + java-sdk/gradlew.bat | 207 +++++++++--------- java-sdk/radar-schemas-tools/build.gradle | 30 +-- .../schema/registration/KafkaTopics.java | 18 +- .../schema/registration/SchemaRegistry.java | 6 +- .../registration/SchemaTopicBackup.java | 4 +- .../registration/SchemaTopicManager.java | 19 +- .../schema/service/SourceCatalogueServer.java | 6 +- .../validation/config/ExcludeConfig.java | 1 + 13 files changed, 165 insertions(+), 158 deletions(-) diff --git a/java-sdk/build.gradle b/java-sdk/build.gradle index 59033e81..4151c1cb 100644 --- a/java-sdk/build.gradle +++ b/java-sdk/build.gradle @@ -3,9 +3,9 @@ //---------------------------------------------------------------------------// plugins { - id 'com.commercehub.gradle.plugin.avro-base' version '0.16.0' - id 'com.jfrog.bintray' version '1.8.4' apply false - id 'com.jfrog.artifactory' version '4.9.8' apply false + id 'com.commercehub.gradle.plugin.avro-base' version '0.19.1' + id 'com.jfrog.bintray' version '1.8.5' apply false + id 'com.jfrog.artifactory' version '4.15.2' apply false } subprojects { @@ -17,11 +17,11 @@ subprojects { apply plugin: 'idea' // Configuration - version = '0.5.9-SNAPSHOT' + version = '0.5.10-SNAPSHOT' group = 'org.radarcns' ext.githubRepoName = 'RADAR-base/RADAR-Schemas' - ext.avroVersion = '1.8.2' + ext.avroVersion = '1.9.2' ext.githubUrl = "https://github.com/${githubRepoName}.git" ext.issueUrl = "https://github.com/${githubRepoName}/issues" @@ -128,5 +128,5 @@ subprojects { } wrapper { - gradleVersion '6.2.2' + gradleVersion '6.4.1' } diff --git a/java-sdk/config/checkstyle/checkstyle.xml b/java-sdk/config/checkstyle/checkstyle.xml index b9f3a458..582d375d 100644 --- a/java-sdk/config/checkstyle/checkstyle.xml +++ b/java-sdk/config/checkstyle/checkstyle.xml @@ -27,6 +27,11 @@ + + + + + @@ -39,10 +44,6 @@ - - - - @@ -51,9 +52,7 @@ - - - + @@ -193,11 +192,8 @@ - - - diff --git a/java-sdk/gradle/wrapper/gradle-wrapper.jar b/java-sdk/gradle/wrapper/gradle-wrapper.jar index f3d88b1c2faf2fc91d853cd5d4242b5547257070..62d4c053550b91381bbd28b1afc82d634bf73a8a 100644 GIT binary patch delta 12524 zcmY*pqN z|ERss*;ReIR@Lg&r_R7IT-GRDbpR4NMKNcwFgy&*A|eco1PnBHRth?SBneiw6$UT&^LVJ0?Naa`KfV(>F!Ez}~S z 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 delta 12163 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 diff --git a/java-sdk/gradle/wrapper/gradle-wrapper.properties b/java-sdk/gradle/wrapper/gradle-wrapper.properties index a2bf1313..a4f0001d 100644 --- a/java-sdk/gradle/wrapper/gradle-wrapper.properties +++ b/java-sdk/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.2.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/java-sdk/gradlew b/java-sdk/gradlew index 2fe81a7d..fbd7c515 100755 --- a/java-sdk/gradlew +++ b/java-sdk/gradlew @@ -82,6 +82,7 @@ esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then @@ -129,6 +130,7 @@ fi if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath diff --git a/java-sdk/gradlew.bat b/java-sdk/gradlew.bat index 62bd9b9c..a9f778a7 100644 --- a/java-sdk/gradlew.bat +++ b/java-sdk/gradlew.bat @@ -1,103 +1,104 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/java-sdk/radar-schemas-tools/build.gradle b/java-sdk/radar-schemas-tools/build.gradle index da6c0bc2..74e4ad1d 100644 --- a/java-sdk/radar-schemas-tools/build.gradle +++ b/java-sdk/radar-schemas-tools/build.gradle @@ -31,16 +31,17 @@ ext { description = 'RADAR Schemas specification and validation tools.' argparseVersion = '0.8.1' - jacksonVersion = '2.10.1' - jacksonYamlVersion = '2.10.1' - jerseyVersion = '2.29.1' - jettyVersion = '9.4.24.v20191120' - junitVersion = '4.12' - confluentVersion = '5.3.1' - kafkaVersion = '2.3.0' - okHttpVersion = '4.2.2' - radarCommonsVersion = '0.12.1' - slf4jVersion = '1.7.26' + jacksonVersion = '2.11.0' + jacksonYamlVersion = '2.11.0' + jerseyVersion = '2.31' + jettyVersion = '9.4.29.v20200521' + junitVersion = '4.13' + confluentVersion = '5.5.0' + kafkaVersion = '2.5.0' + okHttpVersion = '4.7.2' + radarCommonsVersion = '0.12.2' + slf4jVersion = '1.7.30' + javaxValidationVersion = '2.0.1.Final' } repositories { @@ -48,11 +49,12 @@ repositories { maven { url 'https://packages.confluent.io/maven/' } maven { url "https://dl.bintray.com/radar-base/org.radarbase" } maven { url 'https://oss.jfrog.org/artifactory/oss-snapshot-local' } + maven { url "https://jitpack.io" } } dependencies { api group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: jacksonVersion - api group: 'javax.validation', name: 'validation-api', version: '2.0.0.Final' + api group: 'javax.validation', name: 'validation-api', version: javaxValidationVersion api group: 'org.apache.kafka', name: 'kafka_2.12', version: kafkaVersion implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: jacksonYamlVersion @@ -103,7 +105,7 @@ test { //---------------------------------------------------------------------------// checkstyle { // codacy version - toolVersion '6.16' + toolVersion '8.31' ignoreFailures false configFile = file("$rootDir/config/checkstyle/checkstyle.xml") @@ -111,7 +113,7 @@ checkstyle { pmd { // pmd version - toolVersion = '6.12.0' + toolVersion = '6.23.0' ignoreFailures = false sourceSets = [sourceSets.main] @@ -181,7 +183,7 @@ bintray { } artifactory { - contextUrl = 'https://oss.jfrog.org/artifactory' + setContextUrl('https://oss.jfrog.org/artifactory') publish { repository { repoKey = 'oss-snapshot-local' diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/KafkaTopics.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/KafkaTopics.java index 6c0c4d01..11753006 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/KafkaTopics.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/KafkaTopics.java @@ -54,7 +54,7 @@ public class KafkaTopics implements Closeable { public KafkaTopics(@NotNull String zookeeper) { this.zkClient = KafkaZkClient .apply(zookeeper, false, 15_000, 10_000, 30, Time.SYSTEM, "kafka.server", - "SessionExpireListener", Option.apply("radar-schemas")); + "SessionExpireListener", Option.apply("radar-schemas"), Option.empty()); bootstrapServers = null; initialized = false; } @@ -64,10 +64,10 @@ public KafkaTopics(@NotNull String zookeeper) { * waiting for at most 200 seconds. * @param brokers number of brokers to wait for * @return whether the brokers where available - * @throws InterruptedException when waiting for the brokers is interrepted. + * @throws InterruptedException when waiting for the brokers is interrupted. + * @throws ZooKeeperClientException if Zookeeper cannot be initialized. */ - public boolean initialize(int brokers) throws InterruptedException, - ZooKeeperClientException { + public boolean initialize(int brokers) throws InterruptedException { int sleep = 2; int numTries = 20; int numBrokers = 0; @@ -111,7 +111,7 @@ private void ensureInitialized() { } /** - * Refresh the list of topics from Kafka + * Refresh the list of topics from Kafka. * @return {@code true} if the update succeeded, {@code false} otherwise. * @throws InterruptedException if the request was interrupted. */ @@ -232,7 +232,13 @@ public boolean createTopics(Stream topics, int partitions, short replica } } - public int getNumberOfBrokers() throws ZooKeeperClientException { + /** + * Get current number of Kafka brokers according to Zookeeper. + * + * @return number of Kafka brokers + * @throws ZooKeeperClientException if zookeeper cannot connect + */ + public int getNumberOfBrokers() { return zkClient.getAllBrokersInCluster().length(); } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/SchemaRegistry.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/SchemaRegistry.java index 9a786ff7..8e73d27d 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/SchemaRegistry.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/SchemaRegistry.java @@ -138,8 +138,8 @@ public void writeTo(BufferedSink sink) throws IOException { return false; } - try (Response response = httpClient.request(request)) { - ResponseBody body = response.body(); + try (Response response = httpClient.request(request); + ResponseBody body = response.body()) { if (response.isSuccessful()) { logger.info("Compatibility set to {}", compatibility); return true; @@ -221,6 +221,8 @@ public void addParser(ArgumentParser parser) { .type(String.class); parser.addArgument("schemaRegistry") .help("schema registry URL"); + parser.addArgument("-a", "--authorization") + .help("Client key and password to authorize with."); SubCommand.addRootArgument(parser); } } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/SchemaTopicBackup.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/SchemaTopicBackup.java index 490050c3..e15bd1b6 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/SchemaTopicBackup.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/SchemaTopicBackup.java @@ -187,11 +187,11 @@ public String getSubject() { } public byte[] getKey() { - return key; + return Arrays.copyOf(key, key.length); } public byte[] getValue() { - return value; + return Arrays.copyOf(value, value.length); } @Override diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/SchemaTopicManager.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/SchemaTopicManager.java index 1c709ef2..94fd82f2 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/SchemaTopicManager.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/SchemaTopicManager.java @@ -17,6 +17,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import javax.validation.constraints.NotNull; +import kafka.zk.ZkVersion; import net.sourceforge.argparse4j.impl.action.StoreConstArgumentAction; import net.sourceforge.argparse4j.inf.ArgumentParser; import net.sourceforge.argparse4j.inf.Namespace; @@ -36,8 +37,6 @@ import org.apache.kafka.common.TopicPartition; import org.apache.kafka.common.config.ConfigResource; import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.KeeperException.NoNodeException; -import org.apache.zookeeper.ZooKeeper; import org.radarcns.schema.CommandLineApp; import org.radarcns.schema.util.SubCommand; import org.slf4j.Logger; @@ -307,7 +306,8 @@ private void ensurePartitions(Consumer consumer) { // ignore } retries++; - } while (retries < 10); + } + while (retries < 10); if (partitions == null || partitions.isEmpty()) { throw new IllegalArgumentException("Unable to subscribe to the Kafka topic " @@ -358,23 +358,22 @@ public void restoreBackup(short replication) } private void ensureSchemaRegistryNotRunning() throws KeeperException, InterruptedException { - ZooKeeper zookeeper = topics.getZkClient().currentZooKeeper(); try { - if (zookeeper.exists("/schema_registry/schema_registry_master", false) != null) { + if (topics.getZkClient().pathExists("/schema_registry/schema_registry_master")) { throw new IllegalStateException( "Cannot restore schemas while the schema registry is running."); } - } catch (NoNodeException ex) { - // no action + } catch (Exception ex) { + logger.error("Cannot check whether schema registry master exists", ex); } logger.info("No zookeeper nodes for Schema Registry."); } private void resetSchemaRegistryId() throws KeeperException, InterruptedException { - ZooKeeper zookeeper = topics.getZkClient().currentZooKeeper(); try { - zookeeper.delete("/schema_registry/schema_registry_id", -1); - } catch (NoNodeException ex) { + topics.getZkClient().deletePath("/schema_registry/schema_registry_id", + ZkVersion.MatchAnyVersion(), false); + } catch (Exception ex) { logger.info("No schema registry ID listed in zookeeper."); } } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/service/SourceCatalogueServer.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/service/SourceCatalogueServer.java index faa9ce01..6b651b8d 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/service/SourceCatalogueServer.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/service/SourceCatalogueServer.java @@ -62,15 +62,13 @@ public String getName() { @Override public int execute(Namespace options, CommandLineApp app) { int partitions = options.getInt("port"); - SourceCatalogueServer service = new SourceCatalogueServer(partitions); - try { + try (SourceCatalogueServer service = new SourceCatalogueServer(partitions)) { service.start(app.getCatalogue()); + return 0; } catch (Exception e) { logger.error("Cannot start server ", e); return 1; } - service.close(); - return 0; } @Override diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/config/ExcludeConfig.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/config/ExcludeConfig.java index f81ead74..a3b3a653 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/config/ExcludeConfig.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/config/ExcludeConfig.java @@ -144,6 +144,7 @@ public void setFiles(String... files) { /** Set the files to be excluded. */ @JsonSetter("files") + @SuppressWarnings("PMD.CloseResource") // File system should not be closed public void setFiles(Collection files) { FileSystem fs = FileSystems.getDefault(); List pathMatchers = files.stream() From cbb708650fc7de5289e122b8243b97760fc9b380 Mon Sep 17 00:00:00 2001 From: yatharthranjan Date: Mon, 15 Jun 2020 13:37:16 +0100 Subject: [PATCH 13/14] Bump release version --- java-sdk/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java-sdk/build.gradle b/java-sdk/build.gradle index 4151c1cb..3e96c0a1 100644 --- a/java-sdk/build.gradle +++ b/java-sdk/build.gradle @@ -17,7 +17,7 @@ subprojects { apply plugin: 'idea' // Configuration - version = '0.5.10-SNAPSHOT' + version = '0.5.10' group = 'org.radarcns' ext.githubRepoName = 'RADAR-base/RADAR-Schemas' From e39bb2321f72bf8c6e2ffb2461f90604e39d97cc Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Tue, 16 Jun 2020 09:49:31 +0200 Subject: [PATCH 14/14] Update dependencies again --- java-sdk/radar-schemas-tools/build.gradle | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/java-sdk/radar-schemas-tools/build.gradle b/java-sdk/radar-schemas-tools/build.gradle index 74e4ad1d..2e9a63a2 100644 --- a/java-sdk/radar-schemas-tools/build.gradle +++ b/java-sdk/radar-schemas-tools/build.gradle @@ -39,7 +39,7 @@ ext { confluentVersion = '5.5.0' kafkaVersion = '2.5.0' okHttpVersion = '4.7.2' - radarCommonsVersion = '0.12.2' + radarCommonsVersion = '0.12.3' slf4jVersion = '1.7.30' javaxValidationVersion = '2.0.1.Final' } @@ -56,6 +56,8 @@ dependencies { api group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: jacksonVersion api group: 'javax.validation', name: 'validation-api', version: javaxValidationVersion api group: 'org.apache.kafka', name: 'kafka_2.12', version: kafkaVersion + // temporary version override to avoid netty vulnerability. Can be removed as soon as Kafka has an updated dependency + implementation group: 'org.apache.zookeeper', name: 'zookeeper', version: '3.5.8' implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: jacksonYamlVersion implementation project(':radar-schemas-commons')