From 0e58677432c4e0b5e0cdd09cddda22031f43e99c Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Thu, 6 Jul 2017 13:42:25 +0100 Subject: [PATCH 001/112] Intial commit of Thinc-it schemas --- commons/questionnaire/questionnaire.avsc | 2 +- commons/thincit/code_breaker.avsc | 32 ++++++++++++++++++++++++ commons/thincit/inpu_type.avsc | 12 +++++++++ commons/thincit/spotter.avsc | 32 ++++++++++++++++++++++++ commons/thincit/symbol_check.avsc | 32 ++++++++++++++++++++++++ commons/thincit/trails.avsc | 17 +++++++++++++ 6 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 commons/thincit/code_breaker.avsc create mode 100644 commons/thincit/inpu_type.avsc create mode 100644 commons/thincit/spotter.avsc create mode 100644 commons/thincit/symbol_check.avsc create mode 100644 commons/thincit/trails.avsc diff --git a/commons/questionnaire/questionnaire.avsc b/commons/questionnaire/questionnaire.avsc index fb88090c..bc7c9e58 100644 --- a/commons/questionnaire/questionnaire.avsc +++ b/commons/questionnaire/questionnaire.avsc @@ -4,7 +4,7 @@ "name": "Questionnaire", "doc": "General schema for questionnaire. Check the specification folder to see how the questionnaire has been defined. For each QuestionnaireType there is a JSON file reporting the questions set and possible answers if available", "fields": [ - { "name": "name", "type": {"name": "QuestionnaireType", "type": "enum", "symbols": ["PHQ8", "ESM", "UNKNOWN"]}, "doc": "Questionnaire names", "default": "UNKNOWN" }, + { "name": "name", "type": {"name": "QuestionnaireType", "type": "enum", "symbols": ["PHQ8", "ESM", "PDQ5D", "UNKNOWN"]}, "doc": "Questionnaire names", "default": "UNKNOWN" }, { "name": "version", "type": "string", "doc": "It reports the questionnaire version stated in the JSON specification" }, { "name": "answers", "type": { diff --git a/commons/thincit/code_breaker.avsc b/commons/thincit/code_breaker.avsc new file mode 100644 index 00000000..dd44aa8b --- /dev/null +++ b/commons/thincit/code_breaker.avsc @@ -0,0 +1,32 @@ +{ + "namespace": "org.radarcns.thincit", + "type": "record", + "name": "CodeBreaker", + "doc": "Assessment derived from DSST. As many trials as can be completed within 2 minutes. E ach trial is a symbol/number to be matched.", + "fields": [ + { "name": "score", "type": "int", "doc": "THINC-it index score - out of 4000" }, + { "name": "completed", "type": "int", "doc": "The amount of completed trials" }, + { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, + { "name": "longestTrial", "type": "double", "doc": "Longest trial completion time expressed in millisecond" }, + { "name": "iqrCompletion", "type": "int", "doc": "Mean of trial completion times within interquartile range" }, + { "name": "inputType", "type": "org.radarcns.thincit.InputType", "doc": "Dominant input type used by the subject to answer", "default": "UNKNOWN" }, + { "name": "details", + "type": { + "type": "array", + "items": { + "name": "CodeBreakerSummary", + "type": "record", + "doc": "Trial summary for CodeBreaker assessment", + "fields": [ + { "name": "longestTime", "type": "double", "doc": "Longest trial completion time expressed in millisecond" }, + { "name": "meanTime", "type": "double", "doc": "Mean trial completion time expressed in millisecond" }, + { "name": "correct", "type": "int", "doc": "The amount of correct responses" }, + { "name": "inputType", "type": "org.radarcns.thincit.InputType", "doc": "Dominant input type used by the subject to answer" } + ] + } + }, + "doc": "List of trial summaries. First item reports about the first quarter, second about the second quarter and so on" + }, + { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the test is submitted to the subject" } + ] +} diff --git a/commons/thincit/inpu_type.avsc b/commons/thincit/inpu_type.avsc new file mode 100644 index 00000000..0ed32d10 --- /dev/null +++ b/commons/thincit/inpu_type.avsc @@ -0,0 +1,12 @@ +{ + "namespace": "org.radarcns.thincit", + "type": "enum", + "name": "InputType", + "doc": "Possible input type that a subject can use to do an assignment", + "symbols": [ + "KEYBOARD", + "MOUSE", + "TOUCHSCREEN", + "UNKNOWN" + ] +} diff --git a/commons/thincit/spotter.avsc b/commons/thincit/spotter.avsc new file mode 100644 index 00000000..2f3f5113 --- /dev/null +++ b/commons/thincit/spotter.avsc @@ -0,0 +1,32 @@ +{ + "namespace": "org.radarcns.thincit", + "type": "record", + "name": "Spotter", + "doc": "Assessment derived from CRT. 40 trials, or 2 minutes max. Each trial is the presentation of a a left or right facing arrow.", + "fields": [ + { "name": "score", "type": "int", "doc": "THINC-it index score - out of 4000" }, + { "name": "meanLatency", "type": "double", "doc": "Mean latency of correct responses expressed in millisecond" }, + { "name": "timeouts", "type": "int", "doc": "The amount of time tha a subject failed to input a response within the time limit" }, + { "name": "anticipations", "type": "int", "doc": "The amount of response within 100ms of stimulus presentation" }, + { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, + { "name": "inputType", "type": "org.radarcns.thincit.InputType", "doc": "Dominant input type used by the subject to answer", "default": "UNKNOWN" }, + { "name": "details", + "type": { + "type": "array", + "items": { + "name": "SpotterSummary", + "type": "record", + "doc": "Trial summary for Spotter assessment", + "fields": [ + { "name": "meanLatency", "type": "double", "doc": "Mean latency of correct responses expressed in millisecond" }, + { "name": "timeouts", "type": "int", "doc": "The amount of time tha a subject failed to input a response within the time limit" }, + { "name": "anticipations", "type": "int", "doc": "The amount of response within 100ms of stimulus presentation" }, + { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" } + ] + } + }, + "doc": "Trial summaries aggregated by 10. First item reports about trial 1-10, second 11-20 and so on" + }, + { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the test is submitted to the subject" } + ] +} diff --git a/commons/thincit/symbol_check.avsc b/commons/thincit/symbol_check.avsc new file mode 100644 index 00000000..6a800f38 --- /dev/null +++ b/commons/thincit/symbol_check.avsc @@ -0,0 +1,32 @@ +{ + "namespace": "org.radarcns.thincit", + "type": "record", + "name": "SymbolCheck", + "doc": "Assessment derived from Nback. 40 trials, or 2 minutes max. Each obscured symbol to be recalled is a trial.", + "fields": [ + { "name": "score", "type": "int", "doc": "THINC-it index score - out of 4000" }, + { "name": "completed", "type": "int", "doc": "The amount of completed trials" }, + { "name": "correct", "type": "int", "doc": "The amount of correct responses" }, + { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, + { "name": "timeouts", "type": "int", "doc": "The amount of time tha a subject failed to input a response within the time limit" }, + { "name": "inputType", "type": "org.radarcns.thincit.InputType", "doc": "Dominant input type used by the subject to answer", "default": "UNKNOWN" }, + { "name": "details", + "type": { + "type": "array", + "items": { + "name": "SymbolCheckSummary", + "type": "record", + "doc": "Trial summary for SymbolCheck assessment", + "fields": [ + { "name": "correct", "type": "int", "doc": "The amount of correct responses" }, + { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, + { "name": "timeouts", "type": "int", "doc": "The amount of time tha a subject failed to input a response within the time limit" }, + { "name": "inputType", "type": "org.radarcns.thincit.InputType", "doc": "Dominant input type used by the subject to answer" } + ] + } + }, + "doc": "Trial summaries aggregated by 10. First item reports about trial 1-10, second 11-20 and so on" + }, + { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the test is submitted to the subject" } + ] +} diff --git a/commons/thincit/trails.avsc b/commons/thincit/trails.avsc new file mode 100644 index 00000000..07a3e5b6 --- /dev/null +++ b/commons/thincit/trails.avsc @@ -0,0 +1,17 @@ +{ + "namespace": "org.radarcns.thincit", + "type": "record", + "name": "Trails", + "doc": "Assessment derived from Trail Making B. 17 trials. Each trial is the transition from one circle to another.", + "fields": [ + { "name": "score", "type": "int", "doc": "THINC-it index score - out of 4000" }, + { "name": "duration", "type": "double", "doc": "Total time taken to complete the assessment" }, + { "name": "layoutVersion", "type": "int", "doc": "Each play randomly select one of 40 pre-designed layouts" }, + { "name": "wrongNode", "type": "int", "doc": "The number of times that the subject transitioned to an incorrect next circle before successful transition to correct next circle" }, + { "name": "lostContact", "type": "int", "doc": "The number of times that the mouse button has been released before transitioning successfully to next circle" }, + { "name": "longestTrial", "type": "double", "doc": "Longest trial completion time expressed in millisecond" }, + { "name": "iqrCompletion", "type": "int", "doc": "Mean of trial completion times within interquartile range" }, + { "name": "intervals", "type": { "type": "array", "items": "double" }, "doc": "Trial completion time in millisecond" }, + { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the test is submitted to the subject" } + ] +} From 6970800cab7b7b41b8f2f87f070cb5a58f8bc4b6 Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Mon, 10 Jul 2017 16:11:28 +0100 Subject: [PATCH 002/112] Changed name convention and timeCompleted --- ..._breaker.avsc => thinc_it_code_breaker.avsc} | 17 +++++++++-------- .../{inpu_type.avsc => thinc_it_inpu_type.avsc} | 2 +- .../{spotter.avsc => thinc_it_spotter.avsc} | 11 ++++++----- ...ol_check.avsc => thinc_it_symbol_check.avsc} | 13 +++++++------ .../{trails.avsc => thinc_it_trails.avsc} | 9 +++++---- 5 files changed, 28 insertions(+), 24 deletions(-) rename commons/thincit/{code_breaker.avsc => thinc_it_code_breaker.avsc} (62%) rename commons/thincit/{inpu_type.avsc => thinc_it_inpu_type.avsc} (87%) rename commons/thincit/{spotter.avsc => thinc_it_spotter.avsc} (75%) rename commons/thincit/{symbol_check.avsc => thinc_it_symbol_check.avsc} (70%) rename commons/thincit/{trails.avsc => thinc_it_trails.avsc} (73%) diff --git a/commons/thincit/code_breaker.avsc b/commons/thincit/thinc_it_code_breaker.avsc similarity index 62% rename from commons/thincit/code_breaker.avsc rename to commons/thincit/thinc_it_code_breaker.avsc index dd44aa8b..0bb9ade7 100644 --- a/commons/thincit/code_breaker.avsc +++ b/commons/thincit/thinc_it_code_breaker.avsc @@ -1,16 +1,18 @@ { "namespace": "org.radarcns.thincit", "type": "record", - "name": "CodeBreaker", - "doc": "Assessment derived from DSST. As many trials as can be completed within 2 minutes. E ach trial is a symbol/number to be matched.", + "name": "ThincItCodeBreaker", + "doc": "THINC-it Assessment derived from DSST. As many trials as can be completed within 2 minutes. E ach trial is a symbol/number to be matched.", "fields": [ + { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the test is submitted to the subject" }, + { "name": "timeCompleted", "type": "double", "doc": "timestamp in UTC (s) when the subject completes the test" }, { "name": "score", "type": "int", "doc": "THINC-it index score - out of 4000" }, { "name": "completed", "type": "int", "doc": "The amount of completed trials" }, { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, { "name": "longestTrial", "type": "double", "doc": "Longest trial completion time expressed in millisecond" }, { "name": "iqrCompletion", "type": "int", "doc": "Mean of trial completion times within interquartile range" }, - { "name": "inputType", "type": "org.radarcns.thincit.InputType", "doc": "Dominant input type used by the subject to answer", "default": "UNKNOWN" }, - { "name": "details", + { "name": "inputType", "type": "org.radarcns.thincit.ThincItInputType", "doc": "Dominant input type used by the subject to answer", "default": "UNKNOWN" }, + { "name": "quarterSummaries", "type": { "type": "array", "items": { @@ -18,15 +20,14 @@ "type": "record", "doc": "Trial summary for CodeBreaker assessment", "fields": [ - { "name": "longestTime", "type": "double", "doc": "Longest trial completion time expressed in millisecond" }, + { "name": "longestTrial", "type": "double", "doc": "Longest trial completion time expressed in millisecond" }, { "name": "meanTime", "type": "double", "doc": "Mean trial completion time expressed in millisecond" }, { "name": "correct", "type": "int", "doc": "The amount of correct responses" }, - { "name": "inputType", "type": "org.radarcns.thincit.InputType", "doc": "Dominant input type used by the subject to answer" } + { "name": "inputType", "type": "org.radarcns.thincit.ThincItInputType", "doc": "Dominant input type used by the subject to answer" } ] } }, "doc": "List of trial summaries. First item reports about the first quarter, second about the second quarter and so on" - }, - { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the test is submitted to the subject" } + } ] } diff --git a/commons/thincit/inpu_type.avsc b/commons/thincit/thinc_it_inpu_type.avsc similarity index 87% rename from commons/thincit/inpu_type.avsc rename to commons/thincit/thinc_it_inpu_type.avsc index 0ed32d10..7914d18e 100644 --- a/commons/thincit/inpu_type.avsc +++ b/commons/thincit/thinc_it_inpu_type.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.thincit", "type": "enum", - "name": "InputType", + "name": "ThincItInputType", "doc": "Possible input type that a subject can use to do an assignment", "symbols": [ "KEYBOARD", diff --git a/commons/thincit/spotter.avsc b/commons/thincit/thinc_it_spotter.avsc similarity index 75% rename from commons/thincit/spotter.avsc rename to commons/thincit/thinc_it_spotter.avsc index 2f3f5113..9b7460a2 100644 --- a/commons/thincit/spotter.avsc +++ b/commons/thincit/thinc_it_spotter.avsc @@ -1,15 +1,17 @@ { "namespace": "org.radarcns.thincit", "type": "record", - "name": "Spotter", - "doc": "Assessment derived from CRT. 40 trials, or 2 minutes max. Each trial is the presentation of a a left or right facing arrow.", + "name": "ThincItSpotter", + "doc": "THINC-it Assessment derived from CRT. 40 trials, or 2 minutes max. Each trial is the presentation of a a left or right facing arrow.", "fields": [ + { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the test is submitted to the subject" }, + { "name": "timeCompleted", "type": "double", "doc": "timestamp in UTC (s) when the subject completes the test" }, { "name": "score", "type": "int", "doc": "THINC-it index score - out of 4000" }, { "name": "meanLatency", "type": "double", "doc": "Mean latency of correct responses expressed in millisecond" }, { "name": "timeouts", "type": "int", "doc": "The amount of time tha a subject failed to input a response within the time limit" }, { "name": "anticipations", "type": "int", "doc": "The amount of response within 100ms of stimulus presentation" }, { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, - { "name": "inputType", "type": "org.radarcns.thincit.InputType", "doc": "Dominant input type used by the subject to answer", "default": "UNKNOWN" }, + { "name": "inputType", "type": "org.radarcns.thincit.ThincItInputType", "doc": "Dominant input type used by the subject to answer", "default": "UNKNOWN" }, { "name": "details", "type": { "type": "array", @@ -26,7 +28,6 @@ } }, "doc": "Trial summaries aggregated by 10. First item reports about trial 1-10, second 11-20 and so on" - }, - { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the test is submitted to the subject" } + } ] } diff --git a/commons/thincit/symbol_check.avsc b/commons/thincit/thinc_it_symbol_check.avsc similarity index 70% rename from commons/thincit/symbol_check.avsc rename to commons/thincit/thinc_it_symbol_check.avsc index 6a800f38..5fdb3c36 100644 --- a/commons/thincit/symbol_check.avsc +++ b/commons/thincit/thinc_it_symbol_check.avsc @@ -1,15 +1,17 @@ { "namespace": "org.radarcns.thincit", "type": "record", - "name": "SymbolCheck", - "doc": "Assessment derived from Nback. 40 trials, or 2 minutes max. Each obscured symbol to be recalled is a trial.", + "name": "ThincItSymbolCheck", + "doc": "THINC-it Assessment derived from Nback. 40 trials, or 2 minutes max. Each obscured symbol to be recalled is a trial.", "fields": [ + { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the test is submitted to the subject" }, + { "name": "timeCompleted", "type": "double", "doc": "timestamp in UTC (s) when the subject completes the test" }, { "name": "score", "type": "int", "doc": "THINC-it index score - out of 4000" }, { "name": "completed", "type": "int", "doc": "The amount of completed trials" }, { "name": "correct", "type": "int", "doc": "The amount of correct responses" }, { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, { "name": "timeouts", "type": "int", "doc": "The amount of time tha a subject failed to input a response within the time limit" }, - { "name": "inputType", "type": "org.radarcns.thincit.InputType", "doc": "Dominant input type used by the subject to answer", "default": "UNKNOWN" }, + { "name": "inputType", "type": "org.radarcns.thincit.ThincItInputType", "doc": "Dominant input type used by the subject to answer", "default": "UNKNOWN" }, { "name": "details", "type": { "type": "array", @@ -21,12 +23,11 @@ { "name": "correct", "type": "int", "doc": "The amount of correct responses" }, { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, { "name": "timeouts", "type": "int", "doc": "The amount of time tha a subject failed to input a response within the time limit" }, - { "name": "inputType", "type": "org.radarcns.thincit.InputType", "doc": "Dominant input type used by the subject to answer" } + { "name": "inputType", "type": "org.radarcns.thincit.ThincItInputType", "doc": "Dominant input type used by the subject to answer" } ] } }, "doc": "Trial summaries aggregated by 10. First item reports about trial 1-10, second 11-20 and so on" - }, - { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the test is submitted to the subject" } + } ] } diff --git a/commons/thincit/trails.avsc b/commons/thincit/thinc_it_trails.avsc similarity index 73% rename from commons/thincit/trails.avsc rename to commons/thincit/thinc_it_trails.avsc index 07a3e5b6..16e37a56 100644 --- a/commons/thincit/trails.avsc +++ b/commons/thincit/thinc_it_trails.avsc @@ -1,9 +1,11 @@ { "namespace": "org.radarcns.thincit", "type": "record", - "name": "Trails", - "doc": "Assessment derived from Trail Making B. 17 trials. Each trial is the transition from one circle to another.", + "name": "ThincItTrails", + "doc": "THINC-it Assessment derived from Trail Making B. 17 trials. Each trial is the transition from one circle to another.", "fields": [ + { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the test is submitted to the subject" }, + { "name": "timeCompleted", "type": "double", "doc": "timestamp in UTC (s) when the subject completes the test" }, { "name": "score", "type": "int", "doc": "THINC-it index score - out of 4000" }, { "name": "duration", "type": "double", "doc": "Total time taken to complete the assessment" }, { "name": "layoutVersion", "type": "int", "doc": "Each play randomly select one of 40 pre-designed layouts" }, @@ -11,7 +13,6 @@ { "name": "lostContact", "type": "int", "doc": "The number of times that the mouse button has been released before transitioning successfully to next circle" }, { "name": "longestTrial", "type": "double", "doc": "Longest trial completion time expressed in millisecond" }, { "name": "iqrCompletion", "type": "int", "doc": "Mean of trial completion times within interquartile range" }, - { "name": "intervals", "type": { "type": "array", "items": "double" }, "doc": "Trial completion time in millisecond" }, - { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the test is submitted to the subject" } + { "name": "intervals", "type": { "type": "array", "items": "double" }, "doc": "Trial completion time in millisecond" } ] } From 43dece9d0c8a6636aaeee8a97a3b9be2a933e3c5 Mon Sep 17 00:00:00 2001 From: Jorge Cid Date: Mon, 10 Jul 2017 16:30:06 +0100 Subject: [PATCH 003/112] Add files via upload minor corrections to the schemas; added app version, raw data, quarter id; changed type to int when capturing time in milliseconds --- commons/thincit/code_breaker.avsc | 36 +++++++++++++++++++++++++++++++ commons/thincit/input_type.avsc | 12 +++++++++++ commons/thincit/spotter.avsc | 36 +++++++++++++++++++++++++++++++ commons/thincit/symbol_check.avsc | 35 ++++++++++++++++++++++++++++++ commons/thincit/trails.avsc | 19 ++++++++++++++++ 5 files changed, 138 insertions(+) create mode 100644 commons/thincit/code_breaker.avsc create mode 100644 commons/thincit/input_type.avsc create mode 100644 commons/thincit/spotter.avsc create mode 100644 commons/thincit/symbol_check.avsc create mode 100644 commons/thincit/trails.avsc diff --git a/commons/thincit/code_breaker.avsc b/commons/thincit/code_breaker.avsc new file mode 100644 index 00000000..b6344250 --- /dev/null +++ b/commons/thincit/code_breaker.avsc @@ -0,0 +1,36 @@ +{ + "namespace": "org.radarcns.thincit", + "type": "record", + "name": "CodeBreaker", + "doc": "Assessment derived from DSST. As many trials as can be completed within 2 minutes. Each trial is a symbol/number to be matched.", + "fields": [ + { "name": "score", "type": "int", "doc": "THINC-it index score - out of 4000" }, + { "name": "completed", "type": "int", "doc": "The amount of completed trials" }, + { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, + { "name": "longestTrial", "type": "int", "doc": "Longest trial completion time expressed in milliseconds" }, + { "name": "iqrCompletion", "type": "int", "doc": "Mean of trial completion times within interquartile range" }, + { "name": "inputType", "type": "org.radarcns.thincit.InputType", "doc": "Dominant input type used by the subject to answer", "default": "UNKNOWN" }, + { "name": "details", + "type": { + "type": "array", + "items": { + "name": "CodeBreakerSummary", + "type": "record", + "doc": "Trial summary for CodeBreaker assessment", + "fields": [ + { "name": "quarter", "type": "int", "doc": "Quarter (1,2,3 or 4)." }, + { "name": "longestTime", "type": "int", "doc": "Longest trial completion time expressed in milliseconds" }, + { "name": "meanTime", "type": "int", "doc": "Mean trial completion time expressed in milliseconds" }, + { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, + { "name": "inputType", "type": "org.radarcns.thincit.InputType", "doc": "Dominant input type used by the subject to answer" } + ] + } + }, + "doc": "List of trial summaries. First item reports about the first quarter, second about the second quarter and so on" + }, + { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the test is submitted to the subject" }, + { "name": "appVersion", "type": "int", "doc": "App version" }, + { "name": "RAW", "type": "string", "doc": "Base 64 encoded raw data." } + + ] +} diff --git a/commons/thincit/input_type.avsc b/commons/thincit/input_type.avsc new file mode 100644 index 00000000..0ed32d10 --- /dev/null +++ b/commons/thincit/input_type.avsc @@ -0,0 +1,12 @@ +{ + "namespace": "org.radarcns.thincit", + "type": "enum", + "name": "InputType", + "doc": "Possible input type that a subject can use to do an assignment", + "symbols": [ + "KEYBOARD", + "MOUSE", + "TOUCHSCREEN", + "UNKNOWN" + ] +} diff --git a/commons/thincit/spotter.avsc b/commons/thincit/spotter.avsc new file mode 100644 index 00000000..cb039bca --- /dev/null +++ b/commons/thincit/spotter.avsc @@ -0,0 +1,36 @@ +{ + "namespace": "org.radarcns.thincit", + "type": "record", + "name": "Spotter", + "doc": "Assessment derived from CRT. 40 trials, or 2 minutes max. Each trial is the presentation of a a left or right facing arrow.", + "fields": [ + { "name": "score", "type": "int", "doc": "THINC-it index score - out of 4000" }, + { "name": "meanLatency", "type": "double", "doc": "Mean latency of correct responses expressed in millisecond" }, + { "name": "timeouts", "type": "int", "doc": "The amount of time tha a subject failed to input a response within the time limit" }, + { "name": "anticipations", "type": "int", "doc": "The amount of response within 100ms of stimulus presentation" }, + { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, + { "name": "inputType", "type": "org.radarcns.thincit.InputType", "doc": "Dominant input type used by the subject to answer", "default": "UNKNOWN" }, + { "name": "details", + "type": { + "type": "array", + "items": { + "name": "SpotterSummary", + "type": "record", + "doc": "Trial summary for Spotter assessment", + "fields": [ + { "name": "quarter", "type": "int", "doc": "Quarter (1,2,3 or 4)." }, + { "name": "meanLatency", "type": "double", "doc": "Mean latency of correct responses expressed in millisecond" }, + { "name": "timeouts", "type": "int", "doc": "The amount of time tha a subject failed to input a response within the time limit" }, + { "name": "anticipations", "type": "int", "doc": "The amount of response within 100ms of stimulus presentation" }, + { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, + { "name": "inputType", "type": "org.radarcns.thincit.InputType", "doc": "Dominant input type used by the subject to answer", "default": "UNKNOWN" } + ] + } + }, + "doc": "Trial summaries aggregated by 10. First item reports about trial 1-10, second 11-20 and so on" + }, + { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the test is submitted to the subject" }, + { "name": "appVersion", "type": "int", "doc": "App version" }, + { "name": "RAW", "type": "string", "doc": "Base 64 encoded raw data." } + ] +} diff --git a/commons/thincit/symbol_check.avsc b/commons/thincit/symbol_check.avsc new file mode 100644 index 00000000..98dfcc4f --- /dev/null +++ b/commons/thincit/symbol_check.avsc @@ -0,0 +1,35 @@ +{ + "namespace": "org.radarcns.thincit", + "type": "record", + "name": "SymbolCheck", + "doc": "Assessment derived from Nback. 40 trials, or 2 minutes max. Each obscured symbol to be recalled is a trial.", + "fields": [ + { "name": "score", "type": "int", "doc": "THINC-it index score - out of 4000" }, + { "name": "completed", "type": "int", "doc": "The amount of completed trials" }, + { "name": "correct", "type": "int", "doc": "The amount of correct responses" }, + { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, + { "name": "timeouts", "type": "int", "doc": "The amount of time tha a subject failed to input a response within the time limit" }, + { "name": "inputType", "type": "org.radarcns.thincit.InputType", "doc": "Dominant input type used by the subject to answer", "default": "UNKNOWN" }, + { "name": "details", + "type": { + "type": "array", + "items": { + "name": "SymbolCheckSummary", + "type": "record", + "doc": "Trial summary for SymbolCheck assessment", + "fields": [ + { "name": "quarter", "type": "int", "doc": "Quarter (1,2,3 or 4)." }, + { "name": "correct", "type": "int", "doc": "The amount of correct responses" }, + { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, + { "name": "timeouts", "type": "int", "doc": "The amount of time that a subject failed to input a response within the time limit" }, + { "name": "inputType", "type": "org.radarcns.thincit.InputType", "doc": "Dominant input type used by the subject to answer" } + ] + } + }, + "doc": "Trial summaries aggregated by 10. First item reports about trial 1-10, second 11-20 and so on" + }, + { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the test is submitted to the subject" }, + { "name": "appVersion", "type": "int", "doc": "App version" }, + { "name": "RAW", "type": "string", "doc": "Base 64 encoded raw data." } + ] +} diff --git a/commons/thincit/trails.avsc b/commons/thincit/trails.avsc new file mode 100644 index 00000000..2eebd4ec --- /dev/null +++ b/commons/thincit/trails.avsc @@ -0,0 +1,19 @@ +{ + "namespace": "org.radarcns.thincit", + "type": "record", + "name": "Trails", + "doc": "Assessment derived from Trail Making B. 17 trials. Each trial is the transition from one circle to another.", + "fields": [ + { "name": "score", "type": "int", "doc": "THINC-it index score - out of 4000" }, + { "name": "duration", "type": "int", "doc": "Total time taken to complete the assessment in milliseconds" }, + { "name": "layoutVersion", "type": "int", "doc": "Each play randomly select one of 40 pre-designed layouts" }, + { "name": "wrongNode", "type": "int", "doc": "The number of times that the subject transitioned to an incorrect next circle before successful transition to correct next circle" }, + { "name": "lostContact", "type": "int", "doc": "The number of times that the mouse button has been released before transitioning successfully to next circle" }, + { "name": "longestTrial", "type": "int", "doc": "Longest trial completion time expressed in millisecond" }, + { "name": "iqrCompletion", "type": "int", "doc": "Mean of trial completion times within interquartile range" }, + { "name": "intervals", "type": { "type": "array", "items": "int" }, "doc": "Trial completion time in milliseconds" }, + { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the test is submitted to the subject" }, + { "name": "appVersion", "type": "int", "doc": "app version" }, + { "name": "RAW", "type": "string", "doc": "Base 64 encoded raw data." } + ] +} From e6acec7cc8dd1bfa7a3c42e20c1b4da9d3f41f36 Mon Sep 17 00:00:00 2001 From: Jorge Cid Date: Mon, 10 Jul 2017 17:54:12 +0100 Subject: [PATCH 004/112] rename thinc_it_input_type.avsc --- .../thincit/{thinc_it_inpu_type.avsc => thinc_it_input_type.avsc} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename commons/thincit/{thinc_it_inpu_type.avsc => thinc_it_input_type.avsc} (100%) diff --git a/commons/thincit/thinc_it_inpu_type.avsc b/commons/thincit/thinc_it_input_type.avsc similarity index 100% rename from commons/thincit/thinc_it_inpu_type.avsc rename to commons/thincit/thinc_it_input_type.avsc From 7afdf4f18b651ccaad6244ccfa624e8701cf0cda Mon Sep 17 00:00:00 2001 From: Jorge Cid Date: Mon, 10 Jul 2017 18:05:52 +0100 Subject: [PATCH 005/112] merge duplicate files --- commons/thincit/code_breaker.avsc | 36 ---------------------- commons/thincit/input_type.avsc | 12 -------- commons/thincit/spotter.avsc | 36 ---------------------- commons/thincit/symbol_check.avsc | 35 --------------------- commons/thincit/thinc_it_code_breaker.avsc | 15 +++++---- commons/thincit/thinc_it_spotter.avsc | 12 +++++--- commons/thincit/thinc_it_symbol_check.avsc | 5 ++- commons/thincit/thinc_it_trails.avsc | 8 +++-- commons/thincit/trails.avsc | 19 ------------ 9 files changed, 26 insertions(+), 152 deletions(-) delete mode 100644 commons/thincit/code_breaker.avsc delete mode 100644 commons/thincit/input_type.avsc delete mode 100644 commons/thincit/spotter.avsc delete mode 100644 commons/thincit/symbol_check.avsc delete mode 100644 commons/thincit/trails.avsc diff --git a/commons/thincit/code_breaker.avsc b/commons/thincit/code_breaker.avsc deleted file mode 100644 index b6344250..00000000 --- a/commons/thincit/code_breaker.avsc +++ /dev/null @@ -1,36 +0,0 @@ -{ - "namespace": "org.radarcns.thincit", - "type": "record", - "name": "CodeBreaker", - "doc": "Assessment derived from DSST. As many trials as can be completed within 2 minutes. Each trial is a symbol/number to be matched.", - "fields": [ - { "name": "score", "type": "int", "doc": "THINC-it index score - out of 4000" }, - { "name": "completed", "type": "int", "doc": "The amount of completed trials" }, - { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, - { "name": "longestTrial", "type": "int", "doc": "Longest trial completion time expressed in milliseconds" }, - { "name": "iqrCompletion", "type": "int", "doc": "Mean of trial completion times within interquartile range" }, - { "name": "inputType", "type": "org.radarcns.thincit.InputType", "doc": "Dominant input type used by the subject to answer", "default": "UNKNOWN" }, - { "name": "details", - "type": { - "type": "array", - "items": { - "name": "CodeBreakerSummary", - "type": "record", - "doc": "Trial summary for CodeBreaker assessment", - "fields": [ - { "name": "quarter", "type": "int", "doc": "Quarter (1,2,3 or 4)." }, - { "name": "longestTime", "type": "int", "doc": "Longest trial completion time expressed in milliseconds" }, - { "name": "meanTime", "type": "int", "doc": "Mean trial completion time expressed in milliseconds" }, - { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, - { "name": "inputType", "type": "org.radarcns.thincit.InputType", "doc": "Dominant input type used by the subject to answer" } - ] - } - }, - "doc": "List of trial summaries. First item reports about the first quarter, second about the second quarter and so on" - }, - { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the test is submitted to the subject" }, - { "name": "appVersion", "type": "int", "doc": "App version" }, - { "name": "RAW", "type": "string", "doc": "Base 64 encoded raw data." } - - ] -} diff --git a/commons/thincit/input_type.avsc b/commons/thincit/input_type.avsc deleted file mode 100644 index 0ed32d10..00000000 --- a/commons/thincit/input_type.avsc +++ /dev/null @@ -1,12 +0,0 @@ -{ - "namespace": "org.radarcns.thincit", - "type": "enum", - "name": "InputType", - "doc": "Possible input type that a subject can use to do an assignment", - "symbols": [ - "KEYBOARD", - "MOUSE", - "TOUCHSCREEN", - "UNKNOWN" - ] -} diff --git a/commons/thincit/spotter.avsc b/commons/thincit/spotter.avsc deleted file mode 100644 index cb039bca..00000000 --- a/commons/thincit/spotter.avsc +++ /dev/null @@ -1,36 +0,0 @@ -{ - "namespace": "org.radarcns.thincit", - "type": "record", - "name": "Spotter", - "doc": "Assessment derived from CRT. 40 trials, or 2 minutes max. Each trial is the presentation of a a left or right facing arrow.", - "fields": [ - { "name": "score", "type": "int", "doc": "THINC-it index score - out of 4000" }, - { "name": "meanLatency", "type": "double", "doc": "Mean latency of correct responses expressed in millisecond" }, - { "name": "timeouts", "type": "int", "doc": "The amount of time tha a subject failed to input a response within the time limit" }, - { "name": "anticipations", "type": "int", "doc": "The amount of response within 100ms of stimulus presentation" }, - { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, - { "name": "inputType", "type": "org.radarcns.thincit.InputType", "doc": "Dominant input type used by the subject to answer", "default": "UNKNOWN" }, - { "name": "details", - "type": { - "type": "array", - "items": { - "name": "SpotterSummary", - "type": "record", - "doc": "Trial summary for Spotter assessment", - "fields": [ - { "name": "quarter", "type": "int", "doc": "Quarter (1,2,3 or 4)." }, - { "name": "meanLatency", "type": "double", "doc": "Mean latency of correct responses expressed in millisecond" }, - { "name": "timeouts", "type": "int", "doc": "The amount of time tha a subject failed to input a response within the time limit" }, - { "name": "anticipations", "type": "int", "doc": "The amount of response within 100ms of stimulus presentation" }, - { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, - { "name": "inputType", "type": "org.radarcns.thincit.InputType", "doc": "Dominant input type used by the subject to answer", "default": "UNKNOWN" } - ] - } - }, - "doc": "Trial summaries aggregated by 10. First item reports about trial 1-10, second 11-20 and so on" - }, - { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the test is submitted to the subject" }, - { "name": "appVersion", "type": "int", "doc": "App version" }, - { "name": "RAW", "type": "string", "doc": "Base 64 encoded raw data." } - ] -} diff --git a/commons/thincit/symbol_check.avsc b/commons/thincit/symbol_check.avsc deleted file mode 100644 index 98dfcc4f..00000000 --- a/commons/thincit/symbol_check.avsc +++ /dev/null @@ -1,35 +0,0 @@ -{ - "namespace": "org.radarcns.thincit", - "type": "record", - "name": "SymbolCheck", - "doc": "Assessment derived from Nback. 40 trials, or 2 minutes max. Each obscured symbol to be recalled is a trial.", - "fields": [ - { "name": "score", "type": "int", "doc": "THINC-it index score - out of 4000" }, - { "name": "completed", "type": "int", "doc": "The amount of completed trials" }, - { "name": "correct", "type": "int", "doc": "The amount of correct responses" }, - { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, - { "name": "timeouts", "type": "int", "doc": "The amount of time tha a subject failed to input a response within the time limit" }, - { "name": "inputType", "type": "org.radarcns.thincit.InputType", "doc": "Dominant input type used by the subject to answer", "default": "UNKNOWN" }, - { "name": "details", - "type": { - "type": "array", - "items": { - "name": "SymbolCheckSummary", - "type": "record", - "doc": "Trial summary for SymbolCheck assessment", - "fields": [ - { "name": "quarter", "type": "int", "doc": "Quarter (1,2,3 or 4)." }, - { "name": "correct", "type": "int", "doc": "The amount of correct responses" }, - { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, - { "name": "timeouts", "type": "int", "doc": "The amount of time that a subject failed to input a response within the time limit" }, - { "name": "inputType", "type": "org.radarcns.thincit.InputType", "doc": "Dominant input type used by the subject to answer" } - ] - } - }, - "doc": "Trial summaries aggregated by 10. First item reports about trial 1-10, second 11-20 and so on" - }, - { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the test is submitted to the subject" }, - { "name": "appVersion", "type": "int", "doc": "App version" }, - { "name": "RAW", "type": "string", "doc": "Base 64 encoded raw data." } - ] -} diff --git a/commons/thincit/thinc_it_code_breaker.avsc b/commons/thincit/thinc_it_code_breaker.avsc index 0bb9ade7..2eeeb335 100644 --- a/commons/thincit/thinc_it_code_breaker.avsc +++ b/commons/thincit/thinc_it_code_breaker.avsc @@ -2,14 +2,14 @@ "namespace": "org.radarcns.thincit", "type": "record", "name": "ThincItCodeBreaker", - "doc": "THINC-it Assessment derived from DSST. As many trials as can be completed within 2 minutes. E ach trial is a symbol/number to be matched.", + "doc": "THINC-it Assessment derived from DSST. As many trials as can be completed within 2 minutes. Each trial is a symbol/number to be matched.", "fields": [ { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the test is submitted to the subject" }, { "name": "timeCompleted", "type": "double", "doc": "timestamp in UTC (s) when the subject completes the test" }, { "name": "score", "type": "int", "doc": "THINC-it index score - out of 4000" }, { "name": "completed", "type": "int", "doc": "The amount of completed trials" }, { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, - { "name": "longestTrial", "type": "double", "doc": "Longest trial completion time expressed in millisecond" }, + { "name": "longestTrial", "type": "int", "doc": "Longest trial completion time expressed in milliseconds" }, { "name": "iqrCompletion", "type": "int", "doc": "Mean of trial completion times within interquartile range" }, { "name": "inputType", "type": "org.radarcns.thincit.ThincItInputType", "doc": "Dominant input type used by the subject to answer", "default": "UNKNOWN" }, { "name": "quarterSummaries", @@ -20,14 +20,17 @@ "type": "record", "doc": "Trial summary for CodeBreaker assessment", "fields": [ - { "name": "longestTrial", "type": "double", "doc": "Longest trial completion time expressed in millisecond" }, - { "name": "meanTime", "type": "double", "doc": "Mean trial completion time expressed in millisecond" }, - { "name": "correct", "type": "int", "doc": "The amount of correct responses" }, + { "name": "quarter", "type": "int", "doc": "Quarter (1,2,3 or 4)." }, + { "name": "longestTime", "type": "int", "doc": "Longest trial completion time expressed in milliseconds" }, + { "name": "meanTime", "type": "int", "doc": "Mean trial completion time expressed in milliseconds" }, + { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, { "name": "inputType", "type": "org.radarcns.thincit.ThincItInputType", "doc": "Dominant input type used by the subject to answer" } ] } }, "doc": "List of trial summaries. First item reports about the first quarter, second about the second quarter and so on" - } + }, + { "name": "appVersion", "type": "int", "doc": "App version" }, + { "name": "RAW", "type": "string", "doc": "Base 64 encoded raw data." } ] } diff --git a/commons/thincit/thinc_it_spotter.avsc b/commons/thincit/thinc_it_spotter.avsc index 9b7460a2..d8e73fae 100644 --- a/commons/thincit/thinc_it_spotter.avsc +++ b/commons/thincit/thinc_it_spotter.avsc @@ -7,7 +7,7 @@ { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the test is submitted to the subject" }, { "name": "timeCompleted", "type": "double", "doc": "timestamp in UTC (s) when the subject completes the test" }, { "name": "score", "type": "int", "doc": "THINC-it index score - out of 4000" }, - { "name": "meanLatency", "type": "double", "doc": "Mean latency of correct responses expressed in millisecond" }, + { "name": "meanLatency", "type": "int", "doc": "Mean latency of correct responses expressed in milliseconds" }, { "name": "timeouts", "type": "int", "doc": "The amount of time tha a subject failed to input a response within the time limit" }, { "name": "anticipations", "type": "int", "doc": "The amount of response within 100ms of stimulus presentation" }, { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, @@ -20,14 +20,18 @@ "type": "record", "doc": "Trial summary for Spotter assessment", "fields": [ - { "name": "meanLatency", "type": "double", "doc": "Mean latency of correct responses expressed in millisecond" }, + { "name": "quarter", "type": "int", "doc": "Quarter (1,2,3 or 4)." }, + { "name": "meanLatency", "type": "double", "doc": "Mean latency of correct responses expressed in milliseconds" }, { "name": "timeouts", "type": "int", "doc": "The amount of time tha a subject failed to input a response within the time limit" }, { "name": "anticipations", "type": "int", "doc": "The amount of response within 100ms of stimulus presentation" }, - { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" } + { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, + { "name": "inputType", "type": "org.radarcns.thincit.ThincItInputType", "doc": "Dominant input type used by the subject to answer", "default": "UNKNOWN" } ] } }, "doc": "Trial summaries aggregated by 10. First item reports about trial 1-10, second 11-20 and so on" - } + }, + { "name": "appVersion", "type": "int", "doc": "App version" }, + { "name": "RAW", "type": "string", "doc": "Base 64 encoded raw data." } ] } diff --git a/commons/thincit/thinc_it_symbol_check.avsc b/commons/thincit/thinc_it_symbol_check.avsc index 5fdb3c36..fb91d627 100644 --- a/commons/thincit/thinc_it_symbol_check.avsc +++ b/commons/thincit/thinc_it_symbol_check.avsc @@ -20,6 +20,7 @@ "type": "record", "doc": "Trial summary for SymbolCheck assessment", "fields": [ + { "name": "quarter", "type": "int", "doc": "Quarter (1,2,3 or 4)." }, { "name": "correct", "type": "int", "doc": "The amount of correct responses" }, { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, { "name": "timeouts", "type": "int", "doc": "The amount of time tha a subject failed to input a response within the time limit" }, @@ -28,6 +29,8 @@ } }, "doc": "Trial summaries aggregated by 10. First item reports about trial 1-10, second 11-20 and so on" - } + }, + { "name": "appVersion", "type": "int", "doc": "App version" }, + { "name": "RAW", "type": "string", "doc": "Base 64 encoded raw data." } ] } diff --git a/commons/thincit/thinc_it_trails.avsc b/commons/thincit/thinc_it_trails.avsc index 16e37a56..9eb450db 100644 --- a/commons/thincit/thinc_it_trails.avsc +++ b/commons/thincit/thinc_it_trails.avsc @@ -7,12 +7,14 @@ { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the test is submitted to the subject" }, { "name": "timeCompleted", "type": "double", "doc": "timestamp in UTC (s) when the subject completes the test" }, { "name": "score", "type": "int", "doc": "THINC-it index score - out of 4000" }, - { "name": "duration", "type": "double", "doc": "Total time taken to complete the assessment" }, + { "name": "duration", "type": "int", "doc": "Total time taken to complete the assessment in milliseconds" }, { "name": "layoutVersion", "type": "int", "doc": "Each play randomly select one of 40 pre-designed layouts" }, { "name": "wrongNode", "type": "int", "doc": "The number of times that the subject transitioned to an incorrect next circle before successful transition to correct next circle" }, { "name": "lostContact", "type": "int", "doc": "The number of times that the mouse button has been released before transitioning successfully to next circle" }, - { "name": "longestTrial", "type": "double", "doc": "Longest trial completion time expressed in millisecond" }, + { "name": "longestTrial", "type": "int", "doc": "Longest trial completion time expressed in milliseconds" }, { "name": "iqrCompletion", "type": "int", "doc": "Mean of trial completion times within interquartile range" }, - { "name": "intervals", "type": { "type": "array", "items": "double" }, "doc": "Trial completion time in millisecond" } + { "name": "intervals", "type": { "type": "array", "items": "int" }, "doc": "Trial completion time in milliseconds" }, + { "name": "appVersion", "type": "int", "doc": "app version" }, + { "name": "RAW", "type": "string", "doc": "Base 64 encoded raw data." } ] } diff --git a/commons/thincit/trails.avsc b/commons/thincit/trails.avsc deleted file mode 100644 index 2eebd4ec..00000000 --- a/commons/thincit/trails.avsc +++ /dev/null @@ -1,19 +0,0 @@ -{ - "namespace": "org.radarcns.thincit", - "type": "record", - "name": "Trails", - "doc": "Assessment derived from Trail Making B. 17 trials. Each trial is the transition from one circle to another.", - "fields": [ - { "name": "score", "type": "int", "doc": "THINC-it index score - out of 4000" }, - { "name": "duration", "type": "int", "doc": "Total time taken to complete the assessment in milliseconds" }, - { "name": "layoutVersion", "type": "int", "doc": "Each play randomly select one of 40 pre-designed layouts" }, - { "name": "wrongNode", "type": "int", "doc": "The number of times that the subject transitioned to an incorrect next circle before successful transition to correct next circle" }, - { "name": "lostContact", "type": "int", "doc": "The number of times that the mouse button has been released before transitioning successfully to next circle" }, - { "name": "longestTrial", "type": "int", "doc": "Longest trial completion time expressed in millisecond" }, - { "name": "iqrCompletion", "type": "int", "doc": "Mean of trial completion times within interquartile range" }, - { "name": "intervals", "type": { "type": "array", "items": "int" }, "doc": "Trial completion time in milliseconds" }, - { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the test is submitted to the subject" }, - { "name": "appVersion", "type": "int", "doc": "app version" }, - { "name": "RAW", "type": "string", "doc": "Base 64 encoded raw data." } - ] -} From 14e8c0b63093a44fda2f1da779f5c03eb097abec Mon Sep 17 00:00:00 2001 From: Jorge Cid Date: Tue, 11 Jul 2017 16:48:07 +0100 Subject: [PATCH 006/112] style guide changes; --- commons/thincit/thinc_it_code_breaker.avsc | 45 ++++++++++---------- commons/thincit/thinc_it_spotter.avsc | 48 ++++++++++----------- commons/thincit/thinc_it_symbol_check.avsc | 49 ++++++++++------------ commons/thincit/thinc_it_trails.avsc | 23 ++++++++-- 4 files changed, 83 insertions(+), 82 deletions(-) diff --git a/commons/thincit/thinc_it_code_breaker.avsc b/commons/thincit/thinc_it_code_breaker.avsc index 2eeeb335..15f48316 100644 --- a/commons/thincit/thinc_it_code_breaker.avsc +++ b/commons/thincit/thinc_it_code_breaker.avsc @@ -2,35 +2,32 @@ "namespace": "org.radarcns.thincit", "type": "record", "name": "ThincItCodeBreaker", - "doc": "THINC-it Assessment derived from DSST. As many trials as can be completed within 2 minutes. Each trial is a symbol/number to be matched.", + "doc": "THINC-it Assessment derived from Digit Symbol Substitution Test. As many trials as can be completed within 2 minutes. Each trial is a symbol/number to be matched.", "fields": [ { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the test is submitted to the subject" }, { "name": "timeCompleted", "type": "double", "doc": "timestamp in UTC (s) when the subject completes the test" }, - { "name": "score", "type": "int", "doc": "THINC-it index score - out of 4000" }, - { "name": "completed", "type": "int", "doc": "The amount of completed trials" }, - { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, + { "name": "score", "type": "int", "doc": "THINC-it index score - 0 to 4000" }, + { "name": "completed", "type": "int", "doc": "The number of completed trials" }, + { "name": "incorrect", "type": "int", "doc": "The number of incorrect responses" }, { "name": "longestTrial", "type": "int", "doc": "Longest trial completion time expressed in milliseconds" }, { "name": "iqrCompletion", "type": "int", "doc": "Mean of trial completion times within interquartile range" }, { "name": "inputType", "type": "org.radarcns.thincit.ThincItInputType", "doc": "Dominant input type used by the subject to answer", "default": "UNKNOWN" }, - { "name": "quarterSummaries", - "type": { - "type": "array", - "items": { - "name": "CodeBreakerSummary", - "type": "record", - "doc": "Trial summary for CodeBreaker assessment", - "fields": [ - { "name": "quarter", "type": "int", "doc": "Quarter (1,2,3 or 4)." }, - { "name": "longestTime", "type": "int", "doc": "Longest trial completion time expressed in milliseconds" }, - { "name": "meanTime", "type": "int", "doc": "Mean trial completion time expressed in milliseconds" }, - { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, - { "name": "inputType", "type": "org.radarcns.thincit.ThincItInputType", "doc": "Dominant input type used by the subject to answer" } - ] - } - }, - "doc": "List of trial summaries. First item reports about the first quarter, second about the second quarter and so on" - }, - { "name": "appVersion", "type": "int", "doc": "App version" }, - { "name": "RAW", "type": "string", "doc": "Base 64 encoded raw data." } + { "name": "quarterSummaryOne", "type": + { + "type": "record", + "name": "ThincItCodeBreakerQuarterSummary", + "doc": "Trial summary for CodeBreaker assessment", + "fields": [ + { "name": "longestTrial", "type": "int", "doc": "Longest trial completion time expressed in milliseconds" }, + { "name": "meanTime", "type": "int", "doc": "Mean trial completion time expressed in milliseconds" }, + { "name": "incorrect", "type": "int", "doc": "The number of incorrect responses" }, + { "name": "inputType", "type": "org.radarcns.thincit.ThincItInputType", "doc": "Dominant input type used by the subject to answer" } + ] + } + , "doc": "Trial summary for CodeBreaker assessment Quarter 1"}, + { "name": "quarterSummaryTwo", "type": "org.radarcns.thincit.ThincItCodeBreakerQuarterSummary", "doc": "Trial summary for CodeBreaker assessment Quarter 2"}, + { "name": "quarterSummaryThree", "type": "org.radarcns.thincit.ThincItCodeBreakerQuarterSummary", "doc": "Trial summary for CodeBreaker assessment Quarter 3"}, + { "name": "quarterSummaryFour", "type": "org.radarcns.thincit.ThincItCodeBreakerQuarterSummary", "doc": "Trial summary for CodeBreaker assessment Quarter 4"}, + { "name": "appVersion", "type": "int", "doc": "App version" } ] } diff --git a/commons/thincit/thinc_it_spotter.avsc b/commons/thincit/thinc_it_spotter.avsc index d8e73fae..c752d26a 100644 --- a/commons/thincit/thinc_it_spotter.avsc +++ b/commons/thincit/thinc_it_spotter.avsc @@ -2,36 +2,30 @@ "namespace": "org.radarcns.thincit", "type": "record", "name": "ThincItSpotter", - "doc": "THINC-it Assessment derived from CRT. 40 trials, or 2 minutes max. Each trial is the presentation of a a left or right facing arrow.", + "doc": "THINC-it Assessment derived from Choice Reaction Time test. 40 trials, or 2 minutes max. Each trial is the presentation of a a left or right facing arrow.", "fields": [ { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the test is submitted to the subject" }, { "name": "timeCompleted", "type": "double", "doc": "timestamp in UTC (s) when the subject completes the test" }, - { "name": "score", "type": "int", "doc": "THINC-it index score - out of 4000" }, + { "name": "score", "type": "int", "doc": "THINC-it index score - 0 to 4000" }, { "name": "meanLatency", "type": "int", "doc": "Mean latency of correct responses expressed in milliseconds" }, - { "name": "timeouts", "type": "int", "doc": "The amount of time tha a subject failed to input a response within the time limit" }, - { "name": "anticipations", "type": "int", "doc": "The amount of response within 100ms of stimulus presentation" }, - { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, + { "name": "timeouts", "type": "int", "doc": "The number of times that a subject failed to input a response within the time limit" }, + { "name": "anticipations", "type": "int", "doc": "The number of responses within 100ms of stimulus presentation" }, + { "name": "incorrect", "type": "int", "doc": "The number of incorrect responses" }, { "name": "inputType", "type": "org.radarcns.thincit.ThincItInputType", "doc": "Dominant input type used by the subject to answer", "default": "UNKNOWN" }, - { "name": "details", - "type": { - "type": "array", - "items": { - "name": "SpotterSummary", - "type": "record", - "doc": "Trial summary for Spotter assessment", - "fields": [ - { "name": "quarter", "type": "int", "doc": "Quarter (1,2,3 or 4)." }, - { "name": "meanLatency", "type": "double", "doc": "Mean latency of correct responses expressed in milliseconds" }, - { "name": "timeouts", "type": "int", "doc": "The amount of time tha a subject failed to input a response within the time limit" }, - { "name": "anticipations", "type": "int", "doc": "The amount of response within 100ms of stimulus presentation" }, - { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, - { "name": "inputType", "type": "org.radarcns.thincit.ThincItInputType", "doc": "Dominant input type used by the subject to answer", "default": "UNKNOWN" } - ] - } - }, - "doc": "Trial summaries aggregated by 10. First item reports about trial 1-10, second 11-20 and so on" - }, - { "name": "appVersion", "type": "int", "doc": "App version" }, - { "name": "RAW", "type": "string", "doc": "Base 64 encoded raw data." } + { "name": "quarterSummaryOne", "type": { + "type": "record", + "name": "ThincItSpotterQuarterSummary", + "doc": "Trial summary for SymbolCheck assessment", + "fields": [ + { "name": "timeouts", "type": "int", "doc": "The number of times that a subject failed to input a response within the time limit" }, + { "name": "anticipations", "type": "int", "doc": "The number of responses within 100ms of stimulus presentation" }, + { "name": "incorrect", "type": "int", "doc": "The number of incorrect responses" }, + { "name": "inputType", "type": "org.radarcns.thincit.ThincItInputType", "doc": "Dominant input type used by the subject to answer", "default": "UNKNOWN" } + ] + } , "doc": "Trial summary for SymbolCheck assessment Quarter 1"}, + { "name": "quarterSummaryTwo", "type": "org.radarcns.thincit.ThincItSpotterQuarterSummary", "doc": "Trial summary for SymbolCheck assessment Quarter 2"}, + { "name": "quarterSummaryThree", "type": "org.radarcns.thincit.ThincItSpotterQuarterSummary", "doc": "Trial summary for SymbolCheck assessment Quarter 3"}, + { "name": "quarterSummaryFour", "type": "org.radarcns.thincit.ThincItSpotterQuarterSummary", "doc": "Trial summary for SymbolCheck assessment Quarter 4"}, + { "name": "appVersion", "type": "int", "doc": "App version" } ] -} +} \ No newline at end of file diff --git a/commons/thincit/thinc_it_symbol_check.avsc b/commons/thincit/thinc_it_symbol_check.avsc index fb91d627..c24724bf 100644 --- a/commons/thincit/thinc_it_symbol_check.avsc +++ b/commons/thincit/thinc_it_symbol_check.avsc @@ -2,35 +2,30 @@ "namespace": "org.radarcns.thincit", "type": "record", "name": "ThincItSymbolCheck", - "doc": "THINC-it Assessment derived from Nback. 40 trials, or 2 minutes max. Each obscured symbol to be recalled is a trial.", + "doc": "THINC-it Assessment derived from NBack. 40 trials, or 2 minutes max. Each obscured symbol to be recalled is a trial.", "fields": [ { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the test is submitted to the subject" }, { "name": "timeCompleted", "type": "double", "doc": "timestamp in UTC (s) when the subject completes the test" }, - { "name": "score", "type": "int", "doc": "THINC-it index score - out of 4000" }, - { "name": "completed", "type": "int", "doc": "The amount of completed trials" }, - { "name": "correct", "type": "int", "doc": "The amount of correct responses" }, - { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, - { "name": "timeouts", "type": "int", "doc": "The amount of time tha a subject failed to input a response within the time limit" }, + { "name": "score", "type": "int", "doc": "THINC-it index score - 0 to 4000" }, + { "name": "completed", "type": "int", "doc": "The number of completed trials" }, + { "name": "correct", "type": "int", "doc": "The number of correct responses" }, + { "name": "incorrect", "type": "int", "doc": "The number of incorrect responses" }, + { "name": "timeouts", "type": "int", "doc": "The number of times that a subject failed to input a response within the time limit" }, { "name": "inputType", "type": "org.radarcns.thincit.ThincItInputType", "doc": "Dominant input type used by the subject to answer", "default": "UNKNOWN" }, - { "name": "details", - "type": { - "type": "array", - "items": { - "name": "SymbolCheckSummary", - "type": "record", - "doc": "Trial summary for SymbolCheck assessment", - "fields": [ - { "name": "quarter", "type": "int", "doc": "Quarter (1,2,3 or 4)." }, - { "name": "correct", "type": "int", "doc": "The amount of correct responses" }, - { "name": "incorrect", "type": "int", "doc": "The amount of incorrect responses" }, - { "name": "timeouts", "type": "int", "doc": "The amount of time tha a subject failed to input a response within the time limit" }, - { "name": "inputType", "type": "org.radarcns.thincit.ThincItInputType", "doc": "Dominant input type used by the subject to answer" } - ] - } - }, - "doc": "Trial summaries aggregated by 10. First item reports about trial 1-10, second 11-20 and so on" - }, - { "name": "appVersion", "type": "int", "doc": "App version" }, - { "name": "RAW", "type": "string", "doc": "Base 64 encoded raw data." } + { "name": "quarterSummaryOne", "type": { + "type": "record", + "name": "ThincItSymbolCheckQuarterSummary", + "doc": "Trial summary for SymbolCheck assessment", + "fields": [ + { "name": "correct", "type": "int", "doc": "The amount of correct responses" }, + { "name": "incorrect", "type": "int", "doc": "The number of incorrect responses" }, + { "name": "timeouts", "type": "int", "doc": "The number of times that a subject failed to input a response within the time limit" }, + { "name": "inputType", "type": "org.radarcns.thincit.ThincItInputType", "doc": "Dominant input type used by the subject to answer" } + ] + } , "doc": "Trial summary for SymbolCheck assessment Quarter 1"}, + { "name": "quarterSummaryTwo", "type": "org.radarcns.thincit.ThincItSymbolCheckQuarterSummary", "doc": "Trial summary for SymbolCheck assessment Quarter 2"}, + { "name": "quarterSummaryThree", "type": "org.radarcns.thincit.ThincItSymbolCheckQuarterSummary", "doc": "Trial summary for SymbolCheck assessment Quarter 3"}, + { "name": "quarterSummaryFour", "type": "org.radarcns.thincit.ThincItSymbolCheckQuarterSummary", "doc": "Trial summary for SymbolCheck assessment Quarter 4"}, + { "name": "appVersion", "type": "int", "doc": "App version" } ] -} +} \ No newline at end of file diff --git a/commons/thincit/thinc_it_trails.avsc b/commons/thincit/thinc_it_trails.avsc index 9eb450db..dced56ef 100644 --- a/commons/thincit/thinc_it_trails.avsc +++ b/commons/thincit/thinc_it_trails.avsc @@ -6,15 +6,30 @@ "fields": [ { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the test is submitted to the subject" }, { "name": "timeCompleted", "type": "double", "doc": "timestamp in UTC (s) when the subject completes the test" }, - { "name": "score", "type": "int", "doc": "THINC-it index score - out of 4000" }, + { "name": "score", "type": "int", "doc": "THINC-it index score - 0 to 4000" }, { "name": "duration", "type": "int", "doc": "Total time taken to complete the assessment in milliseconds" }, { "name": "layoutVersion", "type": "int", "doc": "Each play randomly select one of 40 pre-designed layouts" }, { "name": "wrongNode", "type": "int", "doc": "The number of times that the subject transitioned to an incorrect next circle before successful transition to correct next circle" }, { "name": "lostContact", "type": "int", "doc": "The number of times that the mouse button has been released before transitioning successfully to next circle" }, { "name": "longestTrial", "type": "int", "doc": "Longest trial completion time expressed in milliseconds" }, { "name": "iqrCompletion", "type": "int", "doc": "Mean of trial completion times within interquartile range" }, - { "name": "intervals", "type": { "type": "array", "items": "int" }, "doc": "Trial completion time in milliseconds" }, - { "name": "appVersion", "type": "int", "doc": "app version" }, - { "name": "RAW", "type": "string", "doc": "Base 64 encoded raw data." } + { "name": "intervalOne", "type": "int", "doc": "Trial completion time in milliseconds" }, + { "name": "intervalTwo", "type": "int", "doc": "Trial completion time in milliseconds" }, + { "name": "intervalThree", "type": "int", "doc": "Trial completion time in milliseconds" }, + { "name": "intervalFour", "type": "int", "doc": "Trial completion time in milliseconds" }, + { "name": "intervalFive", "type": "int", "doc": "Trial completion time in milliseconds" }, + { "name": "intervalSix", "type": "int", "doc": "Trial completion time in milliseconds" }, + { "name": "intervalSeven", "type": "int", "doc": "Trial completion time in milliseconds" }, + { "name": "intervalEight", "type": "int", "doc": "Trial completion time in milliseconds" }, + { "name": "intervalNine", "type": "int", "doc": "Trial completion time in milliseconds" }, + { "name": "intervalTen", "type": "int", "doc": "Trial completion time in milliseconds" }, + { "name": "intervalEleven", "type": "int", "doc": "Trial completion time in milliseconds" }, + { "name": "intervalTwelve", "type": "int", "doc": "Trial completion time in milliseconds" }, + { "name": "intervalThirteen", "type": "int", "doc": "Trial completion time in milliseconds" }, + { "name": "intervalFourteen", "type": "int", "doc": "Trial completion time in milliseconds" }, + { "name": "intervalFifteen", "type": "int", "doc": "Trial completion time in milliseconds" }, + { "name": "intervalSixteen", "type": "int", "doc": "Trial completion time in milliseconds" }, + { "name": "intervalSeventeen", "type": "int", "doc": "Trial completion time in milliseconds" }, + { "name": "appVersion", "type": "int", "doc": "app version" } ] } From c922763a4f877247d3b31bc139375853034cbb8f Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Thu, 20 Jul 2017 18:00:03 +0100 Subject: [PATCH 007/112] Initial commit with new folder structure --- commons/README.md | 9 ++ .../questionnaire/questionnaire.avsc | 2 +- .../aggregator/double_aggregator.avsc | 2 +- .../aggregator/double_array_aggregator.avsc | 4 +- commons/{ => kafka}/key/measurement_key.avsc | 2 +- commons/{ => kafka}/key/windowed_key.avsc | 2 +- .../application_external_time.avsc | 5 +- .../application_record_counts.avsc | 5 +- .../application_server_status.avsc | 3 +- .../application/application_uptime.avsc | 3 +- .../biovotion/biovotion_vsm_acceleration.avsc | 4 +- .../biovotion_vsm_battery_state.avsc | 2 +- .../biovotion_vsm_blood_pulse_wave.avsc | 2 +- .../biovotion/biovotion_vsm_energy.avsc | 2 +- .../biovotion_vsm_galvanic_skin_response.avsc | 2 +- .../biovotion/biovotion_vsm_heart_rate.avsc | 2 +- .../biovotion_vsm_heart_rate_variability.avsc | 2 +- .../biovotion/biovotion_vsm_led_current.avsc | 2 +- .../biovotion/biovotion_vsm_ppg_raw.avsc | 2 +- .../biovotion_vsm_respiration_rate.avsc | 2 +- .../biovotion/biovotion_vsm_spo2.avsc | 2 +- .../biovotion/biovotion_vsm_temperature.avsc | 2 +- .../empatica/empatica_e4_acceleration.avsc | 2 +- .../empatica/empatica_e4_battery_level.avsc | 2 +- .../empatica_e4_blood_volume_pulse.avsc | 4 +- .../empatica_e4_electrodermal_activity.avsc | 2 +- .../empatica_e4_inter_beat_interval.avsc | 2 +- .../empatica/empatica_e4_sensor_status.avsc | 2 +- .../empatica/empatica_e4_tag.avsc | 2 +- .../empatica/empatica_e4_temperature.avsc | 4 +- .../pebble/pebble2_acceleration.avsc | 2 +- .../pebble/pebble2_battery_level.avsc | 2 +- .../pebble/pebble2_heart_rate.avsc | 2 +- .../pebble/pebble2_heart_rate_filtered.avsc | 2 +- .../phone/phone_acceleration.avsc | 2 +- .../phone/phone_battery_level.avsc | 2 +- commons/{ => passive}/phone/phone_call.avsc | 2 +- .../{ => passive}/phone/phone_gyroscope.avsc | 2 +- commons/{ => passive}/phone/phone_light.avsc | 2 +- .../phone/phone_magnetic_field.avsc | 2 +- .../phone/phone_relative_location.avsc | 4 +- commons/{ => passive}/phone/phone_sms.avsc | 2 +- .../{ => passive}/phone/phone_sms_unread.avsc | 2 +- .../{ => passive}/phone/phone_step_count.avsc | 2 +- .../phone/phone_usage_event.avsc | 2 +- .../phone/phone_user_interaction.avsc | 2 +- questionnaire/README.md | 61 ------- questionnaire/specification/DEMO_config.json | 42 ----- questionnaire/specification/PHQ8_config.json | 149 ------------------ restapi/README.md | 3 + specification/README.md | 8 + 51 files changed, 72 insertions(+), 308 deletions(-) create mode 100644 commons/README.md rename commons/{ => active}/questionnaire/questionnaire.avsc (96%) rename commons/{ => kafka}/aggregator/double_aggregator.avsc (91%) rename commons/{ => kafka}/aggregator/double_array_aggregator.avsc (92%) rename commons/{ => kafka}/key/measurement_key.avsc (86%) rename commons/{ => kafka}/key/windowed_key.avsc (87%) rename commons/{ => monitor}/application/application_external_time.avsc (88%) rename commons/{ => monitor}/application/application_record_counts.avsc (78%) rename commons/{ => monitor}/application/application_server_status.avsc (79%) rename commons/{ => monitor}/application/application_uptime.avsc (66%) rename commons/{ => passive}/biovotion/biovotion_vsm_acceleration.avsc (91%) rename commons/{ => passive}/biovotion/biovotion_vsm_battery_state.avsc (93%) rename commons/{ => passive}/biovotion/biovotion_vsm_blood_pulse_wave.avsc (91%) rename commons/{ => passive}/biovotion/biovotion_vsm_energy.avsc (91%) rename commons/{ => passive}/biovotion/biovotion_vsm_galvanic_skin_response.avsc (90%) rename commons/{ => passive}/biovotion/biovotion_vsm_heart_rate.avsc (90%) rename commons/{ => passive}/biovotion/biovotion_vsm_heart_rate_variability.avsc (91%) rename commons/{ => passive}/biovotion/biovotion_vsm_led_current.avsc (92%) rename commons/{ => passive}/biovotion/biovotion_vsm_ppg_raw.avsc (93%) rename commons/{ => passive}/biovotion/biovotion_vsm_respiration_rate.avsc (91%) rename commons/{ => passive}/biovotion/biovotion_vsm_spo2.avsc (90%) rename commons/{ => passive}/biovotion/biovotion_vsm_temperature.avsc (92%) rename commons/{ => passive}/empatica/empatica_e4_acceleration.avsc (92%) rename commons/{ => passive}/empatica/empatica_e4_battery_level.avsc (88%) rename commons/{ => passive}/empatica/empatica_e4_blood_volume_pulse.avsc (88%) rename commons/{ => passive}/empatica/empatica_e4_electrodermal_activity.avsc (90%) rename commons/{ => passive}/empatica/empatica_e4_inter_beat_interval.avsc (91%) rename commons/{ => passive}/empatica/empatica_e4_sensor_status.avsc (91%) rename commons/{ => passive}/empatica/empatica_e4_tag.avsc (91%) rename commons/{ => passive}/empatica/empatica_e4_temperature.avsc (89%) rename commons/{ => passive}/pebble/pebble2_acceleration.avsc (92%) rename commons/{ => passive}/pebble/pebble2_battery_level.avsc (92%) rename commons/{ => passive}/pebble/pebble2_heart_rate.avsc (90%) rename commons/{ => passive}/pebble/pebble2_heart_rate_filtered.avsc (91%) rename commons/{ => passive}/phone/phone_acceleration.avsc (92%) rename commons/{ => passive}/phone/phone_battery_level.avsc (93%) rename commons/{ => passive}/phone/phone_call.avsc (95%) rename commons/{ => passive}/phone/phone_gyroscope.avsc (91%) rename commons/{ => passive}/phone/phone_light.avsc (89%) rename commons/{ => passive}/phone/phone_magnetic_field.avsc (92%) rename commons/{ => passive}/phone/phone_relative_location.avsc (97%) rename commons/{ => passive}/phone/phone_sms.avsc (96%) rename commons/{ => passive}/phone/phone_sms_unread.avsc (90%) rename commons/{ => passive}/phone/phone_step_count.avsc (89%) rename commons/{ => passive}/phone/phone_usage_event.avsc (95%) rename commons/{ => passive}/phone/phone_user_interaction.avsc (92%) delete mode 100644 questionnaire/README.md delete mode 100644 questionnaire/specification/DEMO_config.json delete mode 100644 questionnaire/specification/PHQ8_config.json create mode 100644 restapi/README.md create mode 100644 specification/README.md diff --git a/commons/README.md b/commons/README.md new file mode 100644 index 00000000..44a1b71f --- /dev/null +++ b/commons/README.md @@ -0,0 +1,9 @@ +# Commons + +This folder is organised as follow +- [active](active) +- [kafka](kafka) +- [monitor](monitor) +- [passive](passive) + +WIP diff --git a/commons/questionnaire/questionnaire.avsc b/commons/active/questionnaire/questionnaire.avsc similarity index 96% rename from commons/questionnaire/questionnaire.avsc rename to commons/active/questionnaire/questionnaire.avsc index 6a36c15d..ed2bdc6b 100644 --- a/commons/questionnaire/questionnaire.avsc +++ b/commons/active/questionnaire/questionnaire.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.questionnaire", + "namespace": "org.radarcns.active.questionnaire", "type": "record", "name": "Questionnaire", "doc": "General schema for questionnaire. Check the specification folder to see how the questionnaire has been defined. For each QuestionnaireType there is a JSON file reporting the questions set and possible answers if available", diff --git a/commons/aggregator/double_aggregator.avsc b/commons/kafka/aggregator/double_aggregator.avsc similarity index 91% rename from commons/aggregator/double_aggregator.avsc rename to commons/kafka/aggregator/double_aggregator.avsc index 42d02991..9f926a14 100644 --- a/commons/aggregator/double_aggregator.avsc +++ b/commons/kafka/aggregator/double_aggregator.avsc @@ -1,4 +1,4 @@ -{"namespace": "org.radarcns.aggregator", +{"namespace": "org.radarcns.kafka.aggregator", "type": "record", "name": "DoubleAggregator", "doc": "Result of data aggregation.", diff --git a/commons/aggregator/double_array_aggregator.avsc b/commons/kafka/aggregator/double_array_aggregator.avsc similarity index 92% rename from commons/aggregator/double_array_aggregator.avsc rename to commons/kafka/aggregator/double_array_aggregator.avsc index 820efce8..0fb81eda 100644 --- a/commons/aggregator/double_array_aggregator.avsc +++ b/commons/kafka/aggregator/double_array_aggregator.avsc @@ -1,4 +1,4 @@ -{"namespace": "org.radarcns.aggregator", +{"namespace": "org.radarcns.kafka.aggregator", "type": "record", "name": "DoubleArrayAggregator", "doc": "Result of data aggregation.", @@ -11,4 +11,4 @@ {"name": "quartile", "type": {"type": "array", "items": {"type": "array", "items": "double"}}}, {"name": "iqr", "type": {"type": "array", "items": "double"}} ] -} \ No newline at end of file +} diff --git a/commons/key/measurement_key.avsc b/commons/kafka/key/measurement_key.avsc similarity index 86% rename from commons/key/measurement_key.avsc rename to commons/kafka/key/measurement_key.avsc index 2cfc2f3a..9e67552e 100644 --- a/commons/key/measurement_key.avsc +++ b/commons/kafka/key/measurement_key.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.key", + "namespace": "org.radarcns.kafka.key", "type": "record", "name": "MeasurementKey", "doc": "Measurement key in the RADAR-CNS project", diff --git a/commons/key/windowed_key.avsc b/commons/kafka/key/windowed_key.avsc similarity index 87% rename from commons/key/windowed_key.avsc rename to commons/kafka/key/windowed_key.avsc index a6ccdbc1..f3f30fb6 100644 --- a/commons/key/windowed_key.avsc +++ b/commons/kafka/key/windowed_key.avsc @@ -1,4 +1,4 @@ -{"namespace": "org.radarcns.key", +{"namespace": "org.radarcns.kafka.key", "type": "record", "name": "WindowedKey", "doc": "Windowed key in the RADAR-CNS project", diff --git a/commons/application/application_external_time.avsc b/commons/monitor/application/application_external_time.avsc similarity index 88% rename from commons/application/application_external_time.avsc rename to commons/monitor/application/application_external_time.avsc index 1b0f9f25..aaed4879 100755 --- a/commons/application/application_external_time.avsc +++ b/commons/monitor/application/application_external_time.avsc @@ -1,14 +1,13 @@ { - "namespace": "org.radarcns.application", + "namespace": "org.radarcns.monitor.application", "type": "record", "name": "ApplicationExternalTime", "doc": "Timestamp from an external source.", "fields": [ {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, {"name": "externalTime", "type": "double", "doc": "timestamp in UTC according to an external source (s)", "default": "NaN"}, {"name": "host", "type": ["null", "string"], "doc": "hostname or IP address that time was polled from", "default": null}, {"name": "protocol", "type": {"name": "ExternalTimeProtocol", "type": "enum", "symbols": ["SNTP", "NTP"], "doc": "SNTP (Simple Network Time Protocol) synchronizes with a single server once, NTP (Network Time Protocol) may synchronize with multiple servers and derive some continuous measures."}, "doc": "protocol for external time synchronization", "default": "SNTP"}, {"name": "delay", "type": "double", "doc": "delay between sending and receiving a message from the host (s). The lower this delay, the more precise the external timestamp is expected to be.", "default": "NaN"} ] -} \ No newline at end of file +} diff --git a/commons/application/application_record_counts.avsc b/commons/monitor/application/application_record_counts.avsc similarity index 78% rename from commons/application/application_record_counts.avsc rename to commons/monitor/application/application_record_counts.avsc index 295d2f22..bb597ef7 100755 --- a/commons/application/application_record_counts.avsc +++ b/commons/monitor/application/application_record_counts.avsc @@ -1,13 +1,12 @@ { - "namespace": "org.radarcns.application", + "namespace": "org.radarcns.monitor.application", "type": "record", "name": "ApplicationRecordCounts", "doc": "Number of records cached or created.", "fields": [ {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, {"name": "recordsCached", "type": "int", "doc": "number of records currently being cached", "default": -1}, {"name": "recordsSent", "type": "int", "doc": "number of records sent since application start"}, {"name": "recordsUnsent", "type": "int", "doc": "number of unsent records", "default": -1} ] -} \ No newline at end of file +} diff --git a/commons/application/application_server_status.avsc b/commons/monitor/application/application_server_status.avsc similarity index 79% rename from commons/application/application_server_status.avsc rename to commons/monitor/application/application_server_status.avsc index 9e4b9102..f587f90b 100755 --- a/commons/application/application_server_status.avsc +++ b/commons/monitor/application/application_server_status.avsc @@ -1,11 +1,10 @@ { - "namespace": "org.radarcns.application", + "namespace": "org.radarcns.monitor.application", "type": "record", "name": "ApplicationServerStatus", "doc": "Server connection status with android client.", "fields": [ {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, {"name": "serverStatus", "type": {"name": "ServerStatus", "type": "enum", "symbols": ["CONNECTED", "DISCONNECTED", "UNKNOWN"]}, "doc": "server connection status", "default": "UNKNOWN"}, {"name": "ipAddress", "type": ["null", "string"], "doc": "Hardware identifier of client application", "default": null} ] diff --git a/commons/application/application_uptime.avsc b/commons/monitor/application/application_uptime.avsc similarity index 66% rename from commons/application/application_uptime.avsc rename to commons/monitor/application/application_uptime.avsc index 05e58558..782763b7 100755 --- a/commons/application/application_uptime.avsc +++ b/commons/monitor/application/application_uptime.avsc @@ -1,11 +1,10 @@ { - "namespace": "org.radarcns.application", + "namespace": "org.radarcns.monitor.application", "type": "record", "name": "ApplicationUptime", "doc": "Length of application uptime", "fields": [ {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, {"name": "uptime", "type": "double", "doc": "Time since last app start (s)"} ] } diff --git a/commons/biovotion/biovotion_vsm_acceleration.avsc b/commons/passive/biovotion/biovotion_vsm_acceleration.avsc similarity index 91% rename from commons/biovotion/biovotion_vsm_acceleration.avsc rename to commons/passive/biovotion/biovotion_vsm_acceleration.avsc index b272f8db..5c318f69 100644 --- a/commons/biovotion/biovotion_vsm_acceleration.avsc +++ b/commons/passive/biovotion/biovotion_vsm_acceleration.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.biovotion", + "namespace": "org.radarcns.passive.biovotion", "type": "record", "name": "BiovotionVSMAcceleration", "doc": "Data from 3-axis accelerometer sensor with gravitational constant g as unit.", @@ -10,4 +10,4 @@ {"name": "y", "type": "float", "doc": "acceleration in the y-axis (g)"}, {"name": "z", "type": "float", "doc": "acceleration in the z-axis (g)"} ] -} \ No newline at end of file +} diff --git a/commons/biovotion/biovotion_vsm_battery_state.avsc b/commons/passive/biovotion/biovotion_vsm_battery_state.avsc similarity index 93% rename from commons/biovotion/biovotion_vsm_battery_state.avsc rename to commons/passive/biovotion/biovotion_vsm_battery_state.avsc index 85cbdab9..c35a24a3 100644 --- a/commons/biovotion/biovotion_vsm_battery_state.avsc +++ b/commons/passive/biovotion/biovotion_vsm_battery_state.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.biovotion", + "namespace": "org.radarcns.passive.biovotion", "type": "record", "name": "BiovotionVSMBatteryState", "doc": "Device battery state.", diff --git a/commons/biovotion/biovotion_vsm_blood_pulse_wave.avsc b/commons/passive/biovotion/biovotion_vsm_blood_pulse_wave.avsc similarity index 91% rename from commons/biovotion/biovotion_vsm_blood_pulse_wave.avsc rename to commons/passive/biovotion/biovotion_vsm_blood_pulse_wave.avsc index 27994298..2dbb68ea 100644 --- a/commons/biovotion/biovotion_vsm_blood_pulse_wave.avsc +++ b/commons/passive/biovotion/biovotion_vsm_blood_pulse_wave.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.biovotion", + "namespace": "org.radarcns.passive.biovotion", "type": "record", "name": "BiovotionVSMBloodPulseWave", "doc": "Blood pulse wave data calculated by biovotion device.", diff --git a/commons/biovotion/biovotion_vsm_energy.avsc b/commons/passive/biovotion/biovotion_vsm_energy.avsc similarity index 91% rename from commons/biovotion/biovotion_vsm_energy.avsc rename to commons/passive/biovotion/biovotion_vsm_energy.avsc index 5d945a82..91e09b90 100644 --- a/commons/biovotion/biovotion_vsm_energy.avsc +++ b/commons/passive/biovotion/biovotion_vsm_energy.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.biovotion", + "namespace": "org.radarcns.passive.biovotion", "type": "record", "name": "BiovotionVSMEnergy", "doc": "Energy expenditure data calculated by biovotion device.", diff --git a/commons/biovotion/biovotion_vsm_galvanic_skin_response.avsc b/commons/passive/biovotion/biovotion_vsm_galvanic_skin_response.avsc similarity index 90% rename from commons/biovotion/biovotion_vsm_galvanic_skin_response.avsc rename to commons/passive/biovotion/biovotion_vsm_galvanic_skin_response.avsc index f10f3d28..a2a28b24 100644 --- a/commons/biovotion/biovotion_vsm_galvanic_skin_response.avsc +++ b/commons/passive/biovotion/biovotion_vsm_galvanic_skin_response.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.biovotion", + "namespace": "org.radarcns.passive.biovotion", "type": "record", "name": "BiovotionVSMGalvanicSkinResponse", "doc": "Raw galvanic skin response data.", diff --git a/commons/biovotion/biovotion_vsm_heart_rate.avsc b/commons/passive/biovotion/biovotion_vsm_heart_rate.avsc similarity index 90% rename from commons/biovotion/biovotion_vsm_heart_rate.avsc rename to commons/passive/biovotion/biovotion_vsm_heart_rate.avsc index d1cf406c..6807c106 100644 --- a/commons/biovotion/biovotion_vsm_heart_rate.avsc +++ b/commons/passive/biovotion/biovotion_vsm_heart_rate.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.biovotion", + "namespace": "org.radarcns.passive.biovotion", "type": "record", "name": "BiovotionVSMHeartRate", "doc": "Heart rate calculated by biovotion device.", diff --git a/commons/biovotion/biovotion_vsm_heart_rate_variability.avsc b/commons/passive/biovotion/biovotion_vsm_heart_rate_variability.avsc similarity index 91% rename from commons/biovotion/biovotion_vsm_heart_rate_variability.avsc rename to commons/passive/biovotion/biovotion_vsm_heart_rate_variability.avsc index 045eeeb4..d42e0e5d 100644 --- a/commons/biovotion/biovotion_vsm_heart_rate_variability.avsc +++ b/commons/passive/biovotion/biovotion_vsm_heart_rate_variability.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.biovotion", + "namespace": "org.radarcns.passive.biovotion", "type": "record", "name": "BiovotionVSMHeartRateVariability", "doc": "Heart rate variability data calculated by biovotion device.", diff --git a/commons/biovotion/biovotion_vsm_led_current.avsc b/commons/passive/biovotion/biovotion_vsm_led_current.avsc similarity index 92% rename from commons/biovotion/biovotion_vsm_led_current.avsc rename to commons/passive/biovotion/biovotion_vsm_led_current.avsc index 77bdc169..f6b522c8 100644 --- a/commons/biovotion/biovotion_vsm_led_current.avsc +++ b/commons/passive/biovotion/biovotion_vsm_led_current.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.biovotion", + "namespace": "org.radarcns.passive.biovotion", "type": "record", "name": "BiovotionVSMLedCurrent", "doc": "Applied current for red, green and ir leds.", diff --git a/commons/biovotion/biovotion_vsm_ppg_raw.avsc b/commons/passive/biovotion/biovotion_vsm_ppg_raw.avsc similarity index 93% rename from commons/biovotion/biovotion_vsm_ppg_raw.avsc rename to commons/passive/biovotion/biovotion_vsm_ppg_raw.avsc index e34f9dd6..8a890649 100644 --- a/commons/biovotion/biovotion_vsm_ppg_raw.avsc +++ b/commons/passive/biovotion/biovotion_vsm_ppg_raw.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.biovotion", + "namespace": "org.radarcns.passive.biovotion", "type": "record", "name": "BiovotionVSMPhotoRaw", "doc": "Raw 14bit Photodiode ADC data for red, green, IR and dark portions (PPG raw data).", diff --git a/commons/biovotion/biovotion_vsm_respiration_rate.avsc b/commons/passive/biovotion/biovotion_vsm_respiration_rate.avsc similarity index 91% rename from commons/biovotion/biovotion_vsm_respiration_rate.avsc rename to commons/passive/biovotion/biovotion_vsm_respiration_rate.avsc index f37db658..66cc5791 100644 --- a/commons/biovotion/biovotion_vsm_respiration_rate.avsc +++ b/commons/passive/biovotion/biovotion_vsm_respiration_rate.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.biovotion", + "namespace": "org.radarcns.passive.biovotion", "type": "record", "name": "BiovotionVSMRespirationRate", "doc": "Respiration rate data calculated by biovotion device.", diff --git a/commons/biovotion/biovotion_vsm_spo2.avsc b/commons/passive/biovotion/biovotion_vsm_spo2.avsc similarity index 90% rename from commons/biovotion/biovotion_vsm_spo2.avsc rename to commons/passive/biovotion/biovotion_vsm_spo2.avsc index c09dbecb..694317f1 100644 --- a/commons/biovotion/biovotion_vsm_spo2.avsc +++ b/commons/passive/biovotion/biovotion_vsm_spo2.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.biovotion", + "namespace": "org.radarcns.passive.biovotion", "type": "record", "name": "BiovotionVSMSpO2", "doc": "Peripheral capillary oxygen saturation (SpO2) calculated by biovotion device.", diff --git a/commons/biovotion/biovotion_vsm_temperature.avsc b/commons/passive/biovotion/biovotion_vsm_temperature.avsc similarity index 92% rename from commons/biovotion/biovotion_vsm_temperature.avsc rename to commons/passive/biovotion/biovotion_vsm_temperature.avsc index f794f78d..8146a4b5 100644 --- a/commons/biovotion/biovotion_vsm_temperature.avsc +++ b/commons/passive/biovotion/biovotion_vsm_temperature.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.biovotion", + "namespace": "org.radarcns.passive.biovotion", "type": "record", "name": "BiovotionVSMTemperature", "doc": "Data from temperature sensor expressed in degrees on the Celsius (°C) scale.", diff --git a/commons/empatica/empatica_e4_acceleration.avsc b/commons/passive/empatica/empatica_e4_acceleration.avsc similarity index 92% rename from commons/empatica/empatica_e4_acceleration.avsc rename to commons/passive/empatica/empatica_e4_acceleration.avsc index f272a70f..bc2c340a 100644 --- a/commons/empatica/empatica_e4_acceleration.avsc +++ b/commons/passive/empatica/empatica_e4_acceleration.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.empatica", + "namespace": "org.radarcns.passive.empatica", "type": "record", "name": "EmpaticaE4Acceleration", "doc": "Data from 3-axis accelerometer sensor with gravitational constant g as unit.", diff --git a/commons/empatica/empatica_e4_battery_level.avsc b/commons/passive/empatica/empatica_e4_battery_level.avsc similarity index 88% rename from commons/empatica/empatica_e4_battery_level.avsc rename to commons/passive/empatica/empatica_e4_battery_level.avsc index 25c73650..33305e19 100644 --- a/commons/empatica/empatica_e4_battery_level.avsc +++ b/commons/passive/empatica/empatica_e4_battery_level.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.empatica", + "namespace": "org.radarcns.passive.empatica", "type": "record", "name": "EmpaticaE4BatteryLevel", "doc": "Device battery level.", diff --git a/commons/empatica/empatica_e4_blood_volume_pulse.avsc b/commons/passive/empatica/empatica_e4_blood_volume_pulse.avsc similarity index 88% rename from commons/empatica/empatica_e4_blood_volume_pulse.avsc rename to commons/passive/empatica/empatica_e4_blood_volume_pulse.avsc index 4a76beb5..3542f108 100644 --- a/commons/empatica/empatica_e4_blood_volume_pulse.avsc +++ b/commons/passive/empatica/empatica_e4_blood_volume_pulse.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.empatica", + "namespace": "org.radarcns.passive.empatica", "type": "record", "name": "EmpaticaE4BloodVolumePulse", "doc": "Data from photoplethysmograph.", @@ -8,4 +8,4 @@ {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, {"name": "bloodVolumePulse", "type": "float", "doc": "light absorption (nW)"} ] -} \ No newline at end of file +} diff --git a/commons/empatica/empatica_e4_electrodermal_activity.avsc b/commons/passive/empatica/empatica_e4_electrodermal_activity.avsc similarity index 90% rename from commons/empatica/empatica_e4_electrodermal_activity.avsc rename to commons/passive/empatica/empatica_e4_electrodermal_activity.avsc index abc3e9b1..25e2b065 100644 --- a/commons/empatica/empatica_e4_electrodermal_activity.avsc +++ b/commons/passive/empatica/empatica_e4_electrodermal_activity.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.empatica", + "namespace": "org.radarcns.passive.empatica", "type": "record", "name": "EmpaticaE4ElectroDermalActivity", "doc": "Data from the electrodermal activity sensor expressed as microsiemens (µS). Uses a galvanic skin response sensor.", diff --git a/commons/empatica/empatica_e4_inter_beat_interval.avsc b/commons/passive/empatica/empatica_e4_inter_beat_interval.avsc similarity index 91% rename from commons/empatica/empatica_e4_inter_beat_interval.avsc rename to commons/passive/empatica/empatica_e4_inter_beat_interval.avsc index fccacd74..744edc58 100644 --- a/commons/empatica/empatica_e4_inter_beat_interval.avsc +++ b/commons/passive/empatica/empatica_e4_inter_beat_interval.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.empatica", + "namespace": "org.radarcns.passive.empatica", "type": "record", "name": "EmpaticaE4InterBeatInterval", "doc": "Time between individuals heart beats extracted from the BVP signal. You can compute the heart rate as (60 / ibi).", diff --git a/commons/empatica/empatica_e4_sensor_status.avsc b/commons/passive/empatica/empatica_e4_sensor_status.avsc similarity index 91% rename from commons/empatica/empatica_e4_sensor_status.avsc rename to commons/passive/empatica/empatica_e4_sensor_status.avsc index 2c79445d..9af24253 100644 --- a/commons/empatica/empatica_e4_sensor_status.avsc +++ b/commons/passive/empatica/empatica_e4_sensor_status.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.empatica", + "namespace": "org.radarcns.passive.empatica", "type": "record", "name": "EmpaticaE4SensorStatus", "doc": "Sensor status according to the device.", diff --git a/commons/empatica/empatica_e4_tag.avsc b/commons/passive/empatica/empatica_e4_tag.avsc similarity index 91% rename from commons/empatica/empatica_e4_tag.avsc rename to commons/passive/empatica/empatica_e4_tag.avsc index 4fbe6080..7233e17c 100644 --- a/commons/empatica/empatica_e4_tag.avsc +++ b/commons/passive/empatica/empatica_e4_tag.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.empatica", + "namespace": "org.radarcns.passive.empatica", "type": "record", "name": "EmpaticaE4Tag", "doc": "Event mark corresponding to a physical button press on the device; the same time as the status LED is first illuminated. The time is synchronized with initial time of the session indicated in the related data files from the corresponding session.", diff --git a/commons/empatica/empatica_e4_temperature.avsc b/commons/passive/empatica/empatica_e4_temperature.avsc similarity index 89% rename from commons/empatica/empatica_e4_temperature.avsc rename to commons/passive/empatica/empatica_e4_temperature.avsc index 655c5828..4f8def70 100644 --- a/commons/empatica/empatica_e4_temperature.avsc +++ b/commons/passive/empatica/empatica_e4_temperature.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.empatica", + "namespace": "org.radarcns.passive.empatica", "type": "record", "name": "EmpaticaE4Temperature", "doc": "Data from temperature sensor expressed degrees on the Celsius (°C) scale.", @@ -8,4 +8,4 @@ {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, {"name": "temperature", "type": "float", "doc": "temperature (°C)"} ] -} \ No newline at end of file +} diff --git a/commons/pebble/pebble2_acceleration.avsc b/commons/passive/pebble/pebble2_acceleration.avsc similarity index 92% rename from commons/pebble/pebble2_acceleration.avsc rename to commons/passive/pebble/pebble2_acceleration.avsc index 60e48c8b..f4036c25 100644 --- a/commons/pebble/pebble2_acceleration.avsc +++ b/commons/passive/pebble/pebble2_acceleration.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.pebble", + "namespace": "org.radarcns.passive.pebble", "type": "record", "name": "Pebble2Acceleration", "doc": "Data from 3-axis accelerometer sensor with gravitational constant g as unit.", diff --git a/commons/pebble/pebble2_battery_level.avsc b/commons/passive/pebble/pebble2_battery_level.avsc similarity index 92% rename from commons/pebble/pebble2_battery_level.avsc rename to commons/passive/pebble/pebble2_battery_level.avsc index ccb3135e..c2e48153 100644 --- a/commons/pebble/pebble2_battery_level.avsc +++ b/commons/passive/pebble/pebble2_battery_level.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.pebble", + "namespace": "org.radarcns.passive.pebble", "type": "record", "name": "Pebble2BatteryLevel", "doc": "Device battery level.", diff --git a/commons/pebble/pebble2_heart_rate.avsc b/commons/passive/pebble/pebble2_heart_rate.avsc similarity index 90% rename from commons/pebble/pebble2_heart_rate.avsc rename to commons/passive/pebble/pebble2_heart_rate.avsc index 5b3ff0eb..4fe5474e 100644 --- a/commons/pebble/pebble2_heart_rate.avsc +++ b/commons/passive/pebble/pebble2_heart_rate.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.pebble", + "namespace": "org.radarcns.passive.pebble", "type": "record", "name": "Pebble2HeartRate", "doc": "Raw heart rate from the Pebble 2 Heart Monitor. You can compute the inter beat interval rate as (60 / heartRate).", diff --git a/commons/pebble/pebble2_heart_rate_filtered.avsc b/commons/passive/pebble/pebble2_heart_rate_filtered.avsc similarity index 91% rename from commons/pebble/pebble2_heart_rate_filtered.avsc rename to commons/passive/pebble/pebble2_heart_rate_filtered.avsc index e404a618..ca2cd130 100644 --- a/commons/pebble/pebble2_heart_rate_filtered.avsc +++ b/commons/passive/pebble/pebble2_heart_rate_filtered.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.pebble", + "namespace": "org.radarcns.passive.pebble", "type": "record", "name": "Pebble2HeartRateFiltered", "doc": "Filtered and smoothed heart rate from the Pebble 2 Heart Monitor. You can compute the inter beat interval rate as (60 / heartRate).", diff --git a/commons/phone/phone_acceleration.avsc b/commons/passive/phone/phone_acceleration.avsc similarity index 92% rename from commons/phone/phone_acceleration.avsc rename to commons/passive/phone/phone_acceleration.avsc index 92df5f96..3e7518cd 100644 --- a/commons/phone/phone_acceleration.avsc +++ b/commons/passive/phone/phone_acceleration.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.phone", + "namespace": "org.radarcns.passive.phone", "type": "record", "name": "PhoneAcceleration", "doc": "Data from 3-axis accelerometer sensor with gravitational constant g as unit.", diff --git a/commons/phone/phone_battery_level.avsc b/commons/passive/phone/phone_battery_level.avsc similarity index 93% rename from commons/phone/phone_battery_level.avsc rename to commons/passive/phone/phone_battery_level.avsc index dec81bc3..6fe1be63 100644 --- a/commons/phone/phone_battery_level.avsc +++ b/commons/passive/phone/phone_battery_level.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.phone", + "namespace": "org.radarcns.passive.phone", "type": "record", "name": "PhoneBatteryLevel", "doc": "Phone battery level.", diff --git a/commons/phone/phone_call.avsc b/commons/passive/phone/phone_call.avsc similarity index 95% rename from commons/phone/phone_call.avsc rename to commons/passive/phone/phone_call.avsc index 44839428..1bdc6f7f 100644 --- a/commons/phone/phone_call.avsc +++ b/commons/passive/phone/phone_call.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.phone", + "namespace": "org.radarcns.passive.phone", "type": "record", "name": "PhoneCall", "doc": "Data from the log of received and made calls.", diff --git a/commons/phone/phone_gyroscope.avsc b/commons/passive/phone/phone_gyroscope.avsc similarity index 91% rename from commons/phone/phone_gyroscope.avsc rename to commons/passive/phone/phone_gyroscope.avsc index df5a1c33..72ece8f1 100644 --- a/commons/phone/phone_gyroscope.avsc +++ b/commons/passive/phone/phone_gyroscope.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.phone", + "namespace": "org.radarcns.passive.phone", "type": "record", "name": "PhoneGyroscope", "doc": "Data from the 3-axis gyroscope.", diff --git a/commons/phone/phone_light.avsc b/commons/passive/phone/phone_light.avsc similarity index 89% rename from commons/phone/phone_light.avsc rename to commons/passive/phone/phone_light.avsc index 590787e4..fa887256 100644 --- a/commons/phone/phone_light.avsc +++ b/commons/passive/phone/phone_light.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.phone", + "namespace": "org.radarcns.passive.phone", "type": "record", "name": "PhoneLight", "doc": "Data from the light sensor in luminous flux per unit area.", diff --git a/commons/phone/phone_magnetic_field.avsc b/commons/passive/phone/phone_magnetic_field.avsc similarity index 92% rename from commons/phone/phone_magnetic_field.avsc rename to commons/passive/phone/phone_magnetic_field.avsc index 7a562d64..99309eb3 100644 --- a/commons/phone/phone_magnetic_field.avsc +++ b/commons/passive/phone/phone_magnetic_field.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.phone", + "namespace": "org.radarcns.passive.phone", "type": "record", "name": "PhoneMagneticField", "doc": "Data from the 3-axis magnetometer.", diff --git a/commons/phone/phone_relative_location.avsc b/commons/passive/phone/phone_relative_location.avsc similarity index 97% rename from commons/phone/phone_relative_location.avsc rename to commons/passive/phone/phone_relative_location.avsc index 4136d3e2..512d2b1e 100644 --- a/commons/phone/phone_relative_location.avsc +++ b/commons/passive/phone/phone_relative_location.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.phone", + "namespace": "org.radarcns.passive.phone", "type": "record", "name": "PhoneRelativeLocation", "doc": "Data from the gps and network location providers. The latitude and longitude are stated with an unspecified reference offset and can thus be treated as relative locations. They cannot be used to infer absolute location. This means accurate distances or angles between locations cannot be calculated since those depend on the absolute location.", @@ -14,4 +14,4 @@ {"name": "speed", "type": "float", "doc": "speed over ground (m/s)", "default": "NaN"}, {"name": "bearing", "type": "float", "doc": "the horizontal direction of travel of this device (degrees with range (0, 360])", "default": "NaN"} ] -} \ No newline at end of file +} diff --git a/commons/phone/phone_sms.avsc b/commons/passive/phone/phone_sms.avsc similarity index 96% rename from commons/phone/phone_sms.avsc rename to commons/passive/phone/phone_sms.avsc index 805929ff..f8173c90 100644 --- a/commons/phone/phone_sms.avsc +++ b/commons/passive/phone/phone_sms.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.phone", + "namespace": "org.radarcns.passive.phone", "type": "record", "name": "PhoneSms", "doc": "Data from log sent and received text messages.", diff --git a/commons/phone/phone_sms_unread.avsc b/commons/passive/phone/phone_sms_unread.avsc similarity index 90% rename from commons/phone/phone_sms_unread.avsc rename to commons/passive/phone/phone_sms_unread.avsc index 8927dc5a..2a654c08 100644 --- a/commons/phone/phone_sms_unread.avsc +++ b/commons/passive/phone/phone_sms_unread.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.phone", + "namespace": "org.radarcns.passive.phone", "type": "record", "name": "PhoneSmsUnread", "doc": "Number of SMS messages in the inbox that have an unread status.", diff --git a/commons/phone/phone_step_count.avsc b/commons/passive/phone/phone_step_count.avsc similarity index 89% rename from commons/phone/phone_step_count.avsc rename to commons/passive/phone/phone_step_count.avsc index 1936582f..ef34cffc 100644 --- a/commons/phone/phone_step_count.avsc +++ b/commons/passive/phone/phone_step_count.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.phone", + "namespace": "org.radarcns.passive.phone", "type": "record", "name": "PhoneStepCount", "doc": "Data from the step counter.", diff --git a/commons/phone/phone_usage_event.avsc b/commons/passive/phone/phone_usage_event.avsc similarity index 95% rename from commons/phone/phone_usage_event.avsc rename to commons/passive/phone/phone_usage_event.avsc index ff9a9f34..3052cc96 100644 --- a/commons/phone/phone_usage_event.avsc +++ b/commons/passive/phone/phone_usage_event.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.phone", + "namespace": "org.radarcns.passive.phone", "type": "record", "name": "PhoneUsageEvent", "doc": "Event for closing or opening an app", diff --git a/commons/phone/phone_user_interaction.avsc b/commons/passive/phone/phone_user_interaction.avsc similarity index 92% rename from commons/phone/phone_user_interaction.avsc rename to commons/passive/phone/phone_user_interaction.avsc index 781f696b..1048d6ae 100644 --- a/commons/phone/phone_user_interaction.avsc +++ b/commons/passive/phone/phone_user_interaction.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.phone", + "namespace": "org.radarcns.passive.phone", "type": "record", "name": "PhoneUserInteraction", "doc": "Logs change of user interaction state: when the phone is unlocked or set to standby.", diff --git a/questionnaire/README.md b/questionnaire/README.md deleted file mode 100644 index 504e7bf6..00000000 --- a/questionnaire/README.md +++ /dev/null @@ -1,61 +0,0 @@ -## Proposal for configuration schema - -### Metadata -```js -{ - "version": "0.0.1", - "lastModified": "2016-11-18T23:01:01+02:00", // format: ISO8601 or Unix Epoch Timestamp - "id": "PHQ8", - "title": "Weekly Checkup", - "questions": [] -} -``` - -### Question type: "Radio" -```js -{ - "id": "PHQ8-1", - "lead": "Over the past two weeks, how often have you been bothered by any of the following problems?", - "content": "Little interest or pleasure in doing things.", - "responses": [ - {"response": "Not at all", "score": 0}, - {"response": "Several days", "score": 1}, - {"response": "More than half the days", "score": 2}, - {"response": "Nearly every day", "score": 3} - ], - "type": "radio" -} -``` - -### Question type: "Range" -```js -{ - "id": "PHQ8-2", - "lead": "...", - "content": "...", - "range": { // must not exceed 10 steps - "min": 1, // must not have negative numbers - "max": 5 // must not have negative numbers - }, - "type": "range" -} -``` - -### Question type: "Audio" -```js -{ - "id": "PHQ8-3", - "lead": "...", - "content": "...", - "options": { - "sampleDuration": 30, - "configFile": "filename.conf", - "compressionLevel": 0, // options: (0:Raw, 1:LLD, 2:Functional, 3:Class label) - "idleDuration": 300, // passive monitoring only - "startHour": 9, // passive monitoring only - "stopHour": 21 // passive monitoring only - }, - "type": "audio" -} -``` - diff --git a/questionnaire/specification/DEMO_config.json b/questionnaire/specification/DEMO_config.json deleted file mode 100644 index 958d0154..00000000 --- a/questionnaire/specification/DEMO_config.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name" : "DEMO", - "version": 1, - "estimatedCompletionTime" : 2, - "startText" : "Here you can test some all available input types.", - "endText" : "Thanks for giving it a try.", - "protocol" : { - "reminders" : { - "amount" : 15, - "repeat" : 1, - "unit" : "min" - }, - "repeatProtocol" : { - "amount" : 2, - "unit" : "week" - }, - "repeatQuestionnaire" : { - "unit" : "min", - "unitsFromZero" : [ 450, 600, 1890, 2004 ] - } - }, - "questions" : [ { - "content" : "The slider as fine-grained input.", - "id" : "Test-0", - "lead" : "Some other input types.", - "range" : { - "max" : 100, - "min" : 0, - "step" : 5 - }, - "type" : "slider" - }, { - "content" : "The multiple values for a smaller range.", - "id" : "Test-2", - "lead" : "Some other input types.", - "range" : { - "max" : 7, - "min" : 1 - }, - "type" : "range" - } ] -} diff --git a/questionnaire/specification/PHQ8_config.json b/questionnaire/specification/PHQ8_config.json deleted file mode 100644 index 80eed0fa..00000000 --- a/questionnaire/specification/PHQ8_config.json +++ /dev/null @@ -1,149 +0,0 @@ -{ - "name" : "PHQ8", - "version": 1, - "estimatedCompletionTime" : 7, - "startText" : "This questionnaire is known as the PHQ8. Clinicians use it to assess current depression in patients. Thank you for taking part in this focus group.", - "endText" : "Thank you for participating today.", - "protocol" : { - "reminders" : { - "amount" : 15, - "repeat" : 2, - "unit" : "min" - }, - "repeatProtocol" : { - "amount" : 1, - "unit" : "month" - }, - "repeatQuestionnaire" : { - "unit" : "min", - "unitsFromZero" : [ 600 ] - } - }, - "questions" : [ { - "content" : "Little interest or pleasure in doing things.", - "id" : "PHQ8-0", - "lead" : "Over the past two weeks, how often have you been bothered by any of the following problems?", - "responses" : [ { - "response" : "Not at all", - "score" : 0 - }, { - "response" : "Several days", - "score" : 1 - }, { - "response" : "More than half the days", - "score" : 2 - }, { - "response" : "Nearly every day", - "score" : 3 - } ], - "type" : "radio" - }, { - "content" : "Feeling down, depressed, or hopeless.", - "id" : "PHQ8-1", - "lead" : "Over the past two weeks, how often have you been bothered by any of the following problems?", - "responses" : [ { - "response" : "Not at all", - "score" : 0 - }, { - "response" : "Several days", - "score" : 1 - }, { - "response" : "More than half the days", - "score" : 2 - }, { - "response" : "Nearly every day", - "score" : 3 - } ], - "type" : "radio" - }, { - "content" : "Trouble falling asleep or staying asleep, or sleeping too much.", - "id" : "PHQ8-2", - "lead" : "Over the past two weeks, how often have you been bothered by any of the following problems?", - "responses" : [ { - "response" : "Not at all", - "score" : 0 - }, { - "response" : "Several days", - "score" : 1 - }, { - "response" : "More than half the days", - "score" : 2 - }, { - "response" : "Nearly every day", - "score" : 3 - } ], - "type" : "radio" - }, { - "content" : "Feeling tired or having little energy.", - "id" : "PHQ8-3", - "lead" : "Over the past two weeks, how often have you been bothered by any of the following problems?", - "responses" : [ { - "response" : "Not at all", - "score" : 0 - }, { - "response" : "Several days", - "score" : 1 - }, { - "response" : "More than half the days", - "score" : 2 - }, { - "response" : "Nearly every day", - "score" : 3 - } ], - "type" : "radio" - }, { - "content" : "Feeling bad about yourself – or that you are a failure or have let yourself or your family down.", - "id" : "PHQ8-4", - "lead" : "Over the past two weeks, how often have you been bothered by any of the following problems?", - "responses" : [ { - "response" : "Not at all", - "score" : 0 - }, { - "response" : "Several days", - "score" : 1 - }, { - "response" : "More than half the days", - "score" : 2 - }, { - "response" : "Nearly every day", - "score" : 3 - } ], - "type" : "radio" - }, { - "content" : "Trouble concentrating on things such as reading the newspaper of watching television.", - "id" : "PHQ8-5", - "lead" : "Over the past two weeks, how often have you been bothered by any of the following problems?", - "responses" : [ { - "response" : "Not at all", - "score" : 0 - }, { - "response" : "Several days", - "score" : 1 - }, { - "response" : "More than half the days", - "score" : 2 - }, { - "response" : "Nearly every day", - "score" : 3 - } ], - "type" : "radio" - }, { - "content" : "Moving or speaking so slowly that other people have noticed. Or the opposite – being so fidgety or restless that you have been moving around a lot more than usual.", - "id" : "PHQ8-6", - "lead" : "Over the past two weeks, how often have you been bothered by any of the following problems?", - "responses" : [ { - "response" : "Not at all", - "score" : 0 - }, { - "response" : "Several days", - "score" : 1 - }, { - "response" : "More than half the days", - "score" : 2 - }, { - "response" : "Nearly every day", - "score" : 3 - } ], - "type" : "radio" - } ] -} diff --git a/restapi/README.md b/restapi/README.md new file mode 100644 index 00000000..c60a9fce --- /dev/null +++ b/restapi/README.md @@ -0,0 +1,3 @@ +# Restapi + +WIP diff --git a/specification/README.md b/specification/README.md new file mode 100644 index 00000000..fbbb4d82 --- /dev/null +++ b/specification/README.md @@ -0,0 +1,8 @@ +# Specification + +This folder is organised as follow +- [active](active) +- [monitor](monitor) +- [passive](passive) + +WIP From 0e7149def150549522f3fb29c0f963cbee0ebba8 Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Thu, 20 Jul 2017 18:59:11 +0100 Subject: [PATCH 008/112] Fixed restapi cross references --- java-sdk/radar-schemas-restapi/build.gradle | 4 ++-- restapi/app/application.avsc | 2 +- restapi/dataset/item.avsc | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/java-sdk/radar-schemas-restapi/build.gradle b/java-sdk/radar-schemas-restapi/build.gradle index 5d300eca..6d37a33f 100644 --- a/java-sdk/radar-schemas-restapi/build.gradle +++ b/java-sdk/radar-schemas-restapi/build.gradle @@ -6,8 +6,8 @@ ext.description = 'RADAR Schemas REST API SDK' //---------------------------------------------------------------------------// task generateAvro(type: com.commercehub.gradle.plugin.avro.GenerateAvroJavaTask) { source rootProject.fileTree('../commons') { - include 'questionnaire/questionnaire.avsc' - include 'application/application_server_status.avsc' + include 'active/questionnaire/questionnaire.avsc' + include 'monitor/application/application_server_status.avsc' } source rootProject.fileTree('../restapi') { include '**/*.avsc' diff --git a/restapi/app/application.avsc b/restapi/app/application.avsc index 434536e6..e4874458 100644 --- a/restapi/app/application.avsc +++ b/restapi/app/application.avsc @@ -8,7 +8,7 @@ "null", "string" ], "doc": "Hardware identifier of client application", "default": null}, {"name": "uptime", "type": "double", "doc": "Time since last app start (s)"}, - {"name": "serverStatus", "type": "org.radarcns.application.ServerStatus", "doc": "server connection status", "default": "UNKNOWN"}, + {"name": "serverStatus", "type": "org.radarcns.monitor.application.ServerStatus", "doc": "server connection status", "default": "UNKNOWN"}, {"name": "recordsCached", "type": "int", "doc": "number of records currently being cached", "default": -1}, {"name": "recordsSent", "type": "int", "doc": "number of records sent since application start"}, {"name": "recordsUnsent", "type": "int", "doc": "number of unsent records", "default": -1} diff --git a/restapi/dataset/item.avsc b/restapi/dataset/item.avsc index 667a6e6c..aec6df46 100644 --- a/restapi/dataset/item.avsc +++ b/restapi/dataset/item.avsc @@ -7,7 +7,7 @@ {"name": "sample", "type": [ "org.radarcns.avro.restapi.data.DoubleSample" , "org.radarcns.avro.restapi.data.Acceleration", - "org.radarcns.questionnaire.Questionnaire" + "org.radarcns.active.questionnaire.Questionnaire" ], "doc": "Sample value. For more details, check org.radarcns.avro.restapi.data.Acceleration, org.radarcns.avro.restapi.data.DoubleSample and org.radarcns.questionnaire.Questionnaire" } , {"name": "startDateTime", "type": "string", "doc": "Point in time (ISO8601) with UTC timezone. It represents the timestamp of the first sample contained inside the aggregated data."} ] From 70f03cd5185f1fb390f043915bd5ec92ffabb6f5 Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Fri, 21 Jul 2017 10:51:40 +0100 Subject: [PATCH 009/112] JUnit package structure and related gradle --- .gitignore | 6 +- java-sdk/radar-schemas-validator/build.gradle | 67 ++ .../config/checkstyle/checkstyle.xml | 216 +++++++ .../config/intellij-java-google-style.xml | 596 ++++++++++++++++++ .../config/pmd/ruleset.xml | 89 +++ .../org/radarcns/validator/Validator.java | 66 ++ .../src/test/resources/logback.xml | 17 + java-sdk/settings.gradle | 1 + 8 files changed, 1057 insertions(+), 1 deletion(-) create mode 100644 java-sdk/radar-schemas-validator/build.gradle create mode 100644 java-sdk/radar-schemas-validator/config/checkstyle/checkstyle.xml create mode 100644 java-sdk/radar-schemas-validator/config/intellij-java-google-style.xml create mode 100644 java-sdk/radar-schemas-validator/config/pmd/ruleset.xml create mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/Validator.java create mode 100644 java-sdk/radar-schemas-validator/src/test/resources/logback.xml diff --git a/.gitignore b/.gitignore index ca117126..ca75b4bb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,11 @@ .DS_Store build/ .idea/ +*.iml .gradle/ -*.java .gradletasknamecache gradle.properties +*.java +!java-sdk/radar-schemas-validator/**/*.java +java-sdk/radar-schemas-validator/build +java-sdk/radar-schemas-validator/out diff --git a/java-sdk/radar-schemas-validator/build.gradle b/java-sdk/radar-schemas-validator/build.gradle new file mode 100644 index 00000000..9d3c787e --- /dev/null +++ b/java-sdk/radar-schemas-validator/build.gradle @@ -0,0 +1,67 @@ +plugins { + id 'idea' + id 'checkstyle' + id 'pmd' +} + +ext.artifactName = 'radar-schemas-validator' +ext.description = 'RADAR Schemas Validator. JUnit tests to check schema acceptance.' + +idea { + module { + downloadSources = true + } +} + +sourceSets { + test { + java.srcDir 'src/test/java' + resources.srcDir 'src/test/resources' + } +} + +ext.junitVersion = '4.12' +ext.slf4jVersion = '1.7.25' + +dependencies { + testCompile group: 'junit', name: 'junit', version: junitVersion + testCompile group: 'org.slf4j', name: 'slf4j-simple', version: slf4jVersion +} + +//---------------------------------------------------------------------------// +// Test definition // +//---------------------------------------------------------------------------// +test { + testLogging { + events "skipped", "failed" + exceptionFormat "full" + showExceptions = true + showCauses = true + showStackTraces = true + showStandardStreams = true + } +} + +//---------------------------------------------------------------------------// +// Style checking // +//---------------------------------------------------------------------------// +checkstyle { + // codacy version + toolVersion '6.16' + ignoreFailures false + + configFile = file("$projectDir/config/checkstyle/checkstyle.xml") +} + +pmd { + // pmd version + toolVersion = '5.5.2' + ignoreFailures = false + + consoleOutput = true + + ruleSets = [] + + ruleSetFiles = files("$projectDir/config/pmd/ruleset.xml") +} + diff --git a/java-sdk/radar-schemas-validator/config/checkstyle/checkstyle.xml b/java-sdk/radar-schemas-validator/config/checkstyle/checkstyle.xml new file mode 100644 index 00000000..b9f3a458 --- /dev/null +++ b/java-sdk/radar-schemas-validator/config/checkstyle/checkstyle.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java-sdk/radar-schemas-validator/config/intellij-java-google-style.xml b/java-sdk/radar-schemas-validator/config/intellij-java-google-style.xml new file mode 100644 index 00000000..70c15157 --- /dev/null +++ b/java-sdk/radar-schemas-validator/config/intellij-java-google-style.xml @@ -0,0 +1,596 @@ + + + + + + diff --git a/java-sdk/radar-schemas-validator/config/pmd/ruleset.xml b/java-sdk/radar-schemas-validator/config/pmd/ruleset.xml new file mode 100644 index 00000000..d7b23e4c --- /dev/null +++ b/java-sdk/radar-schemas-validator/config/pmd/ruleset.xml @@ -0,0 +1,89 @@ + + + + + This ruleset was parsed from the Codacy default codestyle. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/Validator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/Validator.java new file mode 100644 index 00000000..ea140739 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/Validator.java @@ -0,0 +1,66 @@ +package org.radarcns.validator; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; + +import java.io.File; +import java.nio.file.Path; +import java.nio.file.Paths; +import org.junit.Test; + +public class Validator { + + public static final String COMMONS_FOLDER_NAME = "commons"; + public static final String RESTAPI_FOLDER_NAME = "restapi"; + public static final String SPECIFICATION_FOLDER_NAME = "specification"; + + public static final Path COMMONS_PATH = Paths.get( + new File(".").toURI()).getParent().getParent().getParent().resolve( + COMMONS_FOLDER_NAME); + + public static final Path REST_API_PATH = Paths.get( + new File(".").toURI()).getParent().getParent().getParent().resolve( + RESTAPI_FOLDER_NAME); + + public static final Path SPECIFICATION_PATH = Paths.get( + new File(".").toURI()).getParent().getParent().getParent().resolve( + SPECIFICATION_FOLDER_NAME); + + //private static final Logger LOGGER = LoggerFactory.getLogger(Validator.class); + + @Test + public void commons() { + File commonsFolder = new File(COMMONS_PATH.toUri()); + assertEquals(true, commonsFolder.exists()); + assertEquals(true, commonsFolder.isDirectory()); + } + + @Test + public void restapi() { + File commonsFolder = new File(REST_API_PATH.toUri()); + assertEquals(true, commonsFolder.exists()); + assertEquals(true, commonsFolder.isDirectory()); + } + + @Test + public void specification() { + File commonsFolder = new File(SPECIFICATION_PATH.toUri()); + assertEquals(true, commonsFolder.exists()); + assertEquals(true, commonsFolder.isDirectory()); + } +} diff --git a/java-sdk/radar-schemas-validator/src/test/resources/logback.xml b/java-sdk/radar-schemas-validator/src/test/resources/logback.xml new file mode 100644 index 00000000..4596615d --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/test/resources/logback.xml @@ -0,0 +1,17 @@ + + + + + + %date{yyyy-MM-dd HH:mm:ss,UTC} UTC [%.2thread] %-5level - %msg [%logger:%line] %n + + + + + + + + + + + diff --git a/java-sdk/settings.gradle b/java-sdk/settings.gradle index ed12a550..f9dc93ae 100644 --- a/java-sdk/settings.gradle +++ b/java-sdk/settings.gradle @@ -1,5 +1,6 @@ rootProject.name = 'radar-schemas' +include ':radar-schemas-validator' include ':radar-schemas-commons' include ':radar-schemas-restapi' include ':radar-schemas-questionnaire' From d5f4511a44891b222fe069988d81d6771b994614 Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Fri, 21 Jul 2017 18:10:26 +0100 Subject: [PATCH 010/112] Switch validator to java 8 --- java-sdk/radar-schemas-validator/build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/java-sdk/radar-schemas-validator/build.gradle b/java-sdk/radar-schemas-validator/build.gradle index 9d3c787e..949b1f69 100644 --- a/java-sdk/radar-schemas-validator/build.gradle +++ b/java-sdk/radar-schemas-validator/build.gradle @@ -7,6 +7,9 @@ plugins { ext.artifactName = 'radar-schemas-validator' ext.description = 'RADAR Schemas Validator. JUnit tests to check schema acceptance.' +targetCompatibility = '1.8' +sourceCompatibility = '1.8' + idea { module { downloadSources = true From 6b1ce7d53bec082690b392b0f3a1be7f72512ac5 Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Fri, 21 Jul 2017 18:12:06 +0100 Subject: [PATCH 011/112] Fixed key name files and added first unit tests --- ...aggregator.avsc => aggregator_double.avsc} | 0 ...ator.avsc => aggregator_double_array.avsc} | 0 ...surement_key.avsc => key_measurement.avsc} | 0 .../{windowed_key.avsc => key_windowed.avsc} | 0 .../org/radarcns/unit/AvroValidatorTest.java | 36 ++++ .../org/radarcns/validator/AvroValidator.java | 164 ++++++++++++++++ .../radarcns/validator/CommonsValidator.java | 63 +++++++ .../validator/StructureValidator.java | 177 ++++++++++++++++++ .../org/radarcns/validator/Validator.java | 66 ------- 9 files changed, 440 insertions(+), 66 deletions(-) rename commons/kafka/aggregator/{double_aggregator.avsc => aggregator_double.avsc} (100%) rename commons/kafka/aggregator/{double_array_aggregator.avsc => aggregator_double_array.avsc} (100%) rename commons/kafka/key/{measurement_key.avsc => key_measurement.avsc} (100%) rename commons/kafka/key/{windowed_key.avsc => key_windowed.avsc} (100%) create mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/unit/AvroValidatorTest.java create mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/AvroValidator.java create mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java create mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/StructureValidator.java delete mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/Validator.java diff --git a/commons/kafka/aggregator/double_aggregator.avsc b/commons/kafka/aggregator/aggregator_double.avsc similarity index 100% rename from commons/kafka/aggregator/double_aggregator.avsc rename to commons/kafka/aggregator/aggregator_double.avsc diff --git a/commons/kafka/aggregator/double_array_aggregator.avsc b/commons/kafka/aggregator/aggregator_double_array.avsc similarity index 100% rename from commons/kafka/aggregator/double_array_aggregator.avsc rename to commons/kafka/aggregator/aggregator_double_array.avsc diff --git a/commons/kafka/key/measurement_key.avsc b/commons/kafka/key/key_measurement.avsc similarity index 100% rename from commons/kafka/key/measurement_key.avsc rename to commons/kafka/key/key_measurement.avsc diff --git a/commons/kafka/key/windowed_key.avsc b/commons/kafka/key/key_windowed.avsc similarity index 100% rename from commons/kafka/key/windowed_key.avsc rename to commons/kafka/key/key_windowed.avsc diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/unit/AvroValidatorTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/unit/AvroValidatorTest.java new file mode 100644 index 00000000..d9151086 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/unit/AvroValidatorTest.java @@ -0,0 +1,36 @@ +package org.radarcns.unit; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static junit.framework.TestCase.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.radarcns.validator.AvroValidator.FIELD_NAME_REGEX; + +import org.junit.Test; + +public class AvroValidatorTest { + + @Test + public void testRegex() { + assertTrue("x".matches(FIELD_NAME_REGEX)); + assertTrue("time".matches(FIELD_NAME_REGEX)); + assertTrue("subjectId".matches(FIELD_NAME_REGEX)); + assertTrue("listOfSeveralThings".matches(FIELD_NAME_REGEX)); + assertFalse("Time".matches(FIELD_NAME_REGEX)); + } + +} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/AvroValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/AvroValidator.java new file mode 100644 index 00000000..86bf1ee8 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/AvroValidator.java @@ -0,0 +1,164 @@ +package org.radarcns.validator; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import org.apache.avro.Schema; +import org.apache.avro.Schema.Field; +import org.apache.avro.Schema.Parser; +import org.radarcns.validator.StructureValidator.NameFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public final class AvroValidator { + + private static final Logger LOGGER = LoggerFactory.getLogger(AvroValidator.class); + + public static final String AVRO_FORMAT = "avsc"; + public static final String YAML_FORMAT = "yml"; + + public static final String PACKAGE = "org.radarcns"; + + public static final String TIME = "time"; + public static final String TIME_RECEIVED = "timeReceived"; + public static final String TIME_COMPLETED = "timeCompleted"; + + public static final String FIELD_NAME_REGEX = "^[a-z][a-zA-Z]*$"; + + private static Map skipName; + + static { + skipName = new HashMap<>(); + skipName.put("spO2", "org.radarcns.passive.biovotion.BiovotionVSMSpO2"); + skipName.put("spO2Quality", "org.radarcns.passive.biovotion.BiovotionVSMSpO2"); + } + + private AvroValidator() { + //Static class + } + + /** + * TODO. + * @param file TODO. + * @param packageName TODO. + * @param parentName TODO. + * @throws IOException TODO. + */ + public static void analiseFiles(File file, NameFolder packageName, String parentName) + throws IOException { + if (file.isDirectory()) { + for (File son : file.listFiles()) { + analiseFiles(son, packageName, file.getName()); + } + } else { + assertEquals(packageName + "should contain only " + AVRO_FORMAT + " files", + AVRO_FORMAT, getExtension(file)); + + Schema schema = new Parser().parse(file); + + if (parentName != null) { + assertTrue(file.getName().startsWith(parentName)); + assertEquals(PACKAGE.concat(".").concat(packageName.getName()).concat( + ".").concat(parentName), schema.getNamespace()); + } else { + assertEquals(PACKAGE.concat(".").concat(packageName.getName()), + schema.getNamespace()); + } + + switch (packageName) { + case ACTIVE: + assertNotNull("Any " + NameFolder.ACTIVE.getName() + + " schema must have a " + TIME_COMPLETED + " field", + schema.getField(TIME_COMPLETED)); + assertNull("To be compliant with the RADAR design, " + + TIME_RECEIVED + " field must be only in " + + NameFolder.PASSIVE.getName(), schema.getField(TIME_RECEIVED)); + checkTimeField(schema, packageName); + break; + case MONITOR: + checkTimeField(schema, packageName); + break; + case PASSIVE: + assertNotNull("Any " + NameFolder.PASSIVE.getName() + + " schema must have a " + TIME_RECEIVED + " field", + schema.getField(TIME_RECEIVED)); + assertNull("To be compliant with the RADAR design, " + + TIME_COMPLETED + " field must be only in " + + NameFolder.ACTIVE.getName(), schema.getField(TIME_COMPLETED)); + checkTimeField(schema, packageName); + break; + default: //Nothing to do + } + + generalSchemaChecks(schema); + } + } + + /** + * TODO. + * @param file TODO. + * @return TODO. + */ + public static String getExtension(File file) { + String extension = ""; + int index = file.getName().lastIndexOf('.'); + if (index > 0) { + extension = file.getName().substring(index + 1); + } + + return extension; + } + + /** + * TODO. + * @param schema TODO. + * @param packageName TODO. + */ + public static void checkTimeField(Schema schema, NameFolder packageName) { + assertNotNull("Any " + packageName.getName() + " schema must have a " + TIME + + " field", schema.getField(TIME)); + } + + /** + * TODO. + * @param schema TODO. + */ + public static void generalSchemaChecks(Schema schema) { + for (Field field : schema.getFields()) { + + if (skipName.containsKey(field.name()) + && skipName.get(field.name()).equalsIgnoreCase(schema.getFullName())) { + LOGGER.warn("[Name field check] Skipping {} in {}", + field.name(), schema.getFullName()); + continue; + } + + assertTrue(field.name() + " in " + schema.getFullName() + + " does not respect lowerCamelCase name convention", + field.name().matches(FIELD_NAME_REGEX)); + } + } + +} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java new file mode 100644 index 00000000..cf0ad4b6 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java @@ -0,0 +1,63 @@ +package org.radarcns.validator; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.io.IOException; +import org.radarcns.validator.StructureValidator.CommonsFolder; +import org.radarcns.validator.StructureValidator.NameFolder; + +/** TODO. */ +public final class CommonsValidator { + + //private static final Logger LOGGER = LoggerFactory.getLogger(CommonsValidator.class); + + private CommonsValidator() { + //Static class + } + + /** TODO. */ + public static void validateAll() throws IOException { + active(); + kafka(); + monitor(); + passive(); + } + + /** TODO. */ + public static void active() throws IOException { + AvroValidator.analiseFiles(CommonsFolder.ACTIVE.getFolder(), NameFolder.ACTIVE, + null); + } + + /** TODO. */ + public static void kafka() throws IOException { + AvroValidator.analiseFiles(CommonsFolder.KAFKA.getFolder(), NameFolder.KAFKA, + null); + } + + /** TODO. */ + public static void monitor() throws IOException { + AvroValidator.analiseFiles(CommonsFolder.MONITOR.getFolder(), NameFolder.MONITOR, + null); + } + + /** TODO. */ + public static void passive() throws IOException { + AvroValidator.analiseFiles(CommonsFolder.PASSIVE.getFolder(), NameFolder.PASSIVE, + null); + } +} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/StructureValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/StructureValidator.java new file mode 100644 index 00000000..5d26ad01 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/StructureValidator.java @@ -0,0 +1,177 @@ +package org.radarcns.validator; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import org.junit.Test; + +/** + * Checks that the tree folder structure respects the following structure + *
    + *
  • commons
  • + *
      + *
    • active
    • + *
    • kafka
    • + *
    • monitor
    • + *
    • passive
    • + *
    + *
  • rest
  • + *
  • specification
  • + *
      + *
    • active
    • + *
    • monitor
    • + *
    • passive
    • + *
    + *
+ * At moment, the {@code restapi} does not have a well defined structure. + * TODO. + */ +public class StructureValidator { + + /** Folder names. */ + public enum NameFolder { + ACTIVE("active"), + COMMONS("commons"), + KAFKA("kafka"), + MONITOR("monitor"), + PASSIVE("passive"), + RESTAPI("restapi"), + SPECIFICATION("specification"); + + private final String name; + + NameFolder(String name) { + this.name = name; + } + + public String getName() { + return name; + } + } + + /** Root paths. */ + public enum RootPath { + COMMONS(Paths.get( + new File(".").toURI()).getParent().getParent().getParent().resolve( + NameFolder.COMMONS.getName())), + REST_API(Paths.get( + new File(".").toURI()).getParent().getParent().getParent().resolve( + NameFolder.RESTAPI.getName())), + SPECIFICATION(Paths.get( + new File(".").toURI()).getParent().getParent().getParent().resolve( + NameFolder.SPECIFICATION.getName())); + + private final Path path; + + RootPath(Path path) { + this.path = path; + } + + public Path getPath() { + return path; + } + } + + /** Root folders. */ + public enum RootFolder { + COMMONS(new File(RootPath.COMMONS.getPath().toUri())), + REST_API(new File(RootPath.REST_API.getPath().toUri())), + SPECIFICATION(new File(RootPath.SPECIFICATION.getPath().toUri())); + + private final File folder; + + RootFolder(File folder) { + this.folder = folder; + } + + public File getFolder() { + return folder; + } + } + + /** Commons folders. */ + public enum CommonsFolder { + ACTIVE(new File(RootPath.COMMONS.getPath().resolve(NameFolder.ACTIVE.getName()).toUri())), + KAFKA(new File(RootPath.COMMONS.getPath().resolve(NameFolder.KAFKA.getName()).toUri())), + MONITOR(new File(RootPath.COMMONS.getPath().resolve(NameFolder.MONITOR.getName()).toUri())), + PASSIVE(new File(RootPath.COMMONS.getPath().resolve(NameFolder.PASSIVE.getName()).toUri())); + + private final File folder; + + CommonsFolder(File folder) { + this.folder = folder; + } + + public File getFolder() { + return folder; + } + } + + /** Commons folders. */ + public enum SpecificationFolder { + ACTIVE(new File(RootPath.SPECIFICATION.getPath().resolve( + NameFolder.ACTIVE.getName()).toUri())), + MONITOR(new File(RootPath.SPECIFICATION.getPath().resolve( + NameFolder.MONITOR.getName()).toUri())), + PASSIVE(new File(RootPath.SPECIFICATION.getPath().resolve( + NameFolder.PASSIVE.getName()).toUri())); + + private final File folder; + + SpecificationFolder(File folder) { + this.folder = folder; + } + + public File getFolder() { + return folder; + } + } + + //private static final Logger LOGGER = LoggerFactory.getLogger(StructureValidator.class); + + @Test + public void commons() throws IOException { + assertEquals(true, RootFolder.COMMONS.getFolder().isDirectory()); + + for (CommonsFolder folder : CommonsFolder.values()) { + assertEquals(true, folder.getFolder().isDirectory()); + } + + CommonsValidator.validateAll(); + } + + @Test + public void restapi() { + assertEquals(true, RootFolder.REST_API.getFolder().isDirectory()); + + //TODO check whether it is possible to define a structure + } + + @Test + public void specification() { + assertEquals(true, RootFolder.SPECIFICATION.getFolder().isDirectory()); + + for (SpecificationFolder folder : SpecificationFolder.values()) { + assertEquals(true, folder.getFolder().isDirectory()); + } + } +} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/Validator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/Validator.java deleted file mode 100644 index ea140739..00000000 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/Validator.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.radarcns.validator; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertEquals; - -import java.io.File; -import java.nio.file.Path; -import java.nio.file.Paths; -import org.junit.Test; - -public class Validator { - - public static final String COMMONS_FOLDER_NAME = "commons"; - public static final String RESTAPI_FOLDER_NAME = "restapi"; - public static final String SPECIFICATION_FOLDER_NAME = "specification"; - - public static final Path COMMONS_PATH = Paths.get( - new File(".").toURI()).getParent().getParent().getParent().resolve( - COMMONS_FOLDER_NAME); - - public static final Path REST_API_PATH = Paths.get( - new File(".").toURI()).getParent().getParent().getParent().resolve( - RESTAPI_FOLDER_NAME); - - public static final Path SPECIFICATION_PATH = Paths.get( - new File(".").toURI()).getParent().getParent().getParent().resolve( - SPECIFICATION_FOLDER_NAME); - - //private static final Logger LOGGER = LoggerFactory.getLogger(Validator.class); - - @Test - public void commons() { - File commonsFolder = new File(COMMONS_PATH.toUri()); - assertEquals(true, commonsFolder.exists()); - assertEquals(true, commonsFolder.isDirectory()); - } - - @Test - public void restapi() { - File commonsFolder = new File(REST_API_PATH.toUri()); - assertEquals(true, commonsFolder.exists()); - assertEquals(true, commonsFolder.isDirectory()); - } - - @Test - public void specification() { - File commonsFolder = new File(SPECIFICATION_PATH.toUri()); - assertEquals(true, commonsFolder.exists()); - assertEquals(true, commonsFolder.isDirectory()); - } -} From f8a424635daa1711c8803cfe4515a63b858ab594 Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Mon, 24 Jul 2017 18:49:26 +0100 Subject: [PATCH 012/112] Combinator pattern --- java-sdk/radar-schemas-validator/build.gradle | 2 + .../org/radarcns/validator/AvroValidator.java | 21 ++ .../org/radarcns/validator/util/Invalid.java | 58 ++++ .../validator/util/SchemaValidator.java | 175 +++++++++++ .../validator/util/SchemaValidatorImpl.java | 36 +++ .../util/ValidationResult.java} | 24 +- .../validator/util/ValidationSupport.java | 32 ++ .../util/unit/SchemaValidatorTest.java | 288 ++++++++++++++++++ 8 files changed, 623 insertions(+), 13 deletions(-) create mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/Invalid.java create mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java create mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorImpl.java rename java-sdk/radar-schemas-validator/src/test/java/org/radarcns/{unit/AvroValidatorTest.java => validator/util/ValidationResult.java} (52%) create mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java create mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/unit/SchemaValidatorTest.java diff --git a/java-sdk/radar-schemas-validator/build.gradle b/java-sdk/radar-schemas-validator/build.gradle index 949b1f69..c23cdde2 100644 --- a/java-sdk/radar-schemas-validator/build.gradle +++ b/java-sdk/radar-schemas-validator/build.gradle @@ -25,10 +25,12 @@ sourceSets { ext.junitVersion = '4.12' ext.slf4jVersion = '1.7.25' +ext.apacheCommonsVersion = '3.6' dependencies { testCompile group: 'junit', name: 'junit', version: junitVersion testCompile group: 'org.slf4j', name: 'slf4j-simple', version: slf4jVersion + testCompile group: 'org.apache.commons', name: 'commons-lang3', version: apacheCommonsVersion } //---------------------------------------------------------------------------// diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/AvroValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/AvroValidator.java index 86bf1ee8..1e30d897 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/AvroValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/AvroValidator.java @@ -28,7 +28,9 @@ import org.apache.avro.Schema; import org.apache.avro.Schema.Field; import org.apache.avro.Schema.Parser; +import org.apache.avro.SchemaValidator; import org.radarcns.validator.StructureValidator.NameFolder; +import org.radarcns.validator.util.SchemaValidatorImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -162,3 +164,22 @@ public static void generalSchemaChecks(Schema schema) { } } + + +//check if there is documentaion +//check if name folder is present in the name schema or viceversa +//check package name +//check contraction +//check if name contains value +//check name convention + +// - Try to avoid abbreviations in the field names and write out the field name instead. +//- There should be no need to add `value` at the end of a field name. +//- Enumerator items should be written in uppercase characters separated by underscores. +//- Add documentation (the `doc` property) to each schema and each field. The documentation should show in text what is being measured, how, and what units or ranges are applicable. Abbreviations and acronyms in the documentation should be written out. +// - Prefer a categorical specification (an Avro enum) over a free string. This disambiguates the possible values for analysis. +//- Prefer a flat record over a hierarchical record. This simplifies the organization of the data downstream, for example, when mapping to CSV. +// - Prefer written out fields to arrays. This simplifies the organization of the data downstream, for example, when mapping to CSV. +// - Give each schema a proper namespace, preferably `org.radarcns.deviceproducer` fully in lowercase, without any numbers, uppercase letters or symbols (except `.`). For the Empatica E4, the producer is Empatica, so the namespace is `org.radarcns.empatica`. For generic types, like a phone, Android Wear device or Android application, the namespace could just be `org.radarcns.phone`, `org.radarcns.wear`, or `org.radarcns.application`. +// - In the schema name, use upper camel case and name the device explicitly (for example, `EmpaticaE4Temperature`). +// warning on collision name diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/Invalid.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/Invalid.java new file mode 100644 index 00000000..367984c2 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/Invalid.java @@ -0,0 +1,58 @@ +package org.radarcns.validator.util; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.util.Optional; + +public class Invalid implements ValidationResult { + + private final String reason; + + Invalid(String reason) { + this.reason = reason; + } + + public boolean isValid() { + return false; + } + + public Optional getReason() { + return Optional.of(reason); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (!(o instanceof Invalid)) { + return false; + } + + Invalid invalid = (Invalid) o; + + return new org.apache.commons.lang3.builder.EqualsBuilder().append( + reason, invalid.reason).isEquals(); + } + + @Override + public int hashCode() { + return new org.apache.commons.lang3.builder.HashCodeBuilder( + 17, 37).append(reason).toHashCode(); + } +} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java new file mode 100644 index 00000000..da6d5312 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java @@ -0,0 +1,175 @@ +package org.radarcns.validator.util; + +import static org.radarcns.validator.util.SchemaValidator.Message.NAME_CONVENTION; +import static org.radarcns.validator.util.SchemaValidator.Message.NOT_TIME_COMPLETED_FIELD; +import static org.radarcns.validator.util.SchemaValidator.Message.NOT_TIME_RECEIVED_FIELD; +import static org.radarcns.validator.util.SchemaValidator.Message.RECORD_NAME; +import static org.radarcns.validator.util.SchemaValidator.Message.TIME_COMPLETED_FIELD; +import static org.radarcns.validator.util.SchemaValidator.Message.TIME_FIELD; +import static org.radarcns.validator.util.SchemaValidator.Message.TIME_RECEIVED_FIELD; +import static org.radarcns.validator.util.ValidationResult.invalid; +import static org.radarcns.validator.util.ValidationResult.valid; + +import com.sun.org.apache.regexp.internal.RE; +import java.util.Arrays; +import java.util.Locale; +import java.util.Objects; +import java.util.Set; +import java.util.function.Function; +import java.util.function.Predicate; +import org.apache.avro.Schema; +import org.apache.avro.Schema.Type; +import org.radarcns.validator.StructureValidator.NameFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +public interface SchemaValidator extends Function { + + String NAME_SPACE = "org.radarcns"; + + String TIME = "time"; + String TIME_RECEIVED = "timeReceived"; + String TIME_COMPLETED = "timeCompleted"; + + String FIELD_NAME_REGEX = "^[a-z][a-zA-Z]*$"; + + /** Folder names. */ + enum Message { + NAME_SPACE("Namespace must be in the form \""), + RECORD_NAME("Record name must be the conversion of the .avsc file name in UpperCamelCase. " + + "The expected value is "), + TIME_FIELD("Any schema representing collected data must have a \"" + TIME + + "\" field formatted in " + Type.DOUBLE.getName().toUpperCase(Locale.ENGLISH) + "."), + TIME_COMPLETED_FIELD("Any " + NameFolder.ACTIVE + " schema must have a \"" + TIME_COMPLETED + + "\" field formatted in " + Type.DOUBLE.getName().toUpperCase(Locale.ENGLISH) + "."), + NOT_TIME_COMPLETED_FIELD("\"" + TIME_COMPLETED + "\" is allow only in " + NameFolder.ACTIVE + + " schemas."), + TIME_RECEIVED_FIELD("Any " + NameFolder.PASSIVE + " schema must have a \"" + TIME_RECEIVED + + "\" field formatted in " + Type.DOUBLE.getName().toUpperCase(Locale.ENGLISH) + "."), + NOT_TIME_RECEIVED_FIELD("\"" + TIME_RECEIVED + "\" is allow only in " + NameFolder.PASSIVE + + " schemas."), + NAME_CONVENTION("Field name does not respect lowerCamelCase name convention."); + + private final String message; + + Message(String message) { + this.message = message; + } + + public String getMessage(Schema schema) { + return message + " " +schema.getFullName() + " is invalid."; + } + + public String getMessage() { + return message ; + } + } + + static SchemaValidator validateNameSpace(NameFolder rootFolder, String currentFolder) { + String expected = NAME_SPACE.concat(".").concat( + rootFolder.getName()).concat(".").concat(currentFolder); + + return schema -> schema.getNamespace().equalsIgnoreCase(expected) ? valid() : + invalid(Message.NAME_SPACE.getMessage().concat(expected).concat( + "\". ").concat(schema.getFullName()).concat(" is invalid.")); + } + + static SchemaValidator validateRecordName(String fileName) { + String expected = getRecordName(fileName); + + return schema -> schema.getName().equalsIgnoreCase(expected) ? valid() : + invalid(RECORD_NAME.getMessage().concat(expected).concat("\". ").concat( + schema.getFullName()).concat(" is invalid.")); + } + + static String getRecordName(String fileName) { + Objects.requireNonNull(fileName); + + String recordName = ""; + + boolean start = true; + for (int i = 0; i < fileName.length(); i++) { + switch (fileName.charAt(i)) { + case '_' : + start = true; + break; + case '.' : return recordName; + default: + recordName += start ? Character.toUpperCase(fileName.charAt(i)) + : fileName.charAt(i); + start = false; + } + } + + return recordName; + } + + static SchemaValidator validateTime() { + return validate(schema -> schema.getField(TIME) != null + && schema.getField(TIME).schema().getType().equals(Type.DOUBLE), TIME_FIELD); + } + + static SchemaValidator validateTimeCompleted() { + return validate(schema -> schema.getField(TIME_COMPLETED) != null + && schema.getField(TIME_COMPLETED).schema().getType().equals(Type.DOUBLE), + TIME_COMPLETED_FIELD); + } + + static SchemaValidator validateNotTimeCompleted() { + return validate(schema -> schema.getField(TIME_COMPLETED) == null, + NOT_TIME_COMPLETED_FIELD); + } + + static SchemaValidator validateTimeReceived() { + return validate(schema -> schema.getField(TIME_RECEIVED) != null + && schema.getField(TIME_RECEIVED).schema().getType().equals(Type.DOUBLE), + TIME_RECEIVED_FIELD); + } + + static SchemaValidator validateNotTimeReceived() { + return validate(schema -> schema.getField(TIME_RECEIVED) == null, + NOT_TIME_RECEIVED_FIELD); + } + + static SchemaValidator validateFieldName() { + return validateFieldName(null); + } + + static SchemaValidator validateFieldName(Set skip) { + return validate(schema -> + schema.getFields() + .stream() + .map(field -> field.name()) + .allMatch(name -> name.matches(FIELD_NAME_REGEX) + || (skip != null && skip.contains(name))) + , NAME_CONVENTION); + } + + static SchemaValidator validate(Predicate predicate, Message message){ + return schema -> predicate.test(schema) ? valid() : invalid(message.getMessage(schema)); + } + + default SchemaValidator and(SchemaValidator other) { + return schema -> { + final ValidationResult result = this.apply(schema); + return result.isValid() ? other.apply(schema) : result; + }; + } + +} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorImpl.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorImpl.java new file mode 100644 index 00000000..fa34b2ca --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorImpl.java @@ -0,0 +1,36 @@ +package org.radarcns.validator.util; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.radarcns.validator.util.SchemaValidator.validateTimeCompleted; +import static org.radarcns.validator.util.SchemaValidator.validateTime; +import static org.radarcns.validator.util.SchemaValidator.validateTimeReceived; + +public final class SchemaValidatorImpl { + + private SchemaValidatorImpl() { + //Private constructor + } + + public static final SchemaValidator ACTIVE_VALIDATION = + validateTime().and(validateTimeCompleted()); + + public static final SchemaValidator MONITOR_VALIDATION = validateTime(); + + public static final SchemaValidator PASSIVE_VALIDATION = + validateTime().and(validateTimeReceived()); +} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/unit/AvroValidatorTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationResult.java similarity index 52% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/unit/AvroValidatorTest.java rename to java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationResult.java index d9151086..956c3aa2 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/unit/AvroValidatorTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationResult.java @@ -1,4 +1,4 @@ -package org.radarcns.unit; +package org.radarcns.validator.util; /* * Copyright 2017 King's College London and The Hyve @@ -16,21 +16,19 @@ * limitations under the License. */ -import static junit.framework.TestCase.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.radarcns.validator.AvroValidator.FIELD_NAME_REGEX; +import java.util.Optional; -import org.junit.Test; +public interface ValidationResult{ -public class AvroValidatorTest { + static ValidationResult valid(){ + return ValidationSupport.valid(); + } - @Test - public void testRegex() { - assertTrue("x".matches(FIELD_NAME_REGEX)); - assertTrue("time".matches(FIELD_NAME_REGEX)); - assertTrue("subjectId".matches(FIELD_NAME_REGEX)); - assertTrue("listOfSeveralThings".matches(FIELD_NAME_REGEX)); - assertFalse("Time".matches(FIELD_NAME_REGEX)); + static ValidationResult invalid(String reason){ + return new Invalid(reason); } + boolean isValid(); + + Optional getReason(); } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java new file mode 100644 index 00000000..7adf9122 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java @@ -0,0 +1,32 @@ +package org.radarcns.validator.util; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.util.Optional; + +final class ValidationSupport { + + protected static final ValidationResult valid = new ValidationResult(){ + public boolean isValid(){ return true; } + public Optional getReason(){ return Optional.empty(); } + }; + + static ValidationResult valid(){ + return valid; + } + +} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/unit/SchemaValidatorTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/unit/SchemaValidatorTest.java new file mode 100644 index 00000000..65b86986 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/unit/SchemaValidatorTest.java @@ -0,0 +1,288 @@ +package org.radarcns.validator.util.unit; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.radarcns.validator.AvroValidator.FIELD_NAME_REGEX; +import static org.radarcns.validator.StructureValidator.NameFolder.ACTIVE; +import static org.radarcns.validator.StructureValidator.NameFolder.MONITOR; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Optional; +import junit.framework.TestCase; +import org.apache.avro.Schema; +import org.apache.avro.SchemaBuilder; +import org.junit.Test; +import org.radarcns.validator.StructureValidator.NameFolder; +import org.radarcns.validator.util.SchemaValidator; +import org.radarcns.validator.util.ValidationResult; +import org.slf4j.LoggerFactory; + +public class SchemaValidatorTest { + + @Test + public void fileNameTest() { + assertEquals("Questionnaire", + SchemaValidator.getRecordName("questionnaire.avsc")); + assertEquals("ApplicationExternalTime", + SchemaValidator.getRecordName("application_external_time.avsc")); + } + + @Test + public void nameSpaceTest() { + Schema schema; + ValidationResult result; + + schema = SchemaBuilder + .builder("org.radarcns.active.questionnaire") + .record("Questionnaire") + .fields() + .endRecord(); + + result = SchemaValidator.validateNameSpace(ACTIVE, + "questionnaire").apply(schema); + + assertTrue(result.isValid()); + + schema = SchemaBuilder + .builder("org.radarcns.monitors.test") + .record("RecordTest") + .fields() + .endRecord(); + + result = SchemaValidator.validateNameSpace(MONITOR, "test").apply(schema); + + assertFalse(result.isValid()); + + assertEquals(Optional.of("Namespace must be in the form \"org.radarcns.monitor.test\". " + + "org.radarcns.monitors.test.RecordTest is invalid."), result.getReason()); + + schema = SchemaBuilder + .builder("org.radarcns.monitor.tests") + .record("RecordTest") + .fields() + .endRecord(); + + result = SchemaValidator.validateNameSpace(MONITOR, "test").apply(schema); + + assertFalse(result.isValid()); + + assertEquals(Optional.of("Namespace must be in the form \"org.radarcns.monitor.test\". " + + "org.radarcns.monitor.tests.RecordTest is invalid."), result.getReason()); + } + + @Test + public void recordNameTest() { + Schema schema; + ValidationResult result; + + schema = SchemaBuilder + .builder("org.radarcns.active.questionnaire") + .record("Questionnaire") + .fields() + .endRecord(); + + result = SchemaValidator.validateRecordName("questionnaire.avsc").apply(schema); + + assertTrue(result.isValid()); + + schema = SchemaBuilder + .builder("org.radarcns.passive.empatica") + .record("EmpaticaE4Aceleration") + .fields() + .endRecord(); + + result = SchemaValidator.validateRecordName("empatica_e4_acceleration.avsc").apply(schema); + + assertFalse(result.isValid()); + + assertEquals(Optional.of("Record name must be the conversion of the .avsc file name in " + + "UpperCamelCase. The expected value is EmpaticaE4Acceleration\". " + + "org.radarcns.passive.empatica.EmpaticaE4Aceleration is invalid."), + result.getReason()); + } + + @Test + public void timeTest() { + Schema schema; + ValidationResult result; + + schema = SchemaBuilder + .builder("org.radarcns.monitor.test") + .record("RecordTest") + .fields() + .requiredString("field") + .endRecord(); + + result = SchemaValidator.validateTime().apply(schema); + + assertFalse(result.isValid()); + + assertEquals(Optional.of("Any schema representing collected data must have a \"time\" field" + + " formatted in DOUBLE. org.radarcns.monitor.test.RecordTest is invalid."), + result.getReason()); + + schema = SchemaBuilder + .builder("org.radarcns.monitor.test") + .record("RecordTest") + .fields() + .requiredDouble("time") + .endRecord(); + + result = SchemaValidator.validateTime().apply(schema); + + assertTrue(result.isValid()); + } + + @Test + public void timeCompletedTest() { + Schema schema; + ValidationResult result; + + schema = SchemaBuilder + .builder("org.radarcns.monitor.test") + .record("RecordTest") + .fields() + .requiredString("field") + .endRecord(); + + result = SchemaValidator.validateTimeCompleted().apply(schema); + assertFalse(result.isValid()); + assertEquals(Optional.of("Any ACTIVE schema must have a \"timeCompleted\" field formatted " + + "in DOUBLE. org.radarcns.monitor.test.RecordTest is invalid."), result.getReason()); + + result = SchemaValidator.validateNotTimeCompleted().apply(schema); + assertTrue(result.isValid()); + + schema = SchemaBuilder + .builder("org.radarcns.monitor.test") + .record("RecordTest") + .fields() + .requiredDouble("timeCompleted") + .endRecord(); + + result = SchemaValidator.validateTimeCompleted().apply(schema); + assertTrue(result.isValid()); + + result = SchemaValidator.validateNotTimeCompleted().apply(schema); + assertFalse(result.isValid()); + assertEquals(Optional.of("\"timeCompleted\" is allow only in ACTIVE schemas. " + + "org.radarcns.monitor.test.RecordTest is invalid."), result.getReason()); + } + + @Test + public void timeReceivedTest() { + Schema schema; + ValidationResult result; + + schema = SchemaBuilder + .builder("org.radarcns.monitor.test") + .record("RecordTest") + .fields() + .requiredString("field") + .endRecord(); + + result = SchemaValidator.validateTimeReceived().apply(schema); + assertFalse(result.isValid()); + assertEquals(Optional.of("Any PASSIVE schema must have a \"timeReceived\" field formatted " + + "in DOUBLE. org.radarcns.monitor.test.RecordTest is invalid."), result.getReason()); + + result = SchemaValidator.validateNotTimeReceived().apply(schema); + assertTrue(result.isValid()); + + schema = SchemaBuilder + .builder("org.radarcns.monitor.test") + .record("RecordTest") + .fields() + .requiredDouble("timeReceived") + .endRecord(); + + result = SchemaValidator.validateTimeReceived().apply(schema); + assertTrue(result.isValid()); + + result = SchemaValidator.validateNotTimeReceived().apply(schema); + assertFalse(result.isValid()); + assertEquals(Optional.of("\"timeReceived\" is allow only in PASSIVE schemas. " + + "org.radarcns.monitor.test.RecordTest is invalid."), result.getReason()); + } + + @Test + public void testRegex() { + assertTrue("x".matches(FIELD_NAME_REGEX)); + assertTrue("time".matches(FIELD_NAME_REGEX)); + assertTrue("subjectId".matches(FIELD_NAME_REGEX)); + assertTrue("listOfSeveralThings".matches(FIELD_NAME_REGEX)); + assertFalse("Time".matches(FIELD_NAME_REGEX)); + assertFalse("E4Heart".matches(FIELD_NAME_REGEX)); + } + + @Test + public void fieldNameTest() { + Schema schema; + ValidationResult result; + + schema = SchemaBuilder + .builder("org.radarcns.monitor.test") + .record("RecordTest") + .fields() + .requiredString("Formula1") + .endRecord(); + + result = SchemaValidator.validateFieldName().apply(schema); + assertFalse(result.isValid()); + assertEquals(Optional.of("Field name does not respect lowerCamelCase name convention. " + + "org.radarcns.monitor.test.RecordTest is invalid."), result.getReason()); + + schema = SchemaBuilder + .builder("org.radarcns.monitor.test") + .record("RecordTest") + .fields() + .requiredString("Formula1") + .requiredString("time") + .endRecord(); + + result = SchemaValidator.validateFieldName(Collections.singleton("time")).apply(schema); + assertFalse(result.isValid()); + assertEquals(Optional.of("Field name does not respect lowerCamelCase name convention. " + + "org.radarcns.monitor.test.RecordTest is invalid."), result.getReason()); + + schema = SchemaBuilder + .builder("org.radarcns.monitor.test") + .record("RecordTest") + .fields() + .requiredDouble("timeReceived") + .endRecord(); + + result = SchemaValidator.validateFieldName().apply(schema); + assertTrue(result.isValid()); + + schema = SchemaBuilder + .builder("org.radarcns.monitor.test") + .record("RecordTest") + .fields() + .requiredString("Formula1") + .requiredString("time") + .endRecord(); + + result = SchemaValidator.validateFieldName(Collections.singleton("Formula1")).apply(schema); + assertTrue(result.isValid()); + } + +} From bd455a5d5dfdfcfb8cc113258af73a2d3e48208b Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Tue, 25 Jul 2017 11:52:53 +0100 Subject: [PATCH 013/112] Fixed Style --- .../org/radarcns/validator/AvroValidator.java | 21 ---- .../validator/util/SchemaValidator.java | 89 +++++++++----- .../validator/util/SchemaValidatorImpl.java | 14 +-- .../validator/util/ValidationResult.java | 8 +- .../validator/util/ValidationSupport.java | 51 +++++++- .../util/unit/SchemaValidatorTest.java | 114 ++++++++++-------- 6 files changed, 180 insertions(+), 117 deletions(-) diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/AvroValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/AvroValidator.java index 1e30d897..86bf1ee8 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/AvroValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/AvroValidator.java @@ -28,9 +28,7 @@ import org.apache.avro.Schema; import org.apache.avro.Schema.Field; import org.apache.avro.Schema.Parser; -import org.apache.avro.SchemaValidator; import org.radarcns.validator.StructureValidator.NameFolder; -import org.radarcns.validator.util.SchemaValidatorImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -164,22 +162,3 @@ public static void generalSchemaChecks(Schema schema) { } } - - -//check if there is documentaion -//check if name folder is present in the name schema or viceversa -//check package name -//check contraction -//check if name contains value -//check name convention - -// - Try to avoid abbreviations in the field names and write out the field name instead. -//- There should be no need to add `value` at the end of a field name. -//- Enumerator items should be written in uppercase characters separated by underscores. -//- Add documentation (the `doc` property) to each schema and each field. The documentation should show in text what is being measured, how, and what units or ranges are applicable. Abbreviations and acronyms in the documentation should be written out. -// - Prefer a categorical specification (an Avro enum) over a free string. This disambiguates the possible values for analysis. -//- Prefer a flat record over a hierarchical record. This simplifies the organization of the data downstream, for example, when mapping to CSV. -// - Prefer written out fields to arrays. This simplifies the organization of the data downstream, for example, when mapping to CSV. -// - Give each schema a proper namespace, preferably `org.radarcns.deviceproducer` fully in lowercase, without any numbers, uppercase letters or symbols (except `.`). For the Empatica E4, the producer is Empatica, so the namespace is `org.radarcns.empatica`. For generic types, like a phone, Android Wear device or Android application, the namespace could just be `org.radarcns.phone`, `org.radarcns.wear`, or `org.radarcns.application`. -// - In the schema name, use upper camel case and name the device explicitly (for example, `EmpaticaE4Temperature`). -// warning on collision name diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java index da6d5312..68c55312 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java @@ -9,19 +9,16 @@ import static org.radarcns.validator.util.SchemaValidator.Message.TIME_RECEIVED_FIELD; import static org.radarcns.validator.util.ValidationResult.invalid; import static org.radarcns.validator.util.ValidationResult.valid; +import static org.radarcns.validator.util.ValidationSupport.getRecordName; -import com.sun.org.apache.regexp.internal.RE; -import java.util.Arrays; import java.util.Locale; -import java.util.Objects; import java.util.Set; import java.util.function.Function; import java.util.function.Predicate; import org.apache.avro.Schema; import org.apache.avro.Schema.Type; import org.radarcns.validator.StructureValidator.NameFolder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; + /* * Copyright 2017 King's College London and The Hyve @@ -73,14 +70,20 @@ enum Message { } public String getMessage(Schema schema) { - return message + " " +schema.getFullName() + " is invalid."; + return message.concat(" ").concat(schema.getFullName()).concat(" is invalid."); } public String getMessage() { - return message ; + return message; } } + /** + * TODO. + * @param rootFolder TODO + * @param currentFolder TODO + * @return TODO + */ static SchemaValidator validateNameSpace(NameFolder rootFolder, String currentFolder) { String expected = NAME_SPACE.concat(".").concat( rootFolder.getName()).concat(".").concat(currentFolder); @@ -90,6 +93,11 @@ static SchemaValidator validateNameSpace(NameFolder rootFolder, String currentFo "\". ").concat(schema.getFullName()).concat(" is invalid.")); } + /** + * TODO. + * @param fileName TODO + * @return TODO + */ static SchemaValidator validateRecordName(String fileName) { String expected = getRecordName(fileName); @@ -98,73 +106,90 @@ static SchemaValidator validateRecordName(String fileName) { schema.getFullName()).concat(" is invalid.")); } - static String getRecordName(String fileName) { - Objects.requireNonNull(fileName); - - String recordName = ""; - - boolean start = true; - for (int i = 0; i < fileName.length(); i++) { - switch (fileName.charAt(i)) { - case '_' : - start = true; - break; - case '.' : return recordName; - default: - recordName += start ? Character.toUpperCase(fileName.charAt(i)) - : fileName.charAt(i); - start = false; - } - } - - return recordName; - } - + /** + * TODO. + * @return TODO + */ static SchemaValidator validateTime() { return validate(schema -> schema.getField(TIME) != null && schema.getField(TIME).schema().getType().equals(Type.DOUBLE), TIME_FIELD); } + /** + * TODO. + * @return TODO + */ static SchemaValidator validateTimeCompleted() { return validate(schema -> schema.getField(TIME_COMPLETED) != null && schema.getField(TIME_COMPLETED).schema().getType().equals(Type.DOUBLE), TIME_COMPLETED_FIELD); } + /** + * TODO. + * @return TODO + */ static SchemaValidator validateNotTimeCompleted() { return validate(schema -> schema.getField(TIME_COMPLETED) == null, NOT_TIME_COMPLETED_FIELD); } + /** + * TODO. + * @return TODO + */ static SchemaValidator validateTimeReceived() { return validate(schema -> schema.getField(TIME_RECEIVED) != null && schema.getField(TIME_RECEIVED).schema().getType().equals(Type.DOUBLE), TIME_RECEIVED_FIELD); } + /** + * TODO. + * @return TODO + */ static SchemaValidator validateNotTimeReceived() { return validate(schema -> schema.getField(TIME_RECEIVED) == null, NOT_TIME_RECEIVED_FIELD); } + /** + * TODO. + * @return TODO + */ static SchemaValidator validateFieldName() { return validateFieldName(null); } + /** + * TODO. + * @param skip TODO + * @return TODO + */ static SchemaValidator validateFieldName(Set skip) { return validate(schema -> schema.getFields() .stream() .map(field -> field.name()) .allMatch(name -> name.matches(FIELD_NAME_REGEX) - || (skip != null && skip.contains(name))) - , NAME_CONVENTION); + || skip != null && skip.contains(name)), NAME_CONVENTION); } - static SchemaValidator validate(Predicate predicate, Message message){ + /** + * TODO. + * @param predicate TODO + * @param message TODO + * @return TODO + */ + static SchemaValidator validate(Predicate predicate, Message message) { return schema -> predicate.test(schema) ? valid() : invalid(message.getMessage(schema)); } + /** + * TODO. + * @param other TODO + * @return TODO + */ default SchemaValidator and(SchemaValidator other) { return schema -> { final ValidationResult result = this.apply(schema); diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorImpl.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorImpl.java index fa34b2ca..be460aab 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorImpl.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorImpl.java @@ -16,21 +16,21 @@ * limitations under the License. */ -import static org.radarcns.validator.util.SchemaValidator.validateTimeCompleted; import static org.radarcns.validator.util.SchemaValidator.validateTime; +import static org.radarcns.validator.util.SchemaValidator.validateTimeCompleted; import static org.radarcns.validator.util.SchemaValidator.validateTimeReceived; public final class SchemaValidatorImpl { - private SchemaValidatorImpl() { - //Private constructor - } - public static final SchemaValidator ACTIVE_VALIDATION = - validateTime().and(validateTimeCompleted()); + validateTime().and(validateTimeCompleted()); public static final SchemaValidator MONITOR_VALIDATION = validateTime(); public static final SchemaValidator PASSIVE_VALIDATION = - validateTime().and(validateTimeReceived()); + validateTime().and(validateTimeReceived()); + + private SchemaValidatorImpl() { + //Private constructor + } } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationResult.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationResult.java index 956c3aa2..a30dd70d 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationResult.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationResult.java @@ -18,13 +18,13 @@ import java.util.Optional; -public interface ValidationResult{ +public interface ValidationResult { - static ValidationResult valid(){ - return ValidationSupport.valid(); + static ValidationResult valid() { + return ValidationSupport.getValid(); } - static ValidationResult invalid(String reason){ + static ValidationResult invalid(String reason) { return new Invalid(reason); } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java index 7adf9122..f7f30500 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java @@ -16,17 +16,56 @@ * limitations under the License. */ +import java.util.Objects; import java.util.Optional; -final class ValidationSupport { +public final class ValidationSupport { - protected static final ValidationResult valid = new ValidationResult(){ - public boolean isValid(){ return true; } - public Optional getReason(){ return Optional.empty(); } + static final ValidationResult VALID = new ValidationResult() { + public boolean isValid() { + return true; + } + + public Optional getReason() { + return Optional.empty(); + } }; - static ValidationResult valid(){ - return valid; + + private ValidationSupport() { + //Static class + } + + static ValidationResult getValid() { + return VALID; + } + + /** + * TODO. + * @param fileName TODO + * @return TODO + */ + @SuppressWarnings("PMD.MissingBreakInSwitch") + public static String getRecordName(String fileName) { + Objects.requireNonNull(fileName); + + String recordName = ""; + + boolean start = true; + for (int i = 0; i < fileName.length(); i++) { + switch (fileName.charAt(i)) { + case '_' : + start = true; + break; + case '.' : return recordName; + default: + recordName += start ? Character.toUpperCase(fileName.charAt(i)) + : fileName.charAt(i); + start = false; + } + } + + return recordName; } } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/unit/SchemaValidatorTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/unit/SchemaValidatorTest.java index 65b86986..540cdb54 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/unit/SchemaValidatorTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/unit/SchemaValidatorTest.java @@ -24,25 +24,30 @@ import static org.radarcns.validator.StructureValidator.NameFolder.MONITOR; import java.util.Collections; -import java.util.HashSet; import java.util.Optional; -import junit.framework.TestCase; import org.apache.avro.Schema; import org.apache.avro.SchemaBuilder; import org.junit.Test; -import org.radarcns.validator.StructureValidator.NameFolder; import org.radarcns.validator.util.SchemaValidator; import org.radarcns.validator.util.ValidationResult; -import org.slf4j.LoggerFactory; +import org.radarcns.validator.util.ValidationSupport; public class SchemaValidatorTest { + private static final String ACTIVE_NAME_SPACE_MOCK = "org.radarcns.active.test"; + private static final String MONITOR_NAME_SPACE_MOCK = "org.radarcns.monitor.test"; + + private static final String RECORD_NAME_MOCK = "RecordName"; + private static final String FIELD_NUMBER_MOCK = "Field1"; + + private static final String INVALID_TEXT = " is invalid."; + @Test public void fileNameTest() { assertEquals("Questionnaire", - SchemaValidator.getRecordName("questionnaire.avsc")); + ValidationSupport.getRecordName("questionnaire.avsc")); assertEquals("ApplicationExternalTime", - SchemaValidator.getRecordName("application_external_time.avsc")); + ValidationSupport.getRecordName("application_external_time.avsc")); } @Test @@ -63,7 +68,7 @@ public void nameSpaceTest() { schema = SchemaBuilder .builder("org.radarcns.monitors.test") - .record("RecordTest") + .record(RECORD_NAME_MOCK) .fields() .endRecord(); @@ -72,11 +77,12 @@ public void nameSpaceTest() { assertFalse(result.isValid()); assertEquals(Optional.of("Namespace must be in the form \"org.radarcns.monitor.test\". " - + "org.radarcns.monitors.test.RecordTest is invalid."), result.getReason()); + + "org.radarcns.monitors.test." + RECORD_NAME_MOCK + INVALID_TEXT), + result.getReason()); schema = SchemaBuilder .builder("org.radarcns.monitor.tests") - .record("RecordTest") + .record(RECORD_NAME_MOCK) .fields() .endRecord(); @@ -85,7 +91,8 @@ public void nameSpaceTest() { assertFalse(result.isValid()); assertEquals(Optional.of("Namespace must be in the form \"org.radarcns.monitor.test\". " - + "org.radarcns.monitor.tests.RecordTest is invalid."), result.getReason()); + + getFinalMessage("org.radarcns.monitor.tests", RECORD_NAME_MOCK)), + result.getReason()); } @Test @@ -125,8 +132,8 @@ public void timeTest() { ValidationResult result; schema = SchemaBuilder - .builder("org.radarcns.monitor.test") - .record("RecordTest") + .builder("org.radarcns.time.test") + .record(RECORD_NAME_MOCK) .fields() .requiredString("field") .endRecord(); @@ -136,14 +143,15 @@ public void timeTest() { assertFalse(result.isValid()); assertEquals(Optional.of("Any schema representing collected data must have a \"time\" field" - + " formatted in DOUBLE. org.radarcns.monitor.test.RecordTest is invalid."), - result.getReason()); + + " formatted in DOUBLE. org.radarcns.time.test." + RECORD_NAME_MOCK + + INVALID_TEXT), + result.getReason()); schema = SchemaBuilder - .builder("org.radarcns.monitor.test") - .record("RecordTest") + .builder("org.radarcns.time.test") + .record(RECORD_NAME_MOCK) .fields() - .requiredDouble("time") + .requiredDouble(SchemaValidator.TIME) .endRecord(); result = SchemaValidator.validateTime().apply(schema); @@ -157,8 +165,8 @@ public void timeCompletedTest() { ValidationResult result; schema = SchemaBuilder - .builder("org.radarcns.monitor.test") - .record("RecordTest") + .builder(ACTIVE_NAME_SPACE_MOCK) + .record(RECORD_NAME_MOCK) .fields() .requiredString("field") .endRecord(); @@ -166,14 +174,15 @@ public void timeCompletedTest() { result = SchemaValidator.validateTimeCompleted().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("Any ACTIVE schema must have a \"timeCompleted\" field formatted " - + "in DOUBLE. org.radarcns.monitor.test.RecordTest is invalid."), result.getReason()); + + "in DOUBLE. org.radarcns.active.test." + RECORD_NAME_MOCK + INVALID_TEXT), + result.getReason()); result = SchemaValidator.validateNotTimeCompleted().apply(schema); assertTrue(result.isValid()); schema = SchemaBuilder - .builder("org.radarcns.monitor.test") - .record("RecordTest") + .builder(ACTIVE_NAME_SPACE_MOCK) + .record(RECORD_NAME_MOCK) .fields() .requiredDouble("timeCompleted") .endRecord(); @@ -184,7 +193,8 @@ public void timeCompletedTest() { result = SchemaValidator.validateNotTimeCompleted().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("\"timeCompleted\" is allow only in ACTIVE schemas. " - + "org.radarcns.monitor.test.RecordTest is invalid."), result.getReason()); + + getFinalMessage(ACTIVE_NAME_SPACE_MOCK, RECORD_NAME_MOCK)), + result.getReason()); } @Test @@ -193,8 +203,8 @@ public void timeReceivedTest() { ValidationResult result; schema = SchemaBuilder - .builder("org.radarcns.monitor.test") - .record("RecordTest") + .builder(MONITOR_NAME_SPACE_MOCK) + .record(RECORD_NAME_MOCK) .fields() .requiredString("field") .endRecord(); @@ -202,14 +212,15 @@ public void timeReceivedTest() { result = SchemaValidator.validateTimeReceived().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("Any PASSIVE schema must have a \"timeReceived\" field formatted " - + "in DOUBLE. org.radarcns.monitor.test.RecordTest is invalid."), result.getReason()); + + "in DOUBLE. org.radarcns.monitor.test." + RECORD_NAME_MOCK + INVALID_TEXT), + result.getReason()); result = SchemaValidator.validateNotTimeReceived().apply(schema); assertTrue(result.isValid()); schema = SchemaBuilder - .builder("org.radarcns.monitor.test") - .record("RecordTest") + .builder(MONITOR_NAME_SPACE_MOCK) + .record(RECORD_NAME_MOCK) .fields() .requiredDouble("timeReceived") .endRecord(); @@ -220,13 +231,14 @@ public void timeReceivedTest() { result = SchemaValidator.validateNotTimeReceived().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("\"timeReceived\" is allow only in PASSIVE schemas. " - + "org.radarcns.monitor.test.RecordTest is invalid."), result.getReason()); + + getFinalMessage(MONITOR_NAME_SPACE_MOCK, RECORD_NAME_MOCK)), + result.getReason()); } @Test public void testRegex() { assertTrue("x".matches(FIELD_NAME_REGEX)); - assertTrue("time".matches(FIELD_NAME_REGEX)); + assertTrue(SchemaValidator.TIME.matches(FIELD_NAME_REGEX)); assertTrue("subjectId".matches(FIELD_NAME_REGEX)); assertTrue("listOfSeveralThings".matches(FIELD_NAME_REGEX)); assertFalse("Time".matches(FIELD_NAME_REGEX)); @@ -239,33 +251,36 @@ public void fieldNameTest() { ValidationResult result; schema = SchemaBuilder - .builder("org.radarcns.monitor.test") - .record("RecordTest") + .builder(MONITOR_NAME_SPACE_MOCK) + .record(RECORD_NAME_MOCK) .fields() - .requiredString("Formula1") + .requiredString(FIELD_NUMBER_MOCK) .endRecord(); result = SchemaValidator.validateFieldName().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("Field name does not respect lowerCamelCase name convention. " - + "org.radarcns.monitor.test.RecordTest is invalid."), result.getReason()); + + getFinalMessage(MONITOR_NAME_SPACE_MOCK, RECORD_NAME_MOCK)), + result.getReason()); schema = SchemaBuilder - .builder("org.radarcns.monitor.test") - .record("RecordTest") + .builder(MONITOR_NAME_SPACE_MOCK) + .record(RECORD_NAME_MOCK) .fields() - .requiredString("Formula1") - .requiredString("time") + .requiredString(FIELD_NUMBER_MOCK) + .requiredString(SchemaValidator.TIME) .endRecord(); - result = SchemaValidator.validateFieldName(Collections.singleton("time")).apply(schema); + result = SchemaValidator.validateFieldName( + Collections.singleton(SchemaValidator.TIME)).apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("Field name does not respect lowerCamelCase name convention. " - + "org.radarcns.monitor.test.RecordTest is invalid."), result.getReason()); + + getFinalMessage(MONITOR_NAME_SPACE_MOCK,RECORD_NAME_MOCK)), + result.getReason()); schema = SchemaBuilder - .builder("org.radarcns.monitor.test") - .record("RecordTest") + .builder(MONITOR_NAME_SPACE_MOCK) + .record(RECORD_NAME_MOCK) .fields() .requiredDouble("timeReceived") .endRecord(); @@ -274,15 +289,20 @@ public void fieldNameTest() { assertTrue(result.isValid()); schema = SchemaBuilder - .builder("org.radarcns.monitor.test") - .record("RecordTest") + .builder(MONITOR_NAME_SPACE_MOCK) + .record(RECORD_NAME_MOCK) .fields() - .requiredString("Formula1") - .requiredString("time") + .requiredString(FIELD_NUMBER_MOCK) + .requiredString(SchemaValidator.TIME) .endRecord(); - result = SchemaValidator.validateFieldName(Collections.singleton("Formula1")).apply(schema); + result = SchemaValidator.validateFieldName( + Collections.singleton(FIELD_NUMBER_MOCK)).apply(schema); assertTrue(result.isValid()); } + private static String getFinalMessage(String nameSpace, String recordName) { + return nameSpace.concat(".").concat(recordName).concat(INVALID_TEXT); + } + } From c9ad57644245eefe9b01c6ad6a33e285c760eb9d Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Tue, 25 Jul 2017 12:27:56 +0100 Subject: [PATCH 014/112] Added value check for field name --- .../validator/util/SchemaValidator.java | 35 ++++++++++++++++--- .../util/unit/SchemaValidatorTest.java | 16 +++++++++ 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java index 68c55312..f8b73447 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java @@ -1,6 +1,6 @@ package org.radarcns.validator.util; -import static org.radarcns.validator.util.SchemaValidator.Message.NAME_CONVENTION; +import static org.radarcns.validator.util.SchemaValidator.Message.FILED_NAME; import static org.radarcns.validator.util.SchemaValidator.Message.NOT_TIME_COMPLETED_FIELD; import static org.radarcns.validator.util.SchemaValidator.Message.NOT_TIME_RECEIVED_FIELD; import static org.radarcns.validator.util.SchemaValidator.Message.RECORD_NAME; @@ -15,6 +15,8 @@ import java.util.Set; import java.util.function.Function; import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.apache.avro.Schema; import org.apache.avro.Schema.Type; import org.radarcns.validator.StructureValidator.NameFolder; @@ -46,6 +48,22 @@ public interface SchemaValidator extends Function { String FIELD_NAME_REGEX = "^[a-z][a-zA-Z]*$"; + /** Field names cannot contain the following values. */ + enum FieldNameNotAllowed { + LOWER_VALUE("value"), + UPPERD_VALUE("Value"); + + private final String name; + + FieldNameNotAllowed(String name) { + this.name = name; + } + + public String getName() { + return name; + } + } + /** Folder names. */ enum Message { NAME_SPACE("Namespace must be in the form \""), @@ -61,7 +79,12 @@ enum Message { + "\" field formatted in " + Type.DOUBLE.getName().toUpperCase(Locale.ENGLISH) + "."), NOT_TIME_RECEIVED_FIELD("\"" + TIME_RECEIVED + "\" is allow only in " + NameFolder.PASSIVE + " schemas."), - NAME_CONVENTION("Field name does not respect lowerCamelCase name convention."); + FILED_NAME("Field name does not respect lowerCamelCase name convention. It cannot contain" + + " any of the following values [" + + Stream.of(FieldNameNotAllowed.values()) + .map(FieldNameNotAllowed::getName) + .collect(Collectors.joining(",")) + + "]."); private final String message; @@ -171,8 +194,12 @@ static SchemaValidator validateFieldName(Set skip) { schema.getFields() .stream() .map(field -> field.name()) - .allMatch(name -> name.matches(FIELD_NAME_REGEX) - || skip != null && skip.contains(name)), NAME_CONVENTION); + .allMatch(name -> + name.matches(FIELD_NAME_REGEX) + && Stream.of(FieldNameNotAllowed.values()) + .noneMatch(notAllowed -> name.contains(notAllowed.getName())) + || skip != null && skip.contains(name)), + FILED_NAME); } /** diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/unit/SchemaValidatorTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/unit/SchemaValidatorTest.java index 540cdb54..c783f035 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/unit/SchemaValidatorTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/unit/SchemaValidatorTest.java @@ -250,6 +250,20 @@ public void fieldNameTest() { Schema schema; ValidationResult result; + schema = SchemaBuilder + .builder(MONITOR_NAME_SPACE_MOCK) + .record(RECORD_NAME_MOCK) + .fields() + .requiredString(FIELD_NUMBER_MOCK + "value") + .endRecord(); + + result = SchemaValidator.validateFieldName().apply(schema); + assertFalse(result.isValid()); + assertEquals(Optional.of("Field name does not respect lowerCamelCase name convention. " + + "It cannot contain any of the following values [value,Value]. " + + getFinalMessage(MONITOR_NAME_SPACE_MOCK, RECORD_NAME_MOCK)), + result.getReason()); + schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) .record(RECORD_NAME_MOCK) @@ -260,6 +274,7 @@ public void fieldNameTest() { result = SchemaValidator.validateFieldName().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("Field name does not respect lowerCamelCase name convention. " + + "It cannot contain any of the following values [value,Value]. " + getFinalMessage(MONITOR_NAME_SPACE_MOCK, RECORD_NAME_MOCK)), result.getReason()); @@ -275,6 +290,7 @@ public void fieldNameTest() { Collections.singleton(SchemaValidator.TIME)).apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("Field name does not respect lowerCamelCase name convention. " + + "It cannot contain any of the following values [value,Value]. " + getFinalMessage(MONITOR_NAME_SPACE_MOCK,RECORD_NAME_MOCK)), result.getReason()); From 9053826489d687a7a49aa4ee8e954f481aea3090 Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Tue, 25 Jul 2017 12:58:29 +0100 Subject: [PATCH 015/112] Added namespace regex --- .../validator/util/SchemaValidator.java | 34 ++++++++--- .../util/unit/SchemaValidatorTest.java | 58 ++++++++++++++----- 2 files changed, 70 insertions(+), 22 deletions(-) diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java index f8b73447..ff61682c 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java @@ -12,6 +12,7 @@ import static org.radarcns.validator.util.ValidationSupport.getRecordName; import java.util.Locale; +import java.util.Objects; import java.util.Set; import java.util.function.Function; import java.util.function.Predicate; @@ -47,6 +48,7 @@ public interface SchemaValidator extends Function { String TIME_COMPLETED = "timeCompleted"; String FIELD_NAME_REGEX = "^[a-z][a-zA-Z]*$"; + String NAMESPACE_REGEX = "^[a-z][a-z.]*$"; /** Field names cannot contain the following values. */ enum FieldNameNotAllowed { @@ -66,7 +68,8 @@ public String getName() { /** Folder names. */ enum Message { - NAME_SPACE("Namespace must be in the form \""), + NAME_SPACE("Namespace cannot be null and must fully lowercase dot separated without " + + "numeric. In this case the expected value is \""), RECORD_NAME("Record name must be the conversion of the .avsc file name in UpperCamelCase. " + "The expected value is "), TIME_FIELD("Any schema representing collected data must have a \"" + TIME @@ -111,7 +114,9 @@ static SchemaValidator validateNameSpace(NameFolder rootFolder, String currentFo String expected = NAME_SPACE.concat(".").concat( rootFolder.getName()).concat(".").concat(currentFolder); - return schema -> schema.getNamespace().equalsIgnoreCase(expected) ? valid() : + return schema -> Objects.nonNull(schema.getNamespace()) + && schema.getNamespace() .matches(NAMESPACE_REGEX) + && schema.getNamespace().equalsIgnoreCase(expected) ? valid() : invalid(Message.NAME_SPACE.getMessage().concat(expected).concat( "\". ").concat(schema.getFullName()).concat(" is invalid.")); } @@ -134,7 +139,7 @@ static SchemaValidator validateRecordName(String fileName) { * @return TODO */ static SchemaValidator validateTime() { - return validate(schema -> schema.getField(TIME) != null + return validate(schema -> Objects.nonNull(schema.getField(TIME)) && schema.getField(TIME).schema().getType().equals(Type.DOUBLE), TIME_FIELD); } @@ -143,7 +148,7 @@ static SchemaValidator validateTime() { * @return TODO */ static SchemaValidator validateTimeCompleted() { - return validate(schema -> schema.getField(TIME_COMPLETED) != null + return validate(schema -> Objects.nonNull(schema.getField(TIME_COMPLETED)) && schema.getField(TIME_COMPLETED).schema().getType().equals(Type.DOUBLE), TIME_COMPLETED_FIELD); } @@ -153,7 +158,7 @@ static SchemaValidator validateTimeCompleted() { * @return TODO */ static SchemaValidator validateNotTimeCompleted() { - return validate(schema -> schema.getField(TIME_COMPLETED) == null, + return validate(schema -> Objects.isNull(schema.getField(TIME_COMPLETED)), NOT_TIME_COMPLETED_FIELD); } @@ -162,7 +167,7 @@ static SchemaValidator validateNotTimeCompleted() { * @return TODO */ static SchemaValidator validateTimeReceived() { - return validate(schema -> schema.getField(TIME_RECEIVED) != null + return validate(schema -> Objects.nonNull(schema.getField(TIME_RECEIVED)) && schema.getField(TIME_RECEIVED).schema().getType().equals(Type.DOUBLE), TIME_RECEIVED_FIELD); } @@ -172,7 +177,7 @@ static SchemaValidator validateTimeReceived() { * @return TODO */ static SchemaValidator validateNotTimeReceived() { - return validate(schema -> schema.getField(TIME_RECEIVED) == null, + return validate(schema -> Objects.isNull(schema.getField(TIME_RECEIVED)), NOT_TIME_RECEIVED_FIELD); } @@ -198,7 +203,20 @@ static SchemaValidator validateFieldName(Set skip) { name.matches(FIELD_NAME_REGEX) && Stream.of(FieldNameNotAllowed.values()) .noneMatch(notAllowed -> name.contains(notAllowed.getName())) - || skip != null && skip.contains(name)), + || Objects.nonNull(skip) && skip.contains(name)), + FILED_NAME); + } + + + /** + * TODO. + * @return TODO + */ + static SchemaValidator validateDocumentation() { + return validate(schema -> + schema.getFields() + .stream() + .allMatch(field -> Objects.nonNull(field.doc())), FILED_NAME); } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/unit/SchemaValidatorTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/unit/SchemaValidatorTest.java index c783f035..c2070c79 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/unit/SchemaValidatorTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/unit/SchemaValidatorTest.java @@ -22,6 +22,7 @@ import static org.radarcns.validator.AvroValidator.FIELD_NAME_REGEX; import static org.radarcns.validator.StructureValidator.NameFolder.ACTIVE; import static org.radarcns.validator.StructureValidator.NameFolder.MONITOR; +import static org.radarcns.validator.util.SchemaValidator.NAMESPACE_REGEX; import java.util.Collections; import java.util.Optional; @@ -50,6 +51,25 @@ public void fileNameTest() { ValidationSupport.getRecordName("application_external_time.avsc")); } + @Test + public void nameSpaceRegex() { + assertTrue("org.radarcns".matches(NAMESPACE_REGEX)); + assertFalse("Org.radarcns".matches(NAMESPACE_REGEX)); + assertFalse("org.radarCns".matches(NAMESPACE_REGEX)); + assertFalse("org.radar-cns".matches(NAMESPACE_REGEX)); + assertFalse("org.radarcns.empaticaE4".matches(NAMESPACE_REGEX)); + } + + @Test + public void fieldNameRegex() { + assertTrue("x".matches(FIELD_NAME_REGEX)); + assertTrue(SchemaValidator.TIME.matches(FIELD_NAME_REGEX)); + assertTrue("subjectId".matches(FIELD_NAME_REGEX)); + assertTrue("listOfSeveralThings".matches(FIELD_NAME_REGEX)); + assertFalse("Time".matches(FIELD_NAME_REGEX)); + assertFalse("E4Heart".matches(FIELD_NAME_REGEX)); + } + @Test public void nameSpaceTest() { Schema schema; @@ -66,6 +86,22 @@ public void nameSpaceTest() { assertTrue(result.isValid()); + schema = SchemaBuilder + .builder("org.radar-cns.monitors.test") + .record(RECORD_NAME_MOCK) + .fields() + .endRecord(); + + result = SchemaValidator.validateNameSpace(MONITOR, "test").apply(schema); + + assertFalse(result.isValid()); + + assertEquals(Optional.of("Namespace cannot be null and must fully lowercase dot " + + "separated without numeric. In this case the expected value is " + + "\"org.radarcns.monitor.test\". org.radar-cns.monitors.test." + + RECORD_NAME_MOCK + INVALID_TEXT), + result.getReason()); + schema = SchemaBuilder .builder("org.radarcns.monitors.test") .record(RECORD_NAME_MOCK) @@ -76,8 +112,10 @@ public void nameSpaceTest() { assertFalse(result.isValid()); - assertEquals(Optional.of("Namespace must be in the form \"org.radarcns.monitor.test\". " - + "org.radarcns.monitors.test." + RECORD_NAME_MOCK + INVALID_TEXT), + assertEquals(Optional.of("Namespace cannot be null and must fully lowercase dot " + + "separated without numeric. In this case the expected value is " + + "\"org.radarcns.monitor.test\". org.radarcns.monitors.test." + + RECORD_NAME_MOCK + INVALID_TEXT), result.getReason()); schema = SchemaBuilder @@ -90,8 +128,10 @@ public void nameSpaceTest() { assertFalse(result.isValid()); - assertEquals(Optional.of("Namespace must be in the form \"org.radarcns.monitor.test\". " - + getFinalMessage("org.radarcns.monitor.tests", RECORD_NAME_MOCK)), + assertEquals(Optional.of("Namespace cannot be null and must fully lowercase dot " + + "separated without numeric. In this case the expected value is " + + "\"org.radarcns.monitor.test\". org.radarcns.monitor.tests." + + RECORD_NAME_MOCK + INVALID_TEXT), result.getReason()); } @@ -235,16 +275,6 @@ public void timeReceivedTest() { result.getReason()); } - @Test - public void testRegex() { - assertTrue("x".matches(FIELD_NAME_REGEX)); - assertTrue(SchemaValidator.TIME.matches(FIELD_NAME_REGEX)); - assertTrue("subjectId".matches(FIELD_NAME_REGEX)); - assertTrue("listOfSeveralThings".matches(FIELD_NAME_REGEX)); - assertFalse("Time".matches(FIELD_NAME_REGEX)); - assertFalse("E4Heart".matches(FIELD_NAME_REGEX)); - } - @Test public void fieldNameTest() { Schema schema; From 370abf67a90f2fc786a8b3f857bc2c435c79d08a Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Wed, 26 Jul 2017 09:59:32 +0100 Subject: [PATCH 016/112] Record name validation --- .../validator/util/SchemaValidator.java | 54 ++++++- .../util/unit/SchemaValidatorTest.java | 140 +++++++++++++++++- 2 files changed, 179 insertions(+), 15 deletions(-) diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java index ff61682c..3e0e6cee 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java @@ -1,5 +1,7 @@ package org.radarcns.validator.util; +import static org.radarcns.validator.util.SchemaValidator.Message.DOC; +import static org.radarcns.validator.util.SchemaValidator.Message.FIELDS; import static org.radarcns.validator.util.SchemaValidator.Message.FILED_NAME; import static org.radarcns.validator.util.SchemaValidator.Message.NOT_TIME_COMPLETED_FIELD; import static org.radarcns.validator.util.SchemaValidator.Message.NOT_TIME_RECEIVED_FIELD; @@ -47,8 +49,10 @@ public interface SchemaValidator extends Function { String TIME_RECEIVED = "timeReceived"; String TIME_COMPLETED = "timeCompleted"; - String FIELD_NAME_REGEX = "^[a-z][a-zA-Z]*$"; String NAMESPACE_REGEX = "^[a-z][a-z.]*$"; + String RECORD_NAME_REGEX = "(^[A-Z][a-z]+)|(^[A-Z][a-z0-9]+[A-Z]$)" + + "|(^[A-Z][a-z0-9]+([A-Z][a-z0-9]+)+$)|(^[A-Z][a-z0-9]+([A-Z][a-z0-9]+)+[A-Z]$)"; + String FIELD_NAME_REGEX = "^[a-z][a-zA-Z]*$"; /** Field names cannot contain the following values. */ enum FieldNameNotAllowed { @@ -66,7 +70,7 @@ public String getName() { } } - /** Folder names. */ + /** Messages. */ enum Message { NAME_SPACE("Namespace cannot be null and must fully lowercase dot separated without " + "numeric. In this case the expected value is \""), @@ -82,12 +86,17 @@ enum Message { + "\" field formatted in " + Type.DOUBLE.getName().toUpperCase(Locale.ENGLISH) + "."), NOT_TIME_RECEIVED_FIELD("\"" + TIME_RECEIVED + "\" is allow only in " + NameFolder.PASSIVE + " schemas."), + FIELDS("Avro Record must have field list."), FILED_NAME("Field name does not respect lowerCamelCase name convention. It cannot contain" + " any of the following values [" + Stream.of(FieldNameNotAllowed.values()) .map(FieldNameNotAllowed::getName) .collect(Collectors.joining(",")) - + "]."); + + "]. Please avoid abbreviations and write out the field name instead."), + DOC("Documentation is mandatory for any schema and field. The documentation should report " + + "what is being measured, how, and what units or ranges are applicable. Abbreviations " + + "and acronyms in the documentation should be written out. The sentence must be ended " + + "by a point. Please add \"doc\" property."); private final String message; @@ -127,13 +136,42 @@ static SchemaValidator validateNameSpace(NameFolder rootFolder, String currentFo * @return TODO */ static SchemaValidator validateRecordName(String fileName) { + return validateRecordName(fileName, null); + } + + /** + * TODO. + * @param fileName TODO + * @param skip TODO + * @return TODO + */ + static SchemaValidator validateRecordName(String fileName, Set skip) { String expected = getRecordName(fileName); - return schema -> schema.getName().equalsIgnoreCase(expected) ? valid() : + return schema -> + schema.getName().matches(RECORD_NAME_REGEX) + && schema.getName().equalsIgnoreCase(expected) + || Objects.nonNull(skip) && skip.contains(schema.getName()) ? valid() : invalid(RECORD_NAME.getMessage().concat(expected).concat("\". ").concat( schema.getFullName()).concat(" is invalid.")); } + /** + * TODO. + * @return TODO + */ + static SchemaValidator validateSchemaDocumentation() { + return validate(schema -> Objects.nonNull(schema.getDoc()), DOC); + } + + /** + * TODO. + * @return TODO + */ + static SchemaValidator validateFields() { + return validate(schema -> !schema.getFields().isEmpty(), FIELDS); + } + /** * TODO. * @return TODO @@ -207,17 +245,17 @@ static SchemaValidator validateFieldName(Set skip) { FILED_NAME); } - /** * TODO. * @return TODO */ - static SchemaValidator validateDocumentation() { + static SchemaValidator validateFiledDocumentation() { return validate(schema -> schema.getFields() .stream() - .allMatch(field -> Objects.nonNull(field.doc())), - FILED_NAME); + .allMatch(field -> Objects.nonNull(field.doc()) + && field.doc().lastIndexOf(".") == field.doc().length() - 1) , + DOC); } /** diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/unit/SchemaValidatorTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/unit/SchemaValidatorTest.java index c2070c79..d395a205 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/unit/SchemaValidatorTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/unit/SchemaValidatorTest.java @@ -23,10 +23,12 @@ import static org.radarcns.validator.StructureValidator.NameFolder.ACTIVE; import static org.radarcns.validator.StructureValidator.NameFolder.MONITOR; import static org.radarcns.validator.util.SchemaValidator.NAMESPACE_REGEX; +import static org.radarcns.validator.util.SchemaValidator.RECORD_NAME_REGEX; import java.util.Collections; import java.util.Optional; import org.apache.avro.Schema; +import org.apache.avro.Schema.Parser; import org.apache.avro.SchemaBuilder; import org.junit.Test; import org.radarcns.validator.util.SchemaValidator; @@ -56,10 +58,31 @@ public void nameSpaceRegex() { assertTrue("org.radarcns".matches(NAMESPACE_REGEX)); assertFalse("Org.radarcns".matches(NAMESPACE_REGEX)); assertFalse("org.radarCns".matches(NAMESPACE_REGEX)); + assertFalse(".org.radarcns".matches(NAMESPACE_REGEX)); assertFalse("org.radar-cns".matches(NAMESPACE_REGEX)); assertFalse("org.radarcns.empaticaE4".matches(NAMESPACE_REGEX)); } + @Test + public void recordNameRegex() { + assertTrue("Questionnaire".matches(RECORD_NAME_REGEX)); + assertTrue("EmpaticaE4Acceleration".matches(RECORD_NAME_REGEX)); + assertTrue("Heart4Me".matches(RECORD_NAME_REGEX)); + assertTrue("Heart4M".matches(RECORD_NAME_REGEX)); + + assertFalse("Heart4".matches(RECORD_NAME_REGEX)); + assertFalse("Heart4me".matches(RECORD_NAME_REGEX)); + assertFalse("Heart4ME".matches(RECORD_NAME_REGEX)); + assertFalse("4Me".matches(RECORD_NAME_REGEX)); + assertFalse("TTest".matches(RECORD_NAME_REGEX)); + assertFalse("questionnaire".matches(RECORD_NAME_REGEX)); + assertFalse("questionnaire4".matches(RECORD_NAME_REGEX)); + assertFalse("questionnaire4Me".matches(RECORD_NAME_REGEX)); + assertFalse("questionnaire4me".matches(RECORD_NAME_REGEX)); + assertFalse("A4MM".matches(RECORD_NAME_REGEX)); + assertFalse("Aaaa4MMaa".matches(RECORD_NAME_REGEX)); + } + @Test public void fieldNameRegex() { assertTrue("x".matches(FIELD_NAME_REGEX)); @@ -141,29 +164,66 @@ public void recordNameTest() { ValidationResult result; schema = SchemaBuilder - .builder("org.radarcns.active.questionnaire") - .record("Questionnaire") + .builder("org.radarcns.active.testactive") + .record("Schema") .fields() .endRecord(); - result = SchemaValidator.validateRecordName("questionnaire.avsc").apply(schema); + result = SchemaValidator.validateRecordName("schema.avsc").apply(schema); assertTrue(result.isValid()); + String fieldName = "EmpaticaE4Aceleration"; + String fileName = "empatica_e4_acceleration.avsc"; + schema = SchemaBuilder .builder("org.radarcns.passive.empatica") - .record("EmpaticaE4Aceleration") + .record(fieldName) .fields() .endRecord(); - result = SchemaValidator.validateRecordName("empatica_e4_acceleration.avsc").apply(schema); + result = SchemaValidator.validateRecordName(fileName).apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("Record name must be the conversion of the .avsc file name in " + "UpperCamelCase. The expected value is EmpaticaE4Acceleration\". " - + "org.radarcns.passive.empatica.EmpaticaE4Aceleration is invalid."), + + "org.radarcns.passive.empatica." + fieldName + " is invalid."), result.getReason()); + + result = SchemaValidator.validateRecordName( + fileName, Collections.singleton(fieldName)).apply(schema); + + assertTrue(result.isValid()); + } + + @Test + public void fieldsTest() { + Schema schema; + ValidationResult result; + + schema = SchemaBuilder + .builder(MONITOR_NAME_SPACE_MOCK) + .record(RECORD_NAME_MOCK) + .fields() + .endRecord(); + + result = SchemaValidator.validateFields().apply(schema); + + assertFalse(result.isValid()); + assertEquals(Optional.of("Avro Record must have field list. " + + getFinalMessage(MONITOR_NAME_SPACE_MOCK, RECORD_NAME_MOCK)), result.getReason()); + + schema = SchemaBuilder + .builder(MONITOR_NAME_SPACE_MOCK) + .record(RECORD_NAME_MOCK) + .fields() + .optionalBoolean("optional") + .endRecord(); + + result = SchemaValidator.validateFields().apply(schema); + + assertTrue(result.isValid()); } @Test @@ -175,7 +235,7 @@ public void timeTest() { .builder("org.radarcns.time.test") .record(RECORD_NAME_MOCK) .fields() - .requiredString("field") + .requiredString("string") .endRecord(); result = SchemaValidator.validateTime().apply(schema); @@ -291,6 +351,7 @@ public void fieldNameTest() { assertFalse(result.isValid()); assertEquals(Optional.of("Field name does not respect lowerCamelCase name convention. " + "It cannot contain any of the following values [value,Value]. " + + "Please avoid abbreviations and write out the field name instead. " + getFinalMessage(MONITOR_NAME_SPACE_MOCK, RECORD_NAME_MOCK)), result.getReason()); @@ -305,6 +366,7 @@ public void fieldNameTest() { assertFalse(result.isValid()); assertEquals(Optional.of("Field name does not respect lowerCamelCase name convention. " + "It cannot contain any of the following values [value,Value]. " + + "Please avoid abbreviations and write out the field name instead. " + getFinalMessage(MONITOR_NAME_SPACE_MOCK, RECORD_NAME_MOCK)), result.getReason()); @@ -321,6 +383,7 @@ public void fieldNameTest() { assertFalse(result.isValid()); assertEquals(Optional.of("Field name does not respect lowerCamelCase name convention. " + "It cannot contain any of the following values [value,Value]. " + + "Please avoid abbreviations and write out the field name instead. " + getFinalMessage(MONITOR_NAME_SPACE_MOCK,RECORD_NAME_MOCK)), result.getReason()); @@ -347,6 +410,69 @@ public void fieldNameTest() { assertTrue(result.isValid()); } + @Test + public void filedDocumentationTest() { + Schema schema; + ValidationResult result; + + schema = new Parser().parse("{\"namespace\": \"org.radarcns.kafka.key\", " + + "\"type\": \"record\"," + + " \"name\": \"key\", \"type\": \"record\", \"fields\": [" + + "{\"name\": \"userId\", \"type\": \"string\" , \"doc\": \"Documentation\"}," + + "{\"name\": \"sourceId\", \"type\": \"string\"} ]}"); + + result = SchemaValidator.validateFiledDocumentation().apply(schema); + + assertFalse(result.isValid()); + assertEquals(Optional.of("Documentation is mandatory for any schema and field. The " + + "documentation should report what is being measured, how, and what units or " + + "ranges are applicable. Abbreviations and acronyms in the documentation should " + + "be written out. The sentence must be ended by a point. Please add \"doc\" " + + "property. org.radarcns.kafka.key.key is invalid."), + result.getReason()); + + schema = new Parser().parse("{\"namespace\": \"org.radarcns.kafka.key\", " + + "\"type\": \"record\", \"name\": \"key\", \"type\": \"record\", \"fields\": [" + + "{\"name\": \"userId\", \"type\": \"string\" , \"doc\": \"Documentation.\"}]}"); + + result = SchemaValidator.validateFiledDocumentation().apply(schema); + assertTrue(result.isValid()); + } + + @Test + public void schemaDocumentationTest() { + Schema schema; + ValidationResult result; + + schema = SchemaBuilder + .builder(MONITOR_NAME_SPACE_MOCK) + .record(RECORD_NAME_MOCK) + .fields() + .endRecord(); + + result = SchemaValidator.validateSchemaDocumentation().apply(schema); + + assertFalse(result.isValid()); + assertEquals(Optional.of("Documentation is mandatory for any schema and field. The " + + "documentation should report what is being measured, how, and what units or " + + "ranges are applicable. Abbreviations and acronyms in the documentation should " + + "be written out. The sentence must be ended by a point. " + + "Please add \"doc\" property. " + + getFinalMessage(MONITOR_NAME_SPACE_MOCK, RECORD_NAME_MOCK)), + result.getReason()); + + schema = SchemaBuilder + .builder(MONITOR_NAME_SPACE_MOCK) + .record(RECORD_NAME_MOCK) + .doc("Documentation.") + .fields() + .endRecord(); + + result = SchemaValidator.validateSchemaDocumentation().apply(schema); + + assertTrue(result.isValid()); + } + private static String getFinalMessage(String nameSpace, String recordName) { return nameSpace.concat(".").concat(recordName).concat(INVALID_TEXT); } From 091c557a4ab0acb3b1f15dc7d42a1b956fff75fe Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Wed, 26 Jul 2017 11:45:30 +0100 Subject: [PATCH 017/112] Added enumeration symbols check --- .../validator/util/SchemaValidator.java | 28 ++++- .../validator/util/ValidationSupport.java | 23 ++++ .../util/unit/SchemaValidatorTest.java | 100 +++++++++++++++++- 3 files changed, 143 insertions(+), 8 deletions(-) diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java index 3e0e6cee..18912597 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java @@ -1,6 +1,7 @@ package org.radarcns.validator.util; import static org.radarcns.validator.util.SchemaValidator.Message.DOC; +import static org.radarcns.validator.util.SchemaValidator.Message.ENUMERATION_SYMBOL; import static org.radarcns.validator.util.SchemaValidator.Message.FIELDS; import static org.radarcns.validator.util.SchemaValidator.Message.FILED_NAME; import static org.radarcns.validator.util.SchemaValidator.Message.NOT_TIME_COMPLETED_FIELD; @@ -11,6 +12,7 @@ import static org.radarcns.validator.util.SchemaValidator.Message.TIME_RECEIVED_FIELD; import static org.radarcns.validator.util.ValidationResult.invalid; import static org.radarcns.validator.util.ValidationResult.valid; +import static org.radarcns.validator.util.ValidationSupport.extractEnumerationFields; import static org.radarcns.validator.util.ValidationSupport.getRecordName; import java.util.Locale; @@ -50,10 +52,14 @@ public interface SchemaValidator extends Function { String TIME_COMPLETED = "timeCompleted"; String NAMESPACE_REGEX = "^[a-z][a-z.]*$"; + String RECORD_NAME_REGEX = "(^[A-Z][a-z]+)|(^[A-Z][a-z0-9]+[A-Z]$)" + "|(^[A-Z][a-z0-9]+([A-Z][a-z0-9]+)+$)|(^[A-Z][a-z0-9]+([A-Z][a-z0-9]+)+[A-Z]$)"; + String FIELD_NAME_REGEX = "^[a-z][a-zA-Z]*$"; + String ENUMERATION_SYMBOL_REGEX = "^[A-Z_]+$"; + /** Field names cannot contain the following values. */ enum FieldNameNotAllowed { LOWER_VALUE("value"), @@ -74,8 +80,8 @@ public String getName() { enum Message { NAME_SPACE("Namespace cannot be null and must fully lowercase dot separated without " + "numeric. In this case the expected value is \""), - RECORD_NAME("Record name must be the conversion of the .avsc file name in UpperCamelCase. " - + "The expected value is "), + RECORD_NAME("Record name must be the conversion of the .avsc file name in UpperCamelCase " + + "and name the device explicitly. The expected value is "), TIME_FIELD("Any schema representing collected data must have a \"" + TIME + "\" field formatted in " + Type.DOUBLE.getName().toUpperCase(Locale.ENGLISH) + "."), TIME_COMPLETED_FIELD("Any " + NameFolder.ACTIVE + " schema must have a \"" + TIME_COMPLETED @@ -96,7 +102,9 @@ enum Message { DOC("Documentation is mandatory for any schema and field. The documentation should report " + "what is being measured, how, and what units or ranges are applicable. Abbreviations " + "and acronyms in the documentation should be written out. The sentence must be ended " - + "by a point. Please add \"doc\" property."); + + "by a point. Please add \"doc\" property."), + ENUMERATION_SYMBOL("Enumerator items should be written in uppercase characters separated " + + "by underscores."); private final String message; @@ -249,7 +257,7 @@ static SchemaValidator validateFieldName(Set skip) { * TODO. * @return TODO */ - static SchemaValidator validateFiledDocumentation() { + static SchemaValidator validateFieldDocumentation() { return validate(schema -> schema.getFields() .stream() @@ -258,6 +266,18 @@ static SchemaValidator validateFiledDocumentation() { DOC); } + /** + * TODO. + * @return TODO + */ + static SchemaValidator validateEnumeration() { + return validate(schema -> + extractEnumerationFields(schema).stream() + .allMatch(symbol -> symbol.matches( + ENUMERATION_SYMBOL_REGEX)), + ENUMERATION_SYMBOL); + } + /** * TODO. * @param predicate TODO diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java index f7f30500..e4f16505 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java @@ -16,8 +16,12 @@ * limitations under the License. */ +import java.util.LinkedList; +import java.util.List; import java.util.Objects; import java.util.Optional; +import org.apache.avro.Schema; +import org.apache.avro.Schema.Type; public final class ValidationSupport { @@ -68,4 +72,23 @@ public static String getRecordName(String fileName) { return recordName; } + /** + * TODO. + * @param root TODO + * @return TODO + */ + public static List extractEnumerationFields(Schema root) { + if (root.getType().equals(Type.ENUM)) { + return root.getEnumSymbols(); + } + + final List symbols = new LinkedList<>(); + root.getFields().stream() + .filter(field -> field.schema().getType().equals(Type.ENUM)) + .map(field -> field.schema()) + .forEach(schema -> symbols.addAll(schema.getEnumSymbols())); + + return symbols; + } + } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/unit/SchemaValidatorTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/unit/SchemaValidatorTest.java index d395a205..866f59e0 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/unit/SchemaValidatorTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/unit/SchemaValidatorTest.java @@ -22,6 +22,7 @@ import static org.radarcns.validator.AvroValidator.FIELD_NAME_REGEX; import static org.radarcns.validator.StructureValidator.NameFolder.ACTIVE; import static org.radarcns.validator.StructureValidator.NameFolder.MONITOR; +import static org.radarcns.validator.util.SchemaValidator.ENUMERATION_SYMBOL_REGEX; import static org.radarcns.validator.util.SchemaValidator.NAMESPACE_REGEX; import static org.radarcns.validator.util.SchemaValidator.RECORD_NAME_REGEX; @@ -93,6 +94,18 @@ public void fieldNameRegex() { assertFalse("E4Heart".matches(FIELD_NAME_REGEX)); } + @Test + public void enumerationRegex() { + assertTrue("HELLO".matches(ENUMERATION_SYMBOL_REGEX)); + assertTrue("HELLOTHERE".matches(ENUMERATION_SYMBOL_REGEX)); + assertTrue("HELLO_THERE".matches(ENUMERATION_SYMBOL_REGEX)); + assertFalse("Hello".matches(ENUMERATION_SYMBOL_REGEX)); + assertFalse("hello".matches(ENUMERATION_SYMBOL_REGEX)); + assertFalse("HelloThere".matches(ENUMERATION_SYMBOL_REGEX)); + assertFalse("Hello_There".matches(ENUMERATION_SYMBOL_REGEX)); + assertFalse("HELLO.THERE".matches(ENUMERATION_SYMBOL_REGEX)); + } + @Test public void nameSpaceTest() { Schema schema; @@ -187,8 +200,9 @@ public void recordNameTest() { assertFalse(result.isValid()); assertEquals(Optional.of("Record name must be the conversion of the .avsc file name in " - + "UpperCamelCase. The expected value is EmpaticaE4Acceleration\". " - + "org.radarcns.passive.empatica." + fieldName + " is invalid."), + + "UpperCamelCase and name the device explicitly. The expected value is " + + "EmpaticaE4Acceleration\". org.radarcns.passive.empatica." + + fieldName + " is invalid."), result.getReason()); result = SchemaValidator.validateRecordName( @@ -421,7 +435,7 @@ public void filedDocumentationTest() { + "{\"name\": \"userId\", \"type\": \"string\" , \"doc\": \"Documentation\"}," + "{\"name\": \"sourceId\", \"type\": \"string\"} ]}"); - result = SchemaValidator.validateFiledDocumentation().apply(schema); + result = SchemaValidator.validateFieldDocumentation().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("Documentation is mandatory for any schema and field. The " @@ -435,7 +449,7 @@ public void filedDocumentationTest() { + "\"type\": \"record\", \"name\": \"key\", \"type\": \"record\", \"fields\": [" + "{\"name\": \"userId\", \"type\": \"string\" , \"doc\": \"Documentation.\"}]}"); - result = SchemaValidator.validateFiledDocumentation().apply(schema); + result = SchemaValidator.validateFieldDocumentation().apply(schema); assertTrue(result.isValid()); } @@ -473,6 +487,84 @@ public void schemaDocumentationTest() { assertTrue(result.isValid()); } + @Test + public void enumerationSymbolTest() { + Schema schema; + ValidationResult result; + + String enumName = "org.radarcns.monitor.application.ApplicationServerStatus"; + String connected = "CONNECTED"; + String unknown = "UNKNOWN"; + + schema = SchemaBuilder + .enumeration(enumName) + .symbols(connected, "DISCONNECTED", unknown); + + result = SchemaValidator.validateEnumeration().apply(schema); + + assertTrue(result.isValid()); + + schema = new Parser().parse("{\"namespace\": \"org.radarcns.monitor.application\", " + + "\"type\": \"record\", \"name\": \"ApplicationServerStatus\", \"fields\": " + + "[ {\"name\": \"serverStatus\", \"type\": {\"name\": \"ServerStatus\", \"type\": " + + "\"enum\", \"symbols\": [\"CONNECTED\", \"NOT_CONNECTED\", \"UNKNOWN\"] } } ] }"); + + result = SchemaValidator.validateEnumeration().apply(schema); + + assertTrue(result.isValid()); + + schema = SchemaBuilder + .enumeration(enumName) + .symbols(connected, "disconnected", unknown); + + result = SchemaValidator.validateEnumeration().apply(schema); + + String invalidMessage = "Enumerator items should be written in uppercase characters " + + "separated by underscores. " + + "org.radarcns.monitor.application.ApplicationServerStatus is invalid."; + + assertFalse(result.isValid()); + assertEquals(Optional.of(invalidMessage), result.getReason()); + + schema = SchemaBuilder + .enumeration(enumName) + .symbols(connected, "Not_Connected", unknown); + + result = SchemaValidator.validateEnumeration().apply(schema); + + assertFalse(result.isValid()); + assertEquals(Optional.of(invalidMessage), result.getReason()); + + schema = SchemaBuilder + .enumeration(enumName) + .symbols(connected, "NotConnected", unknown); + + result = SchemaValidator.validateEnumeration().apply(schema); + + assertFalse(result.isValid()); + assertEquals(Optional.of(invalidMessage), result.getReason()); + + schema = new Parser().parse("{\"namespace\": \"org.radarcns.monitor.application\", " + + "\"type\": \"record\", \"name\": \"ApplicationServerStatus\", \"fields\": " + + "[ {\"name\": \"serverStatus\", \"type\": {\"name\": \"ServerStatus\", \"type\": " + + "\"enum\", \"symbols\": [\"CONNECTED\", \"Not_Connected\", \"UNKNOWN\"] } } ] }"); + + result = SchemaValidator.validateEnumeration().apply(schema); + + assertFalse(result.isValid()); + assertEquals(Optional.of(invalidMessage), result.getReason()); + + schema = new Parser().parse("{\"namespace\": \"org.radarcns.monitor.application\", " + + "\"type\": \"record\", \"name\": \"ApplicationServerStatus\", \"fields\": " + + "[ {\"name\": \"serverStatus\", \"type\": {\"name\": \"ServerStatus\", \"type\": " + + "\"enum\", \"symbols\": [\"Connected\", \"NotConnected\", \"UNKNOWN\"] } } ] }"); + + result = SchemaValidator.validateEnumeration().apply(schema); + + assertFalse(result.isValid()); + assertEquals(Optional.of(invalidMessage), result.getReason()); + } + private static String getFinalMessage(String nameSpace, String recordName) { return nameSpace.concat(".").concat(recordName).concat(INVALID_TEXT); } From 633a538cdecbb87c4afe2cb8cd2e7d08d0bbf149 Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Wed, 26 Jul 2017 14:48:53 +0100 Subject: [PATCH 018/112] Add general tests and modified interface access control --- .../org/radarcns/validator/util/Invalid.java | 3 + .../validator/util/SchemaValidator.java | 393 ++++++---------- .../validator/util/SchemaValidatorImpl.java | 36 -- .../validator/util/SchemaValidatorRole.java | 437 ++++++++++++++++++ ...Test.java => SchemaValidatorRoleTest.java} | 105 ++--- .../validator/util/SchemaValidatorTest.java | 46 ++ .../validator/util/ValidationResult.java | 3 + .../validator/util/ValidationSupport.java | 14 +- 8 files changed, 691 insertions(+), 346 deletions(-) delete mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorImpl.java create mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java rename java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/{unit/SchemaValidatorTest.java => SchemaValidatorRoleTest.java} (84%) create mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/Invalid.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/Invalid.java index 367984c2..818e104b 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/Invalid.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/Invalid.java @@ -18,6 +18,9 @@ import java.util.Optional; +/** + * TODO. + */ public class Invalid implements ValidationResult { private final String reason; diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java index 18912597..f0921258 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java @@ -1,32 +1,5 @@ package org.radarcns.validator.util; -import static org.radarcns.validator.util.SchemaValidator.Message.DOC; -import static org.radarcns.validator.util.SchemaValidator.Message.ENUMERATION_SYMBOL; -import static org.radarcns.validator.util.SchemaValidator.Message.FIELDS; -import static org.radarcns.validator.util.SchemaValidator.Message.FILED_NAME; -import static org.radarcns.validator.util.SchemaValidator.Message.NOT_TIME_COMPLETED_FIELD; -import static org.radarcns.validator.util.SchemaValidator.Message.NOT_TIME_RECEIVED_FIELD; -import static org.radarcns.validator.util.SchemaValidator.Message.RECORD_NAME; -import static org.radarcns.validator.util.SchemaValidator.Message.TIME_COMPLETED_FIELD; -import static org.radarcns.validator.util.SchemaValidator.Message.TIME_FIELD; -import static org.radarcns.validator.util.SchemaValidator.Message.TIME_RECEIVED_FIELD; -import static org.radarcns.validator.util.ValidationResult.invalid; -import static org.radarcns.validator.util.ValidationResult.valid; -import static org.radarcns.validator.util.ValidationSupport.extractEnumerationFields; -import static org.radarcns.validator.util.ValidationSupport.getRecordName; - -import java.util.Locale; -import java.util.Objects; -import java.util.Set; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import org.apache.avro.Schema; -import org.apache.avro.Schema.Type; -import org.radarcns.validator.StructureValidator.NameFolder; - - /* * Copyright 2017 King's College London and The Hyve * @@ -43,261 +16,173 @@ * limitations under the License. */ -public interface SchemaValidator extends Function { - - String NAME_SPACE = "org.radarcns"; - - String TIME = "time"; - String TIME_RECEIVED = "timeReceived"; - String TIME_COMPLETED = "timeCompleted"; - - String NAMESPACE_REGEX = "^[a-z][a-z.]*$"; - - String RECORD_NAME_REGEX = "(^[A-Z][a-z]+)|(^[A-Z][a-z0-9]+[A-Z]$)" - + "|(^[A-Z][a-z0-9]+([A-Z][a-z0-9]+)+$)|(^[A-Z][a-z0-9]+([A-Z][a-z0-9]+)+[A-Z]$)"; - - String FIELD_NAME_REGEX = "^[a-z][a-zA-Z]*$"; - - String ENUMERATION_SYMBOL_REGEX = "^[A-Z_]+$"; - - /** Field names cannot contain the following values. */ - enum FieldNameNotAllowed { - LOWER_VALUE("value"), - UPPERD_VALUE("Value"); - - private final String name; - - FieldNameNotAllowed(String name) { - this.name = name; - } - - public String getName() { - return name; - } - } - - /** Messages. */ - enum Message { - NAME_SPACE("Namespace cannot be null and must fully lowercase dot separated without " - + "numeric. In this case the expected value is \""), - RECORD_NAME("Record name must be the conversion of the .avsc file name in UpperCamelCase " - + "and name the device explicitly. The expected value is "), - TIME_FIELD("Any schema representing collected data must have a \"" + TIME - + "\" field formatted in " + Type.DOUBLE.getName().toUpperCase(Locale.ENGLISH) + "."), - TIME_COMPLETED_FIELD("Any " + NameFolder.ACTIVE + " schema must have a \"" + TIME_COMPLETED - + "\" field formatted in " + Type.DOUBLE.getName().toUpperCase(Locale.ENGLISH) + "."), - NOT_TIME_COMPLETED_FIELD("\"" + TIME_COMPLETED + "\" is allow only in " + NameFolder.ACTIVE - + " schemas."), - TIME_RECEIVED_FIELD("Any " + NameFolder.PASSIVE + " schema must have a \"" + TIME_RECEIVED - + "\" field formatted in " + Type.DOUBLE.getName().toUpperCase(Locale.ENGLISH) + "."), - NOT_TIME_RECEIVED_FIELD("\"" + TIME_RECEIVED + "\" is allow only in " + NameFolder.PASSIVE - + " schemas."), - FIELDS("Avro Record must have field list."), - FILED_NAME("Field name does not respect lowerCamelCase name convention. It cannot contain" - + " any of the following values [" - + Stream.of(FieldNameNotAllowed.values()) - .map(FieldNameNotAllowed::getName) - .collect(Collectors.joining(",")) - + "]. Please avoid abbreviations and write out the field name instead."), - DOC("Documentation is mandatory for any schema and field. The documentation should report " - + "what is being measured, how, and what units or ranges are applicable. Abbreviations " - + "and acronyms in the documentation should be written out. The sentence must be ended " - + "by a point. Please add \"doc\" property."), - ENUMERATION_SYMBOL("Enumerator items should be written in uppercase characters separated " - + "by underscores."); - - private final String message; - - Message(String message) { - this.message = message; - } - - public String getMessage(Schema schema) { - return message.concat(" ").concat(schema.getFullName()).concat(" is invalid."); - } +import static org.radarcns.validator.util.SchemaValidatorRole.getActiveValidator; +import static org.radarcns.validator.util.SchemaValidatorRole.getGeneralValidator; +import static org.radarcns.validator.util.SchemaValidatorRole.getMonitorValidator; +import static org.radarcns.validator.util.SchemaValidatorRole.getPassiveValidator; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import org.apache.avro.Schema; +import org.apache.avro.Schema.Field; +import org.apache.avro.Schema.Type; +import org.radarcns.validator.StructureValidator.NameFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; - public String getMessage() { - return message; - } - } +/** + * TODO. + */ +public final class SchemaValidator { - /** - * TODO. - * @param rootFolder TODO - * @param currentFolder TODO - * @return TODO - */ - static SchemaValidator validateNameSpace(NameFolder rootFolder, String currentFolder) { - String expected = NAME_SPACE.concat(".").concat( - rootFolder.getName()).concat(".").concat(currentFolder); + private static final Logger LOGGER = LoggerFactory.getLogger(SchemaValidator.class); - return schema -> Objects.nonNull(schema.getNamespace()) - && schema.getNamespace() .matches(NAMESPACE_REGEX) - && schema.getNamespace().equalsIgnoreCase(expected) ? valid() : - invalid(Message.NAME_SPACE.getMessage().concat(expected).concat( - "\". ").concat(schema.getFullName()).concat(" is invalid.")); - } + private static final Map> COLLISIONS = new HashMap<>(); - /** - * TODO. - * @param fileName TODO - * @return TODO - */ - static SchemaValidator validateRecordName(String fileName) { - return validateRecordName(fileName, null); + private SchemaValidator() { + //Static class } /** * TODO. - * @param fileName TODO - * @param skip TODO + * @param schema TODO + * @param pathToSchema TODO + * @param root TODO + * @param subfolder TODO * @return TODO + * @throws IOException TODO */ - static SchemaValidator validateRecordName(String fileName, Set skip) { - String expected = getRecordName(fileName); - - return schema -> - schema.getName().matches(RECORD_NAME_REGEX) - && schema.getName().equalsIgnoreCase(expected) - || Objects.nonNull(skip) && skip.contains(schema.getName()) ? valid() : - invalid(RECORD_NAME.getMessage().concat(expected).concat("\". ").concat( - schema.getFullName()).concat(" is invalid.")); - } + public static ValidationResult validate(Schema schema, Path pathToSchema, NameFolder root, + String subfolder) { + Objects.requireNonNull(schema); + Objects.requireNonNull(pathToSchema); + Objects.requireNonNull(root); + Objects.requireNonNull(subfolder); - /** - * TODO. - * @return TODO - */ - static SchemaValidator validateSchemaDocumentation() { - return validate(schema -> Objects.nonNull(schema.getDoc()), DOC); - } + ValidationResult result; - /** - * TODO. - * @return TODO - */ - static SchemaValidator validateFields() { - return validate(schema -> !schema.getFields().isEmpty(), FIELDS); - } + switch (root) { + case ACTIVE: + result = getActiveValidator(pathToSchema, root, subfolder).apply(schema); + break; + case MONITOR: + result = getMonitorValidator(pathToSchema, root, subfolder).apply(schema); + break; + case KAFKA: + result = getGeneralValidator(pathToSchema, root, subfolder).apply(schema); + break; + case PASSIVE: + result = getPassiveValidator(pathToSchema, root, subfolder).apply(schema); + break; + default: + LOGGER.warn("Applying general validation to {}", getPath(pathToSchema)); + result = getGeneralValidator(pathToSchema, root, subfolder).apply(schema); + break; + } - /** - * TODO. - * @return TODO - */ - static SchemaValidator validateTime() { - return validate(schema -> Objects.nonNull(schema.getField(TIME)) - && schema.getField(TIME).schema().getType().equals(Type.DOUBLE), TIME_FIELD); - } + computeCollision(schema); - /** - * TODO. - * @return TODO - */ - static SchemaValidator validateTimeCompleted() { - return validate(schema -> Objects.nonNull(schema.getField(TIME_COMPLETED)) - && schema.getField(TIME_COMPLETED).schema().getType().equals(Type.DOUBLE), - TIME_COMPLETED_FIELD); - } + if (!result.isValid()) { + LOGGER.error("{} is invalid.", getPath(pathToSchema)); + } - /** - * TODO. - * @return TODO - */ - static SchemaValidator validateNotTimeCompleted() { - return validate(schema -> Objects.isNull(schema.getField(TIME_COMPLETED)), - NOT_TIME_COMPLETED_FIELD); - } + return result; + } + + /** + * TODO. + * @param schema TODO + * @param pathToSchema TODO + * @param root TODO + * @param subfolder TODO + * @param skipRecordName TODO + * @param skipFieldName TODO + * @return TODO + * @throws IOException TODO + */ + public static ValidationResult validate(Schema schema, Path pathToSchema, NameFolder root, + String subfolder, Set skipRecordName, Set skipFieldName) { + Objects.requireNonNull(schema); + Objects.requireNonNull(pathToSchema); + Objects.requireNonNull(root); + Objects.requireNonNull(subfolder); + + ValidationResult result; + + switch (root) { + case ACTIVE: + result = getActiveValidator(pathToSchema, root, subfolder, skipRecordName, + skipFieldName).apply(schema); + break; + case MONITOR: + result = getMonitorValidator(pathToSchema, root, subfolder, skipRecordName, + skipFieldName).apply(schema); + break; + case KAFKA: + result = getGeneralValidator(pathToSchema, root, subfolder, skipRecordName, + skipFieldName).apply(schema); + break; + case PASSIVE: + result = getPassiveValidator(pathToSchema, root, subfolder, skipRecordName, + skipFieldName).apply(schema); + break; + default: + LOGGER.warn("Applying general validation to {}", getPath(pathToSchema)); + result = getGeneralValidator(pathToSchema, root, subfolder, skipRecordName, + skipFieldName).apply(schema); + break; + } - /** - * TODO. - * @return TODO - */ - static SchemaValidator validateTimeReceived() { - return validate(schema -> Objects.nonNull(schema.getField(TIME_RECEIVED)) - && schema.getField(TIME_RECEIVED).schema().getType().equals(Type.DOUBLE), - TIME_RECEIVED_FIELD); - } + computeCollision(schema); - /** - * TODO. - * @return TODO - */ - static SchemaValidator validateNotTimeReceived() { - return validate(schema -> Objects.isNull(schema.getField(TIME_RECEIVED)), - NOT_TIME_RECEIVED_FIELD); - } + if (!result.isValid()) { + LOGGER.error("{} is invalid.", getPath(pathToSchema)); + } - /** - * TODO. - * @return TODO - */ - static SchemaValidator validateFieldName() { - return validateFieldName(null); + return result; } - /** - * TODO. - * @param skip TODO - * @return TODO - */ - static SchemaValidator validateFieldName(Set skip) { - return validate(schema -> - schema.getFields() - .stream() - .map(field -> field.name()) - .allMatch(name -> - name.matches(FIELD_NAME_REGEX) - && Stream.of(FieldNameNotAllowed.values()) - .noneMatch(notAllowed -> name.contains(notAllowed.getName())) - || Objects.nonNull(skip) && skip.contains(name)), - FILED_NAME); + public static String getPath(Path path) { + return path.toString().substring(path.toString().indexOf("/RADAR-Schemas/")); } - /** - * TODO. - * @return TODO - */ - static SchemaValidator validateFieldDocumentation() { - return validate(schema -> - schema.getFields() - .stream() - .allMatch(field -> Objects.nonNull(field.doc()) - && field.doc().lastIndexOf(".") == field.doc().length() - 1) , - DOC); - } + private static void computeCollision(Schema schema) { + if (!schema.getType().equals(Type.RECORD)) { + return; + } - /** - * TODO. - * @return TODO - */ - static SchemaValidator validateEnumeration() { - return validate(schema -> - extractEnumerationFields(schema).stream() - .allMatch(symbol -> symbol.matches( - ENUMERATION_SYMBOL_REGEX)), - ENUMERATION_SYMBOL); + for (Field field : schema.getFields()) { + List list = COLLISIONS.get(field.name()); + if (schema == null) { + COLLISIONS.put(field.name(), Collections.singletonList(schema)); + } else { + list.add(schema); + } + computeCollision(field.schema()); + } } /** * TODO. - * @param predicate TODO - * @param message TODO - * @return TODO */ - static SchemaValidator validate(Predicate predicate, Message message) { - return schema -> predicate.test(schema) ? valid() : invalid(message.getMessage(schema)); - } + public static void analyseCollision() { + COLLISIONS.entrySet().stream() + .filter(entry -> entry.getValue().size() > 1) + .forEach(entry -> { + String message = entry.getKey() + " appears in: \n"; + for (Schema schema : entry.getValue()) { + message += "\t - " + schema.getFullName() + " as " + + schema.getField( + entry.getKey()).schema().getType().getName().toUpperCase(); + } - /** - * TODO. - * @param other TODO - * @return TODO - */ - default SchemaValidator and(SchemaValidator other) { - return schema -> { - final ValidationResult result = this.apply(schema); - return result.isValid() ? other.apply(schema) : result; - }; + LOGGER.warn(message, entry.getKey()); + }); } - } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorImpl.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorImpl.java deleted file mode 100644 index be460aab..00000000 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorImpl.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.radarcns.validator.util; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.radarcns.validator.util.SchemaValidator.validateTime; -import static org.radarcns.validator.util.SchemaValidator.validateTimeCompleted; -import static org.radarcns.validator.util.SchemaValidator.validateTimeReceived; - -public final class SchemaValidatorImpl { - - public static final SchemaValidator ACTIVE_VALIDATION = - validateTime().and(validateTimeCompleted()); - - public static final SchemaValidator MONITOR_VALIDATION = validateTime(); - - public static final SchemaValidator PASSIVE_VALIDATION = - validateTime().and(validateTimeReceived()); - - private SchemaValidatorImpl() { - //Private constructor - } -} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java new file mode 100644 index 00000000..6067f226 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java @@ -0,0 +1,437 @@ +package org.radarcns.validator.util; + +import static org.radarcns.validator.util.SchemaValidatorRole.Message.DOC; +import static org.radarcns.validator.util.SchemaValidatorRole.Message.ENUMERATION_SYMBOL; +import static org.radarcns.validator.util.SchemaValidatorRole.Message.FIELDS; +import static org.radarcns.validator.util.SchemaValidatorRole.Message.FILED_NAME; +import static org.radarcns.validator.util.SchemaValidatorRole.Message.NOT_TIME_COMPLETED_FIELD; +import static org.radarcns.validator.util.SchemaValidatorRole.Message.NOT_TIME_RECEIVED_FIELD; +import static org.radarcns.validator.util.SchemaValidatorRole.Message.RECORD_NAME; +import static org.radarcns.validator.util.SchemaValidatorRole.Message.TIME_COMPLETED_FIELD; +import static org.radarcns.validator.util.SchemaValidatorRole.Message.TIME_FIELD; +import static org.radarcns.validator.util.SchemaValidatorRole.Message.TIME_RECEIVED_FIELD; +import static org.radarcns.validator.util.ValidationResult.invalid; +import static org.radarcns.validator.util.ValidationResult.valid; +import static org.radarcns.validator.util.ValidationSupport.extractEnumerationFields; +import static org.radarcns.validator.util.ValidationSupport.getRecordName; + +import java.nio.file.Path; +import java.util.Locale; +import java.util.Objects; +import java.util.Set; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.apache.avro.Schema; +import org.apache.avro.Schema.Type; +import org.radarcns.validator.StructureValidator.NameFolder; + + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * TODO. + */ +interface SchemaValidatorRole extends Function { + + String NAME_SPACE = "org.radarcns"; + + String TIME = "time"; + String TIME_RECEIVED = "timeReceived"; + String TIME_COMPLETED = "timeCompleted"; + + String NAMESPACE_REGEX = "^[a-z][a-z.]*$"; + + String RECORD_NAME_REGEX = "(^[A-Z][a-z]+)|(^[A-Z][a-z0-9]+[A-Z]$)" + + "|(^[A-Z][a-z0-9]+([A-Z][a-z0-9]+)+$)|(^[A-Z][a-z0-9]+([A-Z][a-z0-9]+)+[A-Z]$)"; + + String FIELD_NAME_REGEX = "^[a-z][a-zA-Z]*$"; + + String ENUMERATION_SYMBOL_REGEX = "^[A-Z_]+$"; + + /** Field names cannot contain the following values. */ + enum FieldNameNotAllowed { + LOWER_VALUE("value"), + UPPERD_VALUE("Value"); + + private final String name; + + FieldNameNotAllowed(String name) { + this.name = name; + } + + public String getName() { + return name; + } + } + + /** Messages. */ + enum Message { + NAME_SPACE("Namespace cannot be null and must fully lowercase dot separated without " + + "numeric. In this case the expected value is \""), + RECORD_NAME("Record name must be the conversion of the .avsc file name in UpperCamelCase " + + "and name the device explicitly. The expected value is "), + TIME_FIELD("Any schema representing collected data must have a \"" + TIME + + "\" field formatted in " + Type.DOUBLE.getName().toUpperCase(Locale.ENGLISH) + "."), + TIME_COMPLETED_FIELD("Any " + NameFolder.ACTIVE + " schema must have a \"" + TIME_COMPLETED + + "\" field formatted in " + Type.DOUBLE.getName().toUpperCase(Locale.ENGLISH) + "."), + NOT_TIME_COMPLETED_FIELD("\"" + TIME_COMPLETED + "\" is allow only in " + NameFolder.ACTIVE + + " schemas."), + TIME_RECEIVED_FIELD("Any " + NameFolder.PASSIVE + " schema must have a \"" + TIME_RECEIVED + + "\" field formatted in " + Type.DOUBLE.getName().toUpperCase(Locale.ENGLISH) + "."), + NOT_TIME_RECEIVED_FIELD("\"" + TIME_RECEIVED + "\" is allow only in " + NameFolder.PASSIVE + + " schemas."), + FIELDS("Avro Record must have field list."), + FILED_NAME("Field name does not respect lowerCamelCase name convention. It cannot contain" + + " any of the following values [" + + Stream.of(FieldNameNotAllowed.values()) + .map(FieldNameNotAllowed::getName) + .collect(Collectors.joining(",")) + + "]. Please avoid abbreviations and write out the field name instead."), + DOC("Documentation is mandatory for any schema and field. The documentation should report " + + "what is being measured, how, and what units or ranges are applicable. Abbreviations " + + "and acronyms in the documentation should be written out. The sentence must be ended " + + "by a point. Please add \"doc\" property."), + ENUMERATION_SYMBOL("Enumerator items should be written in uppercase characters separated " + + "by underscores."); + + private final String message; + + Message(String message) { + this.message = message; + } + + public String getMessage(Schema schema) { + return message.concat(" ").concat(schema.getFullName()).concat(" is invalid."); + } + + public String getMessage() { + return message; + } + } + + /** + * TODO. + * @param rootFolder TODO + * @param subFolder TODO + * @return TODO + */ + static SchemaValidatorRole validateNameSpace(NameFolder rootFolder, String subFolder) { + String expected = NAME_SPACE.concat(".").concat( + rootFolder.getName()).concat(".").concat(subFolder); + + return schema -> Objects.nonNull(schema.getNamespace()) + && schema.getNamespace() .matches(NAMESPACE_REGEX) + && schema.getNamespace().equalsIgnoreCase(expected) ? valid() : + invalid(Message.NAME_SPACE.getMessage().concat(expected).concat( + "\". ").concat(schema.getFullName()).concat(" is invalid.")); + } + + /** + * TODO. + * @param path TODO + * @return TODO + */ + static SchemaValidatorRole validateRecordName(Path path) { + return validateRecordName(path, null); + } + + /** + * TODO. + * @param path TODO + * @param skip TODO + * @return TODO + */ + static SchemaValidatorRole validateRecordName(Path path, Set skip) { + String expected = getRecordName(path); + + return schema -> + schema.getName().matches(RECORD_NAME_REGEX) + && schema.getName().equalsIgnoreCase(expected) + || Objects.nonNull(skip) && skip.contains(schema.getName()) ? valid() : + invalid(RECORD_NAME.getMessage().concat(expected).concat("\". ").concat( + schema.getFullName()).concat(" is invalid.")); + } + + /** + * TODO. + * @return TODO + */ + static SchemaValidatorRole validateSchemaDocumentation() { + return validate(schema -> Objects.nonNull(schema.getDoc()), DOC); + } + + /** + * TODO. + * @return TODO + */ + static SchemaValidatorRole validateFields() { + return validate(schema -> !schema.getFields().isEmpty(), FIELDS); + } + + /** + * TODO. + * @return TODO + */ + static SchemaValidatorRole validateFieldName() { + return validateFieldName(null); + } + + /** + * TODO. + * @param skip TODO + * @return TODO + */ + static SchemaValidatorRole validateFieldName(Set skip) { + return validate(schema -> + schema.getFields() + .stream() + .map(field -> field.name()) + .allMatch(name -> + name.matches(FIELD_NAME_REGEX) + && Stream.of(FieldNameNotAllowed.values()) + .noneMatch(notAllowed -> name.contains(notAllowed.getName())) + || Objects.nonNull(skip) && skip.contains(name)), + FILED_NAME); + } + + /** + * TODO. + * @return TODO + */ + static SchemaValidatorRole validateFieldDocumentation() { + return validate(schema -> + schema.getFields() + .stream() + .allMatch(field -> Objects.nonNull(field.doc()) + && field.doc().lastIndexOf(".") == field.doc().length() - 1) , + DOC); + } + + /** + * TODO. + * @return TODO + */ + static SchemaValidatorRole validateEnumeration() { + return validate(schema -> + extractEnumerationFields(schema).stream() + .allMatch(symbol -> symbol.matches( + ENUMERATION_SYMBOL_REGEX)), + ENUMERATION_SYMBOL); + } + + /** + * TODO. + * @return TODO + */ + static SchemaValidatorRole validateTime() { + return validate(schema -> Objects.nonNull(schema.getField(TIME)) + && schema.getField(TIME).schema().getType().equals(Type.DOUBLE), TIME_FIELD); + } + + /** + * TODO. + * @return TODO + */ + static SchemaValidatorRole validateTimeCompleted() { + return validate(schema -> Objects.nonNull(schema.getField(TIME_COMPLETED)) + && schema.getField(TIME_COMPLETED).schema().getType().equals(Type.DOUBLE), + TIME_COMPLETED_FIELD); + } + + /** + * TODO. + * @return TODO + */ + static SchemaValidatorRole validateNotTimeCompleted() { + return validate(schema -> Objects.isNull(schema.getField(TIME_COMPLETED)), + NOT_TIME_COMPLETED_FIELD); + } + + /** + * TODO. + * @return TODO + */ + static SchemaValidatorRole validateTimeReceived() { + return validate(schema -> Objects.nonNull(schema.getField(TIME_RECEIVED)) + && schema.getField(TIME_RECEIVED).schema().getType().equals(Type.DOUBLE), + TIME_RECEIVED_FIELD); + } + + /** + * TODO. + * @return TODO + */ + static SchemaValidatorRole validateNotTimeReceived() { + return validate(schema -> Objects.isNull(schema.getField(TIME_RECEIVED)), + NOT_TIME_RECEIVED_FIELD); + } + + /** + * TODO. + * @param predicate TODO + * @param message TODO + * @return TODO + */ + static SchemaValidatorRole validate(Predicate predicate, Message message) { + return schema -> predicate.test(schema) ? valid() : invalid(message.getMessage(schema)); + } + + /** + * TODO. + * @param other TODO + * @return TODO + */ + default SchemaValidatorRole and(SchemaValidatorRole other) { + return schema -> { + final ValidationResult result = this.apply(schema); + return result.isValid() ? other.apply(schema) : result; + }; + } + + /** + * TODO. + * @param pathToSchema TODO + * @param root TODO + * @param subfolder TODO + * @return TODO + */ + static SchemaValidatorRole getGeneralValidator(Path pathToSchema, NameFolder root, + String subfolder) { + return validateNameSpace(root, subfolder) + .and(validateRecordName(pathToSchema)) + .and(validateSchemaDocumentation()) + .and(validateFields()) + .and(validateFieldName()) + .and(validateFieldDocumentation()) + .and(validateEnumeration()); + } + + /** + * TODO. + * @param pathToSchema TODO + * @param root TODO + * @param subfolder TODO + * @param skipRecordName TODO + * @param skipFieldName TODO + * @return TODO + */ + static SchemaValidatorRole getGeneralValidator(Path pathToSchema, NameFolder root, + String subfolder, Set skipRecordName, Set skipFieldName) { + return validateNameSpace(root, subfolder) + .and(validateRecordName(pathToSchema, skipRecordName)) + .and(validateSchemaDocumentation()) + .and(validateFields()) + .and(validateFieldName(skipFieldName)) + .and(validateFieldDocumentation()) + .and(validateEnumeration()); + } + + /** + * TODO. + * @param pathToSchema TODO + * @param root TODO + * @param subfolder TODO + * @return TODO + */ + static SchemaValidatorRole getActiveValidator(Path pathToSchema, NameFolder root, + String subfolder) { + return getGeneralValidator(pathToSchema, root, subfolder) + .and(validateTime()) + .and(validateTimeCompleted()) + .and(validateNotTimeReceived()); + } + + /** + * TODO. + * @param pathToSchema TODO + * @param root TODO + * @param subfolder TODO + * @param skipRecordName TODO + * @param skipFieldName TODO + * @return TODO + */ + static SchemaValidatorRole getActiveValidator(Path pathToSchema, NameFolder root, + String subfolder, Set skipRecordName, Set skipFieldName) { + return getGeneralValidator(pathToSchema, root, subfolder, skipRecordName, skipFieldName) + .and(validateTime()) + .and(validateTimeCompleted()) + .and(validateNotTimeReceived()); + } + + /** + * TODO. + * @param pathToSchema TODO + * @param root TODO + * @param subfolder TODO + * @return TODO + */ + static SchemaValidatorRole getMonitorValidator(Path pathToSchema, NameFolder root, + String subfolder) { + return getGeneralValidator(pathToSchema, root, subfolder) + .and(validateTime()); + } + + /** + * TODO. + * @param pathToSchema TODO + * @param root TODO + * @param subfolder TODO + * @param skipRecordName TODO + * @param skipFieldName TODO + * @return TODO + */ + static SchemaValidatorRole getMonitorValidator(Path pathToSchema, NameFolder root, + String subfolder, Set skipRecordName, Set skipFieldName) { + return getGeneralValidator(pathToSchema, root, subfolder, skipRecordName, skipFieldName) + .and(validateTime()); + } + + /** + * TODO. + * @param pathToSchema TODO + * @param root TODO + * @param subfolder TODO + * @return TODO + */ + static SchemaValidatorRole getPassiveValidator(Path pathToSchema, NameFolder root, + String subfolder) { + return getGeneralValidator(pathToSchema, root, subfolder) + .and(validateTime()) + .and(validateTimeReceived()) + .and(validateNotTimeCompleted()); + } + + /** + * TODO. + * @param pathToSchema TODO + * @param root TODO + * @param subfolder TODO + * @param skipRecordName TODO + * @param skipFieldName TODO + * @return TODO + */ + static SchemaValidatorRole getPassiveValidator(Path pathToSchema, NameFolder root, + String subfolder, Set skipRecordName, Set skipFieldName) { + return getGeneralValidator(pathToSchema, root, subfolder, skipRecordName, skipFieldName) + .and(validateTime()) + .and(validateTimeReceived()) + .and(validateNotTimeCompleted()); + } + +} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/unit/SchemaValidatorTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java similarity index 84% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/unit/SchemaValidatorTest.java rename to java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java index 866f59e0..d56debbf 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/unit/SchemaValidatorTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java @@ -1,4 +1,4 @@ -package org.radarcns.validator.util.unit; +package org.radarcns.validator.util; /* * Copyright 2017 King's College London and The Hyve @@ -22,21 +22,20 @@ import static org.radarcns.validator.AvroValidator.FIELD_NAME_REGEX; import static org.radarcns.validator.StructureValidator.NameFolder.ACTIVE; import static org.radarcns.validator.StructureValidator.NameFolder.MONITOR; -import static org.radarcns.validator.util.SchemaValidator.ENUMERATION_SYMBOL_REGEX; -import static org.radarcns.validator.util.SchemaValidator.NAMESPACE_REGEX; -import static org.radarcns.validator.util.SchemaValidator.RECORD_NAME_REGEX; +import static org.radarcns.validator.util.SchemaValidatorRole.ENUMERATION_SYMBOL_REGEX; +import static org.radarcns.validator.util.SchemaValidatorRole.NAMESPACE_REGEX; +import static org.radarcns.validator.util.SchemaValidatorRole.RECORD_NAME_REGEX; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Collections; import java.util.Optional; import org.apache.avro.Schema; import org.apache.avro.Schema.Parser; import org.apache.avro.SchemaBuilder; import org.junit.Test; -import org.radarcns.validator.util.SchemaValidator; -import org.radarcns.validator.util.ValidationResult; -import org.radarcns.validator.util.ValidationSupport; -public class SchemaValidatorTest { +public class SchemaValidatorRoleTest { private static final String ACTIVE_NAME_SPACE_MOCK = "org.radarcns.active.test"; private static final String MONITOR_NAME_SPACE_MOCK = "org.radarcns.monitor.test"; @@ -49,9 +48,10 @@ public class SchemaValidatorTest { @Test public void fileNameTest() { assertEquals("Questionnaire", - ValidationSupport.getRecordName("questionnaire.avsc")); + ValidationSupport.getRecordName(Paths.get("/path/to/questionnaire.avsc"))); assertEquals("ApplicationExternalTime", - ValidationSupport.getRecordName("application_external_time.avsc")); + ValidationSupport.getRecordName( + Paths.get("/path/to/application_external_time.avsc"))); } @Test @@ -87,7 +87,7 @@ public void recordNameRegex() { @Test public void fieldNameRegex() { assertTrue("x".matches(FIELD_NAME_REGEX)); - assertTrue(SchemaValidator.TIME.matches(FIELD_NAME_REGEX)); + assertTrue(SchemaValidatorRole.TIME.matches(FIELD_NAME_REGEX)); assertTrue("subjectId".matches(FIELD_NAME_REGEX)); assertTrue("listOfSeveralThings".matches(FIELD_NAME_REGEX)); assertFalse("Time".matches(FIELD_NAME_REGEX)); @@ -117,7 +117,7 @@ public void nameSpaceTest() { .fields() .endRecord(); - result = SchemaValidator.validateNameSpace(ACTIVE, + result = SchemaValidatorRole.validateNameSpace(ACTIVE, "questionnaire").apply(schema); assertTrue(result.isValid()); @@ -128,7 +128,7 @@ public void nameSpaceTest() { .fields() .endRecord(); - result = SchemaValidator.validateNameSpace(MONITOR, "test").apply(schema); + result = SchemaValidatorRole.validateNameSpace(MONITOR, "test").apply(schema); assertFalse(result.isValid()); @@ -144,7 +144,7 @@ public void nameSpaceTest() { .fields() .endRecord(); - result = SchemaValidator.validateNameSpace(MONITOR, "test").apply(schema); + result = SchemaValidatorRole.validateNameSpace(MONITOR, "test").apply(schema); assertFalse(result.isValid()); @@ -160,7 +160,7 @@ public void nameSpaceTest() { .fields() .endRecord(); - result = SchemaValidator.validateNameSpace(MONITOR, "test").apply(schema); + result = SchemaValidatorRole.validateNameSpace(MONITOR, "test").apply(schema); assertFalse(result.isValid()); @@ -182,12 +182,13 @@ public void recordNameTest() { .fields() .endRecord(); - result = SchemaValidator.validateRecordName("schema.avsc").apply(schema); + result = SchemaValidatorRole.validateRecordName( + Paths.get("/path/to/schema.avsc")).apply(schema); assertTrue(result.isValid()); String fieldName = "EmpaticaE4Aceleration"; - String fileName = "empatica_e4_acceleration.avsc"; + Path filePath = Paths.get("/path/to/empatica_e4_acceleration.avsc"); schema = SchemaBuilder .builder("org.radarcns.passive.empatica") @@ -195,7 +196,7 @@ public void recordNameTest() { .fields() .endRecord(); - result = SchemaValidator.validateRecordName(fileName).apply(schema); + result = SchemaValidatorRole.validateRecordName(filePath).apply(schema); assertFalse(result.isValid()); @@ -205,8 +206,8 @@ public void recordNameTest() { + fieldName + " is invalid."), result.getReason()); - result = SchemaValidator.validateRecordName( - fileName, Collections.singleton(fieldName)).apply(schema); + result = SchemaValidatorRole.validateRecordName(filePath, + Collections.singleton(fieldName)).apply(schema); assertTrue(result.isValid()); } @@ -222,7 +223,7 @@ public void fieldsTest() { .fields() .endRecord(); - result = SchemaValidator.validateFields().apply(schema); + result = SchemaValidatorRole.validateFields().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("Avro Record must have field list. " @@ -235,7 +236,7 @@ public void fieldsTest() { .optionalBoolean("optional") .endRecord(); - result = SchemaValidator.validateFields().apply(schema); + result = SchemaValidatorRole.validateFields().apply(schema); assertTrue(result.isValid()); } @@ -252,7 +253,7 @@ public void timeTest() { .requiredString("string") .endRecord(); - result = SchemaValidator.validateTime().apply(schema); + result = SchemaValidatorRole.validateTime().apply(schema); assertFalse(result.isValid()); @@ -265,10 +266,10 @@ public void timeTest() { .builder("org.radarcns.time.test") .record(RECORD_NAME_MOCK) .fields() - .requiredDouble(SchemaValidator.TIME) + .requiredDouble(SchemaValidatorRole.TIME) .endRecord(); - result = SchemaValidator.validateTime().apply(schema); + result = SchemaValidatorRole.validateTime().apply(schema); assertTrue(result.isValid()); } @@ -285,13 +286,13 @@ public void timeCompletedTest() { .requiredString("field") .endRecord(); - result = SchemaValidator.validateTimeCompleted().apply(schema); + result = SchemaValidatorRole.validateTimeCompleted().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("Any ACTIVE schema must have a \"timeCompleted\" field formatted " + "in DOUBLE. org.radarcns.active.test." + RECORD_NAME_MOCK + INVALID_TEXT), result.getReason()); - result = SchemaValidator.validateNotTimeCompleted().apply(schema); + result = SchemaValidatorRole.validateNotTimeCompleted().apply(schema); assertTrue(result.isValid()); schema = SchemaBuilder @@ -301,10 +302,10 @@ public void timeCompletedTest() { .requiredDouble("timeCompleted") .endRecord(); - result = SchemaValidator.validateTimeCompleted().apply(schema); + result = SchemaValidatorRole.validateTimeCompleted().apply(schema); assertTrue(result.isValid()); - result = SchemaValidator.validateNotTimeCompleted().apply(schema); + result = SchemaValidatorRole.validateNotTimeCompleted().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("\"timeCompleted\" is allow only in ACTIVE schemas. " + getFinalMessage(ACTIVE_NAME_SPACE_MOCK, RECORD_NAME_MOCK)), @@ -323,13 +324,13 @@ public void timeReceivedTest() { .requiredString("field") .endRecord(); - result = SchemaValidator.validateTimeReceived().apply(schema); + result = SchemaValidatorRole.validateTimeReceived().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("Any PASSIVE schema must have a \"timeReceived\" field formatted " + "in DOUBLE. org.radarcns.monitor.test." + RECORD_NAME_MOCK + INVALID_TEXT), result.getReason()); - result = SchemaValidator.validateNotTimeReceived().apply(schema); + result = SchemaValidatorRole.validateNotTimeReceived().apply(schema); assertTrue(result.isValid()); schema = SchemaBuilder @@ -339,10 +340,10 @@ public void timeReceivedTest() { .requiredDouble("timeReceived") .endRecord(); - result = SchemaValidator.validateTimeReceived().apply(schema); + result = SchemaValidatorRole.validateTimeReceived().apply(schema); assertTrue(result.isValid()); - result = SchemaValidator.validateNotTimeReceived().apply(schema); + result = SchemaValidatorRole.validateNotTimeReceived().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("\"timeReceived\" is allow only in PASSIVE schemas. " + getFinalMessage(MONITOR_NAME_SPACE_MOCK, RECORD_NAME_MOCK)), @@ -361,7 +362,7 @@ public void fieldNameTest() { .requiredString(FIELD_NUMBER_MOCK + "value") .endRecord(); - result = SchemaValidator.validateFieldName().apply(schema); + result = SchemaValidatorRole.validateFieldName().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("Field name does not respect lowerCamelCase name convention. " + "It cannot contain any of the following values [value,Value]. " @@ -376,7 +377,7 @@ public void fieldNameTest() { .requiredString(FIELD_NUMBER_MOCK) .endRecord(); - result = SchemaValidator.validateFieldName().apply(schema); + result = SchemaValidatorRole.validateFieldName().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("Field name does not respect lowerCamelCase name convention. " + "It cannot contain any of the following values [value,Value]. " @@ -389,11 +390,11 @@ public void fieldNameTest() { .record(RECORD_NAME_MOCK) .fields() .requiredString(FIELD_NUMBER_MOCK) - .requiredString(SchemaValidator.TIME) + .requiredString(SchemaValidatorRole.TIME) .endRecord(); - result = SchemaValidator.validateFieldName( - Collections.singleton(SchemaValidator.TIME)).apply(schema); + result = SchemaValidatorRole.validateFieldName( + Collections.singleton(SchemaValidatorRole.TIME)).apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("Field name does not respect lowerCamelCase name convention. " + "It cannot contain any of the following values [value,Value]. " @@ -408,7 +409,7 @@ public void fieldNameTest() { .requiredDouble("timeReceived") .endRecord(); - result = SchemaValidator.validateFieldName().apply(schema); + result = SchemaValidatorRole.validateFieldName().apply(schema); assertTrue(result.isValid()); schema = SchemaBuilder @@ -416,10 +417,10 @@ public void fieldNameTest() { .record(RECORD_NAME_MOCK) .fields() .requiredString(FIELD_NUMBER_MOCK) - .requiredString(SchemaValidator.TIME) + .requiredString(SchemaValidatorRole.TIME) .endRecord(); - result = SchemaValidator.validateFieldName( + result = SchemaValidatorRole.validateFieldName( Collections.singleton(FIELD_NUMBER_MOCK)).apply(schema); assertTrue(result.isValid()); } @@ -435,7 +436,7 @@ public void filedDocumentationTest() { + "{\"name\": \"userId\", \"type\": \"string\" , \"doc\": \"Documentation\"}," + "{\"name\": \"sourceId\", \"type\": \"string\"} ]}"); - result = SchemaValidator.validateFieldDocumentation().apply(schema); + result = SchemaValidatorRole.validateFieldDocumentation().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("Documentation is mandatory for any schema and field. The " @@ -449,7 +450,7 @@ public void filedDocumentationTest() { + "\"type\": \"record\", \"name\": \"key\", \"type\": \"record\", \"fields\": [" + "{\"name\": \"userId\", \"type\": \"string\" , \"doc\": \"Documentation.\"}]}"); - result = SchemaValidator.validateFieldDocumentation().apply(schema); + result = SchemaValidatorRole.validateFieldDocumentation().apply(schema); assertTrue(result.isValid()); } @@ -464,7 +465,7 @@ public void schemaDocumentationTest() { .fields() .endRecord(); - result = SchemaValidator.validateSchemaDocumentation().apply(schema); + result = SchemaValidatorRole.validateSchemaDocumentation().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("Documentation is mandatory for any schema and field. The " @@ -482,7 +483,7 @@ public void schemaDocumentationTest() { .fields() .endRecord(); - result = SchemaValidator.validateSchemaDocumentation().apply(schema); + result = SchemaValidatorRole.validateSchemaDocumentation().apply(schema); assertTrue(result.isValid()); } @@ -500,7 +501,7 @@ public void enumerationSymbolTest() { .enumeration(enumName) .symbols(connected, "DISCONNECTED", unknown); - result = SchemaValidator.validateEnumeration().apply(schema); + result = SchemaValidatorRole.validateEnumeration().apply(schema); assertTrue(result.isValid()); @@ -509,7 +510,7 @@ public void enumerationSymbolTest() { + "[ {\"name\": \"serverStatus\", \"type\": {\"name\": \"ServerStatus\", \"type\": " + "\"enum\", \"symbols\": [\"CONNECTED\", \"NOT_CONNECTED\", \"UNKNOWN\"] } } ] }"); - result = SchemaValidator.validateEnumeration().apply(schema); + result = SchemaValidatorRole.validateEnumeration().apply(schema); assertTrue(result.isValid()); @@ -517,7 +518,7 @@ public void enumerationSymbolTest() { .enumeration(enumName) .symbols(connected, "disconnected", unknown); - result = SchemaValidator.validateEnumeration().apply(schema); + result = SchemaValidatorRole.validateEnumeration().apply(schema); String invalidMessage = "Enumerator items should be written in uppercase characters " + "separated by underscores. " @@ -530,7 +531,7 @@ public void enumerationSymbolTest() { .enumeration(enumName) .symbols(connected, "Not_Connected", unknown); - result = SchemaValidator.validateEnumeration().apply(schema); + result = SchemaValidatorRole.validateEnumeration().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of(invalidMessage), result.getReason()); @@ -539,7 +540,7 @@ public void enumerationSymbolTest() { .enumeration(enumName) .symbols(connected, "NotConnected", unknown); - result = SchemaValidator.validateEnumeration().apply(schema); + result = SchemaValidatorRole.validateEnumeration().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of(invalidMessage), result.getReason()); @@ -549,7 +550,7 @@ public void enumerationSymbolTest() { + "[ {\"name\": \"serverStatus\", \"type\": {\"name\": \"ServerStatus\", \"type\": " + "\"enum\", \"symbols\": [\"CONNECTED\", \"Not_Connected\", \"UNKNOWN\"] } } ] }"); - result = SchemaValidator.validateEnumeration().apply(schema); + result = SchemaValidatorRole.validateEnumeration().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of(invalidMessage), result.getReason()); @@ -559,7 +560,7 @@ public void enumerationSymbolTest() { + "[ {\"name\": \"serverStatus\", \"type\": {\"name\": \"ServerStatus\", \"type\": " + "\"enum\", \"symbols\": [\"Connected\", \"NotConnected\", \"UNKNOWN\"] } } ] }"); - result = SchemaValidator.validateEnumeration().apply(schema); + result = SchemaValidatorRole.validateEnumeration().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of(invalidMessage), result.getReason()); diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java new file mode 100644 index 00000000..1dcd5bb8 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java @@ -0,0 +1,46 @@ +package org.radarcns.validator.util; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; +import static org.radarcns.validator.util.SchemaValidator.getPath; + +import java.nio.file.Path; +import java.nio.file.Paths; +import org.junit.Test; + +/** + * TODO. + */ +public class SchemaValidatorTest { + + @Test + public void testGetPath() { + Path path = Paths.get("/Users/developer/Repositories/RADAR-Schemas/commons/" + + "monitor/application/application_external_time.avsc"); + + String expected = "/RADAR-Schemas/commons/monitor/application/" + + "application_external_time.avsc"; + + assertEquals(expected, getPath(path)); + } + + @Test + public void testCollision() { + //TODO + } +} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationResult.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationResult.java index a30dd70d..336558ef 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationResult.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationResult.java @@ -18,6 +18,9 @@ import java.util.Optional; +/** + * TODO. + */ public interface ValidationResult { static ValidationResult valid() { diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java index e4f16505..3a627f01 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java @@ -16,6 +16,7 @@ * limitations under the License. */ +import java.nio.file.Path; import java.util.LinkedList; import java.util.List; import java.util.Objects; @@ -23,6 +24,9 @@ import org.apache.avro.Schema; import org.apache.avro.Schema.Type; +/** + * TODO. + */ public final class ValidationSupport { static final ValidationResult VALID = new ValidationResult() { @@ -46,15 +50,16 @@ static ValidationResult getValid() { /** * TODO. - * @param fileName TODO + * @param path TODO * @return TODO */ - @SuppressWarnings("PMD.MissingBreakInSwitch") - public static String getRecordName(String fileName) { - Objects.requireNonNull(fileName); + public static String getRecordName(Path path) { + Objects.requireNonNull(path); String recordName = ""; + String fileName = path.getFileName().toString(); + boolean start = true; for (int i = 0; i < fileName.length(); i++) { switch (fileName.charAt(i)) { @@ -66,6 +71,7 @@ public static String getRecordName(String fileName) { recordName += start ? Character.toUpperCase(fileName.charAt(i)) : fileName.charAt(i); start = false; + break; } } From 41f8dfe9a74c4debb33b054e4ebb7d14cb82a5e1 Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Wed, 26 Jul 2017 16:31:16 +0100 Subject: [PATCH 019/112] Added collision test --- .../validator/util/SchemaValidator.java | 69 ++++++++++++++----- .../validator/util/SchemaValidatorRole.java | 2 +- .../util/SchemaValidatorRoleTest.java | 4 +- .../validator/util/SchemaValidatorTest.java | 41 ++++++++++- .../test/resources/key_measurement_test.avsc | 10 +++ .../src/test/resources/key_windowed_test.avsc | 11 +++ 6 files changed, 116 insertions(+), 21 deletions(-) create mode 100644 java-sdk/radar-schemas-validator/src/test/resources/key_measurement_test.avsc create mode 100644 java-sdk/radar-schemas-validator/src/test/resources/key_windowed_test.avsc diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java index f0921258..3ee2854e 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java @@ -16,6 +16,9 @@ * limitations under the License. */ +import static org.radarcns.validator.util.SchemaValidatorRole.TIME; +import static org.radarcns.validator.util.SchemaValidatorRole.TIME_COMPLETED; +import static org.radarcns.validator.util.SchemaValidatorRole.TIME_RECEIVED; import static org.radarcns.validator.util.SchemaValidatorRole.getActiveValidator; import static org.radarcns.validator.util.SchemaValidatorRole.getGeneralValidator; import static org.radarcns.validator.util.SchemaValidatorRole.getMonitorValidator; @@ -23,8 +26,9 @@ import java.io.IOException; import java.nio.file.Path; -import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; @@ -45,6 +49,14 @@ public final class SchemaValidator { private static final Map> COLLISIONS = new HashMap<>(); + private static final Set AVOID_COLLISION_CHECK = new HashSet<>(); + + static { + AVOID_COLLISION_CHECK.add(TIME); + AVOID_COLLISION_CHECK.add(TIME_COMPLETED); + AVOID_COLLISION_CHECK.add(TIME_RECEIVED); + } + private SchemaValidator() { //Static class } @@ -141,26 +153,38 @@ public static ValidationResult validate(Schema schema, Path pathToSchema, NameFo computeCollision(schema); - if (!result.isValid()) { - LOGGER.error("{} is invalid.", getPath(pathToSchema)); - } - return result; } + /** + * TODO. + * @param path TODO + * @return TODO + */ public static String getPath(Path path) { return path.toString().substring(path.toString().indexOf("/RADAR-Schemas/")); } + /** + * TODO. + * @param schema TODO. + */ private static void computeCollision(Schema schema) { if (!schema.getType().equals(Type.RECORD)) { return; } for (Field field : schema.getFields()) { + + if (AVOID_COLLISION_CHECK.contains(field.name())) { + continue; + } + List list = COLLISIONS.get(field.name()); - if (schema == null) { - COLLISIONS.put(field.name(), Collections.singletonList(schema)); + if (list == null) { + list = new LinkedList<>(); + list.add(schema); + COLLISIONS.put(field.name(), list); } else { list.add(schema); } @@ -170,19 +194,32 @@ private static void computeCollision(Schema schema) { /** * TODO. + * @return TODO */ - public static void analyseCollision() { + public static StringBuilder analyseCollision() { + int capacity = 100 * COLLISIONS.values().stream().mapToInt(List::size).sum() + + COLLISIONS.size() * 120 + 100; + + StringBuilder messageBuilder = new StringBuilder(capacity); COLLISIONS.entrySet().stream() .filter(entry -> entry.getValue().size() > 1) .forEach(entry -> { - String message = entry.getKey() + " appears in: \n"; - for (Schema schema : entry.getValue()) { - message += "\t - " + schema.getFullName() + " as " - + schema.getField( - entry.getKey()).schema().getType().getName().toUpperCase(); - } - - LOGGER.warn(message, entry.getKey()); + messageBuilder.append(entry.getKey().concat(" appears in:\n")); + entry.getValue().stream().forEach( + schema -> messageBuilder.append("\t - " + .concat(schema.getFullName()) + .concat(" as ") + .concat(schema.getField(entry.getKey()) + .schema() + .getType() + .getName() + .toUpperCase()) + .concat("\n"))); + + messageBuilder.append("In case they have different use-cases, please modify " + + "the name field accordingly.\n"); }); + + return messageBuilder; } } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java index 6067f226..256f58ba 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java @@ -85,7 +85,7 @@ enum Message { NAME_SPACE("Namespace cannot be null and must fully lowercase dot separated without " + "numeric. In this case the expected value is \""), RECORD_NAME("Record name must be the conversion of the .avsc file name in UpperCamelCase " - + "and name the device explicitly. The expected value is "), + + "and must explicitly contain the device name. The expected value is "), TIME_FIELD("Any schema representing collected data must have a \"" + TIME + "\" field formatted in " + Type.DOUBLE.getName().toUpperCase(Locale.ENGLISH) + "."), TIME_COMPLETED_FIELD("Any " + NameFolder.ACTIVE + " schema must have a \"" + TIME_COMPLETED diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java index d56debbf..5f775a46 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java @@ -201,8 +201,8 @@ public void recordNameTest() { assertFalse(result.isValid()); assertEquals(Optional.of("Record name must be the conversion of the .avsc file name in " - + "UpperCamelCase and name the device explicitly. The expected value is " - + "EmpaticaE4Acceleration\". org.radarcns.passive.empatica." + + "UpperCamelCase and must explicitly contain the device name. " + + "The expected value is EmpaticaE4Acceleration\". org.radarcns.passive.empatica." + fieldName + " is invalid."), result.getReason()); diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java index 1dcd5bb8..fe4b409a 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java @@ -17,10 +17,16 @@ */ import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.radarcns.validator.StructureValidator.NameFolder.KAFKA; +import static org.radarcns.validator.util.SchemaValidator.analyseCollision; import static org.radarcns.validator.util.SchemaValidator.getPath; +import static org.radarcns.validator.util.SchemaValidator.validate; +import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; +import org.apache.avro.Schema.Parser; import org.junit.Test; /** @@ -40,7 +46,38 @@ public void testGetPath() { } @Test - public void testCollision() { - //TODO + public void testCollision() throws IOException { + Parser parser = new Parser(); + + String folder = "key"; + String windowed = "key_windowed_test.avsc"; + String measurement = "key_measurement_test.avsc"; + + ValidationResult result = validate( + parser.parse(getClass().getClassLoader().getResourceAsStream(windowed)), + Paths.get("/Users/developer/Repositories/RADAR-Schemas/commons/kafka/key/" + + windowed), KAFKA, folder); + + assertTrue(result.isValid()); + + result = validate( + parser.parse(getClass().getClassLoader().getResourceAsStream(measurement)), + Paths.get("/Users/developer/Repositories/RADAR-Schemas/commons/kafka/key/" + + measurement), KAFKA, folder); + + assertTrue(result.isValid()); + + String expected = "userTestId appears in:\n" + + "\t - org.radarcns.kafka.key.KeyWindowedTest as STRING\n" + + "\t - org.radarcns.kafka.key.KeyMeasurementTest as STRING\n" + + "In case they have different use-cases, " + + "please modify the name field accordingly.\n" + + "sourceTestId appears in:\n" + + "\t - org.radarcns.kafka.key.KeyWindowedTest as STRING\n" + + "\t - org.radarcns.kafka.key.KeyMeasurementTest as STRING\n" + + "In case they have different use-cases, " + + "please modify the name field accordingly.\n"; + + assertEquals(expected, analyseCollision().toString()); } } diff --git a/java-sdk/radar-schemas-validator/src/test/resources/key_measurement_test.avsc b/java-sdk/radar-schemas-validator/src/test/resources/key_measurement_test.avsc new file mode 100644 index 00000000..9b6b0f09 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/test/resources/key_measurement_test.avsc @@ -0,0 +1,10 @@ +{ + "namespace": "org.radarcns.kafka.key", + "type": "record", + "name": "KeyMeasurementTest", + "doc": "Measurement key in the RADAR-CNS project.", + "fields": [ + {"name": "userTestId", "type": "string", "doc": "User Identifier created during the enrolment."}, + {"name": "sourceTestId", "type": "string", "doc": "Unique identifier associated with the source."} + ] +} diff --git a/java-sdk/radar-schemas-validator/src/test/resources/key_windowed_test.avsc b/java-sdk/radar-schemas-validator/src/test/resources/key_windowed_test.avsc new file mode 100644 index 00000000..5ae0e6a9 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/test/resources/key_windowed_test.avsc @@ -0,0 +1,11 @@ +{"namespace": "org.radarcns.kafka.key", + "type": "record", + "name": "KeyWindowedTest", + "doc": "Windowed key in the RADAR-CNS project", + "fields": [ + {"name": "userTestId", "type": "string", "doc": "User Identifier created during the enrolment."}, + {"name": "sourceTestId", "type": "string", "doc": "Unique identifier associated with the source."}, + {"name": "start", "type": "long", "doc": "First timestamp in UNIX time contained in the time window."}, + {"name": "end", "type": "long", "doc": "Last timestamp in UNIX time contained in the time window."} + ] +} From 933415a40c40a1f533dabf6bc15289e195a40533 Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Thu, 27 Jul 2017 12:59:26 +0100 Subject: [PATCH 020/112] Added default value check --- .../validator/util/SchemaValidator.java | 41 +--- .../validator/util/SchemaValidatorRole.java | 97 +++++++-- .../util/SchemaValidatorRoleTest.java | 198 +++++++++++++++--- .../validator/util/SchemaValidatorTest.java | 1 + .../validator/util/ValidationSupport.java | 74 +++++++ 5 files changed, 333 insertions(+), 78 deletions(-) diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java index 3ee2854e..fcf32762 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java @@ -20,7 +20,7 @@ import static org.radarcns.validator.util.SchemaValidatorRole.TIME_COMPLETED; import static org.radarcns.validator.util.SchemaValidatorRole.TIME_RECEIVED; import static org.radarcns.validator.util.SchemaValidatorRole.getActiveValidator; -import static org.radarcns.validator.util.SchemaValidatorRole.getGeneralValidator; +import static org.radarcns.validator.util.SchemaValidatorRole.getGeneralRecordValidator; import static org.radarcns.validator.util.SchemaValidatorRole.getMonitorValidator; import static org.radarcns.validator.util.SchemaValidatorRole.getPassiveValidator; @@ -72,39 +72,8 @@ private SchemaValidator() { */ public static ValidationResult validate(Schema schema, Path pathToSchema, NameFolder root, String subfolder) { - Objects.requireNonNull(schema); - Objects.requireNonNull(pathToSchema); - Objects.requireNonNull(root); - Objects.requireNonNull(subfolder); - - ValidationResult result; - - switch (root) { - case ACTIVE: - result = getActiveValidator(pathToSchema, root, subfolder).apply(schema); - break; - case MONITOR: - result = getMonitorValidator(pathToSchema, root, subfolder).apply(schema); - break; - case KAFKA: - result = getGeneralValidator(pathToSchema, root, subfolder).apply(schema); - break; - case PASSIVE: - result = getPassiveValidator(pathToSchema, root, subfolder).apply(schema); - break; - default: - LOGGER.warn("Applying general validation to {}", getPath(pathToSchema)); - result = getGeneralValidator(pathToSchema, root, subfolder).apply(schema); - break; - } - - computeCollision(schema); - - if (!result.isValid()) { - LOGGER.error("{} is invalid.", getPath(pathToSchema)); - } - - return result; + return validate(schema, pathToSchema, root, subfolder, + null, null); } /** @@ -137,7 +106,7 @@ public static ValidationResult validate(Schema schema, Path pathToSchema, NameFo skipFieldName).apply(schema); break; case KAFKA: - result = getGeneralValidator(pathToSchema, root, subfolder, skipRecordName, + result = getGeneralRecordValidator(pathToSchema, root, subfolder, skipRecordName, skipFieldName).apply(schema); break; case PASSIVE: @@ -146,7 +115,7 @@ public static ValidationResult validate(Schema schema, Path pathToSchema, NameFo break; default: LOGGER.warn("Applying general validation to {}", getPath(pathToSchema)); - result = getGeneralValidator(pathToSchema, root, subfolder, skipRecordName, + result = getGeneralRecordValidator(pathToSchema, root, subfolder, skipRecordName, skipFieldName).apply(schema); break; } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java index 256f58ba..81703df5 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java @@ -1,7 +1,9 @@ package org.radarcns.validator.util; +import static org.radarcns.validator.util.SchemaValidatorRole.Message.DEFAULT_VALUE; import static org.radarcns.validator.util.SchemaValidatorRole.Message.DOC; import static org.radarcns.validator.util.SchemaValidatorRole.Message.ENUMERATION_SYMBOL; +import static org.radarcns.validator.util.SchemaValidatorRole.Message.ENUMERATION_UNKNOWN_SYMBOL; import static org.radarcns.validator.util.SchemaValidatorRole.Message.FIELDS; import static org.radarcns.validator.util.SchemaValidatorRole.Message.FILED_NAME; import static org.radarcns.validator.util.SchemaValidatorRole.Message.NOT_TIME_COMPLETED_FIELD; @@ -55,6 +57,8 @@ interface SchemaValidatorRole extends Function { String TIME_RECEIVED = "timeReceived"; String TIME_COMPLETED = "timeCompleted"; + String UNKNOWN = "UNKNOWN"; + String NAMESPACE_REGEX = "^[a-z][a-z.]*$"; String RECORD_NAME_REGEX = "(^[A-Z][a-z]+)|(^[A-Z][a-z0-9]+[A-Z]$)" @@ -67,7 +71,9 @@ interface SchemaValidatorRole extends Function { /** Field names cannot contain the following values. */ enum FieldNameNotAllowed { LOWER_VALUE("value"), - UPPERD_VALUE("Value"); + UPPER_VALUE("Value"), + LOWER_VAL("val"), + UPPER_VAL("Val"); private final String name; @@ -108,7 +114,14 @@ enum Message { + "and acronyms in the documentation should be written out. The sentence must be ended " + "by a point. Please add \"doc\" property."), ENUMERATION_SYMBOL("Enumerator items should be written in uppercase characters separated " - + "by underscores."); + + "by underscores."), + ENUMERATION_UNKNOWN_SYMBOL("Enumerator must contain the \"" + UNKNOWN + "\" symbol. It is " + + "useful to specify default value for a field using type equals to \"enum\"."), + DEFAULT_VALUE("Any NULLABLE Avro field must specify a default value. The allowed default " + + "values are: \"UNKNOWN\" for ENUMERATION, \"MIN_VALUE\" or \"MAX_VALUE\" " + + "for nullable int and long, \"NaN\" for nullable float and double, \"true\" or " + + "\"false\" for nullable boolean, \"byte[]\" or \"null\" for bytes, and \"null\" " + + "for all the other cases."); private final String message; @@ -227,7 +240,7 @@ static SchemaValidatorRole validateFieldDocumentation() { * TODO. * @return TODO */ - static SchemaValidatorRole validateEnumeration() { + static SchemaValidatorRole validateEnumerationSymbols() { return validate(schema -> extractEnumerationFields(schema).stream() .allMatch(symbol -> symbol.matches( @@ -235,6 +248,14 @@ static SchemaValidatorRole validateEnumeration() { ENUMERATION_SYMBOL); } + /** + * TODO. + * @return TODO + */ + static SchemaValidatorRole validateDefault() { + return validate(schema -> ValidationSupport.validateDefault(schema), DEFAULT_VALUE); + } + /** * TODO. * @return TODO @@ -282,6 +303,15 @@ static SchemaValidatorRole validateNotTimeReceived() { NOT_TIME_RECEIVED_FIELD); } + /** + * TODO. + * @return TODO + */ + static SchemaValidatorRole validateUnknownSymbol() { + return validate(schema -> extractEnumerationFields(schema).contains(UNKNOWN), + ENUMERATION_UNKNOWN_SYMBOL); + } + /** * TODO. * @param predicate TODO @@ -311,7 +341,7 @@ default SchemaValidatorRole and(SchemaValidatorRole other) { * @param subfolder TODO * @return TODO */ - static SchemaValidatorRole getGeneralValidator(Path pathToSchema, NameFolder root, + static SchemaValidatorRole getGeneralRecordValidator(Path pathToSchema, NameFolder root, String subfolder) { return validateNameSpace(root, subfolder) .and(validateRecordName(pathToSchema)) @@ -319,7 +349,7 @@ static SchemaValidatorRole getGeneralValidator(Path pathToSchema, NameFolder roo .and(validateFields()) .and(validateFieldName()) .and(validateFieldDocumentation()) - .and(validateEnumeration()); + .and(validateEnumerationSymbols()); } /** @@ -331,7 +361,7 @@ static SchemaValidatorRole getGeneralValidator(Path pathToSchema, NameFolder roo * @param skipFieldName TODO * @return TODO */ - static SchemaValidatorRole getGeneralValidator(Path pathToSchema, NameFolder root, + static SchemaValidatorRole getGeneralRecordValidator(Path pathToSchema, NameFolder root, String subfolder, Set skipRecordName, Set skipFieldName) { return validateNameSpace(root, subfolder) .and(validateRecordName(pathToSchema, skipRecordName)) @@ -339,7 +369,7 @@ static SchemaValidatorRole getGeneralValidator(Path pathToSchema, NameFolder roo .and(validateFields()) .and(validateFieldName(skipFieldName)) .and(validateFieldDocumentation()) - .and(validateEnumeration()); + .and(validateEnumerationSymbols()); } /** @@ -351,7 +381,7 @@ static SchemaValidatorRole getGeneralValidator(Path pathToSchema, NameFolder roo */ static SchemaValidatorRole getActiveValidator(Path pathToSchema, NameFolder root, String subfolder) { - return getGeneralValidator(pathToSchema, root, subfolder) + return getGeneralRecordValidator(pathToSchema, root, subfolder) .and(validateTime()) .and(validateTimeCompleted()) .and(validateNotTimeReceived()); @@ -368,7 +398,8 @@ static SchemaValidatorRole getActiveValidator(Path pathToSchema, NameFolder root */ static SchemaValidatorRole getActiveValidator(Path pathToSchema, NameFolder root, String subfolder, Set skipRecordName, Set skipFieldName) { - return getGeneralValidator(pathToSchema, root, subfolder, skipRecordName, skipFieldName) + return getGeneralRecordValidator(pathToSchema, root, subfolder, skipRecordName, + skipFieldName) .and(validateTime()) .and(validateTimeCompleted()) .and(validateNotTimeReceived()); @@ -383,7 +414,7 @@ static SchemaValidatorRole getActiveValidator(Path pathToSchema, NameFolder root */ static SchemaValidatorRole getMonitorValidator(Path pathToSchema, NameFolder root, String subfolder) { - return getGeneralValidator(pathToSchema, root, subfolder) + return getGeneralRecordValidator(pathToSchema, root, subfolder) .and(validateTime()); } @@ -398,8 +429,9 @@ static SchemaValidatorRole getMonitorValidator(Path pathToSchema, NameFolder roo */ static SchemaValidatorRole getMonitorValidator(Path pathToSchema, NameFolder root, String subfolder, Set skipRecordName, Set skipFieldName) { - return getGeneralValidator(pathToSchema, root, subfolder, skipRecordName, skipFieldName) - .and(validateTime()); + return getGeneralRecordValidator(pathToSchema, root, subfolder, skipRecordName, + skipFieldName) + .and(validateTime()); } /** @@ -411,7 +443,7 @@ static SchemaValidatorRole getMonitorValidator(Path pathToSchema, NameFolder roo */ static SchemaValidatorRole getPassiveValidator(Path pathToSchema, NameFolder root, String subfolder) { - return getGeneralValidator(pathToSchema, root, subfolder) + return getGeneralRecordValidator(pathToSchema, root, subfolder) .and(validateTime()) .and(validateTimeReceived()) .and(validateNotTimeCompleted()); @@ -428,10 +460,47 @@ static SchemaValidatorRole getPassiveValidator(Path pathToSchema, NameFolder roo */ static SchemaValidatorRole getPassiveValidator(Path pathToSchema, NameFolder root, String subfolder, Set skipRecordName, Set skipFieldName) { - return getGeneralValidator(pathToSchema, root, subfolder, skipRecordName, skipFieldName) + return getGeneralRecordValidator(pathToSchema, root, subfolder, skipRecordName, + skipFieldName) .and(validateTime()) .and(validateTimeReceived()) .and(validateNotTimeCompleted()); } + /** + * TODO. + * @param pathToSchema TODO + * @param root TODO + * @param subfolder TODO + * @return TODO + */ + static SchemaValidatorRole getGeneralEnumValidator(Path pathToSchema, NameFolder root, + String subfolder) { + return validateNameSpace(root, subfolder) + .and(validateRecordName(pathToSchema)) + .and(validateSchemaDocumentation()) + .and(validateFields()) + .and(validateEnumerationSymbols()) + .and(validateUnknownSymbol()); + } + + /** + * TODO. + * @param pathToSchema TODO + * @param root TODO + * @param subfolder TODO + * @param skipRecordName TODO + * @return TODO + */ + static SchemaValidatorRole getGeneralEnumValidator(Path pathToSchema, NameFolder root, + String subfolder, Set skipRecordName) { + return validateNameSpace(root, subfolder) + .and(validateRecordName(pathToSchema, skipRecordName)) + .and(validateSchemaDocumentation()) + .and(validateFields()) + .and(validateEnumerationSymbols()) + .and(validateUnknownSymbol()); + + } + } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java index 5f775a46..a4882fb4 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java @@ -364,9 +364,12 @@ public void fieldNameTest() { result = SchemaValidatorRole.validateFieldName().apply(schema); assertFalse(result.isValid()); - assertEquals(Optional.of("Field name does not respect lowerCamelCase name convention. " - + "It cannot contain any of the following values [value,Value]. " - + "Please avoid abbreviations and write out the field name instead. " + + String message = "Field name does not respect lowerCamelCase name convention. " + + "It cannot contain any of the following values [value,Value,val,Val]. " + + "Please avoid abbreviations and write out the field name instead. "; + + assertEquals(Optional.of(message + getFinalMessage(MONITOR_NAME_SPACE_MOCK, RECORD_NAME_MOCK)), result.getReason()); @@ -379,9 +382,7 @@ public void fieldNameTest() { result = SchemaValidatorRole.validateFieldName().apply(schema); assertFalse(result.isValid()); - assertEquals(Optional.of("Field name does not respect lowerCamelCase name convention. " - + "It cannot contain any of the following values [value,Value]. " - + "Please avoid abbreviations and write out the field name instead. " + assertEquals(Optional.of(message + getFinalMessage(MONITOR_NAME_SPACE_MOCK, RECORD_NAME_MOCK)), result.getReason()); @@ -396,9 +397,7 @@ public void fieldNameTest() { result = SchemaValidatorRole.validateFieldName( Collections.singleton(SchemaValidatorRole.TIME)).apply(schema); assertFalse(result.isValid()); - assertEquals(Optional.of("Field name does not respect lowerCamelCase name convention. " - + "It cannot contain any of the following values [value,Value]. " - + "Please avoid abbreviations and write out the field name instead. " + assertEquals(Optional.of(message + getFinalMessage(MONITOR_NAME_SPACE_MOCK,RECORD_NAME_MOCK)), result.getReason()); @@ -501,16 +500,21 @@ public void enumerationSymbolTest() { .enumeration(enumName) .symbols(connected, "DISCONNECTED", unknown); - result = SchemaValidatorRole.validateEnumeration().apply(schema); + result = SchemaValidatorRole.validateEnumerationSymbols().apply(schema); assertTrue(result.isValid()); - schema = new Parser().parse("{\"namespace\": \"org.radarcns.monitor.application\", " - + "\"type\": \"record\", \"name\": \"ApplicationServerStatus\", \"fields\": " - + "[ {\"name\": \"serverStatus\", \"type\": {\"name\": \"ServerStatus\", \"type\": " - + "\"enum\", \"symbols\": [\"CONNECTED\", \"NOT_CONNECTED\", \"UNKNOWN\"] } } ] }"); + String schemaTxtInit = "{\"namespace\": \"org.radarcns.monitor.application\", " + + "\"type\": \"record\", \"name\": \"ApplicationServerStatus\", \"fields\": " + + "[ {\"name\": \"serverStatus\", \"type\": {\"name\": \"ServerStatus\", \"type\": " + + "\"enum\", \"symbols\": ["; + + String schemaTxtEnd = "] } } ] }"; - result = SchemaValidatorRole.validateEnumeration().apply(schema); + schema = new Parser().parse(schemaTxtInit.concat( + "\"CONNECTED\", \"NOT_CONNECTED\", \"UNKNOWN\"".concat(schemaTxtEnd))); + + result = SchemaValidatorRole.validateEnumerationSymbols().apply(schema); assertTrue(result.isValid()); @@ -518,7 +522,7 @@ public void enumerationSymbolTest() { .enumeration(enumName) .symbols(connected, "disconnected", unknown); - result = SchemaValidatorRole.validateEnumeration().apply(schema); + result = SchemaValidatorRole.validateEnumerationSymbols().apply(schema); String invalidMessage = "Enumerator items should be written in uppercase characters " + "separated by underscores. " @@ -531,7 +535,7 @@ public void enumerationSymbolTest() { .enumeration(enumName) .symbols(connected, "Not_Connected", unknown); - result = SchemaValidatorRole.validateEnumeration().apply(schema); + result = SchemaValidatorRole.validateEnumerationSymbols().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of(invalidMessage), result.getReason()); @@ -540,27 +544,165 @@ public void enumerationSymbolTest() { .enumeration(enumName) .symbols(connected, "NotConnected", unknown); - result = SchemaValidatorRole.validateEnumeration().apply(schema); + result = SchemaValidatorRole.validateEnumerationSymbols().apply(schema); + + assertFalse(result.isValid()); + assertEquals(Optional.of(invalidMessage), result.getReason()); + + schema = new Parser().parse(schemaTxtInit.concat( + "\"CONNECTED\", \"Not_Connected\", \"UNKNOWN\"".concat(schemaTxtEnd))); + + result = SchemaValidatorRole.validateEnumerationSymbols().apply(schema); + + assertFalse(result.isValid()); + assertEquals(Optional.of(invalidMessage), result.getReason()); + + schema = new Parser().parse(schemaTxtInit.concat( + "\"Connected\", \"NotConnected\", \"UNKNOWN\"".concat(schemaTxtEnd))); + + result = SchemaValidatorRole.validateEnumerationSymbols().apply(schema); + + assertFalse(result.isValid()); + assertEquals(Optional.of(invalidMessage), result.getReason()); + } + + @Test + public void unknownSymbolTest() { + Schema schema; + ValidationResult result; + + schema = SchemaBuilder.enumeration("org.radarcns.test.EnumeratorTest") + .symbols("TEST", "UNKNOWN"); + + result = SchemaValidatorRole.validateUnknownSymbol().apply(schema); + + assertTrue(result.isValid()); + + schema = SchemaBuilder.enumeration("org.radarcns.test.EnumeratorTest") + .symbols("TEST", "UN_KNOWN"); + + result = SchemaValidatorRole.validateUnknownSymbol().apply(schema); + + assertFalse(result.isValid()); + assertEquals(Optional.of("Enumerator must contain the \"UNKNOWN\" symbol. It is " + + "useful to specify default value for a field using type equals to \"enum\". " + + "org.radarcns.test.EnumeratorTest is invalid."), + result.getReason()); + } + + @Test(expected = IllegalArgumentException.class) + public void defaultValueExceptionTest() { + SchemaValidatorRole.validateDefault().apply( + SchemaBuilder.enumeration("org.radarcns.test.EnumeratorTest") + .symbols("TEST", "UNKNOWN")); + } + + @Test + @SuppressWarnings("PMD.ExcessiveMethodLength") + public void defaultValueTest() { + String namespace = "org.radarcns.test"; + String recordName = "TestRecord"; + + Schema schema; + ValidationResult result; + + schema = SchemaBuilder + .builder(namespace) + .record(recordName) + .fields() + .nullableDouble("nullableDouble", Double.NaN) + .nullableFloat("nullableFloat", Float.NaN) + .nullableInt("nullableIntMin", Integer.MIN_VALUE) + .nullableInt("nullableIntMax", Integer.MAX_VALUE) + .nullableLong("nullableLongMin", Long.MIN_VALUE) + .nullableLong("nullableLongMax", Long.MAX_VALUE) + .nullableString("nullableString", null) + .nullableBoolean("nullableBoolean", false) //check with text schema + .nullableBytes("nullableBytes", new byte[1]) //check with text schema + .endRecord(); + + result = SchemaValidatorRole.validateDefault().apply(schema); + + assertTrue(result.isValid()); + + String scemaTxtInit = "{\"namespace\": \"org.radarcns.test\", " + + "\"type\": \"record\", \"name\": \"TestRecord\", \"fields\": "; + + schema = new Parser().parse(scemaTxtInit + + "[ {\"name\": \"nullableBytes\", \"type\": [ \"null\", \"bytes\"], " + + "\"default\": \"null\" } ] }"); + + result = SchemaValidatorRole.validateDefault().apply(schema); + + assertTrue(result.isValid()); + + schema = SchemaBuilder + .builder(namespace) + .record(recordName) + .fields() + .nullableDouble("nullableDouble", -1) + .endRecord(); + + result = SchemaValidatorRole.validateDefault().apply(schema); + + String invalidMessage = "Any NULLABLE Avro field must specify a default value. " + + "The allowed default values are: \"UNKNOWN\" for ENUMERATION, \"MIN_VALUE\" or " + + "\"MAX_VALUE\" for nullable int and long, \"NaN\" for nullable float and double, " + + "\"true\" or \"false\" for nullable boolean, \"byte[]\" or \"null\" for bytes, " + + "and \"null\" for all the other cases. org.radarcns.test.TestRecord" + + " is invalid."; assertFalse(result.isValid()); assertEquals(Optional.of(invalidMessage), result.getReason()); - schema = new Parser().parse("{\"namespace\": \"org.radarcns.monitor.application\", " - + "\"type\": \"record\", \"name\": \"ApplicationServerStatus\", \"fields\": " - + "[ {\"name\": \"serverStatus\", \"type\": {\"name\": \"ServerStatus\", \"type\": " - + "\"enum\", \"symbols\": [\"CONNECTED\", \"Not_Connected\", \"UNKNOWN\"] } } ] }"); + schema = SchemaBuilder + .builder(namespace) + .record(recordName) + .fields() + .nullableInt("nullableInt", -1) + .endRecord(); + + result = SchemaValidatorRole.validateDefault().apply(schema); + + assertFalse(result.isValid()); + assertEquals(Optional.of(invalidMessage), result.getReason()); + + schema = SchemaBuilder + .builder(namespace) + .record(recordName) + .fields() + .nullableLong("nullableLong", -1) + .endRecord(); + + result = SchemaValidatorRole.validateDefault().apply(schema); + + assertFalse(result.isValid()); + assertEquals(Optional.of(invalidMessage), result.getReason()); + + schema = new Parser().parse(scemaTxtInit + + "[ {\"name\": \"serverStatus\", \"type\": {\"name\": \"ServerStatus\", \"type\": " + + "\"enum\", \"symbols\": [\"Connected\", \"NotConnected\", \"UNKNOWN\"] }, " + + "\"default\": \"UNKNOWN\" } ] }"); + + result = SchemaValidatorRole.validateDefault().apply(schema); + + assertTrue(result.isValid()); + + schema = new Parser().parse(scemaTxtInit + + "[ {\"name\": \"serverStatus\", \"type\": {\"name\": \"ServerStatus\", \"type\": " + + "\"enum\", \"symbols\": [\"Connected\", \"NotConnected\", \"UNKNOWN\"] }, " + + "\"default\": \"null\" } ] }"); - result = SchemaValidatorRole.validateEnumeration().apply(schema); + result = SchemaValidatorRole.validateDefault().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of(invalidMessage), result.getReason()); - schema = new Parser().parse("{\"namespace\": \"org.radarcns.monitor.application\", " - + "\"type\": \"record\", \"name\": \"ApplicationServerStatus\", \"fields\": " - + "[ {\"name\": \"serverStatus\", \"type\": {\"name\": \"ServerStatus\", \"type\": " - + "\"enum\", \"symbols\": [\"Connected\", \"NotConnected\", \"UNKNOWN\"] } } ] }"); + schema = new Parser().parse(scemaTxtInit + + "[ {\"name\": \"nullableBoolean\", \"type\": [ \"null\", \"boolean\"], " + + "\"default\": \"null\" } ] }"); - result = SchemaValidatorRole.validateEnumeration().apply(schema); + result = SchemaValidatorRole.validateDefault().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of(invalidMessage), result.getReason()); diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java index fe4b409a..95aa8a4d 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java @@ -80,4 +80,5 @@ public void testCollision() throws IOException { assertEquals(expected, analyseCollision().toString()); } + } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java index 3a627f01..fe26c973 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java @@ -16,12 +16,17 @@ * limitations under the License. */ +import static java.util.stream.Collectors.toList; +import static org.radarcns.validator.util.SchemaValidatorRole.UNKNOWN; + import java.nio.file.Path; import java.util.LinkedList; import java.util.List; import java.util.Objects; import java.util.Optional; +import org.apache.avro.JsonProperties; import org.apache.avro.Schema; +import org.apache.avro.Schema.Field; import org.apache.avro.Schema.Type; /** @@ -97,4 +102,73 @@ public static List extractEnumerationFields(Schema root) { return symbols; } + /** + * TODO. + * @param input TODO + * @return TODO + * @throws IllegalArgumentException TODO + */ + public static boolean validateDefault(Schema input) { + if (!input.getType().equals(Type.RECORD)) { + throw new IllegalArgumentException("Function can be applied only to avro RECORD."); + } + + boolean flag = true; + + for (Field field : input.getFields()) { + switch (field.schema().getType()) { + case RECORD: + flag = flag && validateDefault(field.schema()); + break; + case UNION: + List types = field.schema().getTypes().stream() + .filter(schema -> !schema.getType().equals(Type.NULL)) + .map(schema -> schema.getType()).collect(toList()); + if (types.size() > 1) { + flag = flag && field.defaultVal().equals(JsonProperties.NULL_VALUE); + } else { + flag = flag && basicValidateDefault(field.defaultVal(), types.get(0)); + } + break; + case ENUM: + flag = flag && field.schema().getEnumSymbols().contains(UNKNOWN) + && field.defaultVal().equals(UNKNOWN); + break; + default: break; + } + + if (!flag) { + return flag; + } + } + + return flag; + } + + /** + * TODO. + * @param defaultVal TODO + * @param type TODO + * @return TODO + */ + private static boolean basicValidateDefault(Object defaultVal, Type type) { + switch (type) { + case INT: + return defaultVal.equals(Integer.MIN_VALUE) || defaultVal.equals(Integer.MAX_VALUE); + case LONG: + return defaultVal.equals(Long.MIN_VALUE) || defaultVal.equals(Long.MAX_VALUE); + case DOUBLE: + return defaultVal.equals("NaN"); + case FLOAT: + return defaultVal.equals("NaN"); + case BOOLEAN: + return defaultVal instanceof Boolean; + case BYTES: + //TODO check if there is better way + return defaultVal instanceof String; + default: + return defaultVal.equals(JsonProperties.NULL_VALUE); + } + } + } From 5408d7ec69cbb80aba42cf387828e02cb190699e Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Thu, 27 Jul 2017 14:15:05 +0100 Subject: [PATCH 021/112] Relaxed default validation --- .../validator/util/SchemaValidator.java | 44 +++++---- .../validator/util/SchemaValidatorRole.java | 16 +++- .../util/SchemaValidatorRoleTest.java | 91 ++++++++++++------- .../validator/util/SchemaValidatorTest.java | 33 +++++++ .../validator/util/ValidationSupport.java | 16 +--- 5 files changed, 135 insertions(+), 65 deletions(-) diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java index fcf32762..df31cd59 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java @@ -20,6 +20,7 @@ import static org.radarcns.validator.util.SchemaValidatorRole.TIME_COMPLETED; import static org.radarcns.validator.util.SchemaValidatorRole.TIME_RECEIVED; import static org.radarcns.validator.util.SchemaValidatorRole.getActiveValidator; +import static org.radarcns.validator.util.SchemaValidatorRole.getGeneralEnumValidator; import static org.radarcns.validator.util.SchemaValidatorRole.getGeneralRecordValidator; import static org.radarcns.validator.util.SchemaValidatorRole.getMonitorValidator; import static org.radarcns.validator.util.SchemaValidatorRole.getPassiveValidator; @@ -96,28 +97,33 @@ public static ValidationResult validate(Schema schema, Path pathToSchema, NameFo ValidationResult result; - switch (root) { - case ACTIVE: - result = getActiveValidator(pathToSchema, root, subfolder, skipRecordName, + if (schema.getType().equals(Type.ENUM)) { + result = getGeneralEnumValidator(pathToSchema, root, subfolder, + skipRecordName).apply(schema); + } else { + switch (root) { + case ACTIVE: + result = getActiveValidator(pathToSchema, root, subfolder, skipRecordName, skipFieldName).apply(schema); - break; - case MONITOR: - result = getMonitorValidator(pathToSchema, root, subfolder, skipRecordName, + break; + case MONITOR: + result = getMonitorValidator(pathToSchema, root, subfolder, skipRecordName, skipFieldName).apply(schema); - break; - case KAFKA: - result = getGeneralRecordValidator(pathToSchema, root, subfolder, skipRecordName, + break; + case KAFKA: + result = getGeneralRecordValidator(pathToSchema, root, subfolder, + skipRecordName, skipFieldName).apply(schema); + break; + case PASSIVE: + result = getPassiveValidator(pathToSchema, root, subfolder, skipRecordName, skipFieldName).apply(schema); - break; - case PASSIVE: - result = getPassiveValidator(pathToSchema, root, subfolder, skipRecordName, - skipFieldName).apply(schema); - break; - default: - LOGGER.warn("Applying general validation to {}", getPath(pathToSchema)); - result = getGeneralRecordValidator(pathToSchema, root, subfolder, skipRecordName, - skipFieldName).apply(schema); - break; + break; + default: + LOGGER.warn("Applying general validation to {}", getPath(pathToSchema)); + result = getGeneralRecordValidator(pathToSchema, root, subfolder, + skipRecordName, skipFieldName).apply(schema); + break; + } } computeCollision(schema); diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java index 81703df5..69ad78a4 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java @@ -9,6 +9,7 @@ import static org.radarcns.validator.util.SchemaValidatorRole.Message.NOT_TIME_COMPLETED_FIELD; import static org.radarcns.validator.util.SchemaValidatorRole.Message.NOT_TIME_RECEIVED_FIELD; import static org.radarcns.validator.util.SchemaValidatorRole.Message.RECORD_NAME; +import static org.radarcns.validator.util.SchemaValidatorRole.Message.SYMBOLS; import static org.radarcns.validator.util.SchemaValidatorRole.Message.TIME_COMPLETED_FIELD; import static org.radarcns.validator.util.SchemaValidatorRole.Message.TIME_FIELD; import static org.radarcns.validator.util.SchemaValidatorRole.Message.TIME_RECEIVED_FIELD; @@ -49,6 +50,8 @@ /** * TODO. */ +@SuppressWarnings("PMD.GodClass") +//TODO split in record and enumerator. interface SchemaValidatorRole extends Function { String NAME_SPACE = "org.radarcns"; @@ -113,6 +116,7 @@ enum Message { + "what is being measured, how, and what units or ranges are applicable. Abbreviations " + "and acronyms in the documentation should be written out. The sentence must be ended " + "by a point. Please add \"doc\" property."), + SYMBOLS("Avro Enumerator must have symbol list."), ENUMERATION_SYMBOL("Enumerator items should be written in uppercase characters separated " + "by underscores."), ENUMERATION_UNKNOWN_SYMBOL("Enumerator must contain the \"" + UNKNOWN + "\" symbol. It is " @@ -236,6 +240,14 @@ static SchemaValidatorRole validateFieldDocumentation() { DOC); } + /** + * TODO. + * @return TODO + */ + static SchemaValidatorRole validateSymbols() { + return validate(schema -> !schema.getEnumSymbols().isEmpty(), SYMBOLS); + } + /** * TODO. * @return TODO @@ -479,7 +491,7 @@ static SchemaValidatorRole getGeneralEnumValidator(Path pathToSchema, NameFolder return validateNameSpace(root, subfolder) .and(validateRecordName(pathToSchema)) .and(validateSchemaDocumentation()) - .and(validateFields()) + .and(validateSymbols()) .and(validateEnumerationSymbols()) .and(validateUnknownSymbol()); } @@ -497,7 +509,7 @@ static SchemaValidatorRole getGeneralEnumValidator(Path pathToSchema, NameFolder return validateNameSpace(root, subfolder) .and(validateRecordName(pathToSchema, skipRecordName)) .and(validateSchemaDocumentation()) - .and(validateFields()) + .and(validateSymbols()) .and(validateEnumerationSymbols()) .and(validateUnknownSymbol()); diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java index a4882fb4..d08cffce 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java @@ -35,10 +35,15 @@ import org.apache.avro.SchemaBuilder; import org.junit.Test; +/** + * TODO. + */ public class SchemaValidatorRoleTest { private static final String ACTIVE_NAME_SPACE_MOCK = "org.radarcns.active.test"; private static final String MONITOR_NAME_SPACE_MOCK = "org.radarcns.monitor.test"; + private static final String ENUMERATOR_NAME_SPACE_MOCK = "org.radarcns.test.EnumeratorTest"; + private static final String UNKNOWN_MOCK = "UNKNOWN"; private static final String RECORD_NAME_MOCK = "RecordName"; private static final String FIELD_NUMBER_MOCK = "Field1"; @@ -203,7 +208,7 @@ public void recordNameTest() { assertEquals(Optional.of("Record name must be the conversion of the .avsc file name in " + "UpperCamelCase and must explicitly contain the device name. " + "The expected value is EmpaticaE4Acceleration\". org.radarcns.passive.empatica." - + fieldName + " is invalid."), + + fieldName + INVALID_TEXT), result.getReason()); result = SchemaValidatorRole.validateRecordName(filePath, @@ -487,6 +492,27 @@ public void schemaDocumentationTest() { assertTrue(result.isValid()); } + @Test + public void enumerationSymbolsTest() { + Schema schema; + ValidationResult result; + + schema = SchemaBuilder.enumeration(ENUMERATOR_NAME_SPACE_MOCK) + .symbols("TEST", UNKNOWN_MOCK); + + result = SchemaValidatorRole.validateSymbols().apply(schema); + + assertTrue(result.isValid()); + + schema = SchemaBuilder.enumeration(ENUMERATOR_NAME_SPACE_MOCK).symbols(); + + result = SchemaValidatorRole.validateSymbols().apply(schema); + + assertFalse(result.isValid()); + assertEquals(Optional.of("Avro Enumerator must have symbol list. " + + ENUMERATOR_NAME_SPACE_MOCK + INVALID_TEXT), result.getReason()); + } + @Test public void enumerationSymbolTest() { Schema schema; @@ -494,11 +520,10 @@ public void enumerationSymbolTest() { String enumName = "org.radarcns.monitor.application.ApplicationServerStatus"; String connected = "CONNECTED"; - String unknown = "UNKNOWN"; schema = SchemaBuilder .enumeration(enumName) - .symbols(connected, "DISCONNECTED", unknown); + .symbols(connected, "DISCONNECTED", UNKNOWN_MOCK); result = SchemaValidatorRole.validateEnumerationSymbols().apply(schema); @@ -512,7 +537,7 @@ public void enumerationSymbolTest() { String schemaTxtEnd = "] } } ] }"; schema = new Parser().parse(schemaTxtInit.concat( - "\"CONNECTED\", \"NOT_CONNECTED\", \"UNKNOWN\"".concat(schemaTxtEnd))); + "\"CONNECTED\", \"NOT_CONNECTED\", \"" + UNKNOWN_MOCK + "\"".concat(schemaTxtEnd))); result = SchemaValidatorRole.validateEnumerationSymbols().apply(schema); @@ -520,7 +545,7 @@ public void enumerationSymbolTest() { schema = SchemaBuilder .enumeration(enumName) - .symbols(connected, "disconnected", unknown); + .symbols(connected, "disconnected", UNKNOWN_MOCK); result = SchemaValidatorRole.validateEnumerationSymbols().apply(schema); @@ -533,7 +558,7 @@ public void enumerationSymbolTest() { schema = SchemaBuilder .enumeration(enumName) - .symbols(connected, "Not_Connected", unknown); + .symbols(connected, "Not_Connected", UNKNOWN_MOCK); result = SchemaValidatorRole.validateEnumerationSymbols().apply(schema); @@ -542,7 +567,7 @@ public void enumerationSymbolTest() { schema = SchemaBuilder .enumeration(enumName) - .symbols(connected, "NotConnected", unknown); + .symbols(connected, "NotConnected", UNKNOWN_MOCK); result = SchemaValidatorRole.validateEnumerationSymbols().apply(schema); @@ -550,7 +575,7 @@ public void enumerationSymbolTest() { assertEquals(Optional.of(invalidMessage), result.getReason()); schema = new Parser().parse(schemaTxtInit.concat( - "\"CONNECTED\", \"Not_Connected\", \"UNKNOWN\"".concat(schemaTxtEnd))); + "\"CONNECTED\", \"Not_Connected\", \"" + UNKNOWN_MOCK + "\"".concat(schemaTxtEnd))); result = SchemaValidatorRole.validateEnumerationSymbols().apply(schema); @@ -558,7 +583,7 @@ public void enumerationSymbolTest() { assertEquals(Optional.of(invalidMessage), result.getReason()); schema = new Parser().parse(schemaTxtInit.concat( - "\"Connected\", \"NotConnected\", \"UNKNOWN\"".concat(schemaTxtEnd))); + "\"Connected\", \"NotConnected\", \"" + UNKNOWN_MOCK + "\"".concat(schemaTxtEnd))); result = SchemaValidatorRole.validateEnumerationSymbols().apply(schema); @@ -571,42 +596,42 @@ public void unknownSymbolTest() { Schema schema; ValidationResult result; - schema = SchemaBuilder.enumeration("org.radarcns.test.EnumeratorTest") - .symbols("TEST", "UNKNOWN"); + schema = SchemaBuilder.enumeration(ENUMERATOR_NAME_SPACE_MOCK) + .symbols("VALUE", UNKNOWN_MOCK); result = SchemaValidatorRole.validateUnknownSymbol().apply(schema); assertTrue(result.isValid()); - schema = SchemaBuilder.enumeration("org.radarcns.test.EnumeratorTest") - .symbols("TEST", "UN_KNOWN"); + schema = SchemaBuilder.enumeration(ENUMERATOR_NAME_SPACE_MOCK) + .symbols("FIELD", "UN_KNOWN"); result = SchemaValidatorRole.validateUnknownSymbol().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("Enumerator must contain the \"UNKNOWN\" symbol. It is " + "useful to specify default value for a field using type equals to \"enum\". " - + "org.radarcns.test.EnumeratorTest is invalid."), + + ENUMERATOR_NAME_SPACE_MOCK + INVALID_TEXT), result.getReason()); } @Test(expected = IllegalArgumentException.class) public void defaultValueExceptionTest() { SchemaValidatorRole.validateDefault().apply( - SchemaBuilder.enumeration("org.radarcns.test.EnumeratorTest") - .symbols("TEST", "UNKNOWN")); + SchemaBuilder.enumeration(ENUMERATOR_NAME_SPACE_MOCK) + .symbols("VAL", UNKNOWN_MOCK)); } @Test @SuppressWarnings("PMD.ExcessiveMethodLength") public void defaultValueTest() { - String namespace = "org.radarcns.test"; - String recordName = "TestRecord"; + //String namespace = "org.radarcns.test"; + //String recordName = "TestRecord"; Schema schema; ValidationResult result; - schema = SchemaBuilder + /*schema = SchemaBuilder .builder(namespace) .record(recordName) .fields() @@ -623,12 +648,12 @@ public void defaultValueTest() { result = SchemaValidatorRole.validateDefault().apply(schema); - assertTrue(result.isValid()); + assertTrue(result.isValid());*/ String scemaTxtInit = "{\"namespace\": \"org.radarcns.test\", " + "\"type\": \"record\", \"name\": \"TestRecord\", \"fields\": "; - schema = new Parser().parse(scemaTxtInit + /*schema = new Parser().parse(scemaTxtInit + "[ {\"name\": \"nullableBytes\", \"type\": [ \"null\", \"bytes\"], " + "\"default\": \"null\" } ] }"); @@ -643,16 +668,9 @@ public void defaultValueTest() { .nullableDouble("nullableDouble", -1) .endRecord(); - result = SchemaValidatorRole.validateDefault().apply(schema); + result = SchemaValidatorRole.validateDefault().apply(schema);*/ - String invalidMessage = "Any NULLABLE Avro field must specify a default value. " - + "The allowed default values are: \"UNKNOWN\" for ENUMERATION, \"MIN_VALUE\" or " - + "\"MAX_VALUE\" for nullable int and long, \"NaN\" for nullable float and double, " - + "\"true\" or \"false\" for nullable boolean, \"byte[]\" or \"null\" for bytes, " - + "and \"null\" for all the other cases. org.radarcns.test.TestRecord" - + " is invalid."; - - assertFalse(result.isValid()); + /*assertFalse(result.isValid()); assertEquals(Optional.of(invalidMessage), result.getReason()); schema = SchemaBuilder @@ -677,7 +695,7 @@ public void defaultValueTest() { result = SchemaValidatorRole.validateDefault().apply(schema); assertFalse(result.isValid()); - assertEquals(Optional.of(invalidMessage), result.getReason()); + assertEquals(Optional.of(invalidMessage), result.getReason());*/ schema = new Parser().parse(scemaTxtInit + "[ {\"name\": \"serverStatus\", \"type\": {\"name\": \"ServerStatus\", \"type\": " @@ -695,17 +713,24 @@ public void defaultValueTest() { result = SchemaValidatorRole.validateDefault().apply(schema); + String invalidMessage = "Any NULLABLE Avro field must specify a default value. " + + "The allowed default values are: \"UNKNOWN\" for ENUMERATION, \"MIN_VALUE\" or " + + "\"MAX_VALUE\" for nullable int and long, \"NaN\" for nullable float and double, " + + "\"true\" or \"false\" for nullable boolean, \"byte[]\" or \"null\" for bytes, " + + "and \"null\" for all the other cases. org.radarcns.test.TestRecord" + + INVALID_TEXT; + assertFalse(result.isValid()); assertEquals(Optional.of(invalidMessage), result.getReason()); - schema = new Parser().parse(scemaTxtInit + /*schema = new Parser().parse(scemaTxtInit + "[ {\"name\": \"nullableBoolean\", \"type\": [ \"null\", \"boolean\"], " + "\"default\": \"null\" } ] }"); result = SchemaValidatorRole.validateDefault().apply(schema); assertFalse(result.isValid()); - assertEquals(Optional.of(invalidMessage), result.getReason()); + assertEquals(Optional.of(invalidMessage), result.getReason());*/ } private static String getFinalMessage(String nameSpace, String recordName) { diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java index 95aa8a4d..adecca02 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java @@ -17,8 +17,10 @@ */ import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.radarcns.validator.StructureValidator.NameFolder.KAFKA; +import static org.radarcns.validator.StructureValidator.NameFolder.MONITOR; import static org.radarcns.validator.util.SchemaValidator.analyseCollision; import static org.radarcns.validator.util.SchemaValidator.getPath; import static org.radarcns.validator.util.SchemaValidator.validate; @@ -26,7 +28,9 @@ import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; +import org.apache.avro.Schema; import org.apache.avro.Schema.Parser; +import org.apache.avro.SchemaBuilder; import org.junit.Test; /** @@ -81,4 +85,33 @@ public void testCollision() throws IOException { assertEquals(expected, analyseCollision().toString()); } + @Test + public void testEnumerator() { + Path schemaPath = Paths.get("/Users/developer/Repositories/RADAR-Schemas/" + + "commons/monitor/application/server_status.avsc"); + + String subfolder = "application"; + + String name = "org.radarcns.monitor.application.ServerStatus"; + String documentation = "Mock documentation."; + + Schema schema = SchemaBuilder + .enumeration(name) + .doc(documentation) + .symbols("CONNECTED", "DISCONNECTED", "UNKNOWN"); + + ValidationResult result = validate(schema, schemaPath, MONITOR, subfolder); + + assertTrue(result.isValid()); + + schema = SchemaBuilder + .enumeration(name) + .doc(documentation) + .symbols("CONNECTED", "DISCONNECTED", "un_known"); + + result = validate(schema, schemaPath, MONITOR, subfolder); + + assertFalse(result.isValid()); + } + } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java index fe26c973..4e05f0f3 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java @@ -16,7 +16,6 @@ * limitations under the License. */ -import static java.util.stream.Collectors.toList; import static org.radarcns.validator.util.SchemaValidatorRole.UNKNOWN; import java.nio.file.Path; @@ -108,6 +107,7 @@ public static List extractEnumerationFields(Schema root) { * @return TODO * @throws IllegalArgumentException TODO */ + //TODO analyse schemas and improve public static boolean validateDefault(Schema input) { if (!input.getType().equals(Type.RECORD)) { throw new IllegalArgumentException("Function can be applied only to avro RECORD."); @@ -121,14 +121,7 @@ public static boolean validateDefault(Schema input) { flag = flag && validateDefault(field.schema()); break; case UNION: - List types = field.schema().getTypes().stream() - .filter(schema -> !schema.getType().equals(Type.NULL)) - .map(schema -> schema.getType()).collect(toList()); - if (types.size() > 1) { - flag = flag && field.defaultVal().equals(JsonProperties.NULL_VALUE); - } else { - flag = flag && basicValidateDefault(field.defaultVal(), types.get(0)); - } + flag = flag && field.defaultVal().equals(JsonProperties.NULL_VALUE); break; case ENUM: flag = flag && field.schema().getEnumSymbols().contains(UNKNOWN) @@ -151,7 +144,8 @@ public static boolean validateDefault(Schema input) { * @param type TODO * @return TODO */ - private static boolean basicValidateDefault(Object defaultVal, Type type) { + //TODO analyse schemas and redesign + /*private static boolean basicValidateDefault(Object defaultVal, Type type) { switch (type) { case INT: return defaultVal.equals(Integer.MIN_VALUE) || defaultVal.equals(Integer.MAX_VALUE); @@ -169,6 +163,6 @@ private static boolean basicValidateDefault(Object defaultVal, Type type) { default: return defaultVal.equals(JsonProperties.NULL_VALUE); } - } + }*/ } From 71280eb92d94561e9f77ad8fd0511e85816ed200 Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Thu, 27 Jul 2017 17:49:01 +0100 Subject: [PATCH 022/112] Skip definition --- .../org/radarcns/validator/AvroValidator.java | 164 ------------------ ...reValidator.java => CatalogValidator.java} | 4 +- .../radarcns/validator/CommonsValidator.java | 34 +++- .../validator/util/AvroValidator.java | 100 +++++++++++ .../validator/util/SchemaValidator.java | 8 +- .../validator/util/SchemaValidatorRole.java | 21 ++- .../util/SchemaValidatorRoleTest.java | 9 +- .../validator/util/SchemaValidatorTest.java | 4 +- .../org/radarcns/validator/util/Skip.java | 51 ++++++ .../validator/util/ValidationSupport.java | 2 +- 10 files changed, 199 insertions(+), 198 deletions(-) delete mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/AvroValidator.java rename java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/{StructureValidator.java => CatalogValidator.java} (97%) create mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java create mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/Skip.java diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/AvroValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/AvroValidator.java deleted file mode 100644 index 86bf1ee8..00000000 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/AvroValidator.java +++ /dev/null @@ -1,164 +0,0 @@ -package org.radarcns.validator; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import java.io.File; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import org.apache.avro.Schema; -import org.apache.avro.Schema.Field; -import org.apache.avro.Schema.Parser; -import org.radarcns.validator.StructureValidator.NameFolder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public final class AvroValidator { - - private static final Logger LOGGER = LoggerFactory.getLogger(AvroValidator.class); - - public static final String AVRO_FORMAT = "avsc"; - public static final String YAML_FORMAT = "yml"; - - public static final String PACKAGE = "org.radarcns"; - - public static final String TIME = "time"; - public static final String TIME_RECEIVED = "timeReceived"; - public static final String TIME_COMPLETED = "timeCompleted"; - - public static final String FIELD_NAME_REGEX = "^[a-z][a-zA-Z]*$"; - - private static Map skipName; - - static { - skipName = new HashMap<>(); - skipName.put("spO2", "org.radarcns.passive.biovotion.BiovotionVSMSpO2"); - skipName.put("spO2Quality", "org.radarcns.passive.biovotion.BiovotionVSMSpO2"); - } - - private AvroValidator() { - //Static class - } - - /** - * TODO. - * @param file TODO. - * @param packageName TODO. - * @param parentName TODO. - * @throws IOException TODO. - */ - public static void analiseFiles(File file, NameFolder packageName, String parentName) - throws IOException { - if (file.isDirectory()) { - for (File son : file.listFiles()) { - analiseFiles(son, packageName, file.getName()); - } - } else { - assertEquals(packageName + "should contain only " + AVRO_FORMAT + " files", - AVRO_FORMAT, getExtension(file)); - - Schema schema = new Parser().parse(file); - - if (parentName != null) { - assertTrue(file.getName().startsWith(parentName)); - assertEquals(PACKAGE.concat(".").concat(packageName.getName()).concat( - ".").concat(parentName), schema.getNamespace()); - } else { - assertEquals(PACKAGE.concat(".").concat(packageName.getName()), - schema.getNamespace()); - } - - switch (packageName) { - case ACTIVE: - assertNotNull("Any " + NameFolder.ACTIVE.getName() - + " schema must have a " + TIME_COMPLETED + " field", - schema.getField(TIME_COMPLETED)); - assertNull("To be compliant with the RADAR design, " - + TIME_RECEIVED + " field must be only in " - + NameFolder.PASSIVE.getName(), schema.getField(TIME_RECEIVED)); - checkTimeField(schema, packageName); - break; - case MONITOR: - checkTimeField(schema, packageName); - break; - case PASSIVE: - assertNotNull("Any " + NameFolder.PASSIVE.getName() - + " schema must have a " + TIME_RECEIVED + " field", - schema.getField(TIME_RECEIVED)); - assertNull("To be compliant with the RADAR design, " - + TIME_COMPLETED + " field must be only in " - + NameFolder.ACTIVE.getName(), schema.getField(TIME_COMPLETED)); - checkTimeField(schema, packageName); - break; - default: //Nothing to do - } - - generalSchemaChecks(schema); - } - } - - /** - * TODO. - * @param file TODO. - * @return TODO. - */ - public static String getExtension(File file) { - String extension = ""; - int index = file.getName().lastIndexOf('.'); - if (index > 0) { - extension = file.getName().substring(index + 1); - } - - return extension; - } - - /** - * TODO. - * @param schema TODO. - * @param packageName TODO. - */ - public static void checkTimeField(Schema schema, NameFolder packageName) { - assertNotNull("Any " + packageName.getName() + " schema must have a " + TIME - + " field", schema.getField(TIME)); - } - - /** - * TODO. - * @param schema TODO. - */ - public static void generalSchemaChecks(Schema schema) { - for (Field field : schema.getFields()) { - - if (skipName.containsKey(field.name()) - && skipName.get(field.name()).equalsIgnoreCase(schema.getFullName())) { - LOGGER.warn("[Name field check] Skipping {} in {}", - field.name(), schema.getFullName()); - continue; - } - - assertTrue(field.name() + " in " + schema.getFullName() - + " does not respect lowerCamelCase name convention", - field.name().matches(FIELD_NAME_REGEX)); - } - } - -} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/StructureValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CatalogValidator.java similarity index 97% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/StructureValidator.java rename to java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CatalogValidator.java index 5d26ad01..0f84a778 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/StructureValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CatalogValidator.java @@ -45,7 +45,7 @@ * At moment, the {@code restapi} does not have a well defined structure. * TODO. */ -public class StructureValidator { +public class CatalogValidator { /** Folder names. */ public enum NameFolder { @@ -146,8 +146,6 @@ public File getFolder() { } } - //private static final Logger LOGGER = LoggerFactory.getLogger(StructureValidator.class); - @Test public void commons() throws IOException { assertEquals(true, RootFolder.COMMONS.getFolder().isDirectory()); diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java index cf0ad4b6..4244cb9a 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java @@ -17,10 +17,13 @@ */ import java.io.IOException; -import org.radarcns.validator.StructureValidator.CommonsFolder; -import org.radarcns.validator.StructureValidator.NameFolder; +import org.radarcns.validator.CatalogValidator.CommonsFolder; +import org.radarcns.validator.CatalogValidator.NameFolder; +import org.radarcns.validator.util.AvroValidator; -/** TODO. */ +/** + * TODO. + */ public final class CommonsValidator { //private static final Logger LOGGER = LoggerFactory.getLogger(CommonsValidator.class); @@ -29,7 +32,10 @@ private CommonsValidator() { //Static class } - /** TODO. */ + /** + * TODO. + * @throws IOException TODO + */ public static void validateAll() throws IOException { active(); kafka(); @@ -37,25 +43,37 @@ public static void validateAll() throws IOException { passive(); } - /** TODO. */ + /** + * TODO. + * @throws IOException TODO + */ public static void active() throws IOException { AvroValidator.analiseFiles(CommonsFolder.ACTIVE.getFolder(), NameFolder.ACTIVE, null); } - /** TODO. */ + /** + * TODO. + * @throws IOException TODO + */ public static void kafka() throws IOException { AvroValidator.analiseFiles(CommonsFolder.KAFKA.getFolder(), NameFolder.KAFKA, null); } - /** TODO. */ + /** + * TODO. + * @throws IOException TODO + */ public static void monitor() throws IOException { AvroValidator.analiseFiles(CommonsFolder.MONITOR.getFolder(), NameFolder.MONITOR, null); } - /** TODO. */ + /** + * TODO. + * @throws IOException TODO + */ public static void passive() throws IOException { AvroValidator.analiseFiles(CommonsFolder.PASSIVE.getFolder(), NameFolder.PASSIVE, null); diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java new file mode 100644 index 00000000..dcc4b282 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java @@ -0,0 +1,100 @@ +package org.radarcns.validator.util; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import org.apache.avro.Schema; +import org.apache.avro.Schema.Parser; +import org.radarcns.validator.CatalogValidator.NameFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public final class AvroValidator { + + private static final Logger LOGGER = LoggerFactory.getLogger(AvroValidator.class); + + public static final String AVRO_FORMAT = "avsc"; + public static final String README_FILE = "README.md"; + + private static Map skip; + + static { + skip = new HashMap<>(); + skip.put("org.radarcns.passive.biovotion.BiovotionVSMSpO2", + new Skip("spO2", "spO2Quality")); + } + + private AvroValidator() { + //Static class + } + + /** + * TODO. + * @param file TODO. + * @param packageName TODO. + * @param parentName TODO. + * @throws IOException TODO. + */ + public static void analiseFiles(File file, NameFolder packageName, String parentName) + throws IOException { + if (file.isDirectory()) { + for (File son : file.listFiles()) { + analiseFiles(son, packageName, file.getName()); + } + } else if (!file.getName().equalsIgnoreCase(README_FILE)) { + assertEquals(packageName + "should contain only " + AVRO_FORMAT + " files", + AVRO_FORMAT, getExtension(file)); + + Schema schema = new Parser().parse(file); + ValidationResult result; + + if (skip.containsKey(schema.getFullName())) { + Skip skipConfig = skip.get(schema.getFullName()); + result = SchemaValidator.validate(schema, file.toPath(), packageName, parentName, + skipConfig.isNameRecord(), skipConfig.getFields()); + } else { + result = SchemaValidator.validate(schema, file.toPath(), packageName, parentName); + } + + assertTrue(result.getReason().get(), result.isValid()); + } + } + + /** + * TODO. + * @param file TODO. + * @return TODO. + */ + public static String getExtension(File file) { + String extension = ""; + int index = file.getName().lastIndexOf('.'); + if (index > 0) { + extension = file.getName().substring(index + 1); + } + + return extension; + } + +} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java index df31cd59..dbe896e5 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java @@ -37,14 +37,14 @@ import org.apache.avro.Schema; import org.apache.avro.Schema.Field; import org.apache.avro.Schema.Type; -import org.radarcns.validator.StructureValidator.NameFolder; +import org.radarcns.validator.CatalogValidator.NameFolder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * TODO. */ -public final class SchemaValidator { +final class SchemaValidator { private static final Logger LOGGER = LoggerFactory.getLogger(SchemaValidator.class); @@ -74,7 +74,7 @@ private SchemaValidator() { public static ValidationResult validate(Schema schema, Path pathToSchema, NameFolder root, String subfolder) { return validate(schema, pathToSchema, root, subfolder, - null, null); + false, null); } /** @@ -89,7 +89,7 @@ public static ValidationResult validate(Schema schema, Path pathToSchema, NameFo * @throws IOException TODO */ public static ValidationResult validate(Schema schema, Path pathToSchema, NameFolder root, - String subfolder, Set skipRecordName, Set skipFieldName) { + String subfolder, boolean skipRecordName, Set skipFieldName) { Objects.requireNonNull(schema); Objects.requireNonNull(pathToSchema); Objects.requireNonNull(root); diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java index 69ad78a4..18d6882b 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java @@ -28,7 +28,7 @@ import java.util.stream.Stream; import org.apache.avro.Schema; import org.apache.avro.Schema.Type; -import org.radarcns.validator.StructureValidator.NameFolder; +import org.radarcns.validator.CatalogValidator.NameFolder; /* @@ -165,7 +165,7 @@ static SchemaValidatorRole validateNameSpace(NameFolder rootFolder, String subFo * @return TODO */ static SchemaValidatorRole validateRecordName(Path path) { - return validateRecordName(path, null); + return validateRecordName(path, false); } /** @@ -174,13 +174,12 @@ static SchemaValidatorRole validateRecordName(Path path) { * @param skip TODO * @return TODO */ - static SchemaValidatorRole validateRecordName(Path path, Set skip) { + static SchemaValidatorRole validateRecordName(Path path, boolean skip) { String expected = getRecordName(path); return schema -> - schema.getName().matches(RECORD_NAME_REGEX) - && schema.getName().equalsIgnoreCase(expected) - || Objects.nonNull(skip) && skip.contains(schema.getName()) ? valid() : + skip || schema.getName().matches(RECORD_NAME_REGEX) + && schema.getName().equalsIgnoreCase(expected)? valid() : invalid(RECORD_NAME.getMessage().concat(expected).concat("\". ").concat( schema.getFullName()).concat(" is invalid.")); } @@ -374,7 +373,7 @@ static SchemaValidatorRole getGeneralRecordValidator(Path pathToSchema, NameFold * @return TODO */ static SchemaValidatorRole getGeneralRecordValidator(Path pathToSchema, NameFolder root, - String subfolder, Set skipRecordName, Set skipFieldName) { + String subfolder, boolean skipRecordName, Set skipFieldName) { return validateNameSpace(root, subfolder) .and(validateRecordName(pathToSchema, skipRecordName)) .and(validateSchemaDocumentation()) @@ -409,7 +408,7 @@ static SchemaValidatorRole getActiveValidator(Path pathToSchema, NameFolder root * @return TODO */ static SchemaValidatorRole getActiveValidator(Path pathToSchema, NameFolder root, - String subfolder, Set skipRecordName, Set skipFieldName) { + String subfolder, boolean skipRecordName, Set skipFieldName) { return getGeneralRecordValidator(pathToSchema, root, subfolder, skipRecordName, skipFieldName) .and(validateTime()) @@ -440,7 +439,7 @@ static SchemaValidatorRole getMonitorValidator(Path pathToSchema, NameFolder roo * @return TODO */ static SchemaValidatorRole getMonitorValidator(Path pathToSchema, NameFolder root, - String subfolder, Set skipRecordName, Set skipFieldName) { + String subfolder, boolean skipRecordName, Set skipFieldName) { return getGeneralRecordValidator(pathToSchema, root, subfolder, skipRecordName, skipFieldName) .and(validateTime()); @@ -471,7 +470,7 @@ static SchemaValidatorRole getPassiveValidator(Path pathToSchema, NameFolder roo * @return TODO */ static SchemaValidatorRole getPassiveValidator(Path pathToSchema, NameFolder root, - String subfolder, Set skipRecordName, Set skipFieldName) { + String subfolder, boolean skipRecordName, Set skipFieldName) { return getGeneralRecordValidator(pathToSchema, root, subfolder, skipRecordName, skipFieldName) .and(validateTime()) @@ -505,7 +504,7 @@ static SchemaValidatorRole getGeneralEnumValidator(Path pathToSchema, NameFolder * @return TODO */ static SchemaValidatorRole getGeneralEnumValidator(Path pathToSchema, NameFolder root, - String subfolder, Set skipRecordName) { + String subfolder, boolean skipRecordName) { return validateNameSpace(root, subfolder) .and(validateRecordName(pathToSchema, skipRecordName)) .and(validateSchemaDocumentation()) diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java index d08cffce..49c7b8c7 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java @@ -19,10 +19,10 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.radarcns.validator.AvroValidator.FIELD_NAME_REGEX; -import static org.radarcns.validator.StructureValidator.NameFolder.ACTIVE; -import static org.radarcns.validator.StructureValidator.NameFolder.MONITOR; +import static org.radarcns.validator.CatalogValidator.NameFolder.ACTIVE; +import static org.radarcns.validator.CatalogValidator.NameFolder.MONITOR; import static org.radarcns.validator.util.SchemaValidatorRole.ENUMERATION_SYMBOL_REGEX; +import static org.radarcns.validator.util.SchemaValidatorRole.FIELD_NAME_REGEX; import static org.radarcns.validator.util.SchemaValidatorRole.NAMESPACE_REGEX; import static org.radarcns.validator.util.SchemaValidatorRole.RECORD_NAME_REGEX; @@ -211,8 +211,7 @@ public void recordNameTest() { + fieldName + INVALID_TEXT), result.getReason()); - result = SchemaValidatorRole.validateRecordName(filePath, - Collections.singleton(fieldName)).apply(schema); + result = SchemaValidatorRole.validateRecordName(filePath, true).apply(schema); assertTrue(result.isValid()); } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java index adecca02..0aefca3a 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java @@ -19,8 +19,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.radarcns.validator.StructureValidator.NameFolder.KAFKA; -import static org.radarcns.validator.StructureValidator.NameFolder.MONITOR; +import static org.radarcns.validator.CatalogValidator.NameFolder.KAFKA; +import static org.radarcns.validator.CatalogValidator.NameFolder.MONITOR; import static org.radarcns.validator.util.SchemaValidator.analyseCollision; import static org.radarcns.validator.util.SchemaValidator.getPath; import static org.radarcns.validator.util.SchemaValidator.validate; diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/Skip.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/Skip.java new file mode 100644 index 00000000..a2d2d211 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/Skip.java @@ -0,0 +1,51 @@ +package org.radarcns.validator.util; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +/** + * TODO. + */ +public class Skip { + + private boolean nameRecord; + private Set fields; + + public Skip(boolean nameRecord) { + this(nameRecord, null); + } + + public Skip(String... fields) { + this(false, fields); + } + + public Skip(boolean nameRecord, String... fields) { + this.nameRecord = nameRecord; + this.fields = fields == null ? null : new HashSet<>(Arrays.asList(fields)); + } + + public boolean isNameRecord() { + return nameRecord; + } + + public Set getFields() { + return fields; + } +} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java index 4e05f0f3..45399460 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java @@ -31,7 +31,7 @@ /** * TODO. */ -public final class ValidationSupport { +final class ValidationSupport { static final ValidationResult VALID = new ValidationResult() { public boolean isValid() { From f6bfb184968afaa44eae0af8f5b559b0780d7659 Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Thu, 27 Jul 2017 18:01:08 +0100 Subject: [PATCH 023/112] Fixed style --- .../org/radarcns/validator/util/{Skip.java => SkipConfig.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/{Skip.java => SkipConfig.java} (100%) diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/Skip.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SkipConfig.java similarity index 100% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/Skip.java rename to java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SkipConfig.java From e98fd9d385c7eec9793e8affcd8a958104e513f5 Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Thu, 27 Jul 2017 19:30:59 +0100 Subject: [PATCH 024/112] Complete test for common --- .../radarcns/validator/CommonsValidator.java | 2 + .../validator/util/AvroValidator.java | 47 ++++++++++++++----- .../validator/util/SchemaValidator.java | 2 + .../validator/util/SchemaValidatorRole.java | 4 +- .../util/SchemaValidatorRoleTest.java | 2 + .../radarcns/validator/util/SkipConfig.java | 34 +++++++++++--- 6 files changed, 72 insertions(+), 19 deletions(-) diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java index 4244cb9a..a6b8ef90 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java @@ -41,6 +41,8 @@ public static void validateAll() throws IOException { kafka(); monitor(); passive(); + + AvroValidator.analyseNamingCollsion(); } /** diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java index dcc4b282..cc5860c1 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java @@ -17,14 +17,13 @@ */ import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import org.apache.avro.Schema; import org.apache.avro.Schema.Parser; import org.radarcns.validator.CatalogValidator.NameFolder; @@ -38,12 +37,17 @@ public final class AvroValidator { public static final String AVRO_FORMAT = "avsc"; public static final String README_FILE = "README.md"; - private static Map skip; + private static final String WILD_CARD = ".*"; + + private static Map skip; static { skip = new HashMap<>(); skip.put("org.radarcns.passive.biovotion.BiovotionVSMSpO2", - new Skip("spO2", "spO2Quality")); + new SkipConfig(true, "spO2", "spO2Quality")); + skip.put("org.radarcns.passive.biovotion.*", new SkipConfig(true)); + skip.put("org.radarcns.passive.empatica.EmpaticaE4InterBeatInterval", + new SkipConfig("interBeatInterval")); } private AvroValidator() { @@ -68,26 +72,37 @@ public static void analiseFiles(File file, NameFolder packageName, String parent AVRO_FORMAT, getExtension(file)); Schema schema = new Parser().parse(file); + ValidationResult result; - if (skip.containsKey(schema.getFullName())) { - Skip skipConfig = skip.get(schema.getFullName()); - result = SchemaValidator.validate(schema, file.toPath(), packageName, parentName, - skipConfig.isNameRecord(), skipConfig.getFields()); - } else { + SkipConfig skipConfig = getSkipConfig(schema); + + if (Objects.isNull(skipConfig)) { result = SchemaValidator.validate(schema, file.toPath(), packageName, parentName); + } else { + result = SchemaValidator.validate(schema, file.toPath(), packageName, parentName, + skipConfig.isNameRecord(), skipConfig.getFields()); } - assertTrue(result.getReason().get(), result.isValid()); + StringBuilder messageBuilder = new StringBuilder(200); + result.getReason().ifPresent(s -> messageBuilder.append(s)); + + assertTrue(messageBuilder.toString(), result.isValid()); } } + private static SkipConfig getSkipConfig(Schema schema) { + SkipConfig skipConfig = skip.get(schema.getFullName()); + return Objects.isNull(skipConfig) + ? skip.get(schema.getNamespace().concat(WILD_CARD)) : skipConfig; + } + /** * TODO. * @param file TODO. * @return TODO. */ - public static String getExtension(File file) { + private static String getExtension(File file) { String extension = ""; int index = file.getName().lastIndexOf('.'); if (index > 0) { @@ -97,4 +112,14 @@ public static String getExtension(File file) { return extension; } + /** + * TODO. + */ + public static void analyseNamingCollsion() { + String message = SchemaValidator.analyseCollision().toString(); + if ("".equalsIgnoreCase(message)) { + LOGGER.warn(message); + } + } + } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java index dbe896e5..5c7db64c 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java @@ -195,6 +195,8 @@ public static StringBuilder analyseCollision() { + "the name field accordingly.\n"); }); + COLLISIONS.clear(); + return messageBuilder; } } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java index 18d6882b..0342410b 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java @@ -69,7 +69,7 @@ interface SchemaValidatorRole extends Function { String FIELD_NAME_REGEX = "^[a-z][a-zA-Z]*$"; - String ENUMERATION_SYMBOL_REGEX = "^[A-Z_]+$"; + String ENUMERATION_SYMBOL_REGEX = "^[A-Z0-8_]+$"; /** Field names cannot contain the following values. */ enum FieldNameNotAllowed { @@ -179,7 +179,7 @@ static SchemaValidatorRole validateRecordName(Path path, boolean skip) { return schema -> skip || schema.getName().matches(RECORD_NAME_REGEX) - && schema.getName().equalsIgnoreCase(expected)? valid() : + && schema.getName().equalsIgnoreCase(expected) ? valid() : invalid(RECORD_NAME.getMessage().concat(expected).concat("\". ").concat( schema.getFullName()).concat(" is invalid.")); } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java index 49c7b8c7..4e3ab785 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java @@ -91,6 +91,7 @@ public void recordNameRegex() { @Test public void fieldNameRegex() { + assertTrue("interBeatInterval".matches(FIELD_NAME_REGEX)); assertTrue("x".matches(FIELD_NAME_REGEX)); assertTrue(SchemaValidatorRole.TIME.matches(FIELD_NAME_REGEX)); assertTrue("subjectId".matches(FIELD_NAME_REGEX)); @@ -101,6 +102,7 @@ public void fieldNameRegex() { @Test public void enumerationRegex() { + assertTrue("PHQ8".matches(ENUMERATION_SYMBOL_REGEX)); assertTrue("HELLO".matches(ENUMERATION_SYMBOL_REGEX)); assertTrue("HELLOTHERE".matches(ENUMERATION_SYMBOL_REGEX)); assertTrue("HELLO_THERE".matches(ENUMERATION_SYMBOL_REGEX)); diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SkipConfig.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SkipConfig.java index a2d2d211..cb6ac030 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SkipConfig.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SkipConfig.java @@ -23,28 +23,50 @@ /** * TODO. */ -public class Skip { +public class SkipConfig { private boolean nameRecord; private Set fields; - public Skip(boolean nameRecord) { - this(nameRecord, null); + /** + * TODO. + * @param nameRecord TODO + */ + public SkipConfig(boolean nameRecord) { + this(nameRecord, ""); } - public Skip(String... fields) { + /** + * TODO. + * @param fields TODO + */ + public SkipConfig(String... fields) { this(false, fields); } - public Skip(boolean nameRecord, String... fields) { + /** + * TODO. + * @param nameRecord TODO + * @param fields TODO + */ + public SkipConfig(boolean nameRecord, String... fields) { this.nameRecord = nameRecord; - this.fields = fields == null ? null : new HashSet<>(Arrays.asList(fields)); + this.fields = fields.length == 1 && fields[0].isEmpty() ? null : + new HashSet<>(Arrays.asList(fields)); } + /** + * TODO. + * @return TODO + */ public boolean isNameRecord() { return nameRecord; } + /** + * TODO. + * @return TODO + */ public Set getFields() { return fields; } From e6688344fb6b5d3c78075593a62ef637bb70e12a Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Thu, 27 Jul 2017 19:31:40 +0100 Subject: [PATCH 025/112] Fixed schema style --- .../active/questionnaire/questionnaire.avsc | 18 +++++++++--------- .../kafka/aggregator/aggregator_double.avsc | 19 ++++++++++--------- .../aggregator/aggregator_double_array.avsc | 19 ++++++++++--------- commons/kafka/key/key_measurement.avsc | 8 ++++---- commons/kafka/key/key_windowed.avsc | 13 +++++++------ .../application_external_time.avsc | 10 +++++----- .../application_record_counts.avsc | 8 ++++---- .../application_server_status.avsc | 6 +++--- .../application/application_uptime.avsc | 6 +++--- .../biovotion/biovotion_vsm_acceleration.avsc | 10 +++++----- .../biovotion_vsm_battery_state.avsc | 12 ++++++------ .../biovotion_vsm_blood_pulse_wave.avsc | 8 ++++---- .../biovotion/biovotion_vsm_energy.avsc | 8 ++++---- .../biovotion_vsm_galvanic_skin_response.avsc | 8 ++++---- .../biovotion/biovotion_vsm_heart_rate.avsc | 8 ++++---- .../biovotion_vsm_heart_rate_variability.avsc | 8 ++++---- .../biovotion/biovotion_vsm_led_current.avsc | 12 ++++++------ .../biovotion/biovotion_vsm_ppg_raw.avsc | 12 ++++++------ .../biovotion_vsm_respiration_rate.avsc | 8 ++++---- .../passive/biovotion/biovotion_vsm_spo2.avsc | 8 ++++---- .../biovotion/biovotion_vsm_temperature.avsc | 10 +++++----- .../empatica/empatica_e4_acceleration.avsc | 10 +++++----- .../empatica/empatica_e4_battery_level.avsc | 6 +++--- .../empatica_e4_blood_volume_pulse.avsc | 6 +++--- .../empatica_e4_electrodermal_activity.avsc | 6 +++--- .../empatica_e4_inter_beat_interval.avsc | 6 +++--- .../empatica/empatica_e4_sensor_status.avsc | 8 ++++---- commons/passive/empatica/empatica_e4_tag.avsc | 4 ++-- .../empatica/empatica_e4_temperature.avsc | 6 +++--- .../passive/pebble/pebble2_acceleration.avsc | 10 +++++----- .../passive/pebble/pebble2_battery_level.avsc | 10 +++++----- .../passive/pebble/pebble2_heart_rate.avsc | 6 +++--- .../pebble/pebble2_heart_rate_filtered.avsc | 6 +++--- commons/passive/phone/phone_acceleration.avsc | 10 +++++----- .../passive/phone/phone_battery_level.avsc | 10 +++++----- commons/passive/phone/phone_call.avsc | 12 ++++++------ commons/passive/phone/phone_gyroscope.avsc | 10 +++++----- commons/passive/phone/phone_light.avsc | 6 +++--- .../passive/phone/phone_magnetic_field.avsc | 10 +++++----- .../phone/phone_relative_location.avsc | 18 +++++++++--------- commons/passive/phone/phone_sms.avsc | 16 ++++++++-------- commons/passive/phone/phone_sms_unread.avsc | 6 +++--- commons/passive/phone/phone_step_count.avsc | 6 +++--- commons/passive/phone/phone_usage_event.avsc | 17 ++++++++--------- .../passive/phone/phone_user_interaction.avsc | 6 +++--- 45 files changed, 216 insertions(+), 214 deletions(-) diff --git a/commons/active/questionnaire/questionnaire.avsc b/commons/active/questionnaire/questionnaire.avsc index ed2bdc6b..c645101e 100644 --- a/commons/active/questionnaire/questionnaire.avsc +++ b/commons/active/questionnaire/questionnaire.avsc @@ -2,12 +2,12 @@ "namespace": "org.radarcns.active.questionnaire", "type": "record", "name": "Questionnaire", - "doc": "General schema for questionnaire. Check the specification folder to see how the questionnaire has been defined. For each QuestionnaireType there is a JSON file reporting the questions set and possible answers if available", + "doc": "General schema for questionnaire. Check the specification folder to see how the questionnaire has been defined. For each QuestionnaireType there is a JSON file reporting the questions set and possible answers if available.", "fields": [ - { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the questionnaire is submitted to the subject" }, - { "name": "timeCompleted", "type": "double", "doc": "timestamp in UTC (s) when subject marks the questionnaire as" }, - { "name": "name", "type": {"name": "QuestionnaireType", "type": "enum", "symbols": ["PHQ8", "ESM", "UNKNOWN"]}, "doc": "Questionnaire names", "default": "UNKNOWN" }, - { "name": "version", "type": "string", "doc": "It reports the questionnaire version stated in the JSON specification" }, + { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the questionnaire is submitted to the subject." }, + { "name": "timeCompleted", "type": "double", "doc": "timestamp in UTC (s) when subject marks the questionnaire as." }, + { "name": "name", "type": {"name": "QuestionnaireType", "type": "enum", "symbols": ["PHQ8", "ESM", "UNKNOWN"]}, "doc": "Questionnaire names.", "default": "UNKNOWN" }, + { "name": "version", "type": "string", "doc": "It reports the questionnaire version stated in the JSON specification." }, { "name": "answers", "type": { "type": "array", @@ -16,13 +16,13 @@ "type": "record", "doc": "Questionnaire answer", "fields": [ - { "name": "value", "type": ["int", "string", "double"], "doc": "Subject answer" }, - { "name": "startTime", "type": "double", "doc": "timestamp in UTC (s) when the question is shown" }, - { "name": "endTime", "type": "double", "doc": "timestamp in UTC (s) when the question is answered" } + { "name": "value", "type": ["int", "string", "double"], "doc": "Subject answer." }, + { "name": "startTime", "type": "double", "doc": "timestamp in UTC (s) when the question is shown." }, + { "name": "endTime", "type": "double", "doc": "timestamp in UTC (s) when the question is answered." } ] } }, - "doc": "Answers list. The answers order must follow the questions order" + "doc": "Answers list. The answers order must follow the questions order." } ] } diff --git a/commons/kafka/aggregator/aggregator_double.avsc b/commons/kafka/aggregator/aggregator_double.avsc index 9f926a14..88f95a50 100644 --- a/commons/kafka/aggregator/aggregator_double.avsc +++ b/commons/kafka/aggregator/aggregator_double.avsc @@ -1,14 +1,15 @@ -{"namespace": "org.radarcns.kafka.aggregator", +{ + "namespace": "org.radarcns.kafka.aggregator", "type": "record", - "name": "DoubleAggregator", + "name": "AggregatorDouble", "doc": "Result of data aggregation.", "fields": [ - {"name": "min", "type": "double", "default": "+Infinity"}, - {"name": "max", "type": "double", "default": "-Infinity"}, - {"name": "sum", "type": "double", "default": "0.0"}, - {"name": "count", "type": "double", "default": "0.0"}, - {"name": "avg", "type": "double", "default": "0.0"}, - {"name": "quartile", "type": {"type": "array", "items": "double"}}, - {"name": "iqr", "type": "double", "default": "0.0"} + { "name": "min", "type": "double", "doc": "State the minimum between accumulated values.", "default": "+Infinity" }, + { "name": "max", "type": "double", "doc": "State the maximum between accumulated values.", "default": "-Infinity" }, + { "name": "sum", "type": "double", "doc": "State the sum of accumulated values.", "default": "0.0" }, + { "name": "count", "type": "double", "doc": "Count the accumulated values.", "default": "0.0" }, + { "name": "avg", "type": "double", "doc": "State the avg between accumulated values.", "default": "0.0" }, + { "name": "quartile", "type": {"type": "array", "items": "double"}, "doc": "Quartile of accumulated values." }, + { "name": "iqr", "type": "double", "doc": "State the interquartile range between accumulated values.", "default": "0.0" } ] } diff --git a/commons/kafka/aggregator/aggregator_double_array.avsc b/commons/kafka/aggregator/aggregator_double_array.avsc index 0fb81eda..b2bda37c 100644 --- a/commons/kafka/aggregator/aggregator_double_array.avsc +++ b/commons/kafka/aggregator/aggregator_double_array.avsc @@ -1,14 +1,15 @@ -{"namespace": "org.radarcns.kafka.aggregator", +{ + "namespace": "org.radarcns.kafka.aggregator", "type": "record", - "name": "DoubleArrayAggregator", + "name": "AggregatorDoubleArray", "doc": "Result of data aggregation.", "fields": [ - {"name": "min", "type": {"type": "array", "items": "double"}}, - {"name": "max", "type": {"type": "array", "items": "double"}}, - {"name": "sum", "type": {"type": "array", "items": "double"}}, - {"name": "count", "type": {"type": "array", "items": "double"}}, - {"name": "avg", "type": {"type": "array", "items": "double"}}, - {"name": "quartile", "type": {"type": "array", "items": {"type": "array", "items": "double"}}}, - {"name": "iqr", "type": {"type": "array", "items": "double"}} + { "name": "min", "type": {"type": "array", "items": "double"}, "doc": "For each component, it states the minimum between accumulated values." }, + { "name": "max", "type": {"type": "array", "items": "double"}, "doc": "For each component, it States the maximum between accumulated values." }, + { "name": "sum", "type": {"type": "array", "items": "double"}, "doc": "For each component, it States the sum of accumulated values." }, + { "name": "count", "type": {"type": "array", "items": "double"}, "doc": "For each component, it counts the accumulated values." }, + { "name": "avg", "type": {"type": "array", "items": "double"}, "doc": "For each component, it states the avg between accumulated values." }, + { "name": "quartile", "type": {"type": "array", "items": {"type": "array", "items": "double"}}, "doc": "Quartile of accumulated values per component." }, + { "name": "iqr", "type": {"type": "array", "items": "double"}, "doc": "For each component, it states the interquartile range between accumulated values." } ] } diff --git a/commons/kafka/key/key_measurement.avsc b/commons/kafka/key/key_measurement.avsc index 9e67552e..5c46d826 100644 --- a/commons/kafka/key/key_measurement.avsc +++ b/commons/kafka/key/key_measurement.avsc @@ -1,10 +1,10 @@ { "namespace": "org.radarcns.kafka.key", "type": "record", - "name": "MeasurementKey", - "doc": "Measurement key in the RADAR-CNS project", + "name": "KeyMeasurement", + "doc": "Measurement key in the RADAR-CNS project.", "fields": [ - {"name": "userId", "type": "string", "doc": "user ID"}, - {"name": "sourceId", "type": "string", "doc": "device source ID"} + {"name": "userId", "type": "string", "doc": "User Identifier created during the enrolment."}, + {"name": "sourceId", "type": "string", "doc": "Unique identifier associated with the source."} ] } diff --git a/commons/kafka/key/key_windowed.avsc b/commons/kafka/key/key_windowed.avsc index f3f30fb6..376d0caf 100644 --- a/commons/kafka/key/key_windowed.avsc +++ b/commons/kafka/key/key_windowed.avsc @@ -1,11 +1,12 @@ -{"namespace": "org.radarcns.kafka.key", +{ + "namespace": "org.radarcns.kafka.key", "type": "record", - "name": "WindowedKey", + "name": "KeyWindowed", "doc": "Windowed key in the RADAR-CNS project", "fields": [ - {"name": "userId", "type": "string"}, - {"name": "sourceId", "type": "string"}, - {"name": "start", "type": "long"}, - {"name": "end", "type": "long"} + {"name": "userId", "type": "string", "doc": "User Identifier created during the enrolment."}, + {"name": "sourceId", "type": "string", "doc": "Unique identifier associated with the source."}, + {"name": "start", "type": "long", "doc": "First timestamp in UNIX time contained in the time window."}, + {"name": "end", "type": "long", "doc": "Last timestamp in UNIX time contained in the time window."} ] } diff --git a/commons/monitor/application/application_external_time.avsc b/commons/monitor/application/application_external_time.avsc index aaed4879..c5f91fba 100755 --- a/commons/monitor/application/application_external_time.avsc +++ b/commons/monitor/application/application_external_time.avsc @@ -4,10 +4,10 @@ "name": "ApplicationExternalTime", "doc": "Timestamp from an external source.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "externalTime", "type": "double", "doc": "timestamp in UTC according to an external source (s)", "default": "NaN"}, - {"name": "host", "type": ["null", "string"], "doc": "hostname or IP address that time was polled from", "default": null}, - {"name": "protocol", "type": {"name": "ExternalTimeProtocol", "type": "enum", "symbols": ["SNTP", "NTP"], "doc": "SNTP (Simple Network Time Protocol) synchronizes with a single server once, NTP (Network Time Protocol) may synchronize with multiple servers and derive some continuous measures."}, "doc": "protocol for external time synchronization", "default": "SNTP"}, - {"name": "delay", "type": "double", "doc": "delay between sending and receiving a message from the host (s). The lower this delay, the more precise the external timestamp is expected to be.", "default": "NaN"} + { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + { "name": "externalTime", "type": "double", "doc": "timestamp in UTC according to an external source (s).", "default": "NaN" }, + { "name": "host", "type": ["null", "string"], "doc": "hostname or IP address that time was polled from.", "default": null }, + { "name": "protocol", "type": {"name": "ExternalTimeProtocol", "type": "enum", "symbols": ["SNTP", "NTP", "UNKNOWN"], "doc": "SNTP (Simple Network Time Protocol) synchronizes with a single server once, NTP (Network Time Protocol) may synchronize with multiple servers and derive some continuous measures."}, "doc": "protocol for external time synchronization.", "default": "UNKNOWN" }, + { "name": "delay", "type": "double", "doc": "delay between sending and receiving a message from the host (s). The lower this delay, the more precise the external timestamp is expected to be.", "default": "NaN" } ] } diff --git a/commons/monitor/application/application_record_counts.avsc b/commons/monitor/application/application_record_counts.avsc index bb597ef7..770c21ef 100755 --- a/commons/monitor/application/application_record_counts.avsc +++ b/commons/monitor/application/application_record_counts.avsc @@ -4,9 +4,9 @@ "name": "ApplicationRecordCounts", "doc": "Number of records cached or created.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "recordsCached", "type": "int", "doc": "number of records currently being cached", "default": -1}, - {"name": "recordsSent", "type": "int", "doc": "number of records sent since application start"}, - {"name": "recordsUnsent", "type": "int", "doc": "number of unsent records", "default": -1} + { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + { "name": "recordsCached", "type": "int", "doc": "number of records currently being cached.", "default": -1 }, + { "name": "recordsSent", "type": "int", "doc": "number of records sent since application start." }, + { "name": "recordsUnsent", "type": "int", "doc": "number of unsent records.", "default": -1 } ] } diff --git a/commons/monitor/application/application_server_status.avsc b/commons/monitor/application/application_server_status.avsc index f587f90b..eb91e5f5 100755 --- a/commons/monitor/application/application_server_status.avsc +++ b/commons/monitor/application/application_server_status.avsc @@ -4,8 +4,8 @@ "name": "ApplicationServerStatus", "doc": "Server connection status with android client.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "serverStatus", "type": {"name": "ServerStatus", "type": "enum", "symbols": ["CONNECTED", "DISCONNECTED", "UNKNOWN"]}, "doc": "server connection status", "default": "UNKNOWN"}, - {"name": "ipAddress", "type": ["null", "string"], "doc": "Hardware identifier of client application", "default": null} + { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + { "name": "serverStatus", "type": {"name": "ServerStatus", "type": "enum", "symbols": ["CONNECTED", "DISCONNECTED", "UNKNOWN"]}, "doc": "server connection status.", "default": "UNKNOWN" }, + { "name": "ipAddress", "type": ["null", "string"], "doc": "Hardware identifier of client application.", "default": null } ] } diff --git a/commons/monitor/application/application_uptime.avsc b/commons/monitor/application/application_uptime.avsc index 782763b7..7fe8da4d 100755 --- a/commons/monitor/application/application_uptime.avsc +++ b/commons/monitor/application/application_uptime.avsc @@ -2,9 +2,9 @@ "namespace": "org.radarcns.monitor.application", "type": "record", "name": "ApplicationUptime", - "doc": "Length of application uptime", + "doc": "Length of application uptime.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "uptime", "type": "double", "doc": "Time since last app start (s)"} + { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + { "name": "uptime", "type": "double", "doc": "Time since last app start (s)." } ] } diff --git a/commons/passive/biovotion/biovotion_vsm_acceleration.avsc b/commons/passive/biovotion/biovotion_vsm_acceleration.avsc index 5c318f69..f83c7db3 100644 --- a/commons/passive/biovotion/biovotion_vsm_acceleration.avsc +++ b/commons/passive/biovotion/biovotion_vsm_acceleration.avsc @@ -4,10 +4,10 @@ "name": "BiovotionVSMAcceleration", "doc": "Data from 3-axis accelerometer sensor with gravitational constant g as unit.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp 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": "time", "type": "double", "doc": "device timestamp 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)." } ] } diff --git a/commons/passive/biovotion/biovotion_vsm_battery_state.avsc b/commons/passive/biovotion/biovotion_vsm_battery_state.avsc index c35a24a3..4a2fc7b3 100644 --- a/commons/passive/biovotion/biovotion_vsm_battery_state.avsc +++ b/commons/passive/biovotion/biovotion_vsm_battery_state.avsc @@ -4,11 +4,11 @@ "name": "BiovotionVSMBatteryState", "doc": "Device battery state.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "batteryLevel", "type": "float", "doc": "battery level (0-1)"}, - {"name": "batteryChargeRate", "type": "float", "doc": "battery charge rate, level change per hour (0-1)"}, - {"name": "batteryVoltage", "type": "float", "doc": "battery voltage (V)"}, - {"name": "batteryStatus", "type": "float", "doc": "battery status; 0:not charging, not on charger; 2:not charging, on charger; 3:charging, on charger"} + { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + { "name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + { "name": "batteryLevel", "type": "float", "doc": "battery level (0-1)." }, + { "name": "batteryChargeRate", "type": "float", "doc": "battery charge rate, level change per hour (0-1)." }, + { "name": "batteryVoltage", "type": "float", "doc": "battery voltage (V)." }, + { "name": "batteryStatus", "type": "float", "doc": "battery status; 0:not charging, not on charger; 2:not charging, on charger; 3:charging, on charger." } ] } diff --git a/commons/passive/biovotion/biovotion_vsm_blood_pulse_wave.avsc b/commons/passive/biovotion/biovotion_vsm_blood_pulse_wave.avsc index 2dbb68ea..a8958f8b 100644 --- a/commons/passive/biovotion/biovotion_vsm_blood_pulse_wave.avsc +++ b/commons/passive/biovotion/biovotion_vsm_blood_pulse_wave.avsc @@ -4,9 +4,9 @@ "name": "BiovotionVSMBloodPulseWave", "doc": "Blood pulse wave data calculated by biovotion device.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "bloodPulseWave", "type": "float", "doc": "Blood pulse wave value"}, - {"name": "bloodPulseWaveQuality", "type": "float", "doc": "Blood pulse wave quality (0-1)"} + { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + { "name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + { "name": "bloodPulseWave", "type": "float", "doc": "Blood pulse wave value." }, + { "name": "bloodPulseWaveQuality", "type": "float", "doc": "Blood pulse wave quality (0-1)." } ] } diff --git a/commons/passive/biovotion/biovotion_vsm_energy.avsc b/commons/passive/biovotion/biovotion_vsm_energy.avsc index 91e09b90..2c1782f5 100644 --- a/commons/passive/biovotion/biovotion_vsm_energy.avsc +++ b/commons/passive/biovotion/biovotion_vsm_energy.avsc @@ -4,9 +4,9 @@ "name": "BiovotionVSMEnergy", "doc": "Energy expenditure data calculated by biovotion device.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "energyExpenditure", "type": "float", "doc": "Energy expenditure value (cal/s)"}, - {"name": "energyExpenditureQuality", "type": "float", "doc": "Energy expenditure quality (0-1)"} + { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + { "name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + { "name": "energyExpenditure", "type": "float", "doc": "Energy expenditure value (cal/s)." }, + { "name": "energyExpenditureQuality", "type": "float", "doc": "Energy expenditure quality (0-1)." } ] } diff --git a/commons/passive/biovotion/biovotion_vsm_galvanic_skin_response.avsc b/commons/passive/biovotion/biovotion_vsm_galvanic_skin_response.avsc index a2a28b24..3812fc6c 100644 --- a/commons/passive/biovotion/biovotion_vsm_galvanic_skin_response.avsc +++ b/commons/passive/biovotion/biovotion_vsm_galvanic_skin_response.avsc @@ -4,9 +4,9 @@ "name": "BiovotionVSMGalvanicSkinResponse", "doc": "Raw galvanic skin response data.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "galvanicSkinResponseAmplitude", "type": "float", "doc": "gsr amplitude (kOhm)"}, - {"name": "galvanicSkinResponsePhase", "type": "float", "doc": "gsr phase"} + { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + { "name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + { "name": "galvanicSkinResponseAmplitude", "type": "float", "doc": "gsr amplitude (kOhm)." }, + { "name": "galvanicSkinResponsePhase", "type": "float", "doc": "gsr phase." } ] } diff --git a/commons/passive/biovotion/biovotion_vsm_heart_rate.avsc b/commons/passive/biovotion/biovotion_vsm_heart_rate.avsc index 6807c106..546b7173 100644 --- a/commons/passive/biovotion/biovotion_vsm_heart_rate.avsc +++ b/commons/passive/biovotion/biovotion_vsm_heart_rate.avsc @@ -4,9 +4,9 @@ "name": "BiovotionVSMHeartRate", "doc": "Heart rate calculated by biovotion device.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "heartRate", "type": "float", "doc": "Heart rate value (bpm)"}, - {"name": "heartRateQuality", "type": "float", "doc": "Heart rate quality (0-1)"} + { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + { "name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + { "name": "heartRate", "type": "float", "doc": "Heart rate value (bpm)." }, + { "name": "heartRateQuality", "type": "float", "doc": "Heart rate quality (0-1)." } ] } diff --git a/commons/passive/biovotion/biovotion_vsm_heart_rate_variability.avsc b/commons/passive/biovotion/biovotion_vsm_heart_rate_variability.avsc index d42e0e5d..59aa9bbb 100644 --- a/commons/passive/biovotion/biovotion_vsm_heart_rate_variability.avsc +++ b/commons/passive/biovotion/biovotion_vsm_heart_rate_variability.avsc @@ -4,9 +4,9 @@ "name": "BiovotionVSMHeartRateVariability", "doc": "Heart rate variability data calculated by biovotion device.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "heartRateVariability", "type": "float", "doc": "Heart rate variability value (ms / RMSSD)"}, - {"name": "heartRateVariabilityQuality", "type": "float", "doc": "Heart rate variability quality (0-1)"} + {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + {"name": "heartRateVariability", "type": "float", "doc": "Heart rate variability value (ms / RMSSD)." }, + {"name": "heartRateVariabilityQuality", "type": "float", "doc": "Heart rate variability quality (0-1)." } ] } diff --git a/commons/passive/biovotion/biovotion_vsm_led_current.avsc b/commons/passive/biovotion/biovotion_vsm_led_current.avsc index f6b522c8..fd9dccb5 100644 --- a/commons/passive/biovotion/biovotion_vsm_led_current.avsc +++ b/commons/passive/biovotion/biovotion_vsm_led_current.avsc @@ -4,11 +4,11 @@ "name": "BiovotionVSMLedCurrent", "doc": "Applied current for red, green and ir leds.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "red", "type": "float", "doc": "current for red LED (mA)"}, - {"name": "green", "type": "float", "doc": "current for green LED (mA)"}, - {"name": "ir", "type": "float", "doc": "current for IR LED (mA)"}, - {"name": "offset", "type": "float", "doc": "current offset (mA)"} + {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + {"name": "red", "type": "float", "doc": "current for red LED (mA)." }, + {"name": "green", "type": "float", "doc": "current for green LED (mA)." }, + {"name": "ir", "type": "float", "doc": "current for IR LED (mA)." }, + {"name": "offset", "type": "float", "doc": "current offset (mA)." } ] } diff --git a/commons/passive/biovotion/biovotion_vsm_ppg_raw.avsc b/commons/passive/biovotion/biovotion_vsm_ppg_raw.avsc index 8a890649..72cda863 100644 --- a/commons/passive/biovotion/biovotion_vsm_ppg_raw.avsc +++ b/commons/passive/biovotion/biovotion_vsm_ppg_raw.avsc @@ -4,11 +4,11 @@ "name": "BiovotionVSMPhotoRaw", "doc": "Raw 14bit Photodiode ADC data for red, green, IR and dark portions (PPG raw data).", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "red", "type": "float", "doc": "raw red light ADC response (normalized)"}, - {"name": "green", "type": "float", "doc": "raw green light ADC response (normalized)"}, - {"name": "ir", "type": "float", "doc": "raw IR light ADC response (normalized)"}, - {"name": "dark", "type": "float", "doc": "raw dark light ADC response (normalized)"} + {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + {"name": "red", "type": "float", "doc": "raw red light ADC response (normalized)." }, + {"name": "green", "type": "float", "doc": "raw green light ADC response (normalized)." }, + {"name": "ir", "type": "float", "doc": "raw IR light ADC response (normalized)." }, + {"name": "dark", "type": "float", "doc": "raw dark light ADC response (normalized)." } ] } diff --git a/commons/passive/biovotion/biovotion_vsm_respiration_rate.avsc b/commons/passive/biovotion/biovotion_vsm_respiration_rate.avsc index 66cc5791..8a4f278d 100644 --- a/commons/passive/biovotion/biovotion_vsm_respiration_rate.avsc +++ b/commons/passive/biovotion/biovotion_vsm_respiration_rate.avsc @@ -4,9 +4,9 @@ "name": "BiovotionVSMRespirationRate", "doc": "Respiration rate data calculated by biovotion device.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "respirationRate", "type": "float", "doc": "Respiration rate value (bpm)"}, - {"name": "respirationRateQuality", "type": "float", "doc": "Respiration rate quality (0-1)"} + {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + {"name": "respirationRate", "type": "float", "doc": "Respiration rate value (bpm)." }, + {"name": "respirationRateQuality", "type": "float", "doc": "Respiration rate quality (0-1)." } ] } diff --git a/commons/passive/biovotion/biovotion_vsm_spo2.avsc b/commons/passive/biovotion/biovotion_vsm_spo2.avsc index 694317f1..773c7a18 100644 --- a/commons/passive/biovotion/biovotion_vsm_spo2.avsc +++ b/commons/passive/biovotion/biovotion_vsm_spo2.avsc @@ -4,9 +4,9 @@ "name": "BiovotionVSMSpO2", "doc": "Peripheral capillary oxygen saturation (SpO2) calculated by biovotion device.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "spO2", "type": "float", "doc": "SpO2 value (0-1)"}, - {"name": "spO2Quality", "type": "float", "doc": "SpO2 quality (0-1)"} + {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + {"name": "spO2", "type": "float", "doc": "SpO2 value (0-1)." }, + {"name": "spO2Quality", "type": "float", "doc": "SpO2 quality (0-1)." } ] } diff --git a/commons/passive/biovotion/biovotion_vsm_temperature.avsc b/commons/passive/biovotion/biovotion_vsm_temperature.avsc index 8146a4b5..5fa8a124 100644 --- a/commons/passive/biovotion/biovotion_vsm_temperature.avsc +++ b/commons/passive/biovotion/biovotion_vsm_temperature.avsc @@ -4,10 +4,10 @@ "name": "BiovotionVSMTemperature", "doc": "Data from temperature sensor expressed in degrees on the Celsius (°C) scale.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "temperature", "type": "float", "doc": "skin temperature (°C)"}, - {"name": "temperatureLocal", "type": "float", "doc": "device (board) temperature (°C)"}, - {"name": "temperatureBarometer", "type": "float", "doc": "barometer temperature (°C)"} + {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + {"name": "temperature", "type": "float", "doc": "skin temperature (°C)." }, + {"name": "temperatureLocal", "type": "float", "doc": "device (board) temperature (°C)." }, + {"name": "temperatureBarometer", "type": "float", "doc": "barometer temperature (°C)." } ] } diff --git a/commons/passive/empatica/empatica_e4_acceleration.avsc b/commons/passive/empatica/empatica_e4_acceleration.avsc index bc2c340a..68a8de4b 100644 --- a/commons/passive/empatica/empatica_e4_acceleration.avsc +++ b/commons/passive/empatica/empatica_e4_acceleration.avsc @@ -4,10 +4,10 @@ "name": "EmpaticaE4Acceleration", "doc": "Data from 3-axis accelerometer sensor with gravitational constant g as unit.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp 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": "time", "type": "double", "doc": "device timestamp 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)." } ] } diff --git a/commons/passive/empatica/empatica_e4_battery_level.avsc b/commons/passive/empatica/empatica_e4_battery_level.avsc index 33305e19..f764c54b 100644 --- a/commons/passive/empatica/empatica_e4_battery_level.avsc +++ b/commons/passive/empatica/empatica_e4_battery_level.avsc @@ -4,8 +4,8 @@ "name": "EmpaticaE4BatteryLevel", "doc": "Device battery level.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "batteryLevel", "type": "float", "doc": "battery level from 0 to 1"} + { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + { "name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + { "name": "batteryLevel", "type": "float", "doc": "battery level from 0 to 1." } ] } diff --git a/commons/passive/empatica/empatica_e4_blood_volume_pulse.avsc b/commons/passive/empatica/empatica_e4_blood_volume_pulse.avsc index 3542f108..4eb28a18 100644 --- a/commons/passive/empatica/empatica_e4_blood_volume_pulse.avsc +++ b/commons/passive/empatica/empatica_e4_blood_volume_pulse.avsc @@ -4,8 +4,8 @@ "name": "EmpaticaE4BloodVolumePulse", "doc": "Data from photoplethysmograph.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "bloodVolumePulse", "type": "float", "doc": "light absorption (nW)"} + { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + { "name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + { "name": "bloodVolumePulse", "type": "float", "doc": "light absorption (nW)." } ] } diff --git a/commons/passive/empatica/empatica_e4_electrodermal_activity.avsc b/commons/passive/empatica/empatica_e4_electrodermal_activity.avsc index 25e2b065..df5a962d 100644 --- a/commons/passive/empatica/empatica_e4_electrodermal_activity.avsc +++ b/commons/passive/empatica/empatica_e4_electrodermal_activity.avsc @@ -4,8 +4,8 @@ "name": "EmpaticaE4ElectroDermalActivity", "doc": "Data from the electrodermal activity sensor expressed as microsiemens (µS). Uses a galvanic skin response sensor.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "electroDermalActivity", "type": "float", "doc": "electrodermal activity (µS)"} + { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + { "name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + { "name": "electroDermalActivity", "type": "float", "doc": "electrodermal activity (µS)." } ] } diff --git a/commons/passive/empatica/empatica_e4_inter_beat_interval.avsc b/commons/passive/empatica/empatica_e4_inter_beat_interval.avsc index 744edc58..a69c2121 100644 --- a/commons/passive/empatica/empatica_e4_inter_beat_interval.avsc +++ b/commons/passive/empatica/empatica_e4_inter_beat_interval.avsc @@ -4,8 +4,8 @@ "name": "EmpaticaE4InterBeatInterval", "doc": "Time between individuals heart beats extracted from the BVP signal. You can compute the heart rate as (60 / ibi).", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "interBeatInterval", "type": "float", "doc": "the duration (s) of the detected inter-beat interval (i.e., the distance in seconds from the previous beat)"} + { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + { "name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + { "name": "interBeatInterval", "type": "float", "doc": "the duration (s) of the detected inter-beat interval (i.e., the distance in seconds from the previous beat)." } ] } diff --git a/commons/passive/empatica/empatica_e4_sensor_status.avsc b/commons/passive/empatica/empatica_e4_sensor_status.avsc index 9af24253..842dcd96 100644 --- a/commons/passive/empatica/empatica_e4_sensor_status.avsc +++ b/commons/passive/empatica/empatica_e4_sensor_status.avsc @@ -4,9 +4,9 @@ "name": "EmpaticaE4SensorStatus", "doc": "Sensor status according to the device.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "sensor", "type": "string", "doc": "sensor name; one of BVP, GSR, ACC, TEMP."}, - {"name": "status", "type": "string", "doc": "sensor status; one of NOT_ON_WRIST, ON_WRIST, DEAD."} + { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + { "name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + { "name": "sensor", "type": "string", "doc": "sensor name; one of BVP, GSR, ACC, TEMP.." }, + { "name": "status", "type": "string", "doc": "sensor status; one of NOT_ON_WRIST, ON_WRIST, DEAD." } ] } diff --git a/commons/passive/empatica/empatica_e4_tag.avsc b/commons/passive/empatica/empatica_e4_tag.avsc index 7233e17c..bd13ef8d 100644 --- a/commons/passive/empatica/empatica_e4_tag.avsc +++ b/commons/passive/empatica/empatica_e4_tag.avsc @@ -4,7 +4,7 @@ "name": "EmpaticaE4Tag", "doc": "Event mark corresponding to a physical button press on the device; the same time as the status LED is first illuminated. The time is synchronized with initial time of the session indicated in the related data files from the corresponding session.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"} + { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + { "name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." } ] } diff --git a/commons/passive/empatica/empatica_e4_temperature.avsc b/commons/passive/empatica/empatica_e4_temperature.avsc index 4f8def70..83067728 100644 --- a/commons/passive/empatica/empatica_e4_temperature.avsc +++ b/commons/passive/empatica/empatica_e4_temperature.avsc @@ -4,8 +4,8 @@ "name": "EmpaticaE4Temperature", "doc": "Data from temperature sensor expressed degrees on the Celsius (°C) scale.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "temperature", "type": "float", "doc": "temperature (°C)"} + { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + { "name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + { "name": "temperature", "type": "float", "doc": "temperature (°C)." } ] } diff --git a/commons/passive/pebble/pebble2_acceleration.avsc b/commons/passive/pebble/pebble2_acceleration.avsc index f4036c25..f54c12a7 100644 --- a/commons/passive/pebble/pebble2_acceleration.avsc +++ b/commons/passive/pebble/pebble2_acceleration.avsc @@ -4,10 +4,10 @@ "name": "Pebble2Acceleration", "doc": "Data from 3-axis accelerometer sensor with gravitational constant g as unit.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp 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": "time", "type": "double", "doc": "device timestamp 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)." } ] } diff --git a/commons/passive/pebble/pebble2_battery_level.avsc b/commons/passive/pebble/pebble2_battery_level.avsc index c2e48153..38e777e9 100644 --- a/commons/passive/pebble/pebble2_battery_level.avsc +++ b/commons/passive/pebble/pebble2_battery_level.avsc @@ -4,10 +4,10 @@ "name": "Pebble2BatteryLevel", "doc": "Device battery level.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "batteryLevel", "type": "float", "doc": "battery level from 0 to 1"}, - {"name": "batteryIsCharging", "type": "boolean", "doc": "whether the battery is being charged"}, - {"name": "batteryIsPlugged", "type": "boolean", "doc": "whether the battery charger cable is plugged in"} + { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + { "name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + { "name": "batteryLevel", "type": "float", "doc": "battery level from 0 to 1." }, + { "name": "batteryIsCharging", "type": "boolean", "doc": "whether the battery is being charged." }, + { "name": "batteryIsPlugged", "type": "boolean", "doc": "whether the battery charger cable is plugged in." } ] } diff --git a/commons/passive/pebble/pebble2_heart_rate.avsc b/commons/passive/pebble/pebble2_heart_rate.avsc index 4fe5474e..f9ac3395 100644 --- a/commons/passive/pebble/pebble2_heart_rate.avsc +++ b/commons/passive/pebble/pebble2_heart_rate.avsc @@ -4,8 +4,8 @@ "name": "Pebble2HeartRate", "doc": "Raw heart rate from the Pebble 2 Heart Monitor. You can compute the inter beat interval rate as (60 / heartRate).", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "heartRate", "type": "float", "doc": "heart rate (bpm)"} + { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + { "name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + { "name": "heartRate", "type": "float", "doc": "heart rate (bpm)." } ] } diff --git a/commons/passive/pebble/pebble2_heart_rate_filtered.avsc b/commons/passive/pebble/pebble2_heart_rate_filtered.avsc index ca2cd130..d747c232 100644 --- a/commons/passive/pebble/pebble2_heart_rate_filtered.avsc +++ b/commons/passive/pebble/pebble2_heart_rate_filtered.avsc @@ -4,8 +4,8 @@ "name": "Pebble2HeartRateFiltered", "doc": "Filtered and smoothed heart rate from the Pebble 2 Heart Monitor. You can compute the inter beat interval rate as (60 / heartRate).", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "heartRate", "type": "float", "doc": "heart rate (bpm)"} + { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + { "name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + { "name": "heartRate", "type": "float", "doc": "heart rate (bpm)." } ] } diff --git a/commons/passive/phone/phone_acceleration.avsc b/commons/passive/phone/phone_acceleration.avsc index 3e7518cd..45a8c9ef 100644 --- a/commons/passive/phone/phone_acceleration.avsc +++ b/commons/passive/phone/phone_acceleration.avsc @@ -4,10 +4,10 @@ "name": "PhoneAcceleration", "doc": "Data from 3-axis accelerometer sensor with gravitational constant g as unit.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp 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": "time", "type": "double", "doc": "device timestamp 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)." } ] } diff --git a/commons/passive/phone/phone_battery_level.avsc b/commons/passive/phone/phone_battery_level.avsc index 6fe1be63..1d8dd393 100644 --- a/commons/passive/phone/phone_battery_level.avsc +++ b/commons/passive/phone/phone_battery_level.avsc @@ -4,10 +4,10 @@ "name": "PhoneBatteryLevel", "doc": "Phone battery level.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "batteryLevel", "type": "float", "doc": "battery level from 0 to 1"}, - {"name": "isPlugged", "type": "boolean", "doc": "whether the phone is connected to a power source"}, - {"name": "status", "type": {"name": "BatteryStatus", "type": "enum", "symbols": ["UNKNOWN", "CHARGING", "DISCHARGING", "NOT_CHARGING", "FULL"]}, "doc": "Android battery states", "default": "UNKNOWN"} + {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + {"name": "batteryLevel", "type": "float", "doc": "battery level from 0 to 1." }, + {"name": "isPlugged", "type": "boolean", "doc": "whether the phone is connected to a power source." }, + {"name": "status", "type": {"name": "BatteryStatus", "type": "enum", "symbols": ["UNKNOWN", "CHARGING", "DISCHARGING", "NOT_CHARGING", "FULL"]}, "doc": "Android battery states.", "default": "UNKNOWN." } ] } diff --git a/commons/passive/phone/phone_call.avsc b/commons/passive/phone/phone_call.avsc index 1bdc6f7f..afaeb15f 100644 --- a/commons/passive/phone/phone_call.avsc +++ b/commons/passive/phone/phone_call.avsc @@ -4,11 +4,11 @@ "name": "PhoneCall", "doc": "Data from the log of received and made calls.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "duration", "type": "float", "doc": "duration of the call (s)", "default": "NaN"}, - {"name": "target", "type": ["null", "bytes"], "doc": "HMAC SHA-256 one-way source/target of the call. This hash of a given phone number will be the same unless the app is reinstalled. If the number is unknown or anonymous, this contains null.", "default": null}, - {"name": "type", "type": {"name": "PhoneCallType", "type": "enum", "symbols": ["INCOMING", "OUTGOING", "MISSED", "VOICEMAIL", "UNKNOWN"]}, "doc": "direction of phone call", "default": "UNKNOWN"}, - {"name": "targetIsContact", "type": ["null","boolean"], "doc": "call to/from a known contact, null if unknown", "default": null} + {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + {"name": "duration", "type": "float", "doc": "duration of the call (s).", "default": "NaN" }, + {"name": "target", "type": ["null", "bytes"], "doc": "HMAC SHA-256 one-way source/target of the call. This hash of a given phone number will be the same unless the app is reinstalled. If the number is unknown or anonymous, this contains null.", "default": null }, + {"name": "type", "type": {"name": "PhoneCallType", "type": "enum", "symbols": ["INCOMING", "OUTGOING", "MISSED", "VOICEMAIL", "UNKNOWN"]}, "doc": "direction of phone call.", "default": "UNKNOWN" }, + {"name": "targetIsContact", "type": ["null","boolean"], "doc": "call to/from a known contact, null if unknown.", "default": null} ] } diff --git a/commons/passive/phone/phone_gyroscope.avsc b/commons/passive/phone/phone_gyroscope.avsc index 72ece8f1..1bfa5f23 100644 --- a/commons/passive/phone/phone_gyroscope.avsc +++ b/commons/passive/phone/phone_gyroscope.avsc @@ -4,10 +4,10 @@ "name": "PhoneGyroscope", "doc": "Data from the 3-axis gyroscope.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "x", "type": "float", "doc": "gyration in the x-axis (rad/s)"}, - {"name": "y", "type": "float", "doc": "gyration in the y-axis (rad/s)"}, - {"name": "z", "type": "float", "doc": "gyration in the z-axis (rad/s)"} + { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + { "name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + { "name": "x", "type": "float", "doc": "gyration in the x-axis (rad/s)." }, + { "name": "y", "type": "float", "doc": "gyration in the y-axis (rad/s)." }, + { "name": "z", "type": "float", "doc": "gyration in the z-axis (rad/s)." } ] } diff --git a/commons/passive/phone/phone_light.avsc b/commons/passive/phone/phone_light.avsc index fa887256..f0a0090a 100644 --- a/commons/passive/phone/phone_light.avsc +++ b/commons/passive/phone/phone_light.avsc @@ -4,8 +4,8 @@ "name": "PhoneLight", "doc": "Data from the light sensor in luminous flux per unit area.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "light", "type": "float", "doc": "illuminance (lx)"} + { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + { "name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + { "name": "light", "type": "float", "doc": "illuminance (lx)." } ] } diff --git a/commons/passive/phone/phone_magnetic_field.avsc b/commons/passive/phone/phone_magnetic_field.avsc index 99309eb3..bd9a819d 100644 --- a/commons/passive/phone/phone_magnetic_field.avsc +++ b/commons/passive/phone/phone_magnetic_field.avsc @@ -4,10 +4,10 @@ "name": "PhoneMagneticField", "doc": "Data from the 3-axis magnetometer.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "x", "type": "float", "doc": "magnetic field in the x-axis (μT)"}, - {"name": "y", "type": "float", "doc": "magnetic field in the y-axis (μT)"}, - {"name": "z", "type": "float", "doc": "magnetic field in the z-axis (μT)"} + { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + { "name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + { "name": "x", "type": "float", "doc": "magnetic field in the x-axis (μT)." }, + { "name": "y", "type": "float", "doc": "magnetic field in the y-axis (μT)." }, + { "name": "z", "type": "float", "doc": "magnetic field in the z-axis (μT)." } ] } diff --git a/commons/passive/phone/phone_relative_location.avsc b/commons/passive/phone/phone_relative_location.avsc index 512d2b1e..598ba8e6 100644 --- a/commons/passive/phone/phone_relative_location.avsc +++ b/commons/passive/phone/phone_relative_location.avsc @@ -4,14 +4,14 @@ "name": "PhoneRelativeLocation", "doc": "Data from the gps and network location providers. The latitude and longitude are stated with an unspecified reference offset and can thus be treated as relative locations. They cannot be used to infer absolute location. This means accurate distances or angles between locations cannot be calculated since those depend on the absolute location.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "provider", "type": {"name": "LocationProvider", "type": "enum", "symbols": ["GPS", "NETWORK", "OTHER"]}, "doc": "Android provider of the location data"}, - {"name": "latitude", "type": "double", "doc": "relative latitude from an initial random reference latitude (degrees with range [-90, 90])", "default": "NaN"}, - {"name": "longitude", "type": "double", "doc": "relative longitude from an initial reference longitude (degrees with range [-180, 180])", "default": "NaN"}, - {"name": "altitude", "type": "float", "doc": "height above the WGS 84 reference ellipsoid (m)", "default": "NaN"}, - {"name": "accuracy", "type": "float", "doc": "The estimated horizontal accuracy of this location, radial (m). We define horizontal accuracy as the radius of 68% confidence. In other words, if you draw a circle centered at this location's latitude and longitude, and with a radius equal to the accuracy, then there is a 68% probability that the true location is inside the circle.", "default": "NaN"}, - {"name": "speed", "type": "float", "doc": "speed over ground (m/s)", "default": "NaN"}, - {"name": "bearing", "type": "float", "doc": "the horizontal direction of travel of this device (degrees with range (0, 360])", "default": "NaN"} + { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + { "name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + { "name": "provider", "type": {"name": "LocationProvider", "type": "enum", "symbols": ["GPS", "NETWORK", "OTHER"]}, "doc": "Android provider of the location data." }, + { "name": "latitude", "type": "double", "doc": "relative latitude from an initial random reference latitude (degrees with range [-90, 90]).", "default": "NaN" }, + { "name": "longitude", "type": "double", "doc": "relative longitude from an initial reference longitude (degrees with range [-180, 180]).", "default": "NaN" }, + { "name": "altitude", "type": "float", "doc": "height above the WGS 84 reference ellipsoid (m).", "default": "NaN" }, + { "name": "accuracy", "type": "float", "doc": "The estimated horizontal accuracy of this location, radial (m). We define horizontal accuracy as the radius of 68% confidence. In other words, if you draw a circle centered at this location's latitude and longitude, and with a radius equal to the accuracy, then there is a 68% probability that the true location is inside the circle.", "default": "NaN" }, + { "name": "speed", "type": "float", "doc": "speed over ground (m/s).", "default": "NaN" }, + { "name": "bearing", "type": "float", "doc": "the horizontal direction of travel of this device (degrees with range (0, 360]).", "default": "NaN" } ] } diff --git a/commons/passive/phone/phone_sms.avsc b/commons/passive/phone/phone_sms.avsc index f8173c90..7f9885a9 100644 --- a/commons/passive/phone/phone_sms.avsc +++ b/commons/passive/phone/phone_sms.avsc @@ -4,13 +4,13 @@ "name": "PhoneSms", "doc": "Data from log sent and received text messages.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "target", "type": ["null", "bytes"], "doc": "HMAC SHA-256 one-way source/target of the SMS. This hash of a given phone number will be the same unless the app is reinstalled. If the number is unknown or anonymous, this contains null.", "default": null}, - {"name": "type", "type": {"name": "PhoneSmsType", "type": "enum", "symbols": ["INCOMING", "OUTGOING", "OTHER", "UNKNOWN"]}, "doc": "direction of the SMS", "default": "UNKNOWN"}, - {"name": "length", "type": ["null","int"], "doc": "number of characters in the message (null if unknown)", "default": null}, - {"name": "targetIsContact", "type": ["null","boolean"], "doc": "sms sender is a known contact, null if unknown", "default": null}, - {"name": "targetIsNonNumeric", "type": "boolean", "doc": "sms sender ID is replaced by text, e.g. a company name", "default": false}, - {"name": "targetIsService", "type": "boolean", "doc": "target is a service, e.g. a 4-digit target", "default": false} + { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + { "name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + { "name": "target", "type": ["null", "bytes"], "doc": "HMAC SHA-256 one-way source/target of the SMS. This hash of a given phone number will be the same unless the app is reinstalled. If the number is unknown or anonymous, this contains null.", "default": null }, + { "name": "type", "type": {"name": "PhoneSmsType", "type": "enum", "symbols": ["INCOMING", "OUTGOING", "OTHER", "UNKNOWN"]}, "doc": "direction of the SMS.", "default": "UNKNOWN." }, + { "name": "length", "type": ["null","int"], "doc": "number of characters in the message (null if unknown).", "default": null}, + { "name": "targetIsContact", "type": ["null","boolean"], "doc": "sms sender is a known contact, null if unknown.", "default": null }, + { "name": "targetIsNonNumeric", "type": "boolean", "doc": "sms sender ID is replaced by text, e.g. a company name.", "default": false }, + { "name": "targetIsService", "type": "boolean", "doc": "target is a service, e.g. a 4-digit target.", "default": false } ] } diff --git a/commons/passive/phone/phone_sms_unread.avsc b/commons/passive/phone/phone_sms_unread.avsc index 2a654c08..7fa77c4e 100644 --- a/commons/passive/phone/phone_sms_unread.avsc +++ b/commons/passive/phone/phone_sms_unread.avsc @@ -4,8 +4,8 @@ "name": "PhoneSmsUnread", "doc": "Number of SMS messages in the inbox that have an unread status.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "unreadSMS", "type": "int", "doc": "number of unread SMS messages currently in the inbox"} + { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + { "name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + { "name": "unreadSMS", "type": "int", "doc": "number of unread SMS messages currently in the inbox." } ] } diff --git a/commons/passive/phone/phone_step_count.avsc b/commons/passive/phone/phone_step_count.avsc index ef34cffc..ce370d4b 100644 --- a/commons/passive/phone/phone_step_count.avsc +++ b/commons/passive/phone/phone_step_count.avsc @@ -4,8 +4,8 @@ "name": "PhoneStepCount", "doc": "Data from the step counter.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "steps", "type": "int", "doc": "number of steps taken between this and the previous record"} + {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + {"name": "steps", "type": "int", "doc": "number of steps taken between this and the previous record." } ] } diff --git a/commons/passive/phone/phone_usage_event.avsc b/commons/passive/phone/phone_usage_event.avsc index 3052cc96..91046136 100644 --- a/commons/passive/phone/phone_usage_event.avsc +++ b/commons/passive/phone/phone_usage_event.avsc @@ -2,15 +2,14 @@ "namespace": "org.radarcns.passive.phone", "type": "record", "name": "PhoneUsageEvent", - "doc": "Event for closing or opening an app", + "doc": "Event for closing or opening an app.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "packageName", "type": "string", "doc": "package name of the launched app"}, - {"name": "categoryName", "type": ["null", "string"], "doc": "app category as given by the play store, null if a category is not listed or unable to be fetched", "default": null}, - {"name": "categoryNameFetchTime", "type": ["null", "double"], "doc": "timestamp in UTC when the category was attempted to fetch from the play store (s), null if not fetched", "default": null}, - {"name": "eventType", "type": - {"name": "UsageEventType", "type": "enum", "symbols": ["FOREGROUND", "BACKGROUND", "CONFIG", "SHORTCUT", "INTERACTION", "NONE"]}, - "doc": "whether the event brought app to foreground or background or neither", "default": "NONE"} + { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + { "name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + { "name": "packageName", "type": "string", "doc": "package name of the launched app." }, + { "name": "categoryName", "type": ["null", "string"], "doc": "app category as given by the play store, null if a category is not listed or unable to be fetched.", "default": null }, + { "name": "categoryNameFetchTime", "type": ["null", "double"], "doc": "timestamp in UTC when the category was attempted to fetch from the play store (s), null if not fetched.", "default": null }, + { "name": "eventType", "type": + { "name": "UsageEventType", "type": "enum", "symbols": ["FOREGROUND", "BACKGROUND", "CONFIG", "SHORTCUT", "INTERACTION", "NONE"]}, "doc": "whether the event brought app to foreground or background or neither.", "default": "NONE" } ] } diff --git a/commons/passive/phone/phone_user_interaction.avsc b/commons/passive/phone/phone_user_interaction.avsc index 1048d6ae..03efdd88 100644 --- a/commons/passive/phone/phone_user_interaction.avsc +++ b/commons/passive/phone/phone_user_interaction.avsc @@ -4,8 +4,8 @@ "name": "PhoneUserInteraction", "doc": "Logs change of user interaction state: when the phone is unlocked or set to standby.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "interactionState", "type": {"name": "PhoneInteractionState", "type": "enum", "symbols": ["STANDBY", "UNLOCKED","SHUTDOWN","BOOTED"]}, "doc": "what interaction state the phone has"} + { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, + { "name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, + { "name": "interactionState", "type": {"name": "PhoneInteractionState", "type": "enum", "symbols": ["STANDBY", "UNLOCKED","SHUTDOWN","BOOTED"]}, "doc": "what interaction state the phone has." } ] } From d05c00caf017522ae23d1d331319971f3781d161 Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Fri, 28 Jul 2017 13:49:04 +0100 Subject: [PATCH 026/112] Added configuration file for validation --- java-sdk/radar-schemas-validator/build.gradle | 4 +- .../radarcns/validator/CommonsValidator.java | 2 +- .../radarcns/validator/config/SkipConfig.java | 152 ++++++++++++++++++ .../validator/config/SkipConfigItem.java | 80 +++++++++ .../validator/util/AvroValidator.java | 52 +++--- .../validator/util/SchemaValidator.java | 12 +- .../util/SchemaValidatorRoleTest.java | 1 + .../radarcns/validator/util/SkipConfig.java | 73 --------- .../src/test/resources/skip.yml | 17 ++ 9 files changed, 281 insertions(+), 112 deletions(-) create mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfig.java create mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfigItem.java delete mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SkipConfig.java create mode 100644 java-sdk/radar-schemas-validator/src/test/resources/skip.yml diff --git a/java-sdk/radar-schemas-validator/build.gradle b/java-sdk/radar-schemas-validator/build.gradle index c23cdde2..90850575 100644 --- a/java-sdk/radar-schemas-validator/build.gradle +++ b/java-sdk/radar-schemas-validator/build.gradle @@ -23,14 +23,16 @@ sourceSets { } } +ext.apacheCommonsVersion = '3.6' ext.junitVersion = '4.12' +ext.radarCommonsVersion = '0.4.2' ext.slf4jVersion = '1.7.25' -ext.apacheCommonsVersion = '3.6' dependencies { testCompile group: 'junit', name: 'junit', version: junitVersion testCompile group: 'org.slf4j', name: 'slf4j-simple', version: slf4jVersion testCompile group: 'org.apache.commons', name: 'commons-lang3', version: apacheCommonsVersion + testCompile group: 'org.radarcns', name: 'radar-commons', version: radarCommonsVersion } //---------------------------------------------------------------------------// diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java index a6b8ef90..87c9c350 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java @@ -42,7 +42,7 @@ public static void validateAll() throws IOException { monitor(); passive(); - AvroValidator.analyseNamingCollsion(); + AvroValidator.analyseNamingCollision(); } /** diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfig.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfig.java new file mode 100644 index 00000000..2b890e9e --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfig.java @@ -0,0 +1,152 @@ +package org.radarcns.validator.config; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.radarcns.validator.util.AvroValidator.getExtension; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import org.apache.avro.Schema; +import org.radarcns.config.YamlConfigLoader; + +/** + * TODO. + */ +public class SkipConfig { + + /** Repository name. */ + public static final String REPOSITORY_NAME = "/RADAR-Schemas/"; + + /** File path location. */ + private static final String FILE_NAME = "skip.yml"; + + /** Wild card to suppress check for entire package. */ + private static final String WILD_CARD_PACKAGE = ".*"; + + /** Wild card to suppress check for folder and subfolders. */ + private static final String WILD_CARD_FOLDER = "**"; + + private final Map setup = new HashMap<>(); + private final Set files = new HashSet<>(); + + private static final SkipConfig CONFIG; + + public SkipConfig() { + // POJO initializer + } + + static { + try { + CONFIG = new YamlConfigLoader().load(new File( + SkipConfig.class.getClassLoader().getResource(FILE_NAME).getFile()), + SkipConfig.class); + } catch (IOException exc) { + throw new ExceptionInInitializerError(exc); + } + } + + /** + * TODO. + * @param schema TODO + * @return TODO + */ + public static boolean contains(Schema schema) { + return CONFIG.setup.containsKey(schema.getNamespace().concat(WILD_CARD_PACKAGE)) + || CONFIG.setup.containsKey(schema.getFullName()); + } + + /** + * TODO. + * @param schema TODO + * @return TODO + */ + public static boolean isNameRecordEnable(Schema schema) { + SkipConfigItem item = CONFIG.setup.get(schema.getFullName()) == null + ? CONFIG.setup.get(schema.getNamespace().concat(WILD_CARD_PACKAGE)) + : CONFIG.setup.get(schema.getFullName()); + + return item == null || item.isNameRecordDisable(); + } + + /** + * TODO. + * @param schema TODO + * @return TODO + */ + public static Set skippedNameFieldCheck(Schema schema) { + SkipConfigItem item = CONFIG.setup.get(schema.getFullName()) == null + ? CONFIG.setup.get(schema.getNamespace().concat(WILD_CARD_PACKAGE)) + : CONFIG.setup.get(schema.getFullName()); + + return item == null ? new HashSet<>() : item.getFields(); + } + + /** + * TODO. + * @param file TODO + * @return TODO + */ + public static boolean skipFile(File file) { + Objects.requireNonNull(file); + + String path = file.toPath().toString().substring( + file.toPath().toString().indexOf(REPOSITORY_NAME)); + path = path.substring(REPOSITORY_NAME.length()); + String[] components = path.split(File.separator); + + boolean flag = false; + + for (Path pathConfig : CONFIG.files) { + if (pathConfig.startsWith(components[0])) { + String[] tempComp = pathConfig.toString().split(File.separator); + + boolean match = true; + + for (int i = 1; i < tempComp.length; i++) { + if (!tempComp[i].equalsIgnoreCase(components[i])) { + match = false; + if (tempComp[i].equalsIgnoreCase(WILD_CARD_FOLDER)) { + if (i + 1 < tempComp.length) { + if (tempComp[i + 1].startsWith("*.")) { + //Case file format + flag = flag || getExtension(file).equalsIgnoreCase( + tempComp[i + 1].substring(2)); + } else if (tempComp[i + 1].contains(".")) { + //Case file name + flag = flag || file.getName().matches(tempComp[i + 1]); + } + } else { + flag = flag || true; + } + } + } + } + + //Case exact matching + flag = flag || match; + } + } + + return flag; + } +} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfigItem.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfigItem.java new file mode 100644 index 00000000..bc4a4223 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfigItem.java @@ -0,0 +1,80 @@ +package org.radarcns.validator.config; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.HashSet; +import java.util.Locale; +import java.util.Set; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * TODO. + */ +class SkipConfigItem { + + /** Possible check status. */ + private enum CheckStatus { + DISABLE, ENABLE; + + private String name; + + CheckStatus() { + this.name = this.name().toLowerCase(Locale.ENGLISH); + } + + public String getName() { + return name; + } + } + + @JsonProperty("name_record_check") + @SuppressWarnings("PMD.ImmutableField") + private CheckStatus nameRecordCheck = CheckStatus.ENABLE; + + @SuppressWarnings("PMD.ImmutableField") + private Set fields = new HashSet<>(); + + public SkipConfigItem() { + // POJO initializer + } + + /** + * TODO. + * + * @return TODO + */ + boolean isNameRecordDisable() { + return nameRecordCheck.getName().equals(CheckStatus.DISABLE.getName()); + } + + /** + * TODO. + * + * @return TODO + */ + Set getFields() { + return fields; + } + + @Override + public String toString() { + return "SkipConfigItem{" + + "nameRecordCheck=" + nameRecordCheck + + ", fields=" + fields + + '}'; + } +} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java index cc5860c1..5c26bea3 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java @@ -21,12 +21,10 @@ import java.io.File; import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; import org.apache.avro.Schema; import org.apache.avro.Schema.Parser; import org.radarcns.validator.CatalogValidator.NameFolder; +import org.radarcns.validator.config.SkipConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,20 +33,6 @@ public final class AvroValidator { private static final Logger LOGGER = LoggerFactory.getLogger(AvroValidator.class); public static final String AVRO_FORMAT = "avsc"; - public static final String README_FILE = "README.md"; - - private static final String WILD_CARD = ".*"; - - private static Map skip; - - static { - skip = new HashMap<>(); - skip.put("org.radarcns.passive.biovotion.BiovotionVSMSpO2", - new SkipConfig(true, "spO2", "spO2Quality")); - skip.put("org.radarcns.passive.biovotion.*", new SkipConfig(true)); - skip.put("org.radarcns.passive.empatica.EmpaticaE4InterBeatInterval", - new SkipConfig("interBeatInterval")); - } private AvroValidator() { //Static class @@ -67,7 +51,9 @@ public static void analiseFiles(File file, NameFolder packageName, String parent for (File son : file.listFiles()) { analiseFiles(son, packageName, file.getName()); } - } else if (!file.getName().equalsIgnoreCase(README_FILE)) { + } else if (!SkipConfig.skipFile(file)) { + LOGGER.info("Analyising file: {}", file.getAbsolutePath()); + assertEquals(packageName + "should contain only " + AVRO_FORMAT + " files", AVRO_FORMAT, getExtension(file)); @@ -75,26 +61,22 @@ public static void analiseFiles(File file, NameFolder packageName, String parent ValidationResult result; - SkipConfig skipConfig = getSkipConfig(schema); - - if (Objects.isNull(skipConfig)) { - result = SchemaValidator.validate(schema, file.toPath(), packageName, parentName); - } else { + if (SkipConfig.contains(schema)) { result = SchemaValidator.validate(schema, file.toPath(), packageName, parentName, - skipConfig.isNameRecord(), skipConfig.getFields()); + SkipConfig.isNameRecordEnable(schema), + SkipConfig.skippedNameFieldCheck(schema)); + } else { + result = SchemaValidator.validate(schema, file.toPath(), packageName, parentName); } - StringBuilder messageBuilder = new StringBuilder(200); - result.getReason().ifPresent(s -> messageBuilder.append(s)); - - assertTrue(messageBuilder.toString(), result.isValid()); + assertTrue(getMessage(result), result.isValid()); } } - private static SkipConfig getSkipConfig(Schema schema) { - SkipConfig skipConfig = skip.get(schema.getFullName()); - return Objects.isNull(skipConfig) - ? skip.get(schema.getNamespace().concat(WILD_CARD)) : skipConfig; + private static String getMessage(ValidationResult result) { + StringBuilder messageBuilder = new StringBuilder(200); + result.getReason().ifPresent(s -> messageBuilder.append(s)); + return messageBuilder.toString(); } /** @@ -102,7 +84,7 @@ private static SkipConfig getSkipConfig(Schema schema) { * @param file TODO. * @return TODO. */ - private static String getExtension(File file) { + public static String getExtension(File file) { String extension = ""; int index = file.getName().lastIndexOf('.'); if (index > 0) { @@ -115,11 +97,13 @@ private static String getExtension(File file) { /** * TODO. */ - public static void analyseNamingCollsion() { + public static void analyseNamingCollision() { String message = SchemaValidator.analyseCollision().toString(); if ("".equalsIgnoreCase(message)) { LOGGER.warn(message); } + + SchemaValidator.resetCollision(); } } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java index 5c7db64c..5044d8a6 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java @@ -38,6 +38,7 @@ import org.apache.avro.Schema.Field; import org.apache.avro.Schema.Type; import org.radarcns.validator.CatalogValidator.NameFolder; +import org.radarcns.validator.config.SkipConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -137,7 +138,7 @@ public static ValidationResult validate(Schema schema, Path pathToSchema, NameFo * @return TODO */ public static String getPath(Path path) { - return path.toString().substring(path.toString().indexOf("/RADAR-Schemas/")); + return path.toString().substring(path.toString().indexOf(SkipConfig.REPOSITORY_NAME)); } /** @@ -195,8 +196,13 @@ public static StringBuilder analyseCollision() { + "the name field accordingly.\n"); }); - COLLISIONS.clear(); - return messageBuilder; } + + /** + * TODO. + */ + public static void resetCollision() { + COLLISIONS.clear(); + } } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java index 4e3ab785..55939b1a 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java @@ -625,6 +625,7 @@ public void defaultValueExceptionTest() { @Test @SuppressWarnings("PMD.ExcessiveMethodLength") + // TODO improve test after having define the default guideline public void defaultValueTest() { //String namespace = "org.radarcns.test"; //String recordName = "TestRecord"; diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SkipConfig.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SkipConfig.java deleted file mode 100644 index cb6ac030..00000000 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SkipConfig.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.radarcns.validator.util; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - -/** - * TODO. - */ -public class SkipConfig { - - private boolean nameRecord; - private Set fields; - - /** - * TODO. - * @param nameRecord TODO - */ - public SkipConfig(boolean nameRecord) { - this(nameRecord, ""); - } - - /** - * TODO. - * @param fields TODO - */ - public SkipConfig(String... fields) { - this(false, fields); - } - - /** - * TODO. - * @param nameRecord TODO - * @param fields TODO - */ - public SkipConfig(boolean nameRecord, String... fields) { - this.nameRecord = nameRecord; - this.fields = fields.length == 1 && fields[0].isEmpty() ? null : - new HashSet<>(Arrays.asList(fields)); - } - - /** - * TODO. - * @return TODO - */ - public boolean isNameRecord() { - return nameRecord; - } - - /** - * TODO. - * @return TODO - */ - public Set getFields() { - return fields; - } -} diff --git a/java-sdk/radar-schemas-validator/src/test/resources/skip.yml b/java-sdk/radar-schemas-validator/src/test/resources/skip.yml new file mode 100644 index 00000000..ac69ae10 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/test/resources/skip.yml @@ -0,0 +1,17 @@ +#====================== SKIP FILE =======================# +files: + - commons/**/README.md + - specification/**/README.md + +#=================== SKIP TEST CONFIGURATION ===================# +setup: + org.radarcns.passive.biovotion.*: + name_record_check: DISABLE + org.radarcns.passive.biovotion.BiovotionVSMSpO2: + name_record_check: DISABLE + fields: + - spO2 + - spO2Quality + org.radarcns.passive.empatica.EmpaticaE4InterBeatInterval: + fields: + - interBeatInterval From 611c05a66540cd6cf7eab22cfecc3515606e122d Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Fri, 28 Jul 2017 14:40:54 +0100 Subject: [PATCH 027/112] Updated READMEs --- README.md | 6 +++ java-sdk/radar-schemas-validator/README.md | 54 +++++++++++++++++++ .../radarcns/validator/CatalogValidator.java | 4 +- .../validator/config/SkipConfigItem.java | 2 +- .../validator/util/AvroValidator.java | 2 - .../src/test/resources/skip.yml | 4 +- 6 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 java-sdk/radar-schemas-validator/README.md diff --git a/README.md b/README.md index 7ad2e56e..d5316ad4 100644 --- a/README.md +++ b/README.md @@ -21,3 +21,9 @@ In addition, schemas in the `commons` directory should follow the following guid - Prefer written out fields to arrays. This simplifies the organization of the data downstream, for example, when mapping to CSV. - Give each schema a proper namespace, preferably `org.radarcns.deviceproducer` fully in lowercase, without any numbers, uppercase letters or symbols (except `.`). For the Empatica E4, the producer is Empatica, so the namespace is `org.radarcns.empatica`. For generic types, like a phone, Android Wear device or Android application, the namespace could just be `org.radarcns.phone`, `org.radarcns.wear`, or `org.radarcns.application`. - In the schema name, use upper camel case and name the device explicitly (for example, `EmpaticaE4Temperature`). + +### Validation phase + +Avro schemas are automatically validated against RADAR-CNS guide lines while building. Record Name and field name validations can be suppressed configuring [skip.yml](java-sdk/radar-schemas-validator/src/test/resources/skip.yml). For more details, check [catalog validator](java-sdk/radar-schemas-validator). + + diff --git a/java-sdk/radar-schemas-validator/README.md b/java-sdk/radar-schemas-validator/README.md new file mode 100644 index 00000000..cdf30a02 --- /dev/null +++ b/java-sdk/radar-schemas-validator/README.md @@ -0,0 +1,54 @@ +# RADAR Schemas Validator + +The RADAR Schemas Validator checks if the Schema Catalog is in a valid state. + +It first checks that the folder structure match the following design: +- commons + * active + * kafka + * monitor + * passive +- rest +- specification + * active + * monitor + * passive + +For each Avro schema under `commons` folder checks: +- in case of `ENUM` + * the `namespace` differs from null and it is a lowercase string dot separated without numeric + * the `name` matches the .avsc file name and it is an UpperCamelCase string + * the is documentation + * `symbols` match UPPER_CASE format + * it contains the `UNKNOWN` symbol +- in case of `RECORD` + * the `namespace` differs from null and it is a lowercase string dot separated without numeric + * the `name` matches the .avsc file name and it is an UpperCamelCase string + * it contains fields + * the `field name` is a lowerCamelCase string and does not contain string such as `value`, `Value`, `val` and `Val`. + * schemas under `active` folder have `time` and `timeCompleted`, do not have a field named `timeReceived` + * schemas under `monitor` folder have `time`, do not have a field named either `timeCompleted` or `timeReceived` + * schemas under `passive` folder have `time` and `timeReceived`, do not have a field named `timeCompleted` + * the record and any provided fields are documented + * `ENUM` fields have `UNKNOWN` as `default` value + * `nullable`/`optional` fields have `null` as default value + +The validation process generates a field name collision summary. It is shown to the end user only in case of collisions. + +Upon rule violation, the end user is notfied with a message explaining how to fix the issue. + +## Suppress checks + +Record name and field name validations can be suppressed modifying the [skip](src/test/resources/skip.yml) configuration file. + +`files` lists files paths that do not need to take into account. It can contain +- entire path like `commons/active/questionnaire/questionnaire.avsc` +- folder and subfolder `commons/active/**`: all file under `active` and all its subfolder will be skipped +- folder and subfolder `commons/active/**/*.avsc`: all file with format `avsc` under `active` and all its subfolder will be skipped + +`setup` allows the user to specify at schema level what checks should be skipped: +- a key like `org.radarcns.passive.biovotion.*` set a skip configuration valid for all schemas under `org.radarcns.passive.biovotion` package +- a key like `org.radarcns.passive.biovotion.BiovotionVSMSpO2` specify a configuration valid only for the given record +- `name_record_check: DISABLE` suppresses the record name check +- `fields` lists all field name for which the field check is suppressed + diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CatalogValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CatalogValidator.java index 0f84a778..f7d27b86 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CatalogValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CatalogValidator.java @@ -164,12 +164,12 @@ public void restapi() { //TODO check whether it is possible to define a structure } - @Test + /*@Test public void specification() { assertEquals(true, RootFolder.SPECIFICATION.getFolder().isDirectory()); for (SpecificationFolder folder : SpecificationFolder.values()) { assertEquals(true, folder.getFolder().isDirectory()); } - } + }*/ } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfigItem.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfigItem.java index bc4a4223..e4c350ca 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfigItem.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfigItem.java @@ -41,7 +41,7 @@ public String getName() { } } - @JsonProperty("name_record_check") + @JsonProperty("record_name_check") @SuppressWarnings("PMD.ImmutableField") private CheckStatus nameRecordCheck = CheckStatus.ENABLE; diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java index 5c26bea3..b7d3f7f5 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java @@ -52,8 +52,6 @@ public static void analiseFiles(File file, NameFolder packageName, String parent analiseFiles(son, packageName, file.getName()); } } else if (!SkipConfig.skipFile(file)) { - LOGGER.info("Analyising file: {}", file.getAbsolutePath()); - assertEquals(packageName + "should contain only " + AVRO_FORMAT + " files", AVRO_FORMAT, getExtension(file)); diff --git a/java-sdk/radar-schemas-validator/src/test/resources/skip.yml b/java-sdk/radar-schemas-validator/src/test/resources/skip.yml index ac69ae10..1a14075e 100644 --- a/java-sdk/radar-schemas-validator/src/test/resources/skip.yml +++ b/java-sdk/radar-schemas-validator/src/test/resources/skip.yml @@ -6,9 +6,9 @@ files: #=================== SKIP TEST CONFIGURATION ===================# setup: org.radarcns.passive.biovotion.*: - name_record_check: DISABLE + record_name_check: DISABLE org.radarcns.passive.biovotion.BiovotionVSMSpO2: - name_record_check: DISABLE + record_name_check: DISABLE fields: - spO2 - spO2Quality From fc20e4b7bcd88f02d72a414644f738faed7f04f1 Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Fri, 28 Jul 2017 14:46:52 +0100 Subject: [PATCH 028/112] Instructions for runnig the validation --- java-sdk/radar-schemas-validator/README.md | 4 ++++ .../test/java/org/radarcns/validator/util/AvroValidator.java | 2 ++ 2 files changed, 6 insertions(+) diff --git a/java-sdk/radar-schemas-validator/README.md b/java-sdk/radar-schemas-validator/README.md index cdf30a02..707a4b4c 100644 --- a/java-sdk/radar-schemas-validator/README.md +++ b/java-sdk/radar-schemas-validator/README.md @@ -37,6 +37,10 @@ The validation process generates a field name collision summary. It is shown to Upon rule violation, the end user is notfied with a message explaining how to fix the issue. +## How to use + +The validation is implemented as a `JUnit` test. To run the validation, simply type `./gradlew test` + ## Suppress checks Record name and field name validations can be suppressed modifying the [skip](src/test/resources/skip.yml) configuration file. diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java index b7d3f7f5..5d9ab8c5 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java @@ -68,6 +68,8 @@ public static void analiseFiles(File file, NameFolder packageName, String parent } assertTrue(getMessage(result), result.isValid()); + + //TODO add file layout validation } } From f5d8ca9ab535d51bb6c49d64e997ca0166ce565b Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Fri, 28 Jul 2017 17:22:48 +0100 Subject: [PATCH 029/112] Enhanced collision skip settings --- java-sdk/radar-schemas-validator/README.md | 27 ++++- .../radarcns/validator/CommonsValidator.java | 2 +- .../radarcns/validator/config/SkipConfig.java | 59 ++++++++-- .../validator/util/AvroValidator.java | 11 +- .../validator/util/SchemaValidator.java | 62 +++++------ .../validator/util/SchemaValidatorTest.java | 15 ++- .../src/test/resources/skip.yml | 101 +++++++++++++++--- 7 files changed, 208 insertions(+), 69 deletions(-) diff --git a/java-sdk/radar-schemas-validator/README.md b/java-sdk/radar-schemas-validator/README.md index 707a4b4c..6e8e7923 100644 --- a/java-sdk/radar-schemas-validator/README.md +++ b/java-sdk/radar-schemas-validator/README.md @@ -45,14 +45,37 @@ The validation is implemented as a `JUnit` test. To run the validation, simply t Record name and field name validations can be suppressed modifying the [skip](src/test/resources/skip.yml) configuration file. -`files` lists files paths that do not need to take into account. It can contain +`files` lists files paths that do not need to take into account. All tests are enable by default. + +```yaml +schema_to_skip: + - record_name_check: [ENABLE | DISABLE] + fields: + - fieldnameOne + - fieldnameTwo +``` + +It can contain - entire path like `commons/active/questionnaire/questionnaire.avsc` - folder and subfolder `commons/active/**`: all file under `active` and all its subfolder will be skipped - folder and subfolder `commons/active/**/*.avsc`: all file with format `avsc` under `active` and all its subfolder will be skipped -`setup` allows the user to specify at schema level what checks should be skipped: +`validation` allows the user to specify what checks should be skipped at schema level: - a key like `org.radarcns.passive.biovotion.*` set a skip configuration valid for all schemas under `org.radarcns.passive.biovotion` package - a key like `org.radarcns.passive.biovotion.BiovotionVSMSpO2` specify a configuration valid only for the given record - `name_record_check: DISABLE` suppresses the record name check - `fields` lists all field name for which the field check is suppressed +`collision` can be set to suppress collision checks: + +```yaml +field_name: + - schema.to.skip.one + - schema.to.skip.two +``` + +The schema can be specified as follow: +- `*` turns off the collision check for all schemas for the given field name +- `schema.to.skip.*` turns off the collision check also for all schemas under the package `schema.to.skip`. In case `field_name` appears in another schemas contained in a different package, the collision check will highlight this +- `schema.to.skip.one` turns off the collision check also for the set schema. In case `field_name` appears in another schemas, the collision check will highlight this + diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java index 87c9c350..2201b49a 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java @@ -42,7 +42,7 @@ public static void validateAll() throws IOException { monitor(); passive(); - AvroValidator.analyseNamingCollision(); + AvroValidator.analyseNamingCollision(true); } /** diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfig.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfig.java index 2b890e9e..ddeb5c39 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfig.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfig.java @@ -27,6 +27,7 @@ import java.util.Objects; import java.util.Set; import org.apache.avro.Schema; +import org.apache.avro.Schema.Field; import org.radarcns.config.YamlConfigLoader; /** @@ -41,13 +42,17 @@ public class SkipConfig { private static final String FILE_NAME = "skip.yml"; /** Wild card to suppress check for entire package. */ - private static final String WILD_CARD_PACKAGE = ".*"; + public static final String WILD_CARD_PACKAGE = ".*"; /** Wild card to suppress check for folder and subfolders. */ private static final String WILD_CARD_FOLDER = "**"; - private final Map setup = new HashMap<>(); + /** Wild card to suppress check all schemas. */ + public static final String WILD_CARD_COLLISION = "*"; + private final Set files = new HashSet<>(); + private final Map validation = new HashMap<>(); + private final Map> collision = new HashMap<>(); private static final SkipConfig CONFIG; @@ -71,8 +76,8 @@ public SkipConfig() { * @return TODO */ public static boolean contains(Schema schema) { - return CONFIG.setup.containsKey(schema.getNamespace().concat(WILD_CARD_PACKAGE)) - || CONFIG.setup.containsKey(schema.getFullName()); + return CONFIG.validation.containsKey(schema.getNamespace().concat(WILD_CARD_PACKAGE)) + || CONFIG.validation.containsKey(schema.getFullName()); } /** @@ -81,9 +86,9 @@ public static boolean contains(Schema schema) { * @return TODO */ public static boolean isNameRecordEnable(Schema schema) { - SkipConfigItem item = CONFIG.setup.get(schema.getFullName()) == null - ? CONFIG.setup.get(schema.getNamespace().concat(WILD_CARD_PACKAGE)) - : CONFIG.setup.get(schema.getFullName()); + SkipConfigItem item = CONFIG.validation.get(schema.getFullName()) == null + ? CONFIG.validation.get(schema.getNamespace().concat(WILD_CARD_PACKAGE)) + : CONFIG.validation.get(schema.getFullName()); return item == null || item.isNameRecordDisable(); } @@ -94,13 +99,47 @@ public static boolean isNameRecordEnable(Schema schema) { * @return TODO */ public static Set skippedNameFieldCheck(Schema schema) { - SkipConfigItem item = CONFIG.setup.get(schema.getFullName()) == null - ? CONFIG.setup.get(schema.getNamespace().concat(WILD_CARD_PACKAGE)) - : CONFIG.setup.get(schema.getFullName()); + SkipConfigItem item = CONFIG.validation.get(schema.getFullName()) == null + ? CONFIG.validation.get(schema.getNamespace().concat(WILD_CARD_PACKAGE)) + : CONFIG.validation.get(schema.getFullName()); return item == null ? new HashSet<>() : item.getFields(); } + /** + * TODO. + * @param schema TODO + * @param field TODO + * @return TODO + */ + public static boolean skipCollision(Schema schema, Field field) { + Set info = CONFIG.collision.getOrDefault(field.name(), new HashSet<>()); + if (info.contains(schema.getFullName()) || info.contains(WILD_CARD_COLLISION)) { + return true; + } + + for (String value : info) { + if (value.contains(WILD_CARD_PACKAGE) && schema.getNamespace().startsWith( + value.substring(0, value.length() - 2))) { + return true; + } + } + + return false; + } + + /** + * TODO. + * @param schema TODO + * @param field TODO + * @return TODO + */ + public static Set getCollision(Schema schema, Field field) { + Set set = CONFIG.collision.getOrDefault(field.name(), new HashSet<>()); + set.add(schema.getFullName()); + return set; + } + /** * TODO. * @param file TODO diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java index 5d9ab8c5..a28a4ec3 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java @@ -96,14 +96,17 @@ public static String getExtension(File file) { /** * TODO. + * @param reset TODO */ - public static void analyseNamingCollision() { + public static void analyseNamingCollision(boolean reset) { String message = SchemaValidator.analyseCollision().toString(); - if ("".equalsIgnoreCase(message)) { - LOGGER.warn(message); + if (!"".equalsIgnoreCase(message)) { + LOGGER.warn("Different schemas have fields with same names:\n{}", message); } - SchemaValidator.resetCollision(); + if (reset) { + SchemaValidator.resetCollision(); + } } } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java index 5044d8a6..056d23c2 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java @@ -16,9 +16,6 @@ * limitations under the License. */ -import static org.radarcns.validator.util.SchemaValidatorRole.TIME; -import static org.radarcns.validator.util.SchemaValidatorRole.TIME_COMPLETED; -import static org.radarcns.validator.util.SchemaValidatorRole.TIME_RECEIVED; import static org.radarcns.validator.util.SchemaValidatorRole.getActiveValidator; import static org.radarcns.validator.util.SchemaValidatorRole.getGeneralEnumValidator; import static org.radarcns.validator.util.SchemaValidatorRole.getGeneralRecordValidator; @@ -27,11 +24,11 @@ import java.io.IOException; import java.nio.file.Path; +import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Objects; import java.util.Set; import org.apache.avro.Schema; @@ -49,15 +46,9 @@ final class SchemaValidator { private static final Logger LOGGER = LoggerFactory.getLogger(SchemaValidator.class); - private static final Map> COLLISIONS = new HashMap<>(); + private static final Map> COLLISIONS = new HashMap<>(); - private static final Set AVOID_COLLISION_CHECK = new HashSet<>(); - - static { - AVOID_COLLISION_CHECK.add(TIME); - AVOID_COLLISION_CHECK.add(TIME_COMPLETED); - AVOID_COLLISION_CHECK.add(TIME_RECEIVED); - } + private static final Map CACHE = new HashMap<>(); private SchemaValidator() { //Static class @@ -96,6 +87,8 @@ public static ValidationResult validate(Schema schema, Path pathToSchema, NameFo Objects.requireNonNull(root); Objects.requireNonNull(subfolder); + CACHE.put(schema.getFullName(), schema); + ValidationResult result; if (schema.getType().equals(Type.ENUM)) { @@ -151,19 +144,14 @@ private static void computeCollision(Schema schema) { } for (Field field : schema.getFields()) { - - if (AVOID_COLLISION_CHECK.contains(field.name())) { + if (SkipConfig.skipCollision(schema, field)) { continue; } - List list = COLLISIONS.get(field.name()); - if (list == null) { - list = new LinkedList<>(); - list.add(schema); - COLLISIONS.put(field.name(), list); - } else { - list.add(schema); - } + Set collision = SkipConfig.getCollision(schema, field); + collision.addAll(COLLISIONS.getOrDefault(field.name(), new HashSet<>())); + + COLLISIONS.put(field.name(), collision); computeCollision(field.schema()); } } @@ -173,24 +161,18 @@ private static void computeCollision(Schema schema) { * @return TODO */ public static StringBuilder analyseCollision() { - int capacity = 100 * COLLISIONS.values().stream().mapToInt(List::size).sum() + int capacity = 100 * COLLISIONS.values().stream().mapToInt(Set::size).sum() + COLLISIONS.size() * 120 + 100; StringBuilder messageBuilder = new StringBuilder(capacity); COLLISIONS.entrySet().stream() .filter(entry -> entry.getValue().size() > 1) + .sorted(Comparator.comparing(Entry::getKey)) .forEach(entry -> { - messageBuilder.append(entry.getKey().concat(" appears in:\n")); + messageBuilder.append('\"').append(entry.getKey().concat("\" appears in:\n")); entry.getValue().stream().forEach( - schema -> messageBuilder.append("\t - " - .concat(schema.getFullName()) - .concat(" as ") - .concat(schema.getField(entry.getKey()) - .schema() - .getType() - .getName() - .toUpperCase()) - .concat("\n"))); + schemaName -> addFieldDetails(entry, schemaName, messageBuilder) + ); messageBuilder.append("In case they have different use-cases, please modify " + "the name field accordingly.\n"); @@ -199,6 +181,18 @@ public static StringBuilder analyseCollision() { return messageBuilder; } + private static void addFieldDetails(Entry> entry, String schemaName, + StringBuilder messageBuilder) { + if (schemaName.contains(SkipConfig.WILD_CARD_COLLISION) + || schemaName.contains(SkipConfig.WILD_CARD_PACKAGE)) { + messageBuilder.append("\t - ".concat(schemaName).concat("\n")); + } else { + messageBuilder.append("\t - ".concat(schemaName).concat(" as ").concat( + CACHE.get(schemaName).getField( + entry.getKey()).schema().getType().getName().toUpperCase()).concat("\n")); + } + } + /** * TODO. */ diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java index 0aefca3a..44ac39d8 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java @@ -23,6 +23,7 @@ import static org.radarcns.validator.CatalogValidator.NameFolder.MONITOR; import static org.radarcns.validator.util.SchemaValidator.analyseCollision; import static org.radarcns.validator.util.SchemaValidator.getPath; +import static org.radarcns.validator.util.SchemaValidator.resetCollision; import static org.radarcns.validator.util.SchemaValidator.validate; import java.io.IOException; @@ -71,18 +72,22 @@ public void testCollision() throws IOException { assertTrue(result.isValid()); - String expected = "userTestId appears in:\n" - + "\t - org.radarcns.kafka.key.KeyWindowedTest as STRING\n" + String expected = "\"sourceTestId\" appears in:\n" + "\t - org.radarcns.kafka.key.KeyMeasurementTest as STRING\n" + + "\t - org.radarcns.kafka.key.KeyWindowedTest as STRING\n" + "In case they have different use-cases, " + "please modify the name field accordingly.\n" - + "sourceTestId appears in:\n" - + "\t - org.radarcns.kafka.key.KeyWindowedTest as STRING\n" + + "\"userTestId\" appears in:\n" + "\t - org.radarcns.kafka.key.KeyMeasurementTest as STRING\n" + + "\t - org.radarcns.kafka.key.KeyWindowedTest as STRING\n" + "In case they have different use-cases, " + "please modify the name field accordingly.\n"; - assertEquals(expected, analyseCollision().toString()); + String actual = analyseCollision().toString(); + + resetCollision(); + + assertEquals(expected, actual); } @Test diff --git a/java-sdk/radar-schemas-validator/src/test/resources/skip.yml b/java-sdk/radar-schemas-validator/src/test/resources/skip.yml index 1a14075e..8c19b75c 100644 --- a/java-sdk/radar-schemas-validator/src/test/resources/skip.yml +++ b/java-sdk/radar-schemas-validator/src/test/resources/skip.yml @@ -1,17 +1,92 @@ -#====================== SKIP FILE =======================# +#============================= SKIP FILE =============================# files: - commons/**/README.md - specification/**/README.md -#=================== SKIP TEST CONFIGURATION ===================# -setup: - org.radarcns.passive.biovotion.*: - record_name_check: DISABLE - org.radarcns.passive.biovotion.BiovotionVSMSpO2: - record_name_check: DISABLE - fields: - - spO2 - - spO2Quality - org.radarcns.passive.empatica.EmpaticaE4InterBeatInterval: - fields: - - interBeatInterval +#====================== SKIP TEST CONFIGURATION ======================# +validation: + org.radarcns.passive.biovotion.*: + record_name_check: DISABLE + org.radarcns.passive.biovotion.BiovotionVSMSpO2: + record_name_check: DISABLE + fields: + - spO2 + - spO2Quality + org.radarcns.passive.empatica.EmpaticaE4InterBeatInterval: + fields: + - interBeatInterval + + +#=================== SKIP COLLISION CONFIGURATION ====================# +collision: + avg: + - org.radarcns.kafka.aggregator.AggregatorDouble + - org.radarcns.kafka.aggregator.AggregatorDoubleArray + batteryLevel: + - org.radarcns.passive.biovotion.BiovotionVSMBatteryState + - org.radarcns.passive.empatica.EmpaticaE4BatteryLevel + - org.radarcns.passive.pebble.Pebble2BatteryLevel + - org.radarcns.passive.phone.PhoneBatteryLevel + count: + - org.radarcns.kafka.aggregator.AggregatorDouble + - org.radarcns.kafka.aggregator.AggregatorDoubleArray + heartRate: + - org.radarcns.passive.biovotion.BiovotionVSMHeartRate + - org.radarcns.passive.pebble.Pebble2HeartRate + - org.radarcns.passive.pebble.Pebble2HeartRateFiltered + iqr: + - org.radarcns.kafka.aggregator.AggregatorDouble + - org.radarcns.kafka.aggregator.AggregatorDoubleArray + max: + - org.radarcns.kafka.aggregator.AggregatorDouble + - org.radarcns.kafka.aggregator.AggregatorDoubleArray + min: + - org.radarcns.kafka.aggregator.AggregatorDouble + - org.radarcns.kafka.aggregator.AggregatorDoubleArray + quartile: + - org.radarcns.kafka.aggregator.AggregatorDouble + - org.radarcns.kafka.aggregator.AggregatorDoubleArray + sourceId: + - org.radarcns.kafka.key.KeyMeasurement + - org.radarcns.kafka.key.KeyWindowed + sum: + - org.radarcns.kafka.aggregator.AggregatorDouble + - org.radarcns.kafka.aggregator.AggregatorDoubleArray + targetIsContact: + - org.radarcns.passive.phone.PhoneCall + - org.radarcns.passive.phone.PhoneSms + temperature: + - org.radarcns.passive.biovotion.BiovotionVSMTemperature + - org.radarcns.passive.empatica.EmpaticaE4Temperature + time: + - org.radarcns.active.* + - org.radarcns.monitor.* + - org.radarcns.passive.* + timeReceived: + - org.radarcns.passive.* + timeCompleted: + - org.radarcns.active.* + userId: + - org.radarcns.kafka.key.KeyMeasurement + - org.radarcns.kafka.key.KeyWindowed + x: + - org.radarcns.passive.biovotion.BiovotionVSMAcceleration + - org.radarcns.passive.empatica.EmpaticaE4Acceleration + - org.radarcns.passive.pebble.Pebble2Acceleration + - org.radarcns.passive.phone.PhoneAcceleration + - org.radarcns.passive.phone.PhoneGyroscope + - org.radarcns.passive.phone.PhoneMagneticField + y: + - org.radarcns.passive.biovotion.BiovotionVSMAcceleration + - org.radarcns.passive.empatica.EmpaticaE4Acceleration + - org.radarcns.passive.pebble.Pebble2Acceleration + - org.radarcns.passive.phone.PhoneAcceleration + - org.radarcns.passive.phone.PhoneGyroscope + - org.radarcns.passive.phone.PhoneMagneticField + z: + - org.radarcns.passive.biovotion.BiovotionVSMAcceleration + - org.radarcns.passive.empatica.EmpaticaE4Acceleration + - org.radarcns.passive.pebble.Pebble2Acceleration + - org.radarcns.passive.phone.PhoneAcceleration + - org.radarcns.passive.phone.PhoneGyroscope + - org.radarcns.passive.phone.PhoneMagneticField From 336b1f23ead2f4586e1ce8f05a56f013d3f07a85 Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Fri, 28 Jul 2017 17:25:36 +0100 Subject: [PATCH 030/112] Fixed README --- java-sdk/radar-schemas-validator/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java-sdk/radar-schemas-validator/README.md b/java-sdk/radar-schemas-validator/README.md index 6e8e7923..76e4fa00 100644 --- a/java-sdk/radar-schemas-validator/README.md +++ b/java-sdk/radar-schemas-validator/README.md @@ -43,7 +43,7 @@ The validation is implemented as a `JUnit` test. To run the validation, simply t ## Suppress checks -Record name and field name validations can be suppressed modifying the [skip](src/test/resources/skip.yml) configuration file. +Record name, field name validations, and field name collision check can be suppressed modifying the [skip](src/test/resources/skip.yml) configuration file. `files` lists files paths that do not need to take into account. All tests are enable by default. From 23b4de31a0e33269cd7d811461c6a3536c69b98b Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Fri, 28 Jul 2017 17:37:57 +0100 Subject: [PATCH 031/112] Fixed typos --- java-sdk/radar-schemas-validator/README.md | 62 ++++++++++++---------- 1 file changed, 34 insertions(+), 28 deletions(-) diff --git a/java-sdk/radar-schemas-validator/README.md b/java-sdk/radar-schemas-validator/README.md index 76e4fa00..37753e33 100644 --- a/java-sdk/radar-schemas-validator/README.md +++ b/java-sdk/radar-schemas-validator/README.md @@ -1,8 +1,8 @@ # RADAR Schemas Validator -The RADAR Schemas Validator checks if the Schema Catalog is in a valid state. +The RADAR Schemas Validator checks if the `Schema Catalog` is in a valid state. -It first checks that the folder structure match the following design: +It first checks the folder structure, it has to be compliant with: - commons * active * kafka @@ -14,28 +14,28 @@ It first checks that the folder structure match the following design: * monitor * passive -For each Avro schema under `commons` folder checks: +For each Avro schema under `commons` folder checks if: - in case of `ENUM` * the `namespace` differs from null and it is a lowercase string dot separated without numeric * the `name` matches the .avsc file name and it is an UpperCamelCase string - * the is documentation + * there is documentation * `symbols` match UPPER_CASE format - * it contains the `UNKNOWN` symbol + * the `UNKNOWN` symbol is present - in case of `RECORD` * the `namespace` differs from null and it is a lowercase string dot separated without numeric * the `name` matches the .avsc file name and it is an UpperCamelCase string - * it contains fields + * fields is not empty * the `field name` is a lowerCamelCase string and does not contain string such as `value`, `Value`, `val` and `Val`. - * schemas under `active` folder have `time` and `timeCompleted`, do not have a field named `timeReceived` - * schemas under `monitor` folder have `time`, do not have a field named either `timeCompleted` or `timeReceived` - * schemas under `passive` folder have `time` and `timeReceived`, do not have a field named `timeCompleted` + * schemas under `active` folder have `time` and `timeCompleted` fields, and do not contain a field named `timeReceived` + * schemas under `monitor` folder have `time` field, and do not contain a field named either `timeCompleted` or `timeReceived` + * schemas under `passive` folder have `time` and `timeReceived` fields, and do not have a field named `timeCompleted` * the record and any provided fields are documented * `ENUM` fields have `UNKNOWN` as `default` value * `nullable`/`optional` fields have `null` as default value -The validation process generates a field name collision summary. It is shown to the end user only in case of collisions. +The validation process generates a field name collision summary. It is shown to the end user only in presence of collisions. -Upon rule violation, the end user is notfied with a message explaining how to fix the issue. +Upon rule violation, the end user is notified with a message explaining how to fix it. ## How to use @@ -45,26 +45,33 @@ The validation is implemented as a `JUnit` test. To run the validation, simply t Record name, field name validations, and field name collision check can be suppressed modifying the [skip](src/test/resources/skip.yml) configuration file. -`files` lists files paths that do not need to take into account. All tests are enable by default. - -```yaml -schema_to_skip: - - record_name_check: [ENABLE | DISABLE] - fields: - - fieldnameOne - - fieldnameTwo -``` - -It can contain +`files` lists file paths that can be ignored. It can contain values like - entire path like `commons/active/questionnaire/questionnaire.avsc` - folder and subfolder `commons/active/**`: all file under `active` and all its subfolder will be skipped - folder and subfolder `commons/active/**/*.avsc`: all file with format `avsc` under `active` and all its subfolder will be skipped -`validation` allows the user to specify what checks should be skipped at schema level: +```yaml +files: + - path/to/avoid/README.md + - path/to/** + - path/to/**/README.md +``` + +`validation` allows the user to specify checks that should be skipped at schema level: - a key like `org.radarcns.passive.biovotion.*` set a skip configuration valid for all schemas under `org.radarcns.passive.biovotion` package - a key like `org.radarcns.passive.biovotion.BiovotionVSMSpO2` specify a configuration valid only for the given record - `name_record_check: DISABLE` suppresses the record name check -- `fields` lists all field name for which the field check is suppressed +- `fields` lists field names for which the field name check is suppressed +All tests are enable by default. + +```yaml +validation: + schema_to_skip: + - record_name_check: [ ENABLE | DISABLE ] + fields: + - fieldnameOne + - fieldnameTwo +``` `collision` can be set to suppress collision checks: @@ -75,7 +82,6 @@ field_name: ``` The schema can be specified as follow: -- `*` turns off the collision check for all schemas for the given field name -- `schema.to.skip.*` turns off the collision check also for all schemas under the package `schema.to.skip`. In case `field_name` appears in another schemas contained in a different package, the collision check will highlight this -- `schema.to.skip.one` turns off the collision check also for the set schema. In case `field_name` appears in another schemas, the collision check will highlight this - +- `*` turns off collision check for all schemas +- `schema.to.skip.*` turns off collision check in package `schema.to.skip`. In case `field_name` appears in other schemas contained in a different package, the collision check will then highlight this +- `schema.to.skip.one` turns off the collision check only for the set schema. In case `field_name` appears in other schemas, the collision check will highlight this From 22a4c5919871884ed8e9baa923b597924a7d0ea8 Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Fri, 28 Jul 2017 17:38:33 +0100 Subject: [PATCH 032/112] New example --- java-sdk/radar-schemas-validator/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java-sdk/radar-schemas-validator/README.md b/java-sdk/radar-schemas-validator/README.md index 37753e33..c976446d 100644 --- a/java-sdk/radar-schemas-validator/README.md +++ b/java-sdk/radar-schemas-validator/README.md @@ -77,7 +77,8 @@ validation: ```yaml field_name: - - schema.to.skip.one + - * + - schema.to.skip.* - schema.to.skip.two ``` From 74664dd08d81716ebe50c031ff002c6276eb7a76 Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Mon, 31 Jul 2017 13:44:55 +0100 Subject: [PATCH 033/112] Fixed Biovotion name convention --- ...sm_acceleration.avsc => biovotion_everion_acceleration.avsc} | 2 +- ..._battery_state.avsc => biovotion_everion_battery_state.avsc} | 2 +- ..._pulse_wave.avsc => biovotion_everion_blood_pulse_wave.avsc} | 2 +- ...{biovotion_vsm_energy.avsc => biovotion_everion_energy.avsc} | 2 +- ...ponse.avsc => biovotion_everion_galvanic_skin_response.avsc} | 2 +- ...on_vsm_heart_rate.avsc => biovotion_everion_heart_rate.avsc} | 2 +- ...ility.avsc => biovotion_everion_heart_rate_variability.avsc} | 2 +- ..._vsm_led_current.avsc => biovotion_everion_led_current.avsc} | 2 +- ...iovotion_vsm_ppg_raw.avsc => biovotion_everion_ppg_raw.avsc} | 2 +- ...ration_rate.avsc => biovotion_everion_respiration_rate.avsc} | 2 +- .../{biovotion_vsm_spo2.avsc => biovotion_everion_spo2.avsc} | 2 +- ..._vsm_temperature.avsc => biovotion_everion_temperature.avsc} | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) rename commons/passive/biovotion/{biovotion_vsm_acceleration.avsc => biovotion_everion_acceleration.avsc} (93%) rename commons/passive/biovotion/{biovotion_vsm_battery_state.avsc => biovotion_everion_battery_state.avsc} (94%) rename commons/passive/biovotion/{biovotion_vsm_blood_pulse_wave.avsc => biovotion_everion_blood_pulse_wave.avsc} (92%) rename commons/passive/biovotion/{biovotion_vsm_energy.avsc => biovotion_everion_energy.avsc} (93%) rename commons/passive/biovotion/{biovotion_vsm_galvanic_skin_response.avsc => biovotion_everion_galvanic_skin_response.avsc} (90%) rename commons/passive/biovotion/{biovotion_vsm_heart_rate.avsc => biovotion_everion_heart_rate.avsc} (92%) rename commons/passive/biovotion/{biovotion_vsm_heart_rate_variability.avsc => biovotion_everion_heart_rate_variability.avsc} (91%) rename commons/passive/biovotion/{biovotion_vsm_led_current.avsc => biovotion_everion_led_current.avsc} (93%) rename commons/passive/biovotion/{biovotion_vsm_ppg_raw.avsc => biovotion_everion_ppg_raw.avsc} (95%) rename commons/passive/biovotion/{biovotion_vsm_respiration_rate.avsc => biovotion_everion_respiration_rate.avsc} (92%) rename commons/passive/biovotion/{biovotion_vsm_spo2.avsc => biovotion_everion_spo2.avsc} (93%) rename commons/passive/biovotion/{biovotion_vsm_temperature.avsc => biovotion_everion_temperature.avsc} (93%) diff --git a/commons/passive/biovotion/biovotion_vsm_acceleration.avsc b/commons/passive/biovotion/biovotion_everion_acceleration.avsc similarity index 93% rename from commons/passive/biovotion/biovotion_vsm_acceleration.avsc rename to commons/passive/biovotion/biovotion_everion_acceleration.avsc index f83c7db3..3d563a18 100644 --- a/commons/passive/biovotion/biovotion_vsm_acceleration.avsc +++ b/commons/passive/biovotion/biovotion_everion_acceleration.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.passive.biovotion", "type": "record", - "name": "BiovotionVSMAcceleration", + "name": "BiovotionEverionAcceleration", "doc": "Data from 3-axis accelerometer sensor with gravitational constant g as unit.", "fields": [ { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, diff --git a/commons/passive/biovotion/biovotion_vsm_battery_state.avsc b/commons/passive/biovotion/biovotion_everion_battery_state.avsc similarity index 94% rename from commons/passive/biovotion/biovotion_vsm_battery_state.avsc rename to commons/passive/biovotion/biovotion_everion_battery_state.avsc index 4a2fc7b3..86bf4073 100644 --- a/commons/passive/biovotion/biovotion_vsm_battery_state.avsc +++ b/commons/passive/biovotion/biovotion_everion_battery_state.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.passive.biovotion", "type": "record", - "name": "BiovotionVSMBatteryState", + "name": "BiovotionEverionBatteryState", "doc": "Device battery state.", "fields": [ { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, diff --git a/commons/passive/biovotion/biovotion_vsm_blood_pulse_wave.avsc b/commons/passive/biovotion/biovotion_everion_blood_pulse_wave.avsc similarity index 92% rename from commons/passive/biovotion/biovotion_vsm_blood_pulse_wave.avsc rename to commons/passive/biovotion/biovotion_everion_blood_pulse_wave.avsc index a8958f8b..c2d3c4df 100644 --- a/commons/passive/biovotion/biovotion_vsm_blood_pulse_wave.avsc +++ b/commons/passive/biovotion/biovotion_everion_blood_pulse_wave.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.passive.biovotion", "type": "record", - "name": "BiovotionVSMBloodPulseWave", + "name": "BiovotionEverionBloodPulseWave", "doc": "Blood pulse wave data calculated by biovotion device.", "fields": [ { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, diff --git a/commons/passive/biovotion/biovotion_vsm_energy.avsc b/commons/passive/biovotion/biovotion_everion_energy.avsc similarity index 93% rename from commons/passive/biovotion/biovotion_vsm_energy.avsc rename to commons/passive/biovotion/biovotion_everion_energy.avsc index 2c1782f5..41561f5f 100644 --- a/commons/passive/biovotion/biovotion_vsm_energy.avsc +++ b/commons/passive/biovotion/biovotion_everion_energy.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.passive.biovotion", "type": "record", - "name": "BiovotionVSMEnergy", + "name": "BiovotionEverionEnergy", "doc": "Energy expenditure data calculated by biovotion device.", "fields": [ { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, diff --git a/commons/passive/biovotion/biovotion_vsm_galvanic_skin_response.avsc b/commons/passive/biovotion/biovotion_everion_galvanic_skin_response.avsc similarity index 90% rename from commons/passive/biovotion/biovotion_vsm_galvanic_skin_response.avsc rename to commons/passive/biovotion/biovotion_everion_galvanic_skin_response.avsc index 3812fc6c..7cda3977 100644 --- a/commons/passive/biovotion/biovotion_vsm_galvanic_skin_response.avsc +++ b/commons/passive/biovotion/biovotion_everion_galvanic_skin_response.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.passive.biovotion", "type": "record", - "name": "BiovotionVSMGalvanicSkinResponse", + "name": "BiovotionEverionGalvanicSkinResponse", "doc": "Raw galvanic skin response data.", "fields": [ { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, diff --git a/commons/passive/biovotion/biovotion_vsm_heart_rate.avsc b/commons/passive/biovotion/biovotion_everion_heart_rate.avsc similarity index 92% rename from commons/passive/biovotion/biovotion_vsm_heart_rate.avsc rename to commons/passive/biovotion/biovotion_everion_heart_rate.avsc index 546b7173..5a745c88 100644 --- a/commons/passive/biovotion/biovotion_vsm_heart_rate.avsc +++ b/commons/passive/biovotion/biovotion_everion_heart_rate.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.passive.biovotion", "type": "record", - "name": "BiovotionVSMHeartRate", + "name": "BiovotionEverionHeartRate", "doc": "Heart rate calculated by biovotion device.", "fields": [ { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, diff --git a/commons/passive/biovotion/biovotion_vsm_heart_rate_variability.avsc b/commons/passive/biovotion/biovotion_everion_heart_rate_variability.avsc similarity index 91% rename from commons/passive/biovotion/biovotion_vsm_heart_rate_variability.avsc rename to commons/passive/biovotion/biovotion_everion_heart_rate_variability.avsc index 59aa9bbb..d655f3ab 100644 --- a/commons/passive/biovotion/biovotion_vsm_heart_rate_variability.avsc +++ b/commons/passive/biovotion/biovotion_everion_heart_rate_variability.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.passive.biovotion", "type": "record", - "name": "BiovotionVSMHeartRateVariability", + "name": "BiovotionEverionHeartRateVariability", "doc": "Heart rate variability data calculated by biovotion device.", "fields": [ {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, diff --git a/commons/passive/biovotion/biovotion_vsm_led_current.avsc b/commons/passive/biovotion/biovotion_everion_led_current.avsc similarity index 93% rename from commons/passive/biovotion/biovotion_vsm_led_current.avsc rename to commons/passive/biovotion/biovotion_everion_led_current.avsc index fd9dccb5..0e3091e3 100644 --- a/commons/passive/biovotion/biovotion_vsm_led_current.avsc +++ b/commons/passive/biovotion/biovotion_everion_led_current.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.passive.biovotion", "type": "record", - "name": "BiovotionVSMLedCurrent", + "name": "BiovotionEverionLedCurrent", "doc": "Applied current for red, green and ir leds.", "fields": [ {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, diff --git a/commons/passive/biovotion/biovotion_vsm_ppg_raw.avsc b/commons/passive/biovotion/biovotion_everion_ppg_raw.avsc similarity index 95% rename from commons/passive/biovotion/biovotion_vsm_ppg_raw.avsc rename to commons/passive/biovotion/biovotion_everion_ppg_raw.avsc index 72cda863..3a3069a3 100644 --- a/commons/passive/biovotion/biovotion_vsm_ppg_raw.avsc +++ b/commons/passive/biovotion/biovotion_everion_ppg_raw.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.passive.biovotion", "type": "record", - "name": "BiovotionVSMPhotoRaw", + "name": "BiovotionEverionPpgRaw", "doc": "Raw 14bit Photodiode ADC data for red, green, IR and dark portions (PPG raw data).", "fields": [ {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, diff --git a/commons/passive/biovotion/biovotion_vsm_respiration_rate.avsc b/commons/passive/biovotion/biovotion_everion_respiration_rate.avsc similarity index 92% rename from commons/passive/biovotion/biovotion_vsm_respiration_rate.avsc rename to commons/passive/biovotion/biovotion_everion_respiration_rate.avsc index 8a4f278d..22563a2d 100644 --- a/commons/passive/biovotion/biovotion_vsm_respiration_rate.avsc +++ b/commons/passive/biovotion/biovotion_everion_respiration_rate.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.passive.biovotion", "type": "record", - "name": "BiovotionVSMRespirationRate", + "name": "BiovotionEverionRespirationRate", "doc": "Respiration rate data calculated by biovotion device.", "fields": [ {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, diff --git a/commons/passive/biovotion/biovotion_vsm_spo2.avsc b/commons/passive/biovotion/biovotion_everion_spo2.avsc similarity index 93% rename from commons/passive/biovotion/biovotion_vsm_spo2.avsc rename to commons/passive/biovotion/biovotion_everion_spo2.avsc index 773c7a18..59c86704 100644 --- a/commons/passive/biovotion/biovotion_vsm_spo2.avsc +++ b/commons/passive/biovotion/biovotion_everion_spo2.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.passive.biovotion", "type": "record", - "name": "BiovotionVSMSpO2", + "name": "BiovotionEverionSpO2", "doc": "Peripheral capillary oxygen saturation (SpO2) calculated by biovotion device.", "fields": [ {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, diff --git a/commons/passive/biovotion/biovotion_vsm_temperature.avsc b/commons/passive/biovotion/biovotion_everion_temperature.avsc similarity index 93% rename from commons/passive/biovotion/biovotion_vsm_temperature.avsc rename to commons/passive/biovotion/biovotion_everion_temperature.avsc index 5fa8a124..b6706637 100644 --- a/commons/passive/biovotion/biovotion_vsm_temperature.avsc +++ b/commons/passive/biovotion/biovotion_everion_temperature.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.passive.biovotion", "type": "record", - "name": "BiovotionVSMTemperature", + "name": "BiovotionEverionTemperature", "doc": "Data from temperature sensor expressed in degrees on the Celsius (°C) scale.", "fields": [ {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, From 468f3c8084fb947eb4e30bcca6a81a2aaf7241eb Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Mon, 31 Jul 2017 13:45:16 +0100 Subject: [PATCH 034/112] Fixed skip function --- java-sdk/radar-schemas-validator/README.md | 4 + .../radarcns/validator/CatalogValidator.java | 6 ++ .../radarcns/validator/CommonsValidator.java | 2 - .../radarcns/validator/config/SkipConfig.java | 85 ++++++++++++------- .../validator/util/AvroValidator.java | 20 ++++- .../validator/util/SchemaValidatorTest.java | 2 + .../src/test/resources/logback.xml | 2 +- .../src/test/resources/skip.yml | 26 +++--- 8 files changed, 98 insertions(+), 49 deletions(-) diff --git a/java-sdk/radar-schemas-validator/README.md b/java-sdk/radar-schemas-validator/README.md index c976446d..bf96b953 100644 --- a/java-sdk/radar-schemas-validator/README.md +++ b/java-sdk/radar-schemas-validator/README.md @@ -49,12 +49,16 @@ Record name, field name validations, and field name collision check can be suppr - entire path like `commons/active/questionnaire/questionnaire.avsc` - folder and subfolder `commons/active/**`: all file under `active` and all its subfolder will be skipped - folder and subfolder `commons/active/**/*.avsc`: all file with format `avsc` under `active` and all its subfolder will be skipped +- file name `.DS_Store`: all file named `.DS_Store` will be skipped +- file extension `*.md`: all file with extension `*.md` will be skipped ```yaml files: - path/to/avoid/README.md - path/to/** - path/to/**/README.md + - .DS_Store + - *.md ``` `validation` allows the user to specify checks that should be skipped at schema level: diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CatalogValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CatalogValidator.java index f7d27b86..69403a02 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CatalogValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CatalogValidator.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; +import org.junit.Before; import org.junit.Test; /** @@ -146,6 +147,11 @@ public File getFolder() { } } + @Before + public void validateSkipConfig() { + //TODO + } + @Test public void commons() throws IOException { assertEquals(true, RootFolder.COMMONS.getFolder().isDirectory()); diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java index 2201b49a..de3173ad 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java @@ -26,8 +26,6 @@ */ public final class CommonsValidator { - //private static final Logger LOGGER = LoggerFactory.getLogger(CommonsValidator.class); - private CommonsValidator() { //Static class } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfig.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfig.java index ddeb5c39..14317e9d 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfig.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfig.java @@ -24,7 +24,6 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Map; -import java.util.Objects; import java.util.Set; import org.apache.avro.Schema; import org.apache.avro.Schema.Field; @@ -44,8 +43,11 @@ public class SkipConfig { /** Wild card to suppress check for entire package. */ public static final String WILD_CARD_PACKAGE = ".*"; + /** Wild card to suppress check for all file extension. */ + public static final String WILD_CARD_FILE_NAME = "*."; + /** Wild card to suppress check for folder and subfolders. */ - private static final String WILD_CARD_FOLDER = "**"; + public static final String WILD_CARD_FOLDER = "**"; /** Wild card to suppress check all schemas. */ public static final String WILD_CARD_COLLISION = "*"; @@ -146,43 +148,64 @@ public static Set getCollision(Schema schema, Field field) { * @return TODO */ public static boolean skipFile(File file) { - Objects.requireNonNull(file); - - String path = file.toPath().toString().substring( - file.toPath().toString().indexOf(REPOSITORY_NAME)); - path = path.substring(REPOSITORY_NAME.length()); - String[] components = path.split(File.separator); + return skipFile(file, CONFIG.files); + } + /** + * TODO. + * @param file TODO + * @param pathToSkip TODO + * @return TODO + */ + @SuppressWarnings({"PMD.ModifiedCyclomaticComplexity", "PMD.StdCyclomaticComplexity"}) + //TODO simplify function + protected static boolean skipFile(File file, Set pathToSkip) { boolean flag = false; - for (Path pathConfig : CONFIG.files) { - if (pathConfig.startsWith(components[0])) { - String[] tempComp = pathConfig.toString().split(File.separator); - - boolean match = true; - - for (int i = 1; i < tempComp.length; i++) { - if (!tempComp[i].equalsIgnoreCase(components[i])) { - match = false; - if (tempComp[i].equalsIgnoreCase(WILD_CARD_FOLDER)) { - if (i + 1 < tempComp.length) { - if (tempComp[i + 1].startsWith("*.")) { - //Case file format - flag = flag || getExtension(file).equalsIgnoreCase( - tempComp[i + 1].substring(2)); - } else if (tempComp[i + 1].contains(".")) { - //Case file name - flag = flag || file.getName().matches(tempComp[i + 1]); + String pathString = file.toPath().toString().substring(file.toPath().toString().indexOf( + REPOSITORY_NAME)); + pathString = pathString.substring(REPOSITORY_NAME.length()); + String[] components = pathString.split(File.separator); + + for (Path path : pathToSkip) { + if (path.getFileName().equals(path)) { + if (path.toString().startsWith(WILD_CARD_FILE_NAME)) { + //Case extension + flag = flag || getExtension(file).equals(path.toString().substring(2)); + } else { + //Case file name + flag = flag || file.getName().equals(path.getFileName().toString()); + } + } else { + if (pathString.equals(path.toString())) { + //Exact match + flag = true; + } else { + //Search sub-path + String[] configComp = path.toString().split(File.separator); + + for (int i = 0; i < Math.min(configComp.length, components.length); i++) { + if (!components[i].equals(configComp[i])) { + if (configComp[i].equals(WILD_CARD_FOLDER)) { + if (i == configComp.length - 1) { + //Case folder and subfolder file independent + flag = true; + } else { + if (configComp[i + 1].startsWith(WILD_CARD_FILE_NAME)) { + //Case extension + flag = flag || getExtension(file).equals( + configComp[i + 1].substring(2)); + } else { + //Case name + flag = flag || file.getName().equals(configComp[i + 1]); + } } - } else { - flag = flag || true; } + + break; } } } - - //Case exact matching - flag = flag || match; } } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java index a28a4ec3..2d5dd0d3 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java @@ -16,7 +16,6 @@ * limitations under the License. */ -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.File; @@ -51,9 +50,13 @@ public static void analiseFiles(File file, NameFolder packageName, String parent for (File son : file.listFiles()) { analiseFiles(son, packageName, file.getName()); } - } else if (!SkipConfig.skipFile(file)) { - assertEquals(packageName + "should contain only " + AVRO_FORMAT + " files", - AVRO_FORMAT, getExtension(file)); + } else if (SkipConfig.skipFile(file)) { + LOGGER.info("Skipping {}", file.getAbsolutePath()); + } else { + assertTrue(packageName.getName().concat(" should contain only ") + .concat(AVRO_FORMAT).concat(" files. ") + .concat(file.getAbsolutePath()).concat(" is invalid."), + isAvscFile(file)); Schema schema = new Parser().parse(file); @@ -79,6 +82,15 @@ private static String getMessage(ValidationResult result) { return messageBuilder.toString(); } + /** + * TODO. + * @param file TODO + * @return TODO + */ + public static boolean isAvscFile(File file) { + return AVRO_FORMAT.equals(getExtension(file)); + } + /** * TODO. * @param file TODO. diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java index 44ac39d8..860642ac 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java @@ -52,6 +52,8 @@ public void testGetPath() { @Test public void testCollision() throws IOException { + resetCollision(); + Parser parser = new Parser(); String folder = "key"; diff --git a/java-sdk/radar-schemas-validator/src/test/resources/logback.xml b/java-sdk/radar-schemas-validator/src/test/resources/logback.xml index 4596615d..58f76877 100644 --- a/java-sdk/radar-schemas-validator/src/test/resources/logback.xml +++ b/java-sdk/radar-schemas-validator/src/test/resources/logback.xml @@ -3,7 +3,7 @@ - %date{yyyy-MM-dd HH:mm:ss,UTC} UTC [%.2thread] %-5level - %msg [%logger:%line] %n + %date{yyyy-MM-dd HH:mm:ss,UTC} UTC %-5level - %msg [%logger:%line] %n diff --git a/java-sdk/radar-schemas-validator/src/test/resources/skip.yml b/java-sdk/radar-schemas-validator/src/test/resources/skip.yml index 8c19b75c..0a3c43f1 100644 --- a/java-sdk/radar-schemas-validator/src/test/resources/skip.yml +++ b/java-sdk/radar-schemas-validator/src/test/resources/skip.yml @@ -1,13 +1,11 @@ #============================= SKIP FILE =============================# files: - - commons/**/README.md - - specification/**/README.md + - README.md + - .DS_Store #====================== SKIP TEST CONFIGURATION ======================# validation: - org.radarcns.passive.biovotion.*: - record_name_check: DISABLE - org.radarcns.passive.biovotion.BiovotionVSMSpO2: + org.radarcns.passive.biovotion.BiovotionEverionSpO2: record_name_check: DISABLE fields: - spO2 @@ -23,7 +21,7 @@ collision: - org.radarcns.kafka.aggregator.AggregatorDouble - org.radarcns.kafka.aggregator.AggregatorDoubleArray batteryLevel: - - org.radarcns.passive.biovotion.BiovotionVSMBatteryState + - org.radarcns.passive.biovotion.BiovotionEverionBatteryState - org.radarcns.passive.empatica.EmpaticaE4BatteryLevel - org.radarcns.passive.pebble.Pebble2BatteryLevel - org.radarcns.passive.phone.PhoneBatteryLevel @@ -31,7 +29,7 @@ collision: - org.radarcns.kafka.aggregator.AggregatorDouble - org.radarcns.kafka.aggregator.AggregatorDoubleArray heartRate: - - org.radarcns.passive.biovotion.BiovotionVSMHeartRate + - org.radarcns.passive.biovotion.BiovotionEverionHeartRate - org.radarcns.passive.pebble.Pebble2HeartRate - org.radarcns.passive.pebble.Pebble2HeartRateFiltered iqr: @@ -52,12 +50,18 @@ collision: sum: - org.radarcns.kafka.aggregator.AggregatorDouble - org.radarcns.kafka.aggregator.AggregatorDoubleArray + target: + - org.radarcns.passive.phone.PhoneCall + - org.radarcns.passive.phone.PhoneSms targetIsContact: - org.radarcns.passive.phone.PhoneCall - org.radarcns.passive.phone.PhoneSms temperature: - - org.radarcns.passive.biovotion.BiovotionVSMTemperature + - org.radarcns.passive.biovotion.BiovotionEverionTemperature - org.radarcns.passive.empatica.EmpaticaE4Temperature + type: + - org.radarcns.passive.phone.PhoneCall + - org.radarcns.passive.phone.PhoneSms time: - org.radarcns.active.* - org.radarcns.monitor.* @@ -70,21 +74,21 @@ collision: - org.radarcns.kafka.key.KeyMeasurement - org.radarcns.kafka.key.KeyWindowed x: - - org.radarcns.passive.biovotion.BiovotionVSMAcceleration + - org.radarcns.passive.biovotion.BiovotionEverionAcceleration - org.radarcns.passive.empatica.EmpaticaE4Acceleration - org.radarcns.passive.pebble.Pebble2Acceleration - org.radarcns.passive.phone.PhoneAcceleration - org.radarcns.passive.phone.PhoneGyroscope - org.radarcns.passive.phone.PhoneMagneticField y: - - org.radarcns.passive.biovotion.BiovotionVSMAcceleration + - org.radarcns.passive.biovotion.BiovotionEverionAcceleration - org.radarcns.passive.empatica.EmpaticaE4Acceleration - org.radarcns.passive.pebble.Pebble2Acceleration - org.radarcns.passive.phone.PhoneAcceleration - org.radarcns.passive.phone.PhoneGyroscope - org.radarcns.passive.phone.PhoneMagneticField z: - - org.radarcns.passive.biovotion.BiovotionVSMAcceleration + - org.radarcns.passive.biovotion.BiovotionEverionAcceleration - org.radarcns.passive.empatica.EmpaticaE4Acceleration - org.radarcns.passive.pebble.Pebble2Acceleration - org.radarcns.passive.phone.PhoneAcceleration From 7d683613c54da546c4ddfaf2ffe71b8568aa3ae1 Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Mon, 31 Jul 2017 13:46:33 +0100 Subject: [PATCH 035/112] Added SkipConfig Unit test --- .../validator/config/SkipConfigTest.java | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfigTest.java diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfigTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfigTest.java new file mode 100644 index 00000000..1f441d75 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfigTest.java @@ -0,0 +1,87 @@ +package org.radarcns.validator.config; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.radarcns.validator.config.SkipConfig.skipFile; + +import java.io.File; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashSet; +import java.util.Set; +import org.junit.Test; + +/** + * TODO. + */ +public class SkipConfigTest { + + @Test + public void testGetPath() { + String root = "/Users/developer/Repositories/RADAR-Schemas/"; + + Set skipPaths = new HashSet<>(); + + skipPaths.add(Paths.get(".DS_Store")); + + assertTrue(skipFile(new File(root.concat("commons/passive/.DS_Store")), skipPaths)); + assertTrue(skipFile(new File(root.concat(".DS_Store")), skipPaths)); + + skipPaths.clear(); + skipPaths.add(Paths.get("*.md")); + + assertTrue(skipFile(new File(root.concat("commons/passive/empatica/README.md")), + skipPaths)); + assertFalse(skipFile(new File(root.concat("specification/passive/schema.avsc")), + skipPaths)); + + skipPaths.clear(); + skipPaths.add(Paths.get("commons/**")); + + assertTrue(skipFile(new File(root.concat("commons/passive/empatica/README.md")), + skipPaths)); + assertFalse(skipFile(new File(root.concat("specification/passive/README.md")), + skipPaths)); + + skipPaths.clear(); + skipPaths.add(Paths.get("commons/**/README.md")); + + assertTrue(skipFile(new File(root.concat("commons/passive/empatica/README.md")), + skipPaths)); + assertFalse(skipFile(new File(root.concat("specification/passive/README.md")), + skipPaths)); + + skipPaths.add(Paths.get("commons/monitor/application/application_external_time.avsc")); + assertTrue(skipFile(new File(root.concat("commons/monitor/application/" + + "application_external_time.avsc")), skipPaths)); + assertFalse(skipFile(new File(root.concat("commons/passive/application/" + + "application_external_time.avsc")), skipPaths)); + assertFalse(skipFile(new File(root.concat("commons/monitor/application/" + + "application_record_counts.avsc")), skipPaths)); + + skipPaths.add(Paths.get("commons/**/*.avsc")); + assertTrue(skipFile(new File(root.concat("commons/monitor/application/" + + "application_external_time.avsc")), skipPaths)); + assertFalse(skipFile(new File(root.concat("restapi/data/acceleration.avsc")), skipPaths)); + } + + + + +} From 775aa8e05f0c67b8db683e3a9cdfe5a4d11cbbeb Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Mon, 31 Jul 2017 16:15:15 +0100 Subject: [PATCH 036/112] Added Skip config validation --- java-sdk/build.gradle | 6 +-- .../radarcns/validator/CatalogValidator.java | 8 +-- .../radarcns/validator/config/SkipConfig.java | 54 +++++++++++++++++++ .../validator/config/SkipConfigTest.java | 27 ++++++++-- .../src/test/resources/skip.yml | 1 - 5 files changed, 86 insertions(+), 10 deletions(-) diff --git a/java-sdk/build.gradle b/java-sdk/build.gradle index a5afb848..fdd97bca 100644 --- a/java-sdk/build.gradle +++ b/java-sdk/build.gradle @@ -15,7 +15,7 @@ subprojects { apply plugin: 'maven-publish' // Configuration - version = '0.1.1-alpha.2' + version = '0.2-alpha.2' group = 'org.radarcns' ext.githubRepoName = 'RADAR-CNS/RADAR-Schemas' @@ -24,8 +24,8 @@ subprojects { ext.avroVersion = '1.8.1' - ext.githubUrl = 'https://github.com/' + githubRepoName + '.git' - ext.issueUrl = 'https://github.com/' + githubRepoName + '/issues' + ext.githubUrl = "https://github.com/${githubRepoName}.git" + ext.issueUrl = "https://github.com/${githubRepoName}/issues" ext.website = 'http://radar-cns.org' // dependencies diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CatalogValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CatalogValidator.java index 69403a02..83f78998 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CatalogValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CatalogValidator.java @@ -17,6 +17,7 @@ */ import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import java.io.File; import java.io.IOException; @@ -24,6 +25,7 @@ import java.nio.file.Paths; import org.junit.Before; import org.junit.Test; +import org.radarcns.validator.config.SkipConfig; /** * Checks that the tree folder structure respects the following structure @@ -128,7 +130,7 @@ public File getFolder() { } /** Commons folders. */ - public enum SpecificationFolder { + /*public enum SpecificationFolder { ACTIVE(new File(RootPath.SPECIFICATION.getPath().resolve( NameFolder.ACTIVE.getName()).toUri())), MONITOR(new File(RootPath.SPECIFICATION.getPath().resolve( @@ -145,11 +147,11 @@ public enum SpecificationFolder { public File getFolder() { return folder; } - } + }*/ @Before public void validateSkipConfig() { - //TODO + assertTrue(SkipConfig.validate()); } @Test diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfig.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfig.java index 14317e9d..1570dac4 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfig.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfig.java @@ -25,15 +25,20 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.stream.Stream; import org.apache.avro.Schema; import org.apache.avro.Schema.Field; import org.radarcns.config.YamlConfigLoader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * TODO. */ public class SkipConfig { + private static final Logger LOGGER = LoggerFactory.getLogger(SkipConfig.class); + /** Repository name. */ public static final String REPOSITORY_NAME = "/RADAR-Schemas/"; @@ -52,6 +57,10 @@ public class SkipConfig { /** Wild card to suppress check all schemas. */ public static final String WILD_CARD_COLLISION = "*"; + /** Regex for validating the yml file. */ + protected static final String VALID_INPUT_REGEX = "^[a-z][a-zA-Z0-9.*]*$"; + protected static final String VALID_FILE_REGEX = "^[a-zA-Z0-9.*][a-zA-Z0-9._*\\/\\\\]+"; + private final Set files = new HashSet<>(); private final Map validation = new HashMap<>(); private final Map> collision = new HashMap<>(); @@ -72,6 +81,51 @@ public SkipConfig() { } } + /** + * TODO. + * @return TODO + */ + public static boolean validate() { + boolean valid = validateClass(CONFIG.files.stream().map(Path::toString), + "Skipped file list is not valid.", true); + + //Validate validation key map + valid = valid && validateClass(CONFIG.validation.keySet().stream(), + "Validation map keys are not valid.", false); + + //Validate validation value map + valid = valid && validateClass(CONFIG.validation.values().stream() + .map(skipConfigItem -> skipConfigItem.getFields()) + .flatMap(Set::stream), + "Validation map values are not valid.", false); + + //Validate collision key map + valid = valid && validateClass(CONFIG.collision.keySet().stream(), + "Collision map keys are not valid.", false); + + //Validate collision value map + return valid && validateClass(CONFIG.collision.values().stream().flatMap(Set::stream), + "Collision map values are not valid.", false); + } + + /** + * TODO. + * @param stream TODO + * @param message TODO + * @param file TODO + * @return TODO + */ + private static boolean validateClass(Stream stream, String message, boolean file) { + return stream.allMatch(value -> { + if (file && !value.matches(VALID_FILE_REGEX) + || !file && !value.matches(VALID_INPUT_REGEX)) { + LOGGER.error("{} Setting \"{}\" is invalid.", message, value); + return false; + } + return true; + }); + } + /** * TODO. * @param schema TODO diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfigTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfigTest.java index 1f441d75..66fe1162 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfigTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfigTest.java @@ -18,6 +18,8 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.radarcns.validator.config.SkipConfig.VALID_FILE_REGEX; +import static org.radarcns.validator.config.SkipConfig.VALID_INPUT_REGEX; import static org.radarcns.validator.config.SkipConfig.skipFile; import java.io.File; @@ -33,7 +35,7 @@ public class SkipConfigTest { @Test - public void testGetPath() { + public void testSkipFile() { String root = "/Users/developer/Repositories/RADAR-Schemas/"; Set skipPaths = new HashSet<>(); @@ -81,7 +83,26 @@ public void testGetPath() { assertFalse(skipFile(new File(root.concat("restapi/data/acceleration.avsc")), skipPaths)); } + @Test + public void testFileRegex() { + assertTrue(".DS_Store".matches(VALID_FILE_REGEX)); + assertTrue("*.md".matches(VALID_FILE_REGEX)); + assertTrue("commons\\**".matches(VALID_FILE_REGEX)); + assertTrue("commons/**".matches(VALID_FILE_REGEX)); + assertTrue("commons/**/README.md".matches(VALID_FILE_REGEX)); + assertTrue("commons/monitor//application_external_time.avsc".matches(VALID_FILE_REGEX)); + assertTrue("commons/**/*.avsc".matches(VALID_FILE_REGEX)); + assertFalse("test-test.java".matches(VALID_FILE_REGEX)); + assertFalse("/commons/**/*.avsc".matches(VALID_FILE_REGEX)); + } - - + @Test + public void testGeneralRegex() { + assertTrue("avg".matches(VALID_INPUT_REGEX)); + assertTrue("x".matches(VALID_INPUT_REGEX)); + assertTrue("org.radarcns.passive.phone.PhoneCall".matches(VALID_INPUT_REGEX)); + assertTrue("org.radarcns.active.*".matches(VALID_INPUT_REGEX)); + assertFalse("org.radarcns.passive.phone.PhoneCall as ENUM".matches(VALID_INPUT_REGEX)); + assertFalse("*".matches(VALID_INPUT_REGEX)); + } } diff --git a/java-sdk/radar-schemas-validator/src/test/resources/skip.yml b/java-sdk/radar-schemas-validator/src/test/resources/skip.yml index 0a3c43f1..f5bee98d 100644 --- a/java-sdk/radar-schemas-validator/src/test/resources/skip.yml +++ b/java-sdk/radar-schemas-validator/src/test/resources/skip.yml @@ -6,7 +6,6 @@ files: #====================== SKIP TEST CONFIGURATION ======================# validation: org.radarcns.passive.biovotion.BiovotionEverionSpO2: - record_name_check: DISABLE fields: - spO2 - spO2Quality From e76e9f03228bd84bcc31b82125bf7c13c3cd3e76 Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Mon, 31 Jul 2017 16:58:40 +0100 Subject: [PATCH 037/112] Changed Biovotion namespace to Vsm1 --- ...erion_acceleration.avsc => biovotion_vsm1_acceleration.avsc} | 2 +- ...ion_battery_state.avsc => biovotion_vsm1_battery_state.avsc} | 2 +- ...ood_pulse_wave.avsc => biovotion_vsm1_blood_pulse_wave.avsc} | 2 +- ...biovotion_everion_energy.avsc => biovotion_vsm1_energy.avsc} | 2 +- ...response.avsc => biovotion_vsm1_galvanic_skin_response.avsc} | 2 +- ...n_everion_heart_rate.avsc => biovotion_vsm1_heart_rate.avsc} | 2 +- ...iability.avsc => biovotion_vsm1_heart_rate_variability.avsc} | 2 +- ...everion_led_current.avsc => biovotion_vsm1_led_current.avsc} | 2 +- ...ovotion_everion_ppg_raw.avsc => biovotion_vsm1_ppg_raw.avsc} | 2 +- ...spiration_rate.avsc => biovotion_vsm1_respiration_rate.avsc} | 2 +- .../{biovotion_everion_spo2.avsc => biovotion_vsm1_spo2.avsc} | 2 +- ...everion_temperature.avsc => biovotion_vsm1_temperature.avsc} | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) rename commons/passive/biovotion/{biovotion_everion_acceleration.avsc => biovotion_vsm1_acceleration.avsc} (93%) rename commons/passive/biovotion/{biovotion_everion_battery_state.avsc => biovotion_vsm1_battery_state.avsc} (94%) rename commons/passive/biovotion/{biovotion_everion_blood_pulse_wave.avsc => biovotion_vsm1_blood_pulse_wave.avsc} (92%) rename commons/passive/biovotion/{biovotion_everion_energy.avsc => biovotion_vsm1_energy.avsc} (93%) rename commons/passive/biovotion/{biovotion_everion_galvanic_skin_response.avsc => biovotion_vsm1_galvanic_skin_response.avsc} (90%) rename commons/passive/biovotion/{biovotion_everion_heart_rate.avsc => biovotion_vsm1_heart_rate.avsc} (92%) rename commons/passive/biovotion/{biovotion_everion_heart_rate_variability.avsc => biovotion_vsm1_heart_rate_variability.avsc} (91%) rename commons/passive/biovotion/{biovotion_everion_led_current.avsc => biovotion_vsm1_led_current.avsc} (93%) rename commons/passive/biovotion/{biovotion_everion_ppg_raw.avsc => biovotion_vsm1_ppg_raw.avsc} (95%) rename commons/passive/biovotion/{biovotion_everion_respiration_rate.avsc => biovotion_vsm1_respiration_rate.avsc} (92%) rename commons/passive/biovotion/{biovotion_everion_spo2.avsc => biovotion_vsm1_spo2.avsc} (93%) rename commons/passive/biovotion/{biovotion_everion_temperature.avsc => biovotion_vsm1_temperature.avsc} (93%) diff --git a/commons/passive/biovotion/biovotion_everion_acceleration.avsc b/commons/passive/biovotion/biovotion_vsm1_acceleration.avsc similarity index 93% rename from commons/passive/biovotion/biovotion_everion_acceleration.avsc rename to commons/passive/biovotion/biovotion_vsm1_acceleration.avsc index 3d563a18..8daa95d5 100644 --- a/commons/passive/biovotion/biovotion_everion_acceleration.avsc +++ b/commons/passive/biovotion/biovotion_vsm1_acceleration.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.passive.biovotion", "type": "record", - "name": "BiovotionEverionAcceleration", + "name": "BiovotionVsm1Acceleration", "doc": "Data from 3-axis accelerometer sensor with gravitational constant g as unit.", "fields": [ { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, diff --git a/commons/passive/biovotion/biovotion_everion_battery_state.avsc b/commons/passive/biovotion/biovotion_vsm1_battery_state.avsc similarity index 94% rename from commons/passive/biovotion/biovotion_everion_battery_state.avsc rename to commons/passive/biovotion/biovotion_vsm1_battery_state.avsc index 86bf4073..ed8a9a9b 100644 --- a/commons/passive/biovotion/biovotion_everion_battery_state.avsc +++ b/commons/passive/biovotion/biovotion_vsm1_battery_state.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.passive.biovotion", "type": "record", - "name": "BiovotionEverionBatteryState", + "name": "BiovotionVsm1BatteryState", "doc": "Device battery state.", "fields": [ { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, diff --git a/commons/passive/biovotion/biovotion_everion_blood_pulse_wave.avsc b/commons/passive/biovotion/biovotion_vsm1_blood_pulse_wave.avsc similarity index 92% rename from commons/passive/biovotion/biovotion_everion_blood_pulse_wave.avsc rename to commons/passive/biovotion/biovotion_vsm1_blood_pulse_wave.avsc index c2d3c4df..e59f1080 100644 --- a/commons/passive/biovotion/biovotion_everion_blood_pulse_wave.avsc +++ b/commons/passive/biovotion/biovotion_vsm1_blood_pulse_wave.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.passive.biovotion", "type": "record", - "name": "BiovotionEverionBloodPulseWave", + "name": "BiovotionVsm1BloodPulseWave", "doc": "Blood pulse wave data calculated by biovotion device.", "fields": [ { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, diff --git a/commons/passive/biovotion/biovotion_everion_energy.avsc b/commons/passive/biovotion/biovotion_vsm1_energy.avsc similarity index 93% rename from commons/passive/biovotion/biovotion_everion_energy.avsc rename to commons/passive/biovotion/biovotion_vsm1_energy.avsc index 41561f5f..022bfac0 100644 --- a/commons/passive/biovotion/biovotion_everion_energy.avsc +++ b/commons/passive/biovotion/biovotion_vsm1_energy.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.passive.biovotion", "type": "record", - "name": "BiovotionEverionEnergy", + "name": "BiovotionVsm1Energy", "doc": "Energy expenditure data calculated by biovotion device.", "fields": [ { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, diff --git a/commons/passive/biovotion/biovotion_everion_galvanic_skin_response.avsc b/commons/passive/biovotion/biovotion_vsm1_galvanic_skin_response.avsc similarity index 90% rename from commons/passive/biovotion/biovotion_everion_galvanic_skin_response.avsc rename to commons/passive/biovotion/biovotion_vsm1_galvanic_skin_response.avsc index 7cda3977..abbe8f5a 100644 --- a/commons/passive/biovotion/biovotion_everion_galvanic_skin_response.avsc +++ b/commons/passive/biovotion/biovotion_vsm1_galvanic_skin_response.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.passive.biovotion", "type": "record", - "name": "BiovotionEverionGalvanicSkinResponse", + "name": "BiovotionVsm1GalvanicSkinResponse", "doc": "Raw galvanic skin response data.", "fields": [ { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, diff --git a/commons/passive/biovotion/biovotion_everion_heart_rate.avsc b/commons/passive/biovotion/biovotion_vsm1_heart_rate.avsc similarity index 92% rename from commons/passive/biovotion/biovotion_everion_heart_rate.avsc rename to commons/passive/biovotion/biovotion_vsm1_heart_rate.avsc index 5a745c88..ba85e825 100644 --- a/commons/passive/biovotion/biovotion_everion_heart_rate.avsc +++ b/commons/passive/biovotion/biovotion_vsm1_heart_rate.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.passive.biovotion", "type": "record", - "name": "BiovotionEverionHeartRate", + "name": "BiovotionVsm1HeartRate", "doc": "Heart rate calculated by biovotion device.", "fields": [ { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, diff --git a/commons/passive/biovotion/biovotion_everion_heart_rate_variability.avsc b/commons/passive/biovotion/biovotion_vsm1_heart_rate_variability.avsc similarity index 91% rename from commons/passive/biovotion/biovotion_everion_heart_rate_variability.avsc rename to commons/passive/biovotion/biovotion_vsm1_heart_rate_variability.avsc index d655f3ab..a2d51ca5 100644 --- a/commons/passive/biovotion/biovotion_everion_heart_rate_variability.avsc +++ b/commons/passive/biovotion/biovotion_vsm1_heart_rate_variability.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.passive.biovotion", "type": "record", - "name": "BiovotionEverionHeartRateVariability", + "name": "BiovotionVsm1HeartRateVariability", "doc": "Heart rate variability data calculated by biovotion device.", "fields": [ {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, diff --git a/commons/passive/biovotion/biovotion_everion_led_current.avsc b/commons/passive/biovotion/biovotion_vsm1_led_current.avsc similarity index 93% rename from commons/passive/biovotion/biovotion_everion_led_current.avsc rename to commons/passive/biovotion/biovotion_vsm1_led_current.avsc index 0e3091e3..68d0ded3 100644 --- a/commons/passive/biovotion/biovotion_everion_led_current.avsc +++ b/commons/passive/biovotion/biovotion_vsm1_led_current.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.passive.biovotion", "type": "record", - "name": "BiovotionEverionLedCurrent", + "name": "BiovotionVsm1LedCurrent", "doc": "Applied current for red, green and ir leds.", "fields": [ {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, diff --git a/commons/passive/biovotion/biovotion_everion_ppg_raw.avsc b/commons/passive/biovotion/biovotion_vsm1_ppg_raw.avsc similarity index 95% rename from commons/passive/biovotion/biovotion_everion_ppg_raw.avsc rename to commons/passive/biovotion/biovotion_vsm1_ppg_raw.avsc index 3a3069a3..0d5b8f94 100644 --- a/commons/passive/biovotion/biovotion_everion_ppg_raw.avsc +++ b/commons/passive/biovotion/biovotion_vsm1_ppg_raw.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.passive.biovotion", "type": "record", - "name": "BiovotionEverionPpgRaw", + "name": "BiovotionVsm1PpgRaw", "doc": "Raw 14bit Photodiode ADC data for red, green, IR and dark portions (PPG raw data).", "fields": [ {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, diff --git a/commons/passive/biovotion/biovotion_everion_respiration_rate.avsc b/commons/passive/biovotion/biovotion_vsm1_respiration_rate.avsc similarity index 92% rename from commons/passive/biovotion/biovotion_everion_respiration_rate.avsc rename to commons/passive/biovotion/biovotion_vsm1_respiration_rate.avsc index 22563a2d..77f106a2 100644 --- a/commons/passive/biovotion/biovotion_everion_respiration_rate.avsc +++ b/commons/passive/biovotion/biovotion_vsm1_respiration_rate.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.passive.biovotion", "type": "record", - "name": "BiovotionEverionRespirationRate", + "name": "BiovotionVsm1RespirationRate", "doc": "Respiration rate data calculated by biovotion device.", "fields": [ {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, diff --git a/commons/passive/biovotion/biovotion_everion_spo2.avsc b/commons/passive/biovotion/biovotion_vsm1_spo2.avsc similarity index 93% rename from commons/passive/biovotion/biovotion_everion_spo2.avsc rename to commons/passive/biovotion/biovotion_vsm1_spo2.avsc index 59c86704..d002d9ee 100644 --- a/commons/passive/biovotion/biovotion_everion_spo2.avsc +++ b/commons/passive/biovotion/biovotion_vsm1_spo2.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.passive.biovotion", "type": "record", - "name": "BiovotionEverionSpO2", + "name": "BiovotionVsm1SpO2", "doc": "Peripheral capillary oxygen saturation (SpO2) calculated by biovotion device.", "fields": [ {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, diff --git a/commons/passive/biovotion/biovotion_everion_temperature.avsc b/commons/passive/biovotion/biovotion_vsm1_temperature.avsc similarity index 93% rename from commons/passive/biovotion/biovotion_everion_temperature.avsc rename to commons/passive/biovotion/biovotion_vsm1_temperature.avsc index b6706637..a70d7f02 100644 --- a/commons/passive/biovotion/biovotion_everion_temperature.avsc +++ b/commons/passive/biovotion/biovotion_vsm1_temperature.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.passive.biovotion", "type": "record", - "name": "BiovotionEverionTemperature", + "name": "BiovotionVsm1Temperature", "doc": "Data from temperature sensor expressed in degrees on the Celsius (°C) scale.", "fields": [ {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, From 648672d683f9c6470e01965241af9d0f26685a17 Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Mon, 31 Jul 2017 16:59:07 +0100 Subject: [PATCH 038/112] Fixed java indent size --- .editorconfig | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.editorconfig b/.editorconfig index 17937eeb..154758a1 100644 --- a/.editorconfig +++ b/.editorconfig @@ -17,3 +17,7 @@ trim_trailing_whitespace = false # Gradle [*.gradle] indent_size = 4 + +# Java +[*.java] +indent_size = 4 From c6c9e5dc1a81a8122825c66b91a7ac17391590c9 Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Mon, 31 Jul 2017 17:00:50 +0100 Subject: [PATCH 039/112] Specification initial commit --- .../build.gradle | 79 ++- .../config/checkstyle/checkstyle.xml | 216 +++++++ .../config/intellij-java-google-style.xml | 596 ++++++++++++++++++ .../config/pmd/ruleset.xml | 89 +++ .../src/main/resources/logback.xml | 17 + java-sdk/radar-schemas-validator/build.gradle | 1 - .../src/test/resources/skip.yml | 14 +- java-sdk/settings.gradle | 2 +- specification/passive/empatica_e4.yml | 60 ++ 9 files changed, 1057 insertions(+), 17 deletions(-) rename java-sdk/{radar-schemas-questionnaire => radar-schemas-specification}/build.gradle (50%) create mode 100644 java-sdk/radar-schemas-specification/config/checkstyle/checkstyle.xml create mode 100644 java-sdk/radar-schemas-specification/config/intellij-java-google-style.xml create mode 100644 java-sdk/radar-schemas-specification/config/pmd/ruleset.xml create mode 100644 java-sdk/radar-schemas-specification/src/main/resources/logback.xml create mode 100644 specification/passive/empatica_e4.yml diff --git a/java-sdk/radar-schemas-questionnaire/build.gradle b/java-sdk/radar-schemas-specification/build.gradle similarity index 50% rename from java-sdk/radar-schemas-questionnaire/build.gradle rename to java-sdk/radar-schemas-specification/build.gradle index f600adf8..20f8516d 100644 --- a/java-sdk/radar-schemas-questionnaire/build.gradle +++ b/java-sdk/radar-schemas-specification/build.gradle @@ -1,17 +1,80 @@ -ext.artifactName = 'radar-schemas-questionnaire' -ext.description = 'RADAR Schemas Questionnaire SDK' +plugins { + id 'idea' + id 'checkstyle' + id 'pmd' +} + +ext.artifactName = 'radar-schemas-specification' +ext.description = 'RADAR Schemas Specification SDK' + +targetCompatibility = '1.8' +sourceCompatibility = '1.8' + +idea { + module { + downloadSources = true + } +} + +sourceSets { + main { + java.srcDir 'src/main/java' + resources.srcDir 'src/main/resources' + } + test { + java.srcDir 'src/test/java' + resources.srcDir 'src/test/resources' + } +} + +ext.apacheCommonsVersion = '3.6' +ext.junitVersion = '4.12' +ext.radarCommonsVersion = '0.4.2' +ext.slf4jVersion = '1.7.25' + +dependencies { + testCompile group: 'junit', name: 'junit', version: junitVersion + testCompile group: 'org.slf4j', name: 'slf4j-simple', version: slf4jVersion + testCompile group: 'org.apache.commons', name: 'commons-lang3', version: apacheCommonsVersion + testCompile group: 'org.radarcns', name: 'radar-commons', version: radarCommonsVersion +} //---------------------------------------------------------------------------// -// AVRO file manipulation // +// Test definition // //---------------------------------------------------------------------------// -task generateAvro(type: com.commercehub.gradle.plugin.avro.GenerateAvroJavaTask) { - source rootProject.fileTree('../questionnaire') { - include '**/*.avsc' +test { + testLogging { + events "skipped", "failed" + exceptionFormat "full" + showExceptions = true + showCauses = true + showStackTraces = true + showStandardStreams = true } - outputDir avroOutputDir } -compileJava.dependsOn generateAvro +//---------------------------------------------------------------------------// +// Style checking // +//---------------------------------------------------------------------------// +checkstyle { + // codacy version + toolVersion '6.16' + ignoreFailures false + + configFile = file("$projectDir/config/checkstyle/checkstyle.xml") +} + +pmd { + // pmd version + toolVersion = '5.5.2' + ignoreFailures = false + + consoleOutput = true + + ruleSets = [] + + ruleSetFiles = files("$projectDir/config/pmd/ruleset.xml") +} //---------------------------------------------------------------------------// // Publishing // diff --git a/java-sdk/radar-schemas-specification/config/checkstyle/checkstyle.xml b/java-sdk/radar-schemas-specification/config/checkstyle/checkstyle.xml new file mode 100644 index 00000000..b9f3a458 --- /dev/null +++ b/java-sdk/radar-schemas-specification/config/checkstyle/checkstyle.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java-sdk/radar-schemas-specification/config/intellij-java-google-style.xml b/java-sdk/radar-schemas-specification/config/intellij-java-google-style.xml new file mode 100644 index 00000000..70c15157 --- /dev/null +++ b/java-sdk/radar-schemas-specification/config/intellij-java-google-style.xml @@ -0,0 +1,596 @@ + + + + + + diff --git a/java-sdk/radar-schemas-specification/config/pmd/ruleset.xml b/java-sdk/radar-schemas-specification/config/pmd/ruleset.xml new file mode 100644 index 00000000..d7b23e4c --- /dev/null +++ b/java-sdk/radar-schemas-specification/config/pmd/ruleset.xml @@ -0,0 +1,89 @@ + + + + + This ruleset was parsed from the Codacy default codestyle. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/java-sdk/radar-schemas-specification/src/main/resources/logback.xml b/java-sdk/radar-schemas-specification/src/main/resources/logback.xml new file mode 100644 index 00000000..437ccb34 --- /dev/null +++ b/java-sdk/radar-schemas-specification/src/main/resources/logback.xml @@ -0,0 +1,17 @@ + + + + + + %date{yyyy-MM-dd HH:mm:ss,UTC} UTC %-5level - %msg [%logger:%line] %n + + + + + + + + + + + diff --git a/java-sdk/radar-schemas-validator/build.gradle b/java-sdk/radar-schemas-validator/build.gradle index 90850575..4150d36b 100644 --- a/java-sdk/radar-schemas-validator/build.gradle +++ b/java-sdk/radar-schemas-validator/build.gradle @@ -71,4 +71,3 @@ pmd { ruleSetFiles = files("$projectDir/config/pmd/ruleset.xml") } - diff --git a/java-sdk/radar-schemas-validator/src/test/resources/skip.yml b/java-sdk/radar-schemas-validator/src/test/resources/skip.yml index f5bee98d..8c978643 100644 --- a/java-sdk/radar-schemas-validator/src/test/resources/skip.yml +++ b/java-sdk/radar-schemas-validator/src/test/resources/skip.yml @@ -5,7 +5,7 @@ files: #====================== SKIP TEST CONFIGURATION ======================# validation: - org.radarcns.passive.biovotion.BiovotionEverionSpO2: + org.radarcns.passive.biovotion.BiovotionVsm1SpO2: fields: - spO2 - spO2Quality @@ -20,7 +20,7 @@ collision: - org.radarcns.kafka.aggregator.AggregatorDouble - org.radarcns.kafka.aggregator.AggregatorDoubleArray batteryLevel: - - org.radarcns.passive.biovotion.BiovotionEverionBatteryState + - org.radarcns.passive.biovotion.BiovotionVsm1BatteryState - org.radarcns.passive.empatica.EmpaticaE4BatteryLevel - org.radarcns.passive.pebble.Pebble2BatteryLevel - org.radarcns.passive.phone.PhoneBatteryLevel @@ -28,7 +28,7 @@ collision: - org.radarcns.kafka.aggregator.AggregatorDouble - org.radarcns.kafka.aggregator.AggregatorDoubleArray heartRate: - - org.radarcns.passive.biovotion.BiovotionEverionHeartRate + - org.radarcns.passive.biovotion.BiovotionVsm1HeartRate - org.radarcns.passive.pebble.Pebble2HeartRate - org.radarcns.passive.pebble.Pebble2HeartRateFiltered iqr: @@ -56,7 +56,7 @@ collision: - org.radarcns.passive.phone.PhoneCall - org.radarcns.passive.phone.PhoneSms temperature: - - org.radarcns.passive.biovotion.BiovotionEverionTemperature + - org.radarcns.passive.biovotion.BiovotionVsm1Temperature - org.radarcns.passive.empatica.EmpaticaE4Temperature type: - org.radarcns.passive.phone.PhoneCall @@ -73,21 +73,21 @@ collision: - org.radarcns.kafka.key.KeyMeasurement - org.radarcns.kafka.key.KeyWindowed x: - - org.radarcns.passive.biovotion.BiovotionEverionAcceleration + - org.radarcns.passive.biovotion.BiovotionVsm1Acceleration - org.radarcns.passive.empatica.EmpaticaE4Acceleration - org.radarcns.passive.pebble.Pebble2Acceleration - org.radarcns.passive.phone.PhoneAcceleration - org.radarcns.passive.phone.PhoneGyroscope - org.radarcns.passive.phone.PhoneMagneticField y: - - org.radarcns.passive.biovotion.BiovotionEverionAcceleration + - org.radarcns.passive.biovotion.BiovotionVsm1Acceleration - org.radarcns.passive.empatica.EmpaticaE4Acceleration - org.radarcns.passive.pebble.Pebble2Acceleration - org.radarcns.passive.phone.PhoneAcceleration - org.radarcns.passive.phone.PhoneGyroscope - org.radarcns.passive.phone.PhoneMagneticField z: - - org.radarcns.passive.biovotion.BiovotionEverionAcceleration + - org.radarcns.passive.biovotion.BiovotionVsm1Acceleration - org.radarcns.passive.empatica.EmpaticaE4Acceleration - org.radarcns.passive.pebble.Pebble2Acceleration - org.radarcns.passive.phone.PhoneAcceleration diff --git a/java-sdk/settings.gradle b/java-sdk/settings.gradle index f9dc93ae..834cfaa4 100644 --- a/java-sdk/settings.gradle +++ b/java-sdk/settings.gradle @@ -3,4 +3,4 @@ rootProject.name = 'radar-schemas' include ':radar-schemas-validator' include ':radar-schemas-commons' include ':radar-schemas-restapi' -include ':radar-schemas-questionnaire' +include ':radar-schemas-specification' diff --git a/specification/passive/empatica_e4.yml b/specification/passive/empatica_e4.yml new file mode 100644 index 00000000..21df1031 --- /dev/null +++ b/specification/passive/empatica_e4.yml @@ -0,0 +1,60 @@ + +#============================= Empatica E4 Wristband =============================# +name: EMPATICA_E4 +app_provider: .empatica.E4ServiceProvider +sensors: + - name: ACCELEROMETER + sample_rate: 32.0 + unit: G + data_type: RAW + topic_name: android_empatica_e4_acceleration + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.empatica.EmpaticaE4Acceleration + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDoubleArray + - name: BATTERY + sample_rate: 1.0 + unit: PERCENTAGE + data_type: RAW + topic_name: android_empatica_e4_battery_level + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.empatica.EmpaticaE4BatteryLevel + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + - name: BLOOD_VOLUME_PULSE + sample_rate: 64.0 + unit: NANOWATT + data_type: RAW + topic_name: android_empatica_e4_blood_volume_pulse + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.empatica.EmpaticaE4BloodVolumePulse + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + - name: ELECTRODERMAL_ACTIVITY + sample_rate: 4.0 + unit: MICROSIEMENS + data_type: RAW + topic_name: android_empatica_e4_electrodermal_activity + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.empatica.EmpaticaE4ElectroDermalActivity + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + - name: HEART_RATE + sample_rate: 1.0 + unit: BEATS_PER_MIN + data_type: RADAR + input_topic_name: android_empatica_e4_inter_beat_interval + output_topic_name: android_empatica_e4_heartrate + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + - name: INTER_BEAT_INTERVAL + sample_rate: 1.0 + unit: BEATS_PER_MIN + data_type: VENDOR + topic_name: android_empatica_e4_inter_beat_interval + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.empatica.EmpaticaE4InterBeatInterval + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + - name: THERMOMETER + sample_rate: 4.0 + unit: CELSIUS + data_type: RAW + topic_name: android_empatica_e4_temperature + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.empatica.EmpaticaE4BatteryLevel + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble From 1b1e8c8773a27d78cad9b2ec10b08c59d81afa9a Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Tue, 1 Aug 2017 14:22:43 +0100 Subject: [PATCH 040/112] Fixed name convention for Biovotion ppg_raw --- .../biovotion/biovotion_vsm1_blood_pulse_wave.avsc | 2 +- .../biovotion_vsm1_heart_rate_variability.avsc | 2 +- ...spo2.avsc => biovotion_vsm1_oxygen_saturation.avsc} | 2 +- commons/passive/biovotion/biovotion_vsm1_ppg_raw.avsc | 10 +++++----- .../org/radarcns/validator/util/AvroValidator.java | 2 +- .../src/test/resources/skip.yml | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) rename commons/passive/biovotion/{biovotion_vsm1_spo2.avsc => biovotion_vsm1_oxygen_saturation.avsc} (92%) diff --git a/commons/passive/biovotion/biovotion_vsm1_blood_pulse_wave.avsc b/commons/passive/biovotion/biovotion_vsm1_blood_pulse_wave.avsc index e59f1080..13113b62 100644 --- a/commons/passive/biovotion/biovotion_vsm1_blood_pulse_wave.avsc +++ b/commons/passive/biovotion/biovotion_vsm1_blood_pulse_wave.avsc @@ -6,7 +6,7 @@ "fields": [ { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, { "name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, - { "name": "bloodPulseWave", "type": "float", "doc": "Blood pulse wave value." }, + { "name": "bloodPulseWave", "type": "float", "doc": "Blood pulse wave value (nondimensional)." }, { "name": "bloodPulseWaveQuality", "type": "float", "doc": "Blood pulse wave quality (0-1)." } ] } diff --git a/commons/passive/biovotion/biovotion_vsm1_heart_rate_variability.avsc b/commons/passive/biovotion/biovotion_vsm1_heart_rate_variability.avsc index a2d51ca5..da356546 100644 --- a/commons/passive/biovotion/biovotion_vsm1_heart_rate_variability.avsc +++ b/commons/passive/biovotion/biovotion_vsm1_heart_rate_variability.avsc @@ -6,7 +6,7 @@ "fields": [ {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, - {"name": "heartRateVariability", "type": "float", "doc": "Heart rate variability value (ms / RMSSD)." }, + {"name": "heartRateVariability", "type": "float", "doc": "Heart rate variability value. The applied metric is the root mean squared of successive differences (RMSSD) of heart pulses, measured in milliseconds." }, {"name": "heartRateVariabilityQuality", "type": "float", "doc": "Heart rate variability quality (0-1)." } ] } diff --git a/commons/passive/biovotion/biovotion_vsm1_spo2.avsc b/commons/passive/biovotion/biovotion_vsm1_oxygen_saturation.avsc similarity index 92% rename from commons/passive/biovotion/biovotion_vsm1_spo2.avsc rename to commons/passive/biovotion/biovotion_vsm1_oxygen_saturation.avsc index d002d9ee..7dc9b8f2 100644 --- a/commons/passive/biovotion/biovotion_vsm1_spo2.avsc +++ b/commons/passive/biovotion/biovotion_vsm1_oxygen_saturation.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.passive.biovotion", "type": "record", - "name": "BiovotionVsm1SpO2", + "name": "BiovotionVsm1OxygenSaturation", "doc": "Peripheral capillary oxygen saturation (SpO2) calculated by biovotion device.", "fields": [ {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, diff --git a/commons/passive/biovotion/biovotion_vsm1_ppg_raw.avsc b/commons/passive/biovotion/biovotion_vsm1_ppg_raw.avsc index 0d5b8f94..0a375268 100644 --- a/commons/passive/biovotion/biovotion_vsm1_ppg_raw.avsc +++ b/commons/passive/biovotion/biovotion_vsm1_ppg_raw.avsc @@ -2,13 +2,13 @@ "namespace": "org.radarcns.passive.biovotion", "type": "record", "name": "BiovotionVsm1PpgRaw", - "doc": "Raw 14bit Photodiode ADC data for red, green, IR and dark portions (PPG raw data).", + "doc": "Raw 14bit Photodiode ADC (Analog to Digital conversion) data for red, green, IR and dark portions (PPG raw data).", "fields": [ {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, - {"name": "red", "type": "float", "doc": "raw red light ADC response (normalized)." }, - {"name": "green", "type": "float", "doc": "raw green light ADC response (normalized)." }, - {"name": "ir", "type": "float", "doc": "raw IR light ADC response (normalized)." }, - {"name": "dark", "type": "float", "doc": "raw dark light ADC response (normalized)." } + {"name": "red", "type": "float", "doc": "raw red light ADC response (normalized 0 -16383)." }, + {"name": "green", "type": "float", "doc": "raw green light ADC response (normalized 0 -16383)." }, + {"name": "ir", "type": "float", "doc": "raw IR light ADC response (normalized 0 -16383)." }, + {"name": "dark", "type": "float", "doc": "raw dark light ADC response (normalized 0 -16383)." } ] } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java index 2d5dd0d3..fbaf2cf3 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java @@ -51,7 +51,7 @@ public static void analiseFiles(File file, NameFolder packageName, String parent analiseFiles(son, packageName, file.getName()); } } else if (SkipConfig.skipFile(file)) { - LOGGER.info("Skipping {}", file.getAbsolutePath()); + LOGGER.debug("Skipping {}", file.getAbsolutePath()); } else { assertTrue(packageName.getName().concat(" should contain only ") .concat(AVRO_FORMAT).concat(" files. ") diff --git a/java-sdk/radar-schemas-validator/src/test/resources/skip.yml b/java-sdk/radar-schemas-validator/src/test/resources/skip.yml index 8c978643..b3e09102 100644 --- a/java-sdk/radar-schemas-validator/src/test/resources/skip.yml +++ b/java-sdk/radar-schemas-validator/src/test/resources/skip.yml @@ -5,7 +5,7 @@ files: #====================== SKIP TEST CONFIGURATION ======================# validation: - org.radarcns.passive.biovotion.BiovotionVsm1SpO2: + org.radarcns.passive.biovotion.BiovotionVsm1OxygenSaturation: fields: - spO2 - spO2Quality From b47e6972e28032dae386c01ddf3856878002868f Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Tue, 1 Aug 2017 14:24:05 +0100 Subject: [PATCH 041/112] Initial specification files. This fixes #31 --- specification/active/ph8q.yml | 103 ++++++++++++++++ specification/monitor/android_application.yml | 32 +++++ specification/passive/adroid_phone.yml | 110 ++++++++++++++++++ specification/passive/biovotion_vsm1.yml | 101 ++++++++++++++++ specification/passive/empatica_e4.yml | 21 ++-- specification/passive/pebble_2.yml | 37 ++++++ 6 files changed, 394 insertions(+), 10 deletions(-) create mode 100644 specification/active/ph8q.yml create mode 100644 specification/monitor/android_application.yml create mode 100644 specification/passive/adroid_phone.yml create mode 100644 specification/passive/biovotion_vsm1.yml create mode 100644 specification/passive/pebble_2.yml diff --git a/specification/active/ph8q.yml b/specification/active/ph8q.yml new file mode 100644 index 00000000..051b29c5 --- /dev/null +++ b/specification/active/ph8q.yml @@ -0,0 +1,103 @@ +#===================== Personal Health Questionnaire Depression Scale (PHQ-8) =====================# +name: PHQ8 +assestment_type: QUESTIONNAIRE +topic_name: questionnaire_phq8 +key_class: org.radarcns.kafka.key.KeyMeasurement +value_class: org.radarcns.active.questionnaire.Questionnaire +questions: + - lead: Over the past two weeks, how often have you been bothered by any of the following problems? + content: Little interest or pleasure in doing things. + widget: RADIO + responses: + - text: Not at all + score: 0 + - text: Several days + score: 1 + - text: More than half the days + score: 2 + - text: Nearly every day + score: 3 + - lead: Over the past two weeks, how often have you been bothered by any of the following problems? + content: Feeling down, depressed, or hopeless. + widget: RADIO + responses: + - text: Not at all + score: 0 + - text: Several days + score: 1 + - text: More than half the days + score: 2 + - text: Nearly every day + score: 3 + - lead: Over the past two weeks, how often have you been bothered by any of the following problems? + content: Trouble falling or staying asleep, or sleeping too much. + widget: RADIO + responses: + - text: Not at all + score: 0 + - text: Several days + score: 1 + - text: More than half the days + score: 2 + - text: Nearly every day + score: 3 + - lead: Over the past two weeks, how often have you been bothered by any of the following problems? + content: Feeling tired or having little energy. + widget: RADIO + responses: + - text: Not at all + score: 0 + - text: Several days + score: 1 + - text: More than half the days + score: 2 + - text: Nearly every day + score: 3 + - lead: Over the past two weeks, how often have you been bothered by any of the following problems? + content: Poor appetite or overeating. + widget: RADIO + responses: + - text: Not at all + score: 0 + - text: Several days + score: 1 + - text: More than half the days + score: 2 + - text: Nearly every day + score: 3 + - lead: Over the past two weeks, how often have you been bothered by any of the following problems? + content: Feeling bad about yourself, or that you are a failure, or have let yourself or your family down. + widget: RADIO + responses: + - text: Not at all + score: 0 + - text: Several days + score: 1 + - text: More than half the days + score: 2 + - text: Nearly every day + score: 3 + - lead: Over the past two weeks, how often have you been bothered by any of the following problems? + content: Trouble concentrating on things, such as reading the newspaper or watching television. + widget: RADIO + responses: + - text: Not at all + score: 0 + - text: Several days + score: 1 + - text: More than half the days + score: 2 + - text: Nearly every day + score: 3 + - lead: Over the past two weeks, how often have you been bothered by any of the following problems? + content: Moving or speaking so slowly that other people could have noticed. Or the opposite – being so fidgety or restless that you have been moving around a lot more than usual. + widget: RADIO + responses: + - text: Not at all + score: 0 + - text: Several days + score: 1 + - text: More than half the days + score: 2 + - text: Nearly every day + score: 3 diff --git a/specification/monitor/android_application.yml b/specification/monitor/android_application.yml new file mode 100644 index 00000000..bb4abf00 --- /dev/null +++ b/specification/monitor/android_application.yml @@ -0,0 +1,32 @@ +#================================ Android Application Monitor =====================================# +name: APPLICATION +app_provider: .application.ApplicationServiceProvider +sensors: + - name: EXTERNAL_TIME + sample_rate: 0.08 + unit: NONDIMENSIONAL + data_type: RAW + topic_name: application_external_time + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.monitor.application.ApplicationExternalTime + - name: RECORD_COUNTS + sample_rate: 0.08 + unit: NONDIMENSIONAL + data_type: RAW + topic_name: application_record_counts + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.monitor.application.ApplicationRecordCounts + - name: SERVER_STATUS + sample_rate: 0.08 + unit: NONDIMENSIONAL + data_type: RAW + topic_name: application_server_status + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.monitor.application.ApplicationServerStatus + - name: UPTIME + sample_rate: 0.08 + unit: NONDIMENSIONAL + data_type: RAW + topic_name: application_uptime + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.monitor.application.ApplicationUptime diff --git a/specification/passive/adroid_phone.yml b/specification/passive/adroid_phone.yml new file mode 100644 index 00000000..9127937f --- /dev/null +++ b/specification/passive/adroid_phone.yml @@ -0,0 +1,110 @@ +#====================================== Android Phone Sensors =====================================# +vendor: ANDROID +model: PHONE +sensors: + #Phone sensors + - name: ACCELEROMETER + app_provider: .phone.PhoneSensorProvider + sample_rate: #TODO + unit: G + data_type: RAW + topic_name: android_phone_acceleration + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.phone.PhoneAcceleration + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDoubleArray + - name: BATTERY + app_provider: .phone.PhoneSensorProvider + sample_rate: #TODO + unit: PERCENTAGE + data_type: RAW + topic_name: android_phone_battery_level + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.phone.PhoneBatteryLevel + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + - name: GYROSCOPE + app_provider: .phone.PhoneSensorProvider + sample_rate: #TODO + unit: RADAIAN_PER_SEC + data_type: RAW + topic_name: android_phone_gyroscope + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.phone.PhoneGyroscope + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDoubleArray + - name: LIGTH + app_provider: .phone.PhoneSensorProvider + sample_rate: #TODO + unit: LUX + data_type: RAW + topic_name: android_phone_ligth + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.phone.PhoneLight + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + - name: MAGNETIC_FIELD + app_provider: .phone.PhoneSensorProvider + sample_rate: #TODO + unit: MICRO_TESLA + data_type: RAW + topic_name: android_phone_magnetic_field + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.phone.PhoneMagneticField + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDoubleArray + - name: STEP_COUNT + app_provider: .phone.PhoneSensorProvider + sample_rate: #TODO + unit: NONDIMENSIONAL + data_type: VENDOR + topic_name: android_phone_step_count + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.phone.PhoneStepCount + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + # Location + - name: RELATIVE_LOCATION + app_provider: .phone.PhoneLocationProvider + sample_rate: #TODO + unit: #TODO + data_type: RAW + topic_name: android_phone_relative_location + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.phone.PhoneRelativeLocation + # Log + - name: PHONE_CALL + app_provider: .phone.PhoneLogProvider + sample_rate: #TODO + unit: NONDIMENSIONAL + data_type: RAW + topic_name: android_phone_call + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.phone.PhoneCall + - name: PHONE_SMS + app_provider: .phone.PhoneLogProvider + sample_rate: #TODO + unit: NONDIMENSIONAL + data_type: RAW + topic_name: android_phone_sms + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.phone.PhoneSms + - name: PHONE_SMS_UNREAD + app_provider: .phone.PhoneLogProvider + sample_rate: #TODO + unit: NONDIMENSIONAL + data_type: RAW + topic_name: android_phone_sms_unread + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.phone.PhoneSmsUnread + # Usage + - name: USAGE_EVENT + app_provider: .phone.PhoneUsageProvider + sample_rate: #TODO + unit: NONDIMENSIONAL + data_type: RAW + topic_name: android_phone_user_event + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.phone.PhoneUsageEvent + - name: USER_INTERACTION + app_provider: .phone.PhoneUsageProvider + sample_rate: #TODO + unit: NONDIMENSIONAL + data_type: RAW + topic_name: android_phone_user_interaction + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.phone.PhoneUserInteraction diff --git a/specification/passive/biovotion_vsm1.yml b/specification/passive/biovotion_vsm1.yml new file mode 100644 index 00000000..2e082c5d --- /dev/null +++ b/specification/passive/biovotion_vsm1.yml @@ -0,0 +1,101 @@ +#===================================== Biovotion VSM1 Everion =====================================# +vendor: BIOVOTION +model: VSM1 +app_provider: biovotion.BiovotionServiceProvider +sensors: + - name: ACCELEROMETER + sample_rate: 51.2 + unit: G + data_type: RAW + topic_name: android_biovotion_vsm1_acceleration + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.biovotion.BiovotionVsm1Acceleration + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDoubleArray + - name: BATTERY + sample_rate: 1.0 + unit: PERCENTAGE + data_type: RAW + topic_name: android_biovotion_vsm1_battery_state + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.biovotion.BiovotionVsm1BatteryState + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + - name: BLOOD_PULSE_WAVE + sample_rate: 1.0 + unit: NONDIMENSIONAL + data_type: VENDOR + topic_name: android_biovotion_vsm1_acceleration + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.biovotion.BiovotionVsm1BloodPulseWave + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + - name: ENERGY + sample_rate: 1.0 + unit: CALORIES_PER_SEC + data_type: VENDOR + topic_name: android_biovotion_vsm1_energy + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.biovotion.BiovotionVsm1Energy + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + - name: GALVANIC_SKIN_RESPONSE + sample_rate: 1.0 + unit: KILO_OHM + data_type: VENDOR + topic_name: android_biovotion_vsm1_galvanic_skin_response + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.biovotion.BiovotionVsm1GalvanicSkinResponse + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDoubleArray + - name: HEART_RATE + sample_rate: 1.0 + unit: BEATS_PER_MIN + data_type: VENDOR + topic_name: android_biovotion_vsm1_heart_rate + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.biovotion.BiovotionVsm1HeartRate + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + - name: HEART_RATE_VARIABILITY + sample_rate: 1.0 + unit: RMSSD_IN_MILLI_SEC + data_type: VENDOR + topic_name: android_biovotion_vsm1_heart_rate_variability + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.biovotion.BiovotionVsm1HeartRateVariability + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + - name: LED + sample_rate: 1.0 + unit: MILLI_AMPER + data_type: VENDOR + topic_name: android_biovotion_vsm1_led_current + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.biovotion.BiovotionVsm1LedCurrent + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDoubleArray + - name: PPG + sample_rate: 51.2 + unit: NONDIMENSIONAL + data_type: VENDOR + topic_name: android_biovotion_vsm1_ppg_current + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.biovotion.BiovotionVsm1PpgRaw + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDoubleArray + - name: RESPIRATION_RATE + sample_rate: 1.0 + unit: BEATS_PER_MIN + data_type: VENDOR + topic_name: android_biovotion_vsm1_respiration_rate + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.biovotion.BiovotionVsm1RespirationRate + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + - name: OXYGEN_SATURATION + sample_rate: 1.0 + unit: PERCENTAGE + data_type: RAW + topic_name: android_biovotion_vsm1_oxygen_saturation + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.biovotion.BiovotionVsm1OxygenSaturation + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + - name: THERMOMETER + sample_rate: 1.0 + unit: CELSIUS + data_type: RAW + topic_name: android_biovotion_vsm1_temperature + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.biovotion.BiovotionVsm1Temperature + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble diff --git a/specification/passive/empatica_e4.yml b/specification/passive/empatica_e4.yml index 21df1031..72745bfa 100644 --- a/specification/passive/empatica_e4.yml +++ b/specification/passive/empatica_e4.yml @@ -1,6 +1,6 @@ - -#============================= Empatica E4 Wristband =============================# -name: EMPATICA_E4 +#====================================== Empatica E4 Wristband =====================================# +vendor: EMPATICA +model: E4 app_provider: .empatica.E4ServiceProvider sensors: - name: ACCELEROMETER @@ -35,13 +35,6 @@ sensors: key_class: org.radarcns.kafka.key.KeyMeasurement value_class: org.radarcns.passive.empatica.EmpaticaE4ElectroDermalActivity aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble - - name: HEART_RATE - sample_rate: 1.0 - unit: BEATS_PER_MIN - data_type: RADAR - input_topic_name: android_empatica_e4_inter_beat_interval - output_topic_name: android_empatica_e4_heartrate - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble - name: INTER_BEAT_INTERVAL sample_rate: 1.0 unit: BEATS_PER_MIN @@ -58,3 +51,11 @@ sensors: key_class: org.radarcns.kafka.key.KeyMeasurement value_class: org.radarcns.passive.empatica.EmpaticaE4BatteryLevel aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble +aggregators: + - name: HEART_RATE + sample_rate: 1.0 + unit: BEATS_PER_MIN + data_type: RADAR + input_topic_name: android_empatica_e4_inter_beat_interval + output_topic_name: android_empatica_e4_heartrate + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble diff --git a/specification/passive/pebble_2.yml b/specification/passive/pebble_2.yml new file mode 100644 index 00000000..c3b696fc --- /dev/null +++ b/specification/passive/pebble_2.yml @@ -0,0 +1,37 @@ +#============================================ Pebble 2 ============================================# +vendor: PEBBLE +model: 2 +app_provider: .pebble.PebbleServiceProvider +sensors: + - name: ACCELEROMETER + sample_rate: 10.0 + unit: G + data_type: RAW + topic_name: android_pebble_2_acceleration + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.pebble.Pebble2Acceleration + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDoubleArray + - name: BATTERY + sample_rate: 1.0 + unit: PERCENTAGE + data_type: RAW + topic_name: android_pebble_2_battery_level + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.pebble.Pebble2BatteryLevel + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + - name: HEART_RATE + sample_rate: 1.0 + unit: BEATS_PER_MIN + data_type: RAW + topic_name: android_pebble_2_heart_rate + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.pebble.Pebble2HeartRate + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + - name: HEART_RATE_FILTERED + sample_rate: 1.0 + unit: BEATS_PER_MIN + data_type: VEDOR + topic_name: android_pebble_2_heart_rate_filtered + key_class: org.radarcns.kafka.key.KeyMeasurement + value_class: org.radarcns.passive.pebble.Pebble2HeartRateFiltered + aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble From 87f41c74368280c3332444e107846b2835aa0729 Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Wed, 2 Aug 2017 10:03:28 +0100 Subject: [PATCH 042/112] Added specifications schemas and fixed build.gradles --- java-sdk/radar-schemas-restapi/build.gradle | 3 ++ .../build.gradle | 32 +++++++++++++ .../config/checkstyle/checkstyle.xml | 0 .../config/intellij-java-google-style.xml | 0 .../config/pmd/ruleset.xml | 0 .../src/main/resources/logback.xml | 0 .../radarcns/validator/CatalogValidator.java | 45 ++++++++++--------- java-sdk/settings.gradle | 2 +- restapi/app/application.avsc | 2 +- restapi/data/acceleration.avsc | 8 ++-- restapi/data/double_sample.avsc | 4 +- restapi/data/quartiles.avsc | 2 +- restapi/dataset/dataset.avsc | 4 +- restapi/dataset/item.avsc | 8 ++-- restapi/header/descriptive_statistic.avsc | 2 +- restapi/header/effective_time_frame.avsc | 2 +- restapi/header/header.avsc | 18 ++++---- restapi/header/time_frame.avsc | 2 +- restapi/message.avsc | 2 +- restapi/sensor/data_type.avsc | 11 ----- restapi/sensor/sensor_specification.avsc | 12 ----- restapi/sensor/sensor_type.avsc | 15 ------- restapi/sensor/unit.avsc | 16 ------- restapi/{sensor => source}/sensor.avsc | 6 +-- restapi/source/source.avsc | 4 +- restapi/source/source_specification.avsc | 10 ----- restapi/source/source_summary.avsc | 6 +-- restapi/source/sources_type.avsc | 7 --- restapi/source/states.avsc | 4 +- restapi/spec/sensor_specification.avsc | 12 +++++ restapi/spec/source_specification.avsc | 10 +++++ restapi/subject/cohort.avsc | 2 +- restapi/subject/subject.avsc | 6 +-- {specification => specifications}/README.md | 0 .../active/phq8.yml | 2 +- .../monitor/android_application.yml | 8 ++-- .../passive/adroid_phone.yml | 12 ++--- .../passive/biovotion_vsm1.yml | 8 ++-- .../passive/empatica_e4.yml | 6 +-- .../passive/pebble_2.yml | 0 specifications/schemas/active_source.avsc | 10 +++++ specifications/schemas/data_type.avsc | 12 +++++ specifications/schemas/passive_source.avsc | 7 +++ specifications/schemas/sensor_name.avsc | 25 +++++++++++ specifications/schemas/unit.avsc | 21 +++++++++ 45 files changed, 216 insertions(+), 152 deletions(-) rename java-sdk/{radar-schemas-specification => radar-schemas-specifications}/build.gradle (77%) rename java-sdk/{radar-schemas-specification => radar-schemas-specifications}/config/checkstyle/checkstyle.xml (100%) rename java-sdk/{radar-schemas-specification => radar-schemas-specifications}/config/intellij-java-google-style.xml (100%) rename java-sdk/{radar-schemas-specification => radar-schemas-specifications}/config/pmd/ruleset.xml (100%) rename java-sdk/{radar-schemas-specification => radar-schemas-specifications}/src/main/resources/logback.xml (100%) delete mode 100644 restapi/sensor/data_type.avsc delete mode 100644 restapi/sensor/sensor_specification.avsc delete mode 100644 restapi/sensor/sensor_type.avsc delete mode 100644 restapi/sensor/unit.avsc rename restapi/{sensor => source}/sensor.avsc (51%) delete mode 100644 restapi/source/source_specification.avsc delete mode 100644 restapi/source/sources_type.avsc create mode 100644 restapi/spec/sensor_specification.avsc create mode 100644 restapi/spec/source_specification.avsc rename {specification => specifications}/README.md (100%) rename specification/active/ph8q.yml => specifications/active/phq8.yml (99%) rename {specification => specifications}/monitor/android_application.yml (91%) rename {specification => specifications}/passive/adroid_phone.yml (96%) rename {specification => specifications}/passive/biovotion_vsm1.yml (97%) rename {specification => specifications}/passive/empatica_e4.yml (97%) rename {specification => specifications}/passive/pebble_2.yml (100%) create mode 100644 specifications/schemas/active_source.avsc create mode 100644 specifications/schemas/data_type.avsc create mode 100644 specifications/schemas/passive_source.avsc create mode 100644 specifications/schemas/sensor_name.avsc create mode 100644 specifications/schemas/unit.avsc diff --git a/java-sdk/radar-schemas-restapi/build.gradle b/java-sdk/radar-schemas-restapi/build.gradle index 6d37a33f..0ca80d5f 100644 --- a/java-sdk/radar-schemas-restapi/build.gradle +++ b/java-sdk/radar-schemas-restapi/build.gradle @@ -9,6 +9,9 @@ task generateAvro(type: com.commercehub.gradle.plugin.avro.GenerateAvroJavaTask) include 'active/questionnaire/questionnaire.avsc' include 'monitor/application/application_server_status.avsc' } + source rootProject.fileTree('../specifications/schemas') { + include '**/*.avsc' + } source rootProject.fileTree('../restapi') { include '**/*.avsc' } diff --git a/java-sdk/radar-schemas-specification/build.gradle b/java-sdk/radar-schemas-specifications/build.gradle similarity index 77% rename from java-sdk/radar-schemas-specification/build.gradle rename to java-sdk/radar-schemas-specifications/build.gradle index 20f8516d..4bd0c60c 100644 --- a/java-sdk/radar-schemas-specification/build.gradle +++ b/java-sdk/radar-schemas-specifications/build.gradle @@ -39,6 +39,37 @@ dependencies { testCompile group: 'org.radarcns', name: 'radar-commons', version: radarCommonsVersion } +//---------------------------------------------------------------------------// +// AVRO file manipulation // +//---------------------------------------------------------------------------// +ext.excludedFromCheckStyle = [] + +task generateAvro(type: com.commercehub.gradle.plugin.avro.GenerateAvroJavaTask) { + source rootProject.fileTree('../commons') { + include 'active/questionnaire/questionnaire.avsc' + } + source rootProject.fileTree('../specifications/schemas') { + include '**/*.avsc' + } + + outputDir avroOutputDir + + //Files ignored from checkstyle + doLast { + def rootPath = sourceSets.main.allJava.srcDirTrees[0].dir.path + sourceSets.main.allJava.files.each { + excludedFromCheckStyle.add(it.path.replace(rootPath, '**')) + } + } +} +compileJava.dependsOn generateAvro + +task excludeAvroGenerated() { + doLast{ + checkstyleMain.exclude(excludedFromCheckStyle) + } +} + //---------------------------------------------------------------------------// // Test definition // //---------------------------------------------------------------------------// @@ -63,6 +94,7 @@ checkstyle { configFile = file("$projectDir/config/checkstyle/checkstyle.xml") } +checkstyleMain.dependsOn excludeAvroGenerated pmd { // pmd version diff --git a/java-sdk/radar-schemas-specification/config/checkstyle/checkstyle.xml b/java-sdk/radar-schemas-specifications/config/checkstyle/checkstyle.xml similarity index 100% rename from java-sdk/radar-schemas-specification/config/checkstyle/checkstyle.xml rename to java-sdk/radar-schemas-specifications/config/checkstyle/checkstyle.xml diff --git a/java-sdk/radar-schemas-specification/config/intellij-java-google-style.xml b/java-sdk/radar-schemas-specifications/config/intellij-java-google-style.xml similarity index 100% rename from java-sdk/radar-schemas-specification/config/intellij-java-google-style.xml rename to java-sdk/radar-schemas-specifications/config/intellij-java-google-style.xml diff --git a/java-sdk/radar-schemas-specification/config/pmd/ruleset.xml b/java-sdk/radar-schemas-specifications/config/pmd/ruleset.xml similarity index 100% rename from java-sdk/radar-schemas-specification/config/pmd/ruleset.xml rename to java-sdk/radar-schemas-specifications/config/pmd/ruleset.xml diff --git a/java-sdk/radar-schemas-specification/src/main/resources/logback.xml b/java-sdk/radar-schemas-specifications/src/main/resources/logback.xml similarity index 100% rename from java-sdk/radar-schemas-specification/src/main/resources/logback.xml rename to java-sdk/radar-schemas-specifications/src/main/resources/logback.xml diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CatalogValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CatalogValidator.java index 83f78998..c0b73dd6 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CatalogValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CatalogValidator.java @@ -58,7 +58,8 @@ public enum NameFolder { MONITOR("monitor"), PASSIVE("passive"), RESTAPI("restapi"), - SPECIFICATION("specification"); + SCHEMAS("schemas"), + SPECIFICATIONS("specifications"); private final String name; @@ -74,14 +75,14 @@ public String getName() { /** Root paths. */ public enum RootPath { COMMONS(Paths.get( - new File(".").toURI()).getParent().getParent().getParent().resolve( - NameFolder.COMMONS.getName())), + new File(".").toURI()).getParent().getParent().getParent().resolve( + NameFolder.COMMONS.getName())), REST_API(Paths.get( - new File(".").toURI()).getParent().getParent().getParent().resolve( - NameFolder.RESTAPI.getName())), - SPECIFICATION(Paths.get( - new File(".").toURI()).getParent().getParent().getParent().resolve( - NameFolder.SPECIFICATION.getName())); + new File(".").toURI()).getParent().getParent().getParent().resolve( + NameFolder.RESTAPI.getName())), + SPECIFICATIONS(Paths.get( + new File(".").toURI()).getParent().getParent().getParent().resolve( + NameFolder.SPECIFICATIONS.getName())); private final Path path; @@ -98,7 +99,7 @@ public Path getPath() { public enum RootFolder { COMMONS(new File(RootPath.COMMONS.getPath().toUri())), REST_API(new File(RootPath.REST_API.getPath().toUri())), - SPECIFICATION(new File(RootPath.SPECIFICATION.getPath().toUri())); + SPECIFICATIONS(new File(RootPath.SPECIFICATIONS.getPath().toUri())); private final File folder; @@ -130,13 +131,15 @@ public File getFolder() { } /** Commons folders. */ - /*public enum SpecificationFolder { - ACTIVE(new File(RootPath.SPECIFICATION.getPath().resolve( - NameFolder.ACTIVE.getName()).toUri())), - MONITOR(new File(RootPath.SPECIFICATION.getPath().resolve( - NameFolder.MONITOR.getName()).toUri())), - PASSIVE(new File(RootPath.SPECIFICATION.getPath().resolve( - NameFolder.PASSIVE.getName()).toUri())); + public enum SpecificationFolder { + ACTIVE(new File(RootPath.SPECIFICATIONS.getPath().resolve( + NameFolder.ACTIVE.getName()).toUri())), + MONITOR(new File(RootPath.SPECIFICATIONS.getPath().resolve( + NameFolder.MONITOR.getName()).toUri())), + PASSIVE(new File(RootPath.SPECIFICATIONS.getPath().resolve( + NameFolder.PASSIVE.getName()).toUri())), + SCHEMAS(new File(RootPath.SPECIFICATIONS.getPath().resolve( + NameFolder.SCHEMAS.getName()).toUri())); private final File folder; @@ -147,7 +150,7 @@ public File getFolder() { public File getFolder() { return folder; } - }*/ + } @Before public void validateSkipConfig() { @@ -172,12 +175,12 @@ public void restapi() { //TODO check whether it is possible to define a structure } - /*@Test - public void specification() { - assertEquals(true, RootFolder.SPECIFICATION.getFolder().isDirectory()); + @Test + public void specifications() { + assertEquals(true, RootFolder.SPECIFICATIONS.getFolder().isDirectory()); for (SpecificationFolder folder : SpecificationFolder.values()) { assertEquals(true, folder.getFolder().isDirectory()); } - }*/ + } } diff --git a/java-sdk/settings.gradle b/java-sdk/settings.gradle index 834cfaa4..f8129cca 100644 --- a/java-sdk/settings.gradle +++ b/java-sdk/settings.gradle @@ -3,4 +3,4 @@ rootProject.name = 'radar-schemas' include ':radar-schemas-validator' include ':radar-schemas-commons' include ':radar-schemas-restapi' -include ':radar-schemas-specification' +include ':radar-schemas-specifications' diff --git a/restapi/app/application.avsc b/restapi/app/application.avsc index e4874458..6cdbaaa9 100644 --- a/restapi/app/application.avsc +++ b/restapi/app/application.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.avro.restapi.app", + "namespace": "org.radarcns.restapi.app", "type": "record", "name": "Application", "doc": "Smartphone application status", diff --git a/restapi/data/acceleration.avsc b/restapi/data/acceleration.avsc index 6dc1fcf3..3c72a07f 100644 --- a/restapi/data/acceleration.avsc +++ b/restapi/data/acceleration.avsc @@ -1,11 +1,11 @@ { - "namespace": "org.radarcns.avro.restapi.data", + "namespace": "org.radarcns.restapi.data", "type": "record", "name": "Acceleration", "doc": "Acceleration sample with gravitational constant g as unit.", "fields": [ - {"name": "x", "type": [ "double" , "org.radarcns.avro.restapi.data.Quartiles" ], "doc": "acceleration in the x-axis (g)"}, - {"name": "y", "type": [ "double" , "org.radarcns.avro.restapi.data.Quartiles" ], "doc": "acceleration in the y-axis (g)"}, - {"name": "z", "type": [ "double" , "org.radarcns.avro.restapi.data.Quartiles" ], "doc": "acceleration in the z-axis (g)"} + {"name": "x", "type": [ "double" , "org.radarcns.restapi.data.Quartiles" ], "doc": "acceleration in the x-axis (g)"}, + {"name": "y", "type": [ "double" , "org.radarcns.restapi.data.Quartiles" ], "doc": "acceleration in the y-axis (g)"}, + {"name": "z", "type": [ "double" , "org.radarcns.restapi.data.Quartiles" ], "doc": "acceleration in the z-axis (g)"} ] } diff --git a/restapi/data/double_sample.avsc b/restapi/data/double_sample.avsc index b8f631e0..4e94d91f 100644 --- a/restapi/data/double_sample.avsc +++ b/restapi/data/double_sample.avsc @@ -1,9 +1,9 @@ { - "namespace": "org.radarcns.avro.restapi.data", + "namespace": "org.radarcns.restapi.data", "type": "record", "name": "DoubleSample", "doc": "Generic sample represented by a double value. A specific schema is provided to represent quartile values.", "fields": [ - {"name": "value", "type": [ "double" , "org.radarcns.avro.restapi.data.Quartiles" ], "doc": "sample value"} + {"name": "value", "type": [ "double" , "org.radarcns.restapi.data.Quartiles" ], "doc": "sample value"} ] } diff --git a/restapi/data/quartiles.avsc b/restapi/data/quartiles.avsc index 5690710d..05a0d4f5 100644 --- a/restapi/data/quartiles.avsc +++ b/restapi/data/quartiles.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.avro.restapi.data", + "namespace": "org.radarcns.restapi.data", "type": "record", "name": "Quartiles", "doc": "List of quartiles", diff --git a/restapi/dataset/dataset.avsc b/restapi/dataset/dataset.avsc index 05ad8e83..600c2031 100644 --- a/restapi/dataset/dataset.avsc +++ b/restapi/dataset/dataset.avsc @@ -1,10 +1,10 @@ { - "namespace": "org.radarcns.avro.restapi.dataset", + "namespace": "org.radarcns.restapi.dataset", "type": "record", "name": "Dataset", "doc": "A generic collection of samples. Its body is divide in Header and Dataset: metadata and sensor data.", "fields": [ - {"name": "header", "type": "org.radarcns.avro.restapi.header.Header", "doc": "Information useful to contextualise the data set"}, + {"name": "header", "type": "org.radarcns.restapi.header.Header", "doc": "Information useful to contextualise the data set"}, {"name": "dataset", "type": {"type": "array", "items": "Item" }, "doc": "Collection of samples"} ] } diff --git a/restapi/dataset/item.avsc b/restapi/dataset/item.avsc index aec6df46..0db75d1e 100644 --- a/restapi/dataset/item.avsc +++ b/restapi/dataset/item.avsc @@ -1,14 +1,14 @@ { - "namespace": "org.radarcns.avro.restapi.dataset", + "namespace": "org.radarcns.restapi.dataset", "type": "record", "name": "Item", "doc": "Dataset item. It contains a value and its related time.", "fields": [ {"name": "sample", "type": [ - "org.radarcns.avro.restapi.data.DoubleSample" , - "org.radarcns.avro.restapi.data.Acceleration", + "org.radarcns.restapi.data.DoubleSample" , + "org.radarcns.restapi.data.Acceleration", "org.radarcns.active.questionnaire.Questionnaire" - ], "doc": "Sample value. For more details, check org.radarcns.avro.restapi.data.Acceleration, org.radarcns.avro.restapi.data.DoubleSample and org.radarcns.questionnaire.Questionnaire" } , + ], "doc": "Sample value. For more details, check org.radarcns.restapi.data.Acceleration, org.radarcns.restapi.data.DoubleSample and org.radarcns.questionnaire.Questionnaire" } , {"name": "startDateTime", "type": "string", "doc": "Point in time (ISO8601) with UTC timezone. It represents the timestamp of the first sample contained inside the aggregated data."} ] } diff --git a/restapi/header/descriptive_statistic.avsc b/restapi/header/descriptive_statistic.avsc index adf716c7..c2e7b61a 100644 --- a/restapi/header/descriptive_statistic.avsc +++ b/restapi/header/descriptive_statistic.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.avro.restapi.header", + "namespace": "org.radarcns.restapi.header", "type": "enum", "name": "DescriptiveStatistic", "doc": "Statical values", diff --git a/restapi/header/effective_time_frame.avsc b/restapi/header/effective_time_frame.avsc index ec139cb2..c35a5112 100644 --- a/restapi/header/effective_time_frame.avsc +++ b/restapi/header/effective_time_frame.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.avro.restapi.header", + "namespace": "org.radarcns.restapi.header", "type": "record", "name": "EffectiveTimeFrame", "doc": "Provide the first and the last timestamp contained in the dataset", diff --git a/restapi/header/header.avsc b/restapi/header/header.avsc index 06bf7908..2818caca 100644 --- a/restapi/header/header.avsc +++ b/restapi/header/header.avsc @@ -1,16 +1,16 @@ { - "namespace": "org.radarcns.avro.restapi.header", + "namespace": "org.radarcns.restapi.header", "type": "record", "name": "Header", "doc": "Metadata for Dataset. It is a summary explaining what kind of information are stored in the Dataset.", "fields": [ - {"name": "subjectId", "type": "string", "doc": "Subject identifier"}, - {"name": "sourceId", "type": "string", "doc": "Source identifier"}, - {"name": "source", "type": "org.radarcns.avro.restapi.source.SourceType", "doc": "Source type"}, - {"name": "sensor", "type": "org.radarcns.avro.restapi.sensor.SensorType", "doc": "Sensor that has generated data"}, - {"name": "descriptiveStatistic", "type": "DescriptiveStatistic", "doc": "Statical value expressed by samples" }, - {"name": "unit", "type": "org.radarcns.avro.restapi.sensor.Unit", "doc": "Measurement unit with which samples are measured" }, - {"name": "timeFrame", "type": "TimeFrame", "doc": "Time interval between two consecutive samples" }, - {"name": "effectiveTimeFrame", "type": "EffectiveTimeFrame", "doc": "Timestamps of the first and the last samples contained in the dataset" } + { "name": "subjectId", "type": "string", "doc": "Subject identifier." }, + { "name": "sourceId", "type": "string", "doc": "Source identifier." }, + { "name": "source", "type": ["org.radarcns.specifications.ActiveSource", "org.radarcns.specifications.PassiveSource"], "doc": "Source information, it can be a device or assessment name." }, + { "name": "type", "type": ["org.radarcns.specifications.SensorName", "org.radarcns.active.questionnaire.QuestionnaireType"], "doc": "Report the sensor name or specific type of assessment." }, + { "name": "descriptiveStatistic", "type": "DescriptiveStatistic", "doc": "Statical value expressed by samples." }, + { "name": "unit", "type": "org.radarcns.specifications.Unit", "doc": "Unit used by the source." }, + { "name": "timeFrame", "type": "TimeFrame", "doc": "Time interval between two consecutive samples." }, + { "name": "effectiveTimeFrame", "type": "EffectiveTimeFrame", "doc": "Timestamps of the first and the last samples contained in the dataset." } ] } diff --git a/restapi/header/time_frame.avsc b/restapi/header/time_frame.avsc index 9a5e5feb..01262783 100644 --- a/restapi/header/time_frame.avsc +++ b/restapi/header/time_frame.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.avro.restapi.header", + "namespace": "org.radarcns.restapi.header", "type": "enum", "name": "TimeFrame", "doc": "Interval between two consecutive samples", diff --git a/restapi/message.avsc b/restapi/message.avsc index 3e48342c..a56f70a7 100644 --- a/restapi/message.avsc +++ b/restapi/message.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.avro.restapi.avro", + "namespace": "org.radarcns.restapi.avro", "type": "record", "name": "Message", "doc": "Message to provide information to the end user in case a function does not provide the expected result", diff --git a/restapi/sensor/data_type.avsc b/restapi/sensor/data_type.avsc deleted file mode 100644 index d41c74d1..00000000 --- a/restapi/sensor/data_type.avsc +++ /dev/null @@ -1,11 +0,0 @@ -{ - "namespace": "org.radarcns.avro.restapi.sensor", - "type": "enum", - "name": "DataType", - "doc": "States if a sample is recorded directly by a sensor or it is computed. Any value different from RAW states who computes the value.", - "symbols": [ - "RAW" , - "VENDOR", - "RADAR" - ] -} diff --git a/restapi/sensor/sensor_specification.avsc b/restapi/sensor/sensor_specification.avsc deleted file mode 100644 index 52dfe48e..00000000 --- a/restapi/sensor/sensor_specification.avsc +++ /dev/null @@ -1,12 +0,0 @@ -{ - "namespace": "org.radarcns.avro.restapi.sensor", - "type": "record", - "name": "SensorSpecification", - "doc": "Sensor specification", - "fields": [ - {"name": "name", "type": "SensorType", "doc": "Sensor name"}, - {"name": "dataType", "type": "DataType", "doc": "Explains if the values is a raw data, otherwise it reports who computes it"}, - {"name": "frequency", "type": "double", "default": -1.0, "doc": "Number of expected samples per second"}, - {"name": "unit", "type": "org.radarcns.avro.restapi.sensor.Unit", "doc": "Measurement unit used by the sensor"} - ] -} diff --git a/restapi/sensor/sensor_type.avsc b/restapi/sensor/sensor_type.avsc deleted file mode 100644 index 83945dd0..00000000 --- a/restapi/sensor/sensor_type.avsc +++ /dev/null @@ -1,15 +0,0 @@ -{ - "namespace": "org.radarcns.avro.restapi.sensor", - "type": "enum", - "name": "SensorType", - "doc": "Sensor types", - "symbols": [ - "ACCELEROMETER" , - "BATTERY", - "BLOOD_VOLUME_PULSE", - "ELECTRODERMAL_ACTIVITY", - "INTER_BEAT_INTERVAL", - "HEART_RATE", - "THERMOMETER" - ] -} diff --git a/restapi/sensor/unit.avsc b/restapi/sensor/unit.avsc deleted file mode 100644 index 1f0a7709..00000000 --- a/restapi/sensor/unit.avsc +++ /dev/null @@ -1,16 +0,0 @@ -{ - "namespace": "org.radarcns.avro.restapi.sensor", - "type": "enum", - "name": "Unit", - "doc": "Measurement units", - "symbols": [ - "BEATS_PER_MIN" , - "CELSIUS", - "DIMENSIONLESS", - "G", - "MICROSIEMENS", - "SECOND", - "NANOWATT", - "PERCENTAGE" - ] -} diff --git a/restapi/sensor/sensor.avsc b/restapi/source/sensor.avsc similarity index 51% rename from restapi/sensor/sensor.avsc rename to restapi/source/sensor.avsc index 00c3e103..304ac9d1 100644 --- a/restapi/sensor/sensor.avsc +++ b/restapi/source/sensor.avsc @@ -1,11 +1,11 @@ { - "namespace": "org.radarcns.avro.restapi.sensor", + "namespace": "org.radarcns.restapi.source", "type": "record", "name": "Sensor", "doc": "Sensor details", "fields": [ - {"name": "name", "type": "SensorType", "doc": "Sensor name"}, - {"name": "state", "type": "org.radarcns.avro.restapi.source.State", "default": "UNKNOWN", "doc": "Current sensor state computed using the received data"}, + {"name": "name", "type": "org.radarcns.specifications.SensorName", "doc": "Sensor name"}, + {"name": "state", "type": "States", "default": "UNKNOWN", "doc": "Current sensor state computed using the received data"}, {"name": "receivedMessage", "type": "int", "default": -1, "doc": "Amount of received messages"}, {"name": "messageLoss", "type": "double", "default": -1.0, "doc": "Percentage of lost messages"} ] diff --git a/restapi/source/source.avsc b/restapi/source/source.avsc index b1ea6c03..81868e64 100644 --- a/restapi/source/source.avsc +++ b/restapi/source/source.avsc @@ -1,11 +1,11 @@ { - "namespace": "org.radarcns.avro.restapi.source", + "namespace": "org.radarcns.restapi.source", "type": "record", "name": "Source", "doc": "Source details", "fields": [ {"name": "id", "type": "string", "doc": "Source identifier" }, - {"name": "type", "type": "SourceType", "doc": "Source name" }, + {"name": "type", "type": "org.radarcns.specifications.PassiveSource", "doc": "Source name" }, {"name": "summary", "type": ["null", "SourceSummary"], "default": null, "doc": "Source details" } ] } diff --git a/restapi/source/source_specification.avsc b/restapi/source/source_specification.avsc deleted file mode 100644 index 40b305f0..00000000 --- a/restapi/source/source_specification.avsc +++ /dev/null @@ -1,10 +0,0 @@ -{ - "namespace": "org.radarcns.avro.restapi.source", - "type": "record", - "name": "SourceSpecification", - "doc": "Source specification", - "fields": [ - {"name": "name", "type": "SourceType", "doc": "Source name"}, - {"name": "sensors", "type": {"type": "map", "values": "org.radarcns.avro.restapi.sensor.SensorSpecification" }, "doc": "Specifications of on board sensors. It is a map where the key is the String conversion of a SensorType"} - ] -} diff --git a/restapi/source/source_summary.avsc b/restapi/source/source_summary.avsc index 5fa73bb1..7afcd79e 100644 --- a/restapi/source/source_summary.avsc +++ b/restapi/source/source_summary.avsc @@ -1,12 +1,12 @@ { - "namespace": "org.radarcns.avro.restapi.source", + "namespace": "org.radarcns.restapi.source", "type": "record", "name": "SourceSummary", "doc": "Details about the source with details for each sensor", "fields": [ - {"name": "state", "type": "State", "default": "UNKNOWN", "doc": "Current source state computed using the received data"}, + {"name": "state", "type": "States", "default": "UNKNOWN", "doc": "Current source state computed using the received data"}, {"name": "receivedMessage", "type": "int", "default": -1, "doc": "Amount of received messages"}, {"name": "messageLoss", "type": "double", "default": -1.0, "doc": "Percentage of lost messages"}, - {"name": "sensors", "type": {"type": "map", "values": "org.radarcns.avro.restapi.sensor.Sensor", "doc": "States of on board sensors. It is a Map where the key is the String conversion of a SensorType"} } + {"name": "sensors", "type": {"type": "map", "values": "Sensor", "doc": "States of on board sensors. It is a Map where the key is the String conversion of a SensorType"} } ] } diff --git a/restapi/source/sources_type.avsc b/restapi/source/sources_type.avsc deleted file mode 100644 index 8ac85a62..00000000 --- a/restapi/source/sources_type.avsc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "namespace": "org.radarcns.avro.restapi.source", - "type": "enum", - "name": "SourceType", - "doc": "All available sources", - "symbols": [ "ANDROID" , "EMPATICA", "PEBBLE", "BIOVOTION" ] -} diff --git a/restapi/source/states.avsc b/restapi/source/states.avsc index ff781488..757695ea 100644 --- a/restapi/source/states.avsc +++ b/restapi/source/states.avsc @@ -1,7 +1,7 @@ { - "namespace": "org.radarcns.avro.restapi.source", + "namespace": "org.radarcns.restapi.source", "type": "enum", - "name": "State", + "name": "States", "doc": "Set of device status", "symbols": [ "FINE" , "OK", "WARNING", "DISCONNECTED", "UNKNOWN" ] } diff --git a/restapi/spec/sensor_specification.avsc b/restapi/spec/sensor_specification.avsc new file mode 100644 index 00000000..640e04ed --- /dev/null +++ b/restapi/spec/sensor_specification.avsc @@ -0,0 +1,12 @@ +{ + "namespace": "org.radarcns.restapi.spec", + "type": "record", + "name": "SensorSpecification", + "doc": "Sensor specification", + "fields": [ + {"name": "name", "type": "org.radarcns.specifications.SensorName", "doc": "Sensor name"}, + {"name": "dataType", "type": "org.radarcns.specifications.DataType", "doc": "Explains if the values is a raw data, otherwise it reports who computes it"}, + {"name": "frequency", "type": "double", "default": -1.0, "doc": "Number of expected samples per second"}, + {"name": "unit", "type": "org.radarcns.specifications.Unit", "doc": "Measurement unit used by the sensor"} + ] +} diff --git a/restapi/spec/source_specification.avsc b/restapi/spec/source_specification.avsc new file mode 100644 index 00000000..1474a11e --- /dev/null +++ b/restapi/spec/source_specification.avsc @@ -0,0 +1,10 @@ +{ + "namespace": "org.radarcns.restapi.spec", + "type": "record", + "name": "SourceSpecification", + "doc": "Source specification", + "fields": [ + {"name": "name", "type": "org.radarcns.specifications.PassiveSource", "doc": "Source name"}, + {"name": "sensors", "type": {"type": "map", "values": "SensorSpecification" }, "doc": "Specifications of on board sensors. It is a map where the key is the String conversion of a SensorType"} + ] +} diff --git a/restapi/subject/cohort.avsc b/restapi/subject/cohort.avsc index ee6b39a6..9a601dde 100644 --- a/restapi/subject/cohort.avsc +++ b/restapi/subject/cohort.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.avro.restapi.subject", + "namespace": "org.radarcns.restapi.subject", "type": "record", "name": "Cohort", "doc": "Cohort definition", diff --git a/restapi/subject/subject.avsc b/restapi/subject/subject.avsc index 6cc7c283..e60b8afc 100644 --- a/restapi/subject/subject.avsc +++ b/restapi/subject/subject.avsc @@ -1,12 +1,12 @@ { - "namespace": "org.radarcns.avro.restapi.subject", + "namespace": "org.radarcns.restapi.subject", "type": "record", "name": "Subject", "doc": "Subject definition", "fields": [ {"name": "subjectId", "type": "string", "doc": "Subject identifier"}, {"name": "active", "type": "boolean", "doc": "True if the subject is engaged, false otherwise. False means the subject is no longer monitored" }, - {"name": "effectiveTimeFrame", "type": "org.radarcns.avro.restapi.header.EffectiveTimeFrame", "doc": "Timestamps of the first and the last samples received by the subject" }, - {"name": "sources", "type": {"type": "array", "items": "org.radarcns.avro.restapi.source.Source" }, "doc": "List of sources used by the subject"} + {"name": "effectiveTimeFrame", "type": "org.radarcns.restapi.header.EffectiveTimeFrame", "doc": "Timestamps of the first and the last samples received by the subject" }, + {"name": "sources", "type": {"type": "array", "items": "org.radarcns.restapi.source.Source" }, "doc": "List of sources used by the subject"} ] } diff --git a/specification/README.md b/specifications/README.md similarity index 100% rename from specification/README.md rename to specifications/README.md diff --git a/specification/active/ph8q.yml b/specifications/active/phq8.yml similarity index 99% rename from specification/active/ph8q.yml rename to specifications/active/phq8.yml index 051b29c5..8c910ce2 100644 --- a/specification/active/ph8q.yml +++ b/specifications/active/phq8.yml @@ -1,5 +1,5 @@ #===================== Personal Health Questionnaire Depression Scale (PHQ-8) =====================# -name: PHQ8 +name: PHQ8 #QuestionnaireType assestment_type: QUESTIONNAIRE topic_name: questionnaire_phq8 key_class: org.radarcns.kafka.key.KeyMeasurement diff --git a/specification/monitor/android_application.yml b/specifications/monitor/android_application.yml similarity index 91% rename from specification/monitor/android_application.yml rename to specifications/monitor/android_application.yml index bb4abf00..a0593383 100644 --- a/specification/monitor/android_application.yml +++ b/specifications/monitor/android_application.yml @@ -4,28 +4,28 @@ app_provider: .application.ApplicationServiceProvider sensors: - name: EXTERNAL_TIME sample_rate: 0.08 - unit: NONDIMENSIONAL + unit: NON_DIMENSIONAL data_type: RAW topic_name: application_external_time key_class: org.radarcns.kafka.key.KeyMeasurement value_class: org.radarcns.monitor.application.ApplicationExternalTime - name: RECORD_COUNTS sample_rate: 0.08 - unit: NONDIMENSIONAL + unit: NON_DIMENSIONAL data_type: RAW topic_name: application_record_counts key_class: org.radarcns.kafka.key.KeyMeasurement value_class: org.radarcns.monitor.application.ApplicationRecordCounts - name: SERVER_STATUS sample_rate: 0.08 - unit: NONDIMENSIONAL + unit: NON_DIMENSIONAL data_type: RAW topic_name: application_server_status key_class: org.radarcns.kafka.key.KeyMeasurement value_class: org.radarcns.monitor.application.ApplicationServerStatus - name: UPTIME sample_rate: 0.08 - unit: NONDIMENSIONAL + unit: NON_DIMENSIONAL data_type: RAW topic_name: application_uptime key_class: org.radarcns.kafka.key.KeyMeasurement diff --git a/specification/passive/adroid_phone.yml b/specifications/passive/adroid_phone.yml similarity index 96% rename from specification/passive/adroid_phone.yml rename to specifications/passive/adroid_phone.yml index 9127937f..8ad43569 100644 --- a/specification/passive/adroid_phone.yml +++ b/specifications/passive/adroid_phone.yml @@ -51,7 +51,7 @@ sensors: - name: STEP_COUNT app_provider: .phone.PhoneSensorProvider sample_rate: #TODO - unit: NONDIMENSIONAL + unit: NON_DIMENSIONAL data_type: VENDOR topic_name: android_phone_step_count key_class: org.radarcns.kafka.key.KeyMeasurement @@ -70,7 +70,7 @@ sensors: - name: PHONE_CALL app_provider: .phone.PhoneLogProvider sample_rate: #TODO - unit: NONDIMENSIONAL + unit: NON_DIMENSIONAL data_type: RAW topic_name: android_phone_call key_class: org.radarcns.kafka.key.KeyMeasurement @@ -78,7 +78,7 @@ sensors: - name: PHONE_SMS app_provider: .phone.PhoneLogProvider sample_rate: #TODO - unit: NONDIMENSIONAL + unit: NON_DIMENSIONAL data_type: RAW topic_name: android_phone_sms key_class: org.radarcns.kafka.key.KeyMeasurement @@ -86,7 +86,7 @@ sensors: - name: PHONE_SMS_UNREAD app_provider: .phone.PhoneLogProvider sample_rate: #TODO - unit: NONDIMENSIONAL + unit: NON_DIMENSIONAL data_type: RAW topic_name: android_phone_sms_unread key_class: org.radarcns.kafka.key.KeyMeasurement @@ -95,7 +95,7 @@ sensors: - name: USAGE_EVENT app_provider: .phone.PhoneUsageProvider sample_rate: #TODO - unit: NONDIMENSIONAL + unit: NON_DIMENSIONAL data_type: RAW topic_name: android_phone_user_event key_class: org.radarcns.kafka.key.KeyMeasurement @@ -103,7 +103,7 @@ sensors: - name: USER_INTERACTION app_provider: .phone.PhoneUsageProvider sample_rate: #TODO - unit: NONDIMENSIONAL + unit: NON_DIMENSIONAL data_type: RAW topic_name: android_phone_user_interaction key_class: org.radarcns.kafka.key.KeyMeasurement diff --git a/specification/passive/biovotion_vsm1.yml b/specifications/passive/biovotion_vsm1.yml similarity index 97% rename from specification/passive/biovotion_vsm1.yml rename to specifications/passive/biovotion_vsm1.yml index 2e082c5d..4d005cbc 100644 --- a/specification/passive/biovotion_vsm1.yml +++ b/specifications/passive/biovotion_vsm1.yml @@ -21,7 +21,7 @@ sensors: aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble - name: BLOOD_PULSE_WAVE sample_rate: 1.0 - unit: NONDIMENSIONAL + unit: NON_DIMENSIONAL data_type: VENDOR topic_name: android_biovotion_vsm1_acceleration key_class: org.radarcns.kafka.key.KeyMeasurement @@ -61,15 +61,15 @@ sensors: aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble - name: LED sample_rate: 1.0 - unit: MILLI_AMPER + unit: MILLI_AMPERE data_type: VENDOR topic_name: android_biovotion_vsm1_led_current key_class: org.radarcns.kafka.key.KeyMeasurement value_class: org.radarcns.passive.biovotion.BiovotionVsm1LedCurrent aggregator_class: org.radarcns.kafka.aggregator.AggregatorDoubleArray - - name: PPG + - name: PHOTOPLETHYSMOGRAPHY sample_rate: 51.2 - unit: NONDIMENSIONAL + unit: NON_DIMENSIONAL data_type: VENDOR topic_name: android_biovotion_vsm1_ppg_current key_class: org.radarcns.kafka.key.KeyMeasurement diff --git a/specification/passive/empatica_e4.yml b/specifications/passive/empatica_e4.yml similarity index 97% rename from specification/passive/empatica_e4.yml rename to specifications/passive/empatica_e4.yml index 72745bfa..03f2719e 100644 --- a/specification/passive/empatica_e4.yml +++ b/specifications/passive/empatica_e4.yml @@ -21,7 +21,7 @@ sensors: aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble - name: BLOOD_VOLUME_PULSE sample_rate: 64.0 - unit: NANOWATT + unit: NANO_WATT data_type: RAW topic_name: android_empatica_e4_blood_volume_pulse key_class: org.radarcns.kafka.key.KeyMeasurement @@ -29,7 +29,7 @@ sensors: aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble - name: ELECTRODERMAL_ACTIVITY sample_rate: 4.0 - unit: MICROSIEMENS + unit: MICRO_SIEMENS data_type: RAW topic_name: android_empatica_e4_electrodermal_activity key_class: org.radarcns.kafka.key.KeyMeasurement @@ -51,7 +51,7 @@ sensors: key_class: org.radarcns.kafka.key.KeyMeasurement value_class: org.radarcns.passive.empatica.EmpaticaE4BatteryLevel aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble -aggregators: +processed: - name: HEART_RATE sample_rate: 1.0 unit: BEATS_PER_MIN diff --git a/specification/passive/pebble_2.yml b/specifications/passive/pebble_2.yml similarity index 100% rename from specification/passive/pebble_2.yml rename to specifications/passive/pebble_2.yml diff --git a/specifications/schemas/active_source.avsc b/specifications/schemas/active_source.avsc new file mode 100644 index 00000000..edd794dc --- /dev/null +++ b/specifications/schemas/active_source.avsc @@ -0,0 +1,10 @@ +{ + "namespace": "org.radarcns.specifications", + "type": "enum", + "name": "ActiveSource", + "doc": "List of integrated active sources.", + "symbols": [ + "QUESTIONNAIRE", + "UNKNOWN" + ] +} diff --git a/specifications/schemas/data_type.avsc b/specifications/schemas/data_type.avsc new file mode 100644 index 00000000..6ac975f0 --- /dev/null +++ b/specifications/schemas/data_type.avsc @@ -0,0 +1,12 @@ +{ + "namespace": "org.radarcns.specifications", + "type": "enum", + "name": "DataType", + "doc": "Data directly collected form an hardware senor or that has not been pre-processed is defined RAW. Any value different from RAW states who computes the value.", + "symbols": [ + "RAW" , + "VENDOR", + "RADAR", + "UNKNOWN" + ] +} diff --git a/specifications/schemas/passive_source.avsc b/specifications/schemas/passive_source.avsc new file mode 100644 index 00000000..cf306825 --- /dev/null +++ b/specifications/schemas/passive_source.avsc @@ -0,0 +1,7 @@ +{ + "namespace": "org.radarcns.specifications", + "type": "enum", + "name": "PassiveSource", + "doc": "Integrated passive sources", + "symbols": [ "ANDROID_PHONE" , "EMPATICA_E4", "PEBBLE_2", "BIOVOTION_VSM1", "UNKNOWN" ] +} diff --git a/specifications/schemas/sensor_name.avsc b/specifications/schemas/sensor_name.avsc new file mode 100644 index 00000000..7289aa74 --- /dev/null +++ b/specifications/schemas/sensor_name.avsc @@ -0,0 +1,25 @@ +{ + "namespace": "org.radarcns.specifications", + "type": "enum", + "name": "SensorName", + "doc": "Sensor types", + "symbols": [ + "ACCELEROMETER" , + "BATTERY", + "BLOOD_VOLUME_PULSE", + "BLOOD_PULSE_WAVE", + "ELECTRODERMAL_ACTIVITY", + "ENERGY", + "GALVANIC_SKIN_RESPONSE", + "HEART_RATE", + "HEART_RATE_FILTERED", + "HEART_RATE_VARIABILITY", + "INTER_BEAT_INTERVAL", + "LED", + "OXYGEN_SATURATION", + "PHOTOPLETHYSMOGRAPHY", + "RESPIRATION_RATE", + "THERMOMETER", + "UNKNOWN" + ] +} diff --git a/specifications/schemas/unit.avsc b/specifications/schemas/unit.avsc new file mode 100644 index 00000000..25b23bf4 --- /dev/null +++ b/specifications/schemas/unit.avsc @@ -0,0 +1,21 @@ +{ + "namespace": "org.radarcns.specifications", + "type": "enum", + "name": "Unit", + "doc": "Measurement units", + "symbols": [ + "BEATS_PER_MIN" , + "CALORIES_PER_SEC", + "CELSIUS", + "G", + "KILO_OHM", + "MICRO_SIEMENS", + "MILLI_AMPERE", + "NANO_WATT", + "NON_DIMENSIONAL", + "PERCENTAGE", + "RMSSD_IN_MILLI_SEC", + "SECOND", + "UNKNOWN" + ] +} From d91751a01c775685288eb8e6071d41d1ccb21057 Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Wed, 2 Aug 2017 11:27:10 +0100 Subject: [PATCH 043/112] Moved specification schemas to commons --- .gitignore | 8 ++ .../catalogue}/active_source.avsc | 2 +- .../catalogue}/data_type.avsc | 2 +- .../catalogue}/passive_source.avsc | 2 +- .../catalogue}/sensor_name.avsc | 2 +- .../schemas => commons/catalogue}/unit.avsc | 2 +- java-sdk/build.gradle | 4 - java-sdk/radar-schemas-commons/build.gradle | 7 ++ java-sdk/radar-schemas-restapi/build.gradle | 11 ++- .../radar-schemas-specifications/build.gradle | 38 ++++------ restapi/header/header.avsc | 6 +- restapi/source/sensor.avsc | 2 +- restapi/source/source.avsc | 2 +- restapi/spec/sensor_specification.avsc | 6 +- restapi/spec/source_specification.avsc | 2 +- specifications/active/phq8.yml | 4 +- .../monitor/android_application.yml | 16 ++-- specifications/passive/adroid_phone.yml | 60 +++++++-------- specifications/passive/biovotion_vsm1.yml | 74 +++++++++---------- specifications/passive/empatica_e4.yml | 38 +++++----- specifications/passive/pebble_2.yml | 24 +++--- 21 files changed, 161 insertions(+), 151 deletions(-) rename {specifications/schemas => commons/catalogue}/active_source.avsc (76%) rename {specifications/schemas => commons/catalogue}/data_type.avsc (86%) rename {specifications/schemas => commons/catalogue}/passive_source.avsc (79%) rename {specifications/schemas => commons/catalogue}/sensor_name.avsc (91%) rename {specifications/schemas => commons/catalogue}/unit.avsc (87%) diff --git a/.gitignore b/.gitignore index ca75b4bb..c0a90938 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,14 @@ build/ .gradletasknamecache gradle.properties *.java + +#======================================== Schemas Validator =======================================# !java-sdk/radar-schemas-validator/**/*.java java-sdk/radar-schemas-validator/build java-sdk/radar-schemas-validator/out + +#====================================== Schemas Specification =====================================# +!java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/**/*.java +java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/avro +java-sdk/radar-schemas-specifications/build +java-sdk/radar-schemas-specifications/out diff --git a/specifications/schemas/active_source.avsc b/commons/catalogue/active_source.avsc similarity index 76% rename from specifications/schemas/active_source.avsc rename to commons/catalogue/active_source.avsc index edd794dc..fa5cb251 100644 --- a/specifications/schemas/active_source.avsc +++ b/commons/catalogue/active_source.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.specifications", + "namespace": "org.radarcns.catalogue", "type": "enum", "name": "ActiveSource", "doc": "List of integrated active sources.", diff --git a/specifications/schemas/data_type.avsc b/commons/catalogue/data_type.avsc similarity index 86% rename from specifications/schemas/data_type.avsc rename to commons/catalogue/data_type.avsc index 6ac975f0..690001ae 100644 --- a/specifications/schemas/data_type.avsc +++ b/commons/catalogue/data_type.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.specifications", + "namespace": "org.radarcns.catalogue", "type": "enum", "name": "DataType", "doc": "Data directly collected form an hardware senor or that has not been pre-processed is defined RAW. Any value different from RAW states who computes the value.", diff --git a/specifications/schemas/passive_source.avsc b/commons/catalogue/passive_source.avsc similarity index 79% rename from specifications/schemas/passive_source.avsc rename to commons/catalogue/passive_source.avsc index cf306825..235a7d86 100644 --- a/specifications/schemas/passive_source.avsc +++ b/commons/catalogue/passive_source.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.specifications", + "namespace": "org.radarcns.catalogue", "type": "enum", "name": "PassiveSource", "doc": "Integrated passive sources", diff --git a/specifications/schemas/sensor_name.avsc b/commons/catalogue/sensor_name.avsc similarity index 91% rename from specifications/schemas/sensor_name.avsc rename to commons/catalogue/sensor_name.avsc index 7289aa74..6c93578a 100644 --- a/specifications/schemas/sensor_name.avsc +++ b/commons/catalogue/sensor_name.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.specifications", + "namespace": "org.radarcns.catalogue", "type": "enum", "name": "SensorName", "doc": "Sensor types", diff --git a/specifications/schemas/unit.avsc b/commons/catalogue/unit.avsc similarity index 87% rename from specifications/schemas/unit.avsc rename to commons/catalogue/unit.avsc index 25b23bf4..4e1670db 100644 --- a/specifications/schemas/unit.avsc +++ b/commons/catalogue/unit.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.specifications", + "namespace": "org.radarcns.catalogue", "type": "enum", "name": "Unit", "doc": "Measurement units", diff --git a/java-sdk/build.gradle b/java-sdk/build.gradle index fdd97bca..692eae25 100644 --- a/java-sdk/build.gradle +++ b/java-sdk/build.gradle @@ -107,10 +107,6 @@ subprojects { // Generated avro files ext.avroOutputDir = file('src/main/java') - - clean { - delete avroOutputDir - } } task wrapper(type: Wrapper) { diff --git a/java-sdk/radar-schemas-commons/build.gradle b/java-sdk/radar-schemas-commons/build.gradle index 33769a25..973cce24 100644 --- a/java-sdk/radar-schemas-commons/build.gradle +++ b/java-sdk/radar-schemas-commons/build.gradle @@ -1,6 +1,13 @@ ext.artifactName = 'radar-schemas-commons' ext.description = 'RADAR Schemas Commons SDK' +//---------------------------------------------------------------------------// +// Clean settings // +//---------------------------------------------------------------------------// +clean { + delete avroOutputDir +} + //---------------------------------------------------------------------------// // AVRO file manipulation // //---------------------------------------------------------------------------// diff --git a/java-sdk/radar-schemas-restapi/build.gradle b/java-sdk/radar-schemas-restapi/build.gradle index 0ca80d5f..6e3474e4 100644 --- a/java-sdk/radar-schemas-restapi/build.gradle +++ b/java-sdk/radar-schemas-restapi/build.gradle @@ -1,6 +1,13 @@ ext.artifactName = 'radar-schemas-restapi' ext.description = 'RADAR Schemas REST API SDK' +//---------------------------------------------------------------------------// +// Clean settings // +//---------------------------------------------------------------------------// +clean { + delete avroOutputDir +} + //---------------------------------------------------------------------------// // AVRO file manipulation // //---------------------------------------------------------------------------// @@ -8,9 +15,7 @@ task generateAvro(type: com.commercehub.gradle.plugin.avro.GenerateAvroJavaTask) source rootProject.fileTree('../commons') { include 'active/questionnaire/questionnaire.avsc' include 'monitor/application/application_server_status.avsc' - } - source rootProject.fileTree('../specifications/schemas') { - include '**/*.avsc' + include 'catalogue/*.avsc' } source rootProject.fileTree('../restapi') { include '**/*.avsc' diff --git a/java-sdk/radar-schemas-specifications/build.gradle b/java-sdk/radar-schemas-specifications/build.gradle index 4bd0c60c..9745a9d4 100644 --- a/java-sdk/radar-schemas-specifications/build.gradle +++ b/java-sdk/radar-schemas-specifications/build.gradle @@ -40,35 +40,30 @@ dependencies { } //---------------------------------------------------------------------------// -// AVRO file manipulation // +// Exchange configuration with Java code // //---------------------------------------------------------------------------// -ext.excludedFromCheckStyle = [] - -task generateAvro(type: com.commercehub.gradle.plugin.avro.GenerateAvroJavaTask) { - source rootProject.fileTree('../commons') { - include 'active/questionnaire/questionnaire.avsc' - } - source rootProject.fileTree('../specifications/schemas') { - include '**/*.avsc' - } - - outputDir avroOutputDir - - //Files ignored from checkstyle +ext.exchnageConfigPath = 'src/main/resources/exchange.properties' +task exchangeConfig() { doLast { - def rootPath = sourceSets.main.allJava.srcDirTrees[0].dir.path - sourceSets.main.allJava.files.each { - excludedFromCheckStyle.add(it.path.replace(rootPath, '**')) + if (file(exchnageConfigPath).createNewFile()) { + file(exchnageConfigPath).write("project.group=${project.group}") + } else { + throw new GradleException("File for exchanginf configuration between Gradle and Java cannot be created. Error while managing file at ${exchnageConfigPath}") } } } -compileJava.dependsOn generateAvro +compileJava.dependsOn exchangeConfig -task excludeAvroGenerated() { - doLast{ - checkstyleMain.exclude(excludedFromCheckStyle) +task cleanExchangeConfig() { + doLast { + if (file(exchnageConfigPath).exists()) { + if (!file(exchnageConfigPath).delete()) { + throw new GradleException("File at ${exchnageConfigPath} cannot be delated.") + } + } } } +clean.dependsOn cleanExchangeConfig //---------------------------------------------------------------------------// // Test definition // @@ -94,7 +89,6 @@ checkstyle { configFile = file("$projectDir/config/checkstyle/checkstyle.xml") } -checkstyleMain.dependsOn excludeAvroGenerated pmd { // pmd version diff --git a/restapi/header/header.avsc b/restapi/header/header.avsc index 2818caca..7ce00816 100644 --- a/restapi/header/header.avsc +++ b/restapi/header/header.avsc @@ -6,10 +6,10 @@ "fields": [ { "name": "subjectId", "type": "string", "doc": "Subject identifier." }, { "name": "sourceId", "type": "string", "doc": "Source identifier." }, - { "name": "source", "type": ["org.radarcns.specifications.ActiveSource", "org.radarcns.specifications.PassiveSource"], "doc": "Source information, it can be a device or assessment name." }, - { "name": "type", "type": ["org.radarcns.specifications.SensorName", "org.radarcns.active.questionnaire.QuestionnaireType"], "doc": "Report the sensor name or specific type of assessment." }, + { "name": "source", "type": ["org.radarcns.catalogue.ActiveSource", "org.radarcns.catalogue.PassiveSource"], "doc": "Source information, it can be a device or assessment name." }, + { "name": "type", "type": ["org.radarcns.catalogue.SensorName", "org.radarcns.active.questionnaire.QuestionnaireType"], "doc": "Report the sensor name or specific type of assessment." }, { "name": "descriptiveStatistic", "type": "DescriptiveStatistic", "doc": "Statical value expressed by samples." }, - { "name": "unit", "type": "org.radarcns.specifications.Unit", "doc": "Unit used by the source." }, + { "name": "unit", "type": "org.radarcns.catalogue.Unit", "doc": "Unit used by the source." }, { "name": "timeFrame", "type": "TimeFrame", "doc": "Time interval between two consecutive samples." }, { "name": "effectiveTimeFrame", "type": "EffectiveTimeFrame", "doc": "Timestamps of the first and the last samples contained in the dataset." } ] diff --git a/restapi/source/sensor.avsc b/restapi/source/sensor.avsc index 304ac9d1..17a613c9 100644 --- a/restapi/source/sensor.avsc +++ b/restapi/source/sensor.avsc @@ -4,7 +4,7 @@ "name": "Sensor", "doc": "Sensor details", "fields": [ - {"name": "name", "type": "org.radarcns.specifications.SensorName", "doc": "Sensor name"}, + {"name": "name", "type": "org.radarcns.catalogue.SensorName", "doc": "Sensor name"}, {"name": "state", "type": "States", "default": "UNKNOWN", "doc": "Current sensor state computed using the received data"}, {"name": "receivedMessage", "type": "int", "default": -1, "doc": "Amount of received messages"}, {"name": "messageLoss", "type": "double", "default": -1.0, "doc": "Percentage of lost messages"} diff --git a/restapi/source/source.avsc b/restapi/source/source.avsc index 81868e64..69a1211b 100644 --- a/restapi/source/source.avsc +++ b/restapi/source/source.avsc @@ -5,7 +5,7 @@ "doc": "Source details", "fields": [ {"name": "id", "type": "string", "doc": "Source identifier" }, - {"name": "type", "type": "org.radarcns.specifications.PassiveSource", "doc": "Source name" }, + {"name": "type", "type": "org.radarcns.catalogue.PassiveSource", "doc": "Source name" }, {"name": "summary", "type": ["null", "SourceSummary"], "default": null, "doc": "Source details" } ] } diff --git a/restapi/spec/sensor_specification.avsc b/restapi/spec/sensor_specification.avsc index 640e04ed..c9ab077e 100644 --- a/restapi/spec/sensor_specification.avsc +++ b/restapi/spec/sensor_specification.avsc @@ -4,9 +4,9 @@ "name": "SensorSpecification", "doc": "Sensor specification", "fields": [ - {"name": "name", "type": "org.radarcns.specifications.SensorName", "doc": "Sensor name"}, - {"name": "dataType", "type": "org.radarcns.specifications.DataType", "doc": "Explains if the values is a raw data, otherwise it reports who computes it"}, + {"name": "name", "type": "org.radarcns.catalogue.SensorName", "doc": "Sensor name"}, + {"name": "dataType", "type": "org.radarcns.catalogue.DataType", "doc": "Explains if the values is a raw data, otherwise it reports who computes it"}, {"name": "frequency", "type": "double", "default": -1.0, "doc": "Number of expected samples per second"}, - {"name": "unit", "type": "org.radarcns.specifications.Unit", "doc": "Measurement unit used by the sensor"} + {"name": "unit", "type": "org.radarcns.catalogue.Unit", "doc": "Measurement unit used by the sensor"} ] } diff --git a/restapi/spec/source_specification.avsc b/restapi/spec/source_specification.avsc index 1474a11e..612a7078 100644 --- a/restapi/spec/source_specification.avsc +++ b/restapi/spec/source_specification.avsc @@ -4,7 +4,7 @@ "name": "SourceSpecification", "doc": "Source specification", "fields": [ - {"name": "name", "type": "org.radarcns.specifications.PassiveSource", "doc": "Source name"}, + {"name": "name", "type": "org.radarcns.catalogue.PassiveSource", "doc": "Source name"}, {"name": "sensors", "type": {"type": "map", "values": "SensorSpecification" }, "doc": "Specifications of on board sensors. It is a map where the key is the String conversion of a SensorType"} ] } diff --git a/specifications/active/phq8.yml b/specifications/active/phq8.yml index 8c910ce2..06f42e45 100644 --- a/specifications/active/phq8.yml +++ b/specifications/active/phq8.yml @@ -2,8 +2,8 @@ name: PHQ8 #QuestionnaireType assestment_type: QUESTIONNAIRE topic_name: questionnaire_phq8 -key_class: org.radarcns.kafka.key.KeyMeasurement -value_class: org.radarcns.active.questionnaire.Questionnaire +key_class: .kafka.key.KeyMeasurement +value_class: .active.questionnaire.Questionnaire questions: - lead: Over the past two weeks, how often have you been bothered by any of the following problems? content: Little interest or pleasure in doing things. diff --git a/specifications/monitor/android_application.yml b/specifications/monitor/android_application.yml index a0593383..e75e53f5 100644 --- a/specifications/monitor/android_application.yml +++ b/specifications/monitor/android_application.yml @@ -7,26 +7,26 @@ sensors: unit: NON_DIMENSIONAL data_type: RAW topic_name: application_external_time - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.monitor.application.ApplicationExternalTime + key_class: .kafka.key.KeyMeasurement + value_class: .monitor.application.ApplicationExternalTime - name: RECORD_COUNTS sample_rate: 0.08 unit: NON_DIMENSIONAL data_type: RAW topic_name: application_record_counts - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.monitor.application.ApplicationRecordCounts + key_class: .kafka.key.KeyMeasurement + value_class: .monitor.application.ApplicationRecordCounts - name: SERVER_STATUS sample_rate: 0.08 unit: NON_DIMENSIONAL data_type: RAW topic_name: application_server_status - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.monitor.application.ApplicationServerStatus + key_class: .kafka.key.KeyMeasurement + value_class: .monitor.application.ApplicationServerStatus - name: UPTIME sample_rate: 0.08 unit: NON_DIMENSIONAL data_type: RAW topic_name: application_uptime - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.monitor.application.ApplicationUptime + key_class: .kafka.key.KeyMeasurement + value_class: .monitor.application.ApplicationUptime diff --git a/specifications/passive/adroid_phone.yml b/specifications/passive/adroid_phone.yml index 8ad43569..94edde06 100644 --- a/specifications/passive/adroid_phone.yml +++ b/specifications/passive/adroid_phone.yml @@ -9,54 +9,54 @@ sensors: unit: G data_type: RAW topic_name: android_phone_acceleration - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.phone.PhoneAcceleration - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDoubleArray + key_class: .kafka.key.KeyMeasurement + value_class: .passive.phone.PhoneAcceleration + aggregator_class: .kafka.aggregator.AggregatorDoubleArray - name: BATTERY app_provider: .phone.PhoneSensorProvider sample_rate: #TODO unit: PERCENTAGE data_type: RAW topic_name: android_phone_battery_level - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.phone.PhoneBatteryLevel - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + key_class: .kafka.key.KeyMeasurement + value_class: .passive.phone.PhoneBatteryLevel + aggregator_class: .kafka.aggregator.AggregatorDouble - name: GYROSCOPE app_provider: .phone.PhoneSensorProvider sample_rate: #TODO unit: RADAIAN_PER_SEC data_type: RAW topic_name: android_phone_gyroscope - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.phone.PhoneGyroscope - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDoubleArray + key_class: .kafka.key.KeyMeasurement + value_class: .passive.phone.PhoneGyroscope + aggregator_class: .kafka.aggregator.AggregatorDoubleArray - name: LIGTH app_provider: .phone.PhoneSensorProvider sample_rate: #TODO unit: LUX data_type: RAW topic_name: android_phone_ligth - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.phone.PhoneLight - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + key_class: .kafka.key.KeyMeasurement + value_class: .passive.phone.PhoneLight + aggregator_class: .kafka.aggregator.AggregatorDouble - name: MAGNETIC_FIELD app_provider: .phone.PhoneSensorProvider sample_rate: #TODO unit: MICRO_TESLA data_type: RAW topic_name: android_phone_magnetic_field - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.phone.PhoneMagneticField - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDoubleArray + key_class: .kafka.key.KeyMeasurement + value_class: .passive.phone.PhoneMagneticField + aggregator_class: .kafka.aggregator.AggregatorDoubleArray - name: STEP_COUNT app_provider: .phone.PhoneSensorProvider sample_rate: #TODO unit: NON_DIMENSIONAL data_type: VENDOR topic_name: android_phone_step_count - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.phone.PhoneStepCount - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + key_class: .kafka.key.KeyMeasurement + value_class: .passive.phone.PhoneStepCount + aggregator_class: .kafka.aggregator.AggregatorDouble # Location - name: RELATIVE_LOCATION app_provider: .phone.PhoneLocationProvider @@ -64,8 +64,8 @@ sensors: unit: #TODO data_type: RAW topic_name: android_phone_relative_location - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.phone.PhoneRelativeLocation + key_class: .kafka.key.KeyMeasurement + value_class: .passive.phone.PhoneRelativeLocation # Log - name: PHONE_CALL app_provider: .phone.PhoneLogProvider @@ -73,24 +73,24 @@ sensors: unit: NON_DIMENSIONAL data_type: RAW topic_name: android_phone_call - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.phone.PhoneCall + key_class: .kafka.key.KeyMeasurement + value_class: .passive.phone.PhoneCall - name: PHONE_SMS app_provider: .phone.PhoneLogProvider sample_rate: #TODO unit: NON_DIMENSIONAL data_type: RAW topic_name: android_phone_sms - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.phone.PhoneSms + key_class: .kafka.key.KeyMeasurement + value_class: .passive.phone.PhoneSms - name: PHONE_SMS_UNREAD app_provider: .phone.PhoneLogProvider sample_rate: #TODO unit: NON_DIMENSIONAL data_type: RAW topic_name: android_phone_sms_unread - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.phone.PhoneSmsUnread + key_class: .kafka.key.KeyMeasurement + value_class: .passive.phone.PhoneSmsUnread # Usage - name: USAGE_EVENT app_provider: .phone.PhoneUsageProvider @@ -98,13 +98,13 @@ sensors: unit: NON_DIMENSIONAL data_type: RAW topic_name: android_phone_user_event - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.phone.PhoneUsageEvent + key_class: .kafka.key.KeyMeasurement + value_class: .passive.phone.PhoneUsageEvent - name: USER_INTERACTION app_provider: .phone.PhoneUsageProvider sample_rate: #TODO unit: NON_DIMENSIONAL data_type: RAW topic_name: android_phone_user_interaction - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.phone.PhoneUserInteraction + key_class: .kafka.key.KeyMeasurement + value_class: .passive.phone.PhoneUserInteraction diff --git a/specifications/passive/biovotion_vsm1.yml b/specifications/passive/biovotion_vsm1.yml index 4d005cbc..e9fe79ba 100644 --- a/specifications/passive/biovotion_vsm1.yml +++ b/specifications/passive/biovotion_vsm1.yml @@ -1,101 +1,101 @@ #===================================== Biovotion VSM1 Everion =====================================# vendor: BIOVOTION model: VSM1 -app_provider: biovotion.BiovotionServiceProvider +app_provider: .biovotion.BiovotionServiceProvider sensors: - name: ACCELEROMETER sample_rate: 51.2 unit: G data_type: RAW topic_name: android_biovotion_vsm1_acceleration - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.biovotion.BiovotionVsm1Acceleration - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDoubleArray + key_class: .kafka.key.KeyMeasurement + value_class: .passive.biovotion.BiovotionVsm1Acceleration + aggregator_class: .kafka.aggregator.AggregatorDoubleArray - name: BATTERY sample_rate: 1.0 unit: PERCENTAGE data_type: RAW topic_name: android_biovotion_vsm1_battery_state - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.biovotion.BiovotionVsm1BatteryState - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + key_class: .kafka.key.KeyMeasurement + value_class: .passive.biovotion.BiovotionVsm1BatteryState + aggregator_class: .kafka.aggregator.AggregatorDouble - name: BLOOD_PULSE_WAVE sample_rate: 1.0 unit: NON_DIMENSIONAL data_type: VENDOR topic_name: android_biovotion_vsm1_acceleration - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.biovotion.BiovotionVsm1BloodPulseWave - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + key_class: .kafka.key.KeyMeasurement + value_class: .passive.biovotion.BiovotionVsm1BloodPulseWave + aggregator_class: .kafka.aggregator.AggregatorDouble - name: ENERGY sample_rate: 1.0 unit: CALORIES_PER_SEC data_type: VENDOR topic_name: android_biovotion_vsm1_energy - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.biovotion.BiovotionVsm1Energy - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + key_class: .kafka.key.KeyMeasurement + value_class: .passive.biovotion.BiovotionVsm1Energy + aggregator_class: .kafka.aggregator.AggregatorDouble - name: GALVANIC_SKIN_RESPONSE sample_rate: 1.0 unit: KILO_OHM data_type: VENDOR topic_name: android_biovotion_vsm1_galvanic_skin_response - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.biovotion.BiovotionVsm1GalvanicSkinResponse - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDoubleArray + key_class: .kafka.key.KeyMeasurement + value_class: .passive.biovotion.BiovotionVsm1GalvanicSkinResponse + aggregator_class: .kafka.aggregator.AggregatorDoubleArray - name: HEART_RATE sample_rate: 1.0 unit: BEATS_PER_MIN data_type: VENDOR topic_name: android_biovotion_vsm1_heart_rate - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.biovotion.BiovotionVsm1HeartRate - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + key_class: .kafka.key.KeyMeasurement + value_class: .passive.biovotion.BiovotionVsm1HeartRate + aggregator_class: .kafka.aggregator.AggregatorDouble - name: HEART_RATE_VARIABILITY sample_rate: 1.0 unit: RMSSD_IN_MILLI_SEC data_type: VENDOR topic_name: android_biovotion_vsm1_heart_rate_variability - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.biovotion.BiovotionVsm1HeartRateVariability - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + key_class: .kafka.key.KeyMeasurement + value_class: .passive.biovotion.BiovotionVsm1HeartRateVariability + aggregator_class: .kafka.aggregator.AggregatorDouble - name: LED sample_rate: 1.0 unit: MILLI_AMPERE data_type: VENDOR topic_name: android_biovotion_vsm1_led_current - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.biovotion.BiovotionVsm1LedCurrent - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDoubleArray + key_class: .kafka.key.KeyMeasurement + value_class: .passive.biovotion.BiovotionVsm1LedCurrent + aggregator_class: .kafka.aggregator.AggregatorDoubleArray - name: PHOTOPLETHYSMOGRAPHY sample_rate: 51.2 unit: NON_DIMENSIONAL data_type: VENDOR topic_name: android_biovotion_vsm1_ppg_current - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.biovotion.BiovotionVsm1PpgRaw - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDoubleArray + key_class: .kafka.key.KeyMeasurement + value_class: .passive.biovotion.BiovotionVsm1PpgRaw + aggregator_class: .kafka.aggregator.AggregatorDoubleArray - name: RESPIRATION_RATE sample_rate: 1.0 unit: BEATS_PER_MIN data_type: VENDOR topic_name: android_biovotion_vsm1_respiration_rate - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.biovotion.BiovotionVsm1RespirationRate - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + key_class: .kafka.key.KeyMeasurement + value_class: .passive.biovotion.BiovotionVsm1RespirationRate + aggregator_class: .kafka.aggregator.AggregatorDouble - name: OXYGEN_SATURATION sample_rate: 1.0 unit: PERCENTAGE data_type: RAW topic_name: android_biovotion_vsm1_oxygen_saturation - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.biovotion.BiovotionVsm1OxygenSaturation - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + key_class: .kafka.key.KeyMeasurement + value_class: .passive.biovotion.BiovotionVsm1OxygenSaturation + aggregator_class: .kafka.aggregator.AggregatorDouble - name: THERMOMETER sample_rate: 1.0 unit: CELSIUS data_type: RAW topic_name: android_biovotion_vsm1_temperature - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.biovotion.BiovotionVsm1Temperature - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + key_class: .kafka.key.KeyMeasurement + value_class: .passive.biovotion.BiovotionVsm1Temperature + aggregator_class: .kafka.aggregator.AggregatorDouble diff --git a/specifications/passive/empatica_e4.yml b/specifications/passive/empatica_e4.yml index 03f2719e..d24876e3 100644 --- a/specifications/passive/empatica_e4.yml +++ b/specifications/passive/empatica_e4.yml @@ -8,49 +8,49 @@ sensors: unit: G data_type: RAW topic_name: android_empatica_e4_acceleration - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.empatica.EmpaticaE4Acceleration - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDoubleArray + key_class: .kafka.key.KeyMeasurement + value_class: .passive.empatica.EmpaticaE4Acceleration + aggregator_class: .kafka.aggregator.AggregatorDoubleArray - name: BATTERY sample_rate: 1.0 unit: PERCENTAGE data_type: RAW topic_name: android_empatica_e4_battery_level - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.empatica.EmpaticaE4BatteryLevel - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + key_class: .kafka.key.KeyMeasurement + value_class: .passive.empatica.EmpaticaE4BatteryLevel + aggregator_class: .kafka.aggregator.AggregatorDouble - name: BLOOD_VOLUME_PULSE sample_rate: 64.0 unit: NANO_WATT data_type: RAW topic_name: android_empatica_e4_blood_volume_pulse - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.empatica.EmpaticaE4BloodVolumePulse - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + key_class: .kafka.key.KeyMeasurement + value_class: .passive.empatica.EmpaticaE4BloodVolumePulse + aggregator_class: .kafka.aggregator.AggregatorDouble - name: ELECTRODERMAL_ACTIVITY sample_rate: 4.0 unit: MICRO_SIEMENS data_type: RAW topic_name: android_empatica_e4_electrodermal_activity - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.empatica.EmpaticaE4ElectroDermalActivity - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + key_class: .kafka.key.KeyMeasurement + value_class: .passive.empatica.EmpaticaE4ElectroDermalActivity + aggregator_class: .kafka.aggregator.AggregatorDouble - name: INTER_BEAT_INTERVAL sample_rate: 1.0 unit: BEATS_PER_MIN data_type: VENDOR topic_name: android_empatica_e4_inter_beat_interval - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.empatica.EmpaticaE4InterBeatInterval - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + key_class: .kafka.key.KeyMeasurement + value_class: .passive.empatica.EmpaticaE4InterBeatInterval + aggregator_class: .kafka.aggregator.AggregatorDouble - name: THERMOMETER sample_rate: 4.0 unit: CELSIUS data_type: RAW topic_name: android_empatica_e4_temperature - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.empatica.EmpaticaE4BatteryLevel - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + key_class: .kafka.key.KeyMeasurement + value_class: .passive.empatica.EmpaticaE4BatteryLevel + aggregator_class: .kafka.aggregator.AggregatorDouble processed: - name: HEART_RATE sample_rate: 1.0 @@ -58,4 +58,4 @@ processed: data_type: RADAR input_topic_name: android_empatica_e4_inter_beat_interval output_topic_name: android_empatica_e4_heartrate - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + aggregator_class: .kafka.aggregator.AggregatorDouble diff --git a/specifications/passive/pebble_2.yml b/specifications/passive/pebble_2.yml index c3b696fc..a4bfa671 100644 --- a/specifications/passive/pebble_2.yml +++ b/specifications/passive/pebble_2.yml @@ -8,30 +8,30 @@ sensors: unit: G data_type: RAW topic_name: android_pebble_2_acceleration - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.pebble.Pebble2Acceleration - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDoubleArray + key_class: .kafka.key.KeyMeasurement + value_class: .passive.pebble.Pebble2Acceleration + aggregator_class: .kafka.aggregator.AggregatorDoubleArray - name: BATTERY sample_rate: 1.0 unit: PERCENTAGE data_type: RAW topic_name: android_pebble_2_battery_level - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.pebble.Pebble2BatteryLevel - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + key_class: .kafka.key.KeyMeasurement + value_class: .passive.pebble.Pebble2BatteryLevel + aggregator_class: .kafka.aggregator.AggregatorDouble - name: HEART_RATE sample_rate: 1.0 unit: BEATS_PER_MIN data_type: RAW topic_name: android_pebble_2_heart_rate - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.pebble.Pebble2HeartRate - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + key_class: .kafka.key.KeyMeasurement + value_class: .passive.pebble.Pebble2HeartRate + aggregator_class: .kafka.aggregator.AggregatorDouble - name: HEART_RATE_FILTERED sample_rate: 1.0 unit: BEATS_PER_MIN data_type: VEDOR topic_name: android_pebble_2_heart_rate_filtered - key_class: org.radarcns.kafka.key.KeyMeasurement - value_class: org.radarcns.passive.pebble.Pebble2HeartRateFiltered - aggregator_class: org.radarcns.kafka.aggregator.AggregatorDouble + key_class: .kafka.key.KeyMeasurement + value_class: .passive.pebble.Pebble2HeartRateFiltered + aggregator_class: .kafka.aggregator.AggregatorDouble From 8a287919e24469bf58dab131ae5bda35654d74f7 Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Wed, 2 Aug 2017 19:19:29 +0100 Subject: [PATCH 044/112] Initial Specifications implementation --- .gitignore | 3 +- ...ve_source.avsc => active_source_type.avsc} | 2 +- commons/catalogue/monitor_source_type.avsc | 13 ++ ...e_source.avsc => passive_source_type.avsc} | 2 +- commons/catalogue/sensor_name.avsc | 10 ++ commons/catalogue/unit.avsc | 4 + .../active/questionnaire/Answer$1.class | Bin 0 -> 234 bytes .../active/questionnaire/Answer$Builder.class | Bin 0 -> 5026 bytes .../active/questionnaire/Answer.class | Bin 0 -> 5067 bytes .../questionnaire/Questionnaire$1.class | Bin 0 -> 255 bytes .../questionnaire/Questionnaire$Builder.class | Bin 0 -> 7112 bytes .../active/questionnaire/Questionnaire.class | Bin 0 -> 7520 bytes .../questionnaire/QuestionnaireType.class | Bin 0 -> 1728 bytes .../radarcns/catalogue/ActiveSourceType.class | Bin 0 -> 1652 bytes .../org/radarcns/catalogue/DataType.class | Bin 0 -> 1805 bytes .../catalogue/MonitorSourceType.class | Bin 0 -> 1862 bytes .../catalogue/PassiveSourceType.class | Bin 0 -> 1856 bytes .../org/radarcns/catalogue/SensorName.class | Bin 0 -> 2751 bytes .../classes/org/radarcns/catalogue/Unit.class | Bin 0 -> 2290 bytes .../kafka/aggregator/AggregatorDouble$1.class | Bin 0 -> 256 bytes .../aggregator/AggregatorDouble$Builder.class | Bin 0 -> 7712 bytes .../kafka/aggregator/AggregatorDouble.class | Bin 0 -> 7116 bytes .../aggregator/AggregatorDoubleArray$1.class | Bin 0 -> 271 bytes .../AggregatorDoubleArray$Builder.class | Bin 0 -> 8019 bytes .../aggregator/AggregatorDoubleArray.class | Bin 0 -> 7779 bytes .../radarcns/kafka/key/KeyMeasurement$1.class | Bin 0 -> 236 bytes .../kafka/key/KeyMeasurement$Builder.class | Bin 0 -> 4234 bytes .../radarcns/kafka/key/KeyMeasurement.class | Bin 0 -> 4559 bytes .../radarcns/kafka/key/KeyWindowed$1.class | Bin 0 -> 227 bytes .../kafka/key/KeyWindowed$Builder.class | Bin 0 -> 5500 bytes .../org/radarcns/kafka/key/KeyWindowed.class | Bin 0 -> 5410 bytes .../ApplicationExternalTime$1.class | Bin 0 -> 283 bytes .../ApplicationExternalTime$Builder.class | Bin 0 -> 6858 bytes .../application/ApplicationExternalTime.class | Bin 0 -> 6837 bytes .../ApplicationRecordCounts$1.class | Bin 0 -> 283 bytes .../ApplicationRecordCounts$Builder.class | Bin 0 -> 6092 bytes .../application/ApplicationRecordCounts.class | Bin 0 -> 5875 bytes .../ApplicationServerStatus$1.class | Bin 0 -> 283 bytes .../ApplicationServerStatus$Builder.class | Bin 0 -> 5668 bytes .../application/ApplicationServerStatus.class | Bin 0 -> 5716 bytes .../application/ApplicationUptime$1.class | Bin 0 -> 265 bytes .../ApplicationUptime$Builder.class | Bin 0 -> 4520 bytes .../application/ApplicationUptime.class | Bin 0 -> 4768 bytes .../application/ExternalTimeProtocol.class | Bin 0 -> 1932 bytes .../monitor/application/ServerStatus.class | Bin 0 -> 1709 bytes .../BiovotionVsm1Acceleration$1.class | Bin 0 -> 285 bytes .../BiovotionVsm1Acceleration$Builder.class | Bin 0 -> 6539 bytes .../biovotion/BiovotionVsm1Acceleration.class | Bin 0 -> 6128 bytes .../BiovotionVsm1BatteryState$1.class | Bin 0 -> 285 bytes .../BiovotionVsm1BatteryState$Builder.class | Bin 0 -> 7363 bytes .../biovotion/BiovotionVsm1BatteryState.class | Bin 0 -> 6690 bytes .../BiovotionVsm1BloodPulseWave$1.class | Bin 0 -> 291 bytes .../BiovotionVsm1BloodPulseWave$Builder.class | Bin 0 -> 6180 bytes .../BiovotionVsm1BloodPulseWave.class | Bin 0 -> 5935 bytes .../biovotion/BiovotionVsm1Energy$1.class | Bin 0 -> 267 bytes .../BiovotionVsm1Energy$Builder.class | Bin 0 -> 6050 bytes .../biovotion/BiovotionVsm1Energy.class | Bin 0 -> 5820 bytes .../BiovotionVsm1GalvanicSkinResponse$1.class | Bin 0 -> 309 bytes ...tionVsm1GalvanicSkinResponse$Builder.class | Bin 0 -> 6395 bytes .../BiovotionVsm1GalvanicSkinResponse.class | Bin 0 -> 6052 bytes .../biovotion/BiovotionVsm1HeartRate$1.class | Bin 0 -> 276 bytes .../BiovotionVsm1HeartRate$Builder.class | Bin 0 -> 6030 bytes .../biovotion/BiovotionVsm1HeartRate.class | Bin 0 -> 5776 bytes .../BiovotionVsm1HeartRateVariability$1.class | Bin 0 -> 309 bytes ...tionVsm1HeartRateVariability$Builder.class | Bin 0 -> 6360 bytes .../BiovotionVsm1HeartRateVariability.class | Bin 0 -> 6207 bytes .../biovotion/BiovotionVsm1LedCurrent$1.class | Bin 0 -> 279 bytes .../BiovotionVsm1LedCurrent$Builder.class | Bin 0 -> 7123 bytes .../biovotion/BiovotionVsm1LedCurrent.class | Bin 0 -> 6426 bytes .../BiovotionVsm1OxygenSaturation$1.class | Bin 0 -> 297 bytes ...iovotionVsm1OxygenSaturation$Builder.class | Bin 0 -> 6120 bytes .../BiovotionVsm1OxygenSaturation.class | Bin 0 -> 5878 bytes .../biovotion/BiovotionVsm1PpgRaw$1.class | Bin 0 -> 267 bytes .../BiovotionVsm1PpgRaw$Builder.class | Bin 0 -> 7033 bytes .../biovotion/BiovotionVsm1PpgRaw.class | Bin 0 -> 6522 bytes .../BiovotionVsm1RespirationRate$1.class | Bin 0 -> 294 bytes ...BiovotionVsm1RespirationRate$Builder.class | Bin 0 -> 6210 bytes .../BiovotionVsm1RespirationRate.class | Bin 0 -> 5949 bytes .../BiovotionVsm1Temperature$1.class | Bin 0 -> 282 bytes .../BiovotionVsm1Temperature$Builder.class | Bin 0 -> 6739 bytes .../biovotion/BiovotionVsm1Temperature.class | Bin 0 -> 6279 bytes .../empatica/EmpaticaE4Acceleration$1.class | Bin 0 -> 274 bytes .../EmpaticaE4Acceleration$Builder.class | Bin 0 -> 6460 bytes .../empatica/EmpaticaE4Acceleration.class | Bin 0 -> 6061 bytes .../empatica/EmpaticaE4BatteryLevel$1.class | Bin 0 -> 274 bytes .../EmpaticaE4BatteryLevel$Builder.class | Bin 0 -> 5387 bytes .../empatica/EmpaticaE4BatteryLevel.class | Bin 0 -> 5355 bytes .../EmpaticaE4BloodVolumePulse$1.class | Bin 0 -> 286 bytes .../EmpaticaE4BloodVolumePulse$Builder.class | Bin 0 -> 5487 bytes .../empatica/EmpaticaE4BloodVolumePulse.class | Bin 0 -> 5444 bytes .../EmpaticaE4ElectroDermalActivity$1.class | Bin 0 -> 301 bytes ...aticaE4ElectroDermalActivity$Builder.class | Bin 0 -> 5612 bytes .../EmpaticaE4ElectroDermalActivity.class | Bin 0 -> 5640 bytes .../EmpaticaE4InterBeatInterval$1.class | Bin 0 -> 289 bytes .../EmpaticaE4InterBeatInterval$Builder.class | Bin 0 -> 5512 bytes .../EmpaticaE4InterBeatInterval.class | Bin 0 -> 5634 bytes .../empatica/EmpaticaE4SensorStatus$1.class | Bin 0 -> 274 bytes .../EmpaticaE4SensorStatus$Builder.class | Bin 0 -> 5891 bytes .../empatica/EmpaticaE4SensorStatus.class | Bin 0 -> 5710 bytes .../passive/empatica/EmpaticaE4Tag$1.class | Bin 0 -> 247 bytes .../empatica/EmpaticaE4Tag$Builder.class | Bin 0 -> 4420 bytes .../passive/empatica/EmpaticaE4Tag.class | Bin 0 -> 4900 bytes .../empatica/EmpaticaE4Temperature$1.class | Bin 0 -> 271 bytes .../EmpaticaE4Temperature$Builder.class | Bin 0 -> 5362 bytes .../empatica/EmpaticaE4Temperature.class | Bin 0 -> 5379 bytes .../pebble/Pebble2Acceleration$1.class | Bin 0 -> 261 bytes .../pebble/Pebble2Acceleration$Builder.class | Bin 0 -> 6362 bytes .../passive/pebble/Pebble2Acceleration.class | Bin 0 -> 5978 bytes .../pebble/Pebble2BatteryLevel$1.class | Bin 0 -> 261 bytes .../pebble/Pebble2BatteryLevel$Builder.class | Bin 0 -> 6746 bytes .../passive/pebble/Pebble2BatteryLevel.class | Bin 0 -> 6281 bytes .../passive/pebble/Pebble2HeartRate$1.class | Bin 0 -> 252 bytes .../pebble/Pebble2HeartRate$Builder.class | Bin 0 -> 5214 bytes .../passive/pebble/Pebble2HeartRate.class | Bin 0 -> 5292 bytes .../pebble/Pebble2HeartRateFiltered$1.class | Bin 0 -> 276 bytes .../Pebble2HeartRateFiltered$Builder.class | Bin 0 -> 5374 bytes .../pebble/Pebble2HeartRateFiltered.class | Bin 0 -> 5446 bytes .../passive/phone/BatteryStatus.class | Bin 0 -> 1795 bytes .../passive/phone/LocationProvider.class | Bin 0 -> 1673 bytes .../passive/phone/PhoneAcceleration$1.class | Bin 0 -> 253 bytes .../phone/PhoneAcceleration$Builder.class | Bin 0 -> 6303 bytes .../passive/phone/PhoneAcceleration.class | Bin 0 -> 5928 bytes .../passive/phone/PhoneBatteryLevel$1.class | Bin 0 -> 253 bytes .../phone/PhoneBatteryLevel$Builder.class | Bin 0 -> 6820 bytes .../passive/phone/PhoneBatteryLevel.class | Bin 0 -> 6458 bytes .../radarcns/passive/phone/PhoneCall$1.class | Bin 0 -> 229 bytes .../passive/phone/PhoneCall$Builder.class | Bin 0 -> 7330 bytes .../radarcns/passive/phone/PhoneCall.class | Bin 0 -> 6931 bytes .../passive/phone/PhoneCallType.class | Bin 0 -> 1787 bytes .../passive/phone/PhoneGyroscope$1.class | Bin 0 -> 244 bytes .../phone/PhoneGyroscope$Builder.class | Bin 0 -> 6243 bytes .../passive/phone/PhoneGyroscope.class | Bin 0 -> 5832 bytes .../passive/phone/PhoneInteractionState.class | Bin 0 -> 1787 bytes .../radarcns/passive/phone/PhoneLight$1.class | Bin 0 -> 232 bytes .../passive/phone/PhoneLight$Builder.class | Bin 0 -> 5055 bytes .../radarcns/passive/phone/PhoneLight.class | Bin 0 -> 5103 bytes .../passive/phone/PhoneMagneticField$1.class | Bin 0 -> 256 bytes .../phone/PhoneMagneticField$Builder.class | Bin 0 -> 6323 bytes .../passive/phone/PhoneMagneticField.class | Bin 0 -> 5915 bytes .../phone/PhoneRelativeLocation$1.class | Bin 0 -> 265 bytes .../phone/PhoneRelativeLocation$Builder.class | Bin 0 -> 9147 bytes .../passive/phone/PhoneRelativeLocation.class | Bin 0 -> 8693 bytes .../radarcns/passive/phone/PhoneSms$1.class | Bin 0 -> 226 bytes .../passive/phone/PhoneSms$Builder.class | Bin 0 -> 8680 bytes .../org/radarcns/passive/phone/PhoneSms.class | Bin 0 -> 7810 bytes .../radarcns/passive/phone/PhoneSmsType.class | Bin 0 -> 1713 bytes .../passive/phone/PhoneSmsUnread$1.class | Bin 0 -> 244 bytes .../phone/PhoneSmsUnread$Builder.class | Bin 0 -> 5159 bytes .../passive/phone/PhoneSmsUnread.class | Bin 0 -> 5232 bytes .../passive/phone/PhoneStepCount$1.class | Bin 0 -> 244 bytes .../phone/PhoneStepCount$Builder.class | Bin 0 -> 5139 bytes .../passive/phone/PhoneStepCount.class | Bin 0 -> 5186 bytes .../passive/phone/PhoneUsageEvent$1.class | Bin 0 -> 247 bytes .../phone/PhoneUsageEvent$Builder.class | Bin 0 -> 7328 bytes .../passive/phone/PhoneUsageEvent.class | Bin 0 -> 6900 bytes .../phone/PhoneUserInteraction$1.class | Bin 0 -> 262 bytes .../phone/PhoneUserInteraction$Builder.class | Bin 0 -> 5399 bytes .../passive/phone/PhoneUserInteraction.class | Bin 0 -> 5539 bytes .../passive/phone/UsageEventType.class | Bin 0 -> 1864 bytes .../radar-schemas-specifications/build.gradle | 25 ++- .../specifications/SourceCatalogue.java | 146 ++++++++++++++++++ .../radarcns/specifications/util/Source.java | 37 +++++ .../util/active/ActiveSource.java | 73 +++++++++ .../specifications/util/active/Question.java | 70 +++++++++ .../util/active/QuestionnaireSource.java | 60 +++++++ .../specifications/util/active/Response.java | 50 ++++++ .../util/passive/MonitorSource.java | 129 ++++++++++++++++ .../util/passive/PassiveSource.java | 81 ++++++++++ .../util/passive/Processor.java | 86 +++++++++++ .../specifications/util/passive/Sensor.java | 126 +++++++++++++++ .../specifications/SourceCatalogueTest.java | 61 ++++++++ java-sdk/radar-schemas-validator/build.gradle | 26 ++++ .../radarcns/validator/CommonsValidator.java | 25 +-- ...dator.java => SchemaCatalogValidator.java} | 14 +- .../validator/util/AvroValidator.java | 26 +++- .../validator/util/SchemaValidator.java | 13 +- .../validator/util/SchemaValidatorRole.java | 8 +- .../util/SchemaValidatorRoleTest.java | 4 +- .../validator/util/SchemaValidatorTest.java | 4 +- .../validator/util/ValidationSupport.java | 43 ++++++ restapi/header/header.avsc | 2 +- restapi/source/source.avsc | 2 +- restapi/spec/source_specification.avsc | 2 +- specifications/active/esm.yml | 14 ++ specifications/active/phq8.yml | 7 +- .../monitor/android_application.yml | 32 ---- specifications/monitor/external_time.yml | 10 ++ specifications/monitor/record_counts.yml | 10 ++ specifications/monitor/server_status.yml | 10 ++ specifications/monitor/uptime.yml | 10 ++ .../{adroid_phone.yml => android_phone.yml} | 4 +- specifications/passive/empatica_e4.yml | 4 +- specifications/passive/pebble_2.yml | 2 +- 193 files changed, 1163 insertions(+), 87 deletions(-) rename commons/catalogue/{active_source.avsc => active_source_type.avsc} (84%) create mode 100644 commons/catalogue/monitor_source_type.avsc rename commons/catalogue/{passive_source.avsc => passive_source_type.avsc} (86%) create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Answer$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Answer$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Answer.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Questionnaire$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Questionnaire$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Questionnaire.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/QuestionnaireType.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/ActiveSourceType.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/DataType.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/MonitorSourceType.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/PassiveSourceType.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/SensorName.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/Unit.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDouble$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDouble$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDouble.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDoubleArray$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDoubleArray$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDoubleArray.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyMeasurement$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyMeasurement$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyMeasurement.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyWindowed$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyWindowed$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyWindowed.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationExternalTime$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationExternalTime$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationExternalTime.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationRecordCounts$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationRecordCounts$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationRecordCounts.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationServerStatus$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationServerStatus$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationServerStatus.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationUptime$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationUptime$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationUptime.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ExternalTimeProtocol.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ServerStatus.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Acceleration$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Acceleration$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Acceleration.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BatteryState$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BatteryState$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BatteryState.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BloodPulseWave$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BloodPulseWave$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BloodPulseWave.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Energy$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Energy$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Energy.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1GalvanicSkinResponse$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1GalvanicSkinResponse$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1GalvanicSkinResponse.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRate$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRate$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRate.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRateVariability$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRateVariability$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRateVariability.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1LedCurrent$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1LedCurrent$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1LedCurrent.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1OxygenSaturation$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1OxygenSaturation$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1OxygenSaturation.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1PpgRaw$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1PpgRaw$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1PpgRaw.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1RespirationRate$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1RespirationRate$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1RespirationRate.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Temperature$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Temperature$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Temperature.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Acceleration$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Acceleration$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Acceleration.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BatteryLevel$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BatteryLevel$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BatteryLevel.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BloodVolumePulse$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BloodVolumePulse$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BloodVolumePulse.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4ElectroDermalActivity$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4ElectroDermalActivity$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4ElectroDermalActivity.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4InterBeatInterval$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4InterBeatInterval$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4InterBeatInterval.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4SensorStatus$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4SensorStatus$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4SensorStatus.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Tag$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Tag$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Tag.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Temperature$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Temperature$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Temperature.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2Acceleration$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2Acceleration$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2Acceleration.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2BatteryLevel$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2BatteryLevel$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2BatteryLevel.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2HeartRate$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2HeartRate$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2HeartRate.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2HeartRateFiltered$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2HeartRateFiltered$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2HeartRateFiltered.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/BatteryStatus.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/LocationProvider.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneAcceleration$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneAcceleration$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneAcceleration.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneBatteryLevel$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneBatteryLevel$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneBatteryLevel.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneCall$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneCall$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneCall.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneCallType.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneGyroscope$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneGyroscope$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneGyroscope.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneInteractionState.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneLight$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneLight$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneLight.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneMagneticField$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneMagneticField$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneMagneticField.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneRelativeLocation$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneRelativeLocation$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneRelativeLocation.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneSms$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneSms$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneSms.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneSmsType.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneSmsUnread$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneSmsUnread$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneSmsUnread.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneStepCount$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneStepCount$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneStepCount.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUsageEvent$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUsageEvent$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUsageEvent.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUserInteraction$1.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUserInteraction$Builder.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUserInteraction.class create mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/UsageEventType.class create mode 100644 java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/SourceCatalogue.java create mode 100644 java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Source.java create mode 100644 java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/ActiveSource.java create mode 100644 java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/Question.java create mode 100644 java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/QuestionnaireSource.java create mode 100644 java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/Response.java create mode 100644 java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/MonitorSource.java create mode 100644 java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/PassiveSource.java create mode 100644 java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/Processor.java create mode 100644 java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/Sensor.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueTest.java rename java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/{CatalogValidator.java => SchemaCatalogValidator.java} (93%) create mode 100644 specifications/active/esm.yml delete mode 100644 specifications/monitor/android_application.yml create mode 100644 specifications/monitor/external_time.yml create mode 100644 specifications/monitor/record_counts.yml create mode 100644 specifications/monitor/server_status.yml create mode 100644 specifications/monitor/uptime.yml rename specifications/passive/{adroid_phone.yml => android_phone.yml} (99%) diff --git a/.gitignore b/.gitignore index c0a90938..951a7c3f 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,6 @@ java-sdk/radar-schemas-validator/build java-sdk/radar-schemas-validator/out #====================================== Schemas Specification =====================================# -!java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/**/*.java -java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/avro +!java-sdk/radar-schemas-specifications/**/*.java java-sdk/radar-schemas-specifications/build java-sdk/radar-schemas-specifications/out diff --git a/commons/catalogue/active_source.avsc b/commons/catalogue/active_source_type.avsc similarity index 84% rename from commons/catalogue/active_source.avsc rename to commons/catalogue/active_source_type.avsc index fa5cb251..6153a5b8 100644 --- a/commons/catalogue/active_source.avsc +++ b/commons/catalogue/active_source_type.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.catalogue", "type": "enum", - "name": "ActiveSource", + "name": "ActiveSourceType", "doc": "List of integrated active sources.", "symbols": [ "QUESTIONNAIRE", diff --git a/commons/catalogue/monitor_source_type.avsc b/commons/catalogue/monitor_source_type.avsc new file mode 100644 index 00000000..1bce95d1 --- /dev/null +++ b/commons/catalogue/monitor_source_type.avsc @@ -0,0 +1,13 @@ +{ + "namespace": "org.radarcns.catalogue", + "type": "enum", + "name": "MonitorSourceType", + "doc": "List of integrated active sources.", + "symbols": [ + "EXTERNAL_TIME", + "RECORD_COUNTS", + "SERVER_STATUS", + "UPTIME", + "UNKNOWN" + ] +} diff --git a/commons/catalogue/passive_source.avsc b/commons/catalogue/passive_source_type.avsc similarity index 86% rename from commons/catalogue/passive_source.avsc rename to commons/catalogue/passive_source_type.avsc index 235a7d86..8195a073 100644 --- a/commons/catalogue/passive_source.avsc +++ b/commons/catalogue/passive_source_type.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.catalogue", "type": "enum", - "name": "PassiveSource", + "name": "PassiveSourceType", "doc": "Integrated passive sources", "symbols": [ "ANDROID_PHONE" , "EMPATICA_E4", "PEBBLE_2", "BIOVOTION_VSM1", "UNKNOWN" ] } diff --git a/commons/catalogue/sensor_name.avsc b/commons/catalogue/sensor_name.avsc index 6c93578a..4161d009 100644 --- a/commons/catalogue/sensor_name.avsc +++ b/commons/catalogue/sensor_name.avsc @@ -11,15 +11,25 @@ "ELECTRODERMAL_ACTIVITY", "ENERGY", "GALVANIC_SKIN_RESPONSE", + "GYROSCOPE", "HEART_RATE", "HEART_RATE_FILTERED", "HEART_RATE_VARIABILITY", "INTER_BEAT_INTERVAL", "LED", + "LIGHT", + "MAGNETIC_FIELD", "OXYGEN_SATURATION", + "PHONE_CALL", + "PHONE_SMS", + "PHONE_SMS_UNREAD", "PHOTOPLETHYSMOGRAPHY", + "RELATIVE_LOCATION", "RESPIRATION_RATE", + "STEP_COUNT", "THERMOMETER", + "USAGE_EVENT", + "USER_INTERACTION", "UNKNOWN" ] } diff --git a/commons/catalogue/unit.avsc b/commons/catalogue/unit.avsc index 4e1670db..c8b782db 100644 --- a/commons/catalogue/unit.avsc +++ b/commons/catalogue/unit.avsc @@ -7,13 +7,17 @@ "BEATS_PER_MIN" , "CALORIES_PER_SEC", "CELSIUS", + "DEGREE", "G", "KILO_OHM", + "LUX", "MICRO_SIEMENS", + "MICRO_TESLA", "MILLI_AMPERE", "NANO_WATT", "NON_DIMENSIONAL", "PERCENTAGE", + "RADAIAN_PER_SEC", "RMSSD_IN_MILLI_SEC", "SECOND", "UNKNOWN" diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Answer$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Answer$1.class new file mode 100644 index 0000000000000000000000000000000000000000..30235ac0513ce88aafb1a19bee9fc7310a41b961 GIT binary patch literal 234 zcma)$K?=e!5JmrJwOR#x1Q#yEg+V-lh=L1o;R#|o)JU0N((2t@cmNM2M!bN3nEx3V z9{=@zJOL~*NRg)K6SAXgyy2~_m@rsLxU-*M^i2~+8!?p&R?0osXIG@i2s7tP<#nOG zk)X7x?Tyv7;ZR#AqOE83gG?5L;ZB78y3!$VAmm@JsGn2Ul z#7k|h_gh=9eb5(|;<81tOF}KKwo6?;_~5gbSD)2aU&Qa<=ggUt%w#cPE!IA>_x`Wn zf7{{D|9k6g03-Ne0=;-zmS<$S7{~qiSOO2?0pE*W@MzBxHr5MMFYzQN(t;nS@snJRRb#qE-OS=tX$Pr z=$yV}tyrm?m0w7mo4aIZDq{-qa>XiDW}GDws7VFG&S%|S+fgU)RE{Zx`v)#4L?#MZ z(rlY{^7h&4(wtqIvF37GY$0RiE?6Z;_TFKnvgnj4?ReG6W$luJc`Bc`OA|S(T()^J zJY6U)q)JxSDrNHJl$EJCD|TwRYL_ccA)mLLlARjQmoM9;K2HQ~9qr#dmzW+cR2IdC zt?7!DdG?G|)J75^h5fCI91~H=mMs`#cobp_cIAQ#|MvcYW&wzmeTu36MuLHs6$XHc zEm~zyD}(p6LL!s1t&(?ih=$w)`X*f=fVE^<>&|4M%HT6bCfx~8jrLF8n=*P35Yw*h z4;&vDyAyqEg8E4+fq|)Ax^EwQkH^;5AeY9nTW5-OneL9R_LhrZnxG7?N&q(B=1g&=5XWf-QCk|pl#l0Wc({MynGMY7(MUw+(d-D{Y`As z9D_bbWZ319D>A){j#b=u6Yatpaap6n+S$k&^;qR9z}hLS(a4Or8HTud09&~JlrH=X zJ8%vA@pBx)FK`mCVG*yRfM4PT{0cw84W7QCq1frV>p=lh9;6(FAxgRr;X4!%GBC`4 zz>y;)=G5@8ddS1-x`(&8uhHt-0Ija(Xl-wFxrUZp1zc`GYeyq%4K29}ux^CbZ>!!8y9{3m2=HD#A{{*D9`_hi#gPycu&zKkild7r9aWVUEfIsH*KaO#a z|0019eLWhp$nZX$5Id9m0##R+sbN!Lw5tfZR1~{ZTL88mAGRLC)<+Er$D6|zSr41q z7BI99+k_9>VGp*rpdML+m~LFE8;05y5EA#jootGhG>W=s8ZEUqz+Xq}#0F?ZgJ{)C zClE;&t^Gvn0MSYjt%G+#YpOX~(FU|03m95Q>tu7ZqD|16AX<|FA$7F)7Ibq%9bs<%IO@i!kn>+wVlmz~~*4);bfvqXy2T_3^ef$Kj@jcZe2+ z49jx1W1Mg5#-_H4_pD1fyc`IE*VH<|`SFw+1l`;u2+`y%gzLlFt!|guoldomNK$+V z=b^Niv?pegk(4@blaU>2E=O=9gL~6XiT?ik+ fNA-7>^B6kXy==;lG9c%;M@NkRx%Ndohxq>ifOBmf literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Answer.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Answer.class new file mode 100644 index 0000000000000000000000000000000000000000..a349294facaf9deaebd9b742dea9faede988068c GIT binary patch literal 5067 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 uS>`8^M=rw{PRCsQw>OB9A2i literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Questionnaire.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Questionnaire.class new file mode 100644 index 0000000000000000000000000000000000000000..00ae24a709cb64f4cd66d41a1ef9f1e9d1b7cb13 GIT binary patch literal 7520 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 literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/DataType.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/DataType.class new file mode 100644 index 0000000000000000000000000000000000000000..8e92454b4c366f7247a18a9c9c73bb1437469f82 GIT binary patch literal 1805 zcma)7ZF3S=6n-{rSint8sK$^+-6CyCM5s0PC8TL+f|`n?6BLJW`r)!%V4Y=`xx2*4 zbo!}(s3kL|Q>Pt2_eXVl?uCdp>6iuf+;i`FKhL@R{m&nN0l0%|96IhM@CCj!aLvG1 z30%h4^0h8ciZLuCh$?0yhDEvgO$;eXH)B|m^jia^1m>|5Ls`;$2JUN!?3bQu_^9HG zPC>916Sfx=Y!))t?+kchhgOdd`@E zY{PcPuI{`QNZA|oHr|`qCN(8d^9RD__Z(TNnUikkWtlXj_6J_*^myF~97??8d49-3 z$M-1m?5RcveQrB#$1aqp?f1FI1q*qrXyU3w>@^b)u&d$vdw^!*2EI3u#fpg!v20=i zS4=F*S4zH?aK*qw4OgX|(>2Nbz(l|Wwcuo7?s^o8Dk%@7;hd(WeoBV~>hyY=Q>D_m zwCp8uC;5+e0)nyJCRh2B*~q_{4H9bk_E^hmIfC1vduZ9d>(Yw1thO(D7W1qw6Rj6a za4X=RFD&|oT^7=IU{OJ>Cg+~j7yMRV_%;s$(sTl=#oGkrmPO;4w@TijrBF<6+HEel z7g}xM_vEP+P)~SZz3BSnyVoB`ChYQ&LY|@w4tq`C4btn+(j-qCqd}&H8f2p5K~Dep zvxy2G5eg@BBC$j>Z@a!n5V=HXoSf}7pHr#?qjx4t)w=kW*qc$CXiBT3w{UhB$zNag zQA6&G0s7y0*t$*E+-15jqgyG78-OT5M^QqLq68q4NJ(%3b4wDP#7`rR>##sqA#rJ< z@<|M#y~NaOM1CcXE-rdU)tN!^H;@_2uVG5a|2QXG|E*~TMn>wDjOJJgIU{$4XQ_18gkXy))16fuM0DTDKzah^ch5~Y9 z$zP~c^08k*ZzN-pW5kb;P|O8gF{WZ>rWG@*n2S-x%o%@@Qe;TCM}s_>wZ`-iv$aNa zh`HJkv{#sK93z?h;3X~{!H~&}YB#HLynrJ3C6HlYL)8@BI1Y6Mc4Ql* zYTDn}@7RdcOsiJ)>-M9joqJ6~GV-A@;vPTuyxsepbNtW0f4&BA7quj!_%emBurA}K zj6w?6vB8(Gxn?tgxfDqOzDZ!7Z*C=UgUez93tWDiz#^9=8F~scc$~mCm*2^FB4JYh zv98xD#qwT#dqkY#3#%>r@Zd9IBsy|dD$VTb0zEfP1FefsxBW6CcG}iZA z&7ij~qqy=?vsiBE6k+x0WzG}tvrfv+1@;!)`k)=y?<=lH-c0wiT2*%=be|CCul-vtCGdV#DkVQ*E3%i0<^d z8}EL@O)6X}Y>$UF=WceaW%8Us37J~Y3GA-bw0)bXC_0WCu)ua5x=U`XEBqtNv=41l zD^iaCLWOU$~q%PZjkaZ8Uwi8%w!9|vtf!(*VzL-rvPp1Bh?!Mdc)%B<9xdA8D zxtS$=Ze|IGGs|DXnN@%KMZqq+_e0PhV6F|*@3ROxHfT_as}|G8xb)D8E~_O0Ni zaK`L(hDM$|D*4S`%sS;e;=D^(I~({k&c$AZtvmGbyH1}|c`L(<4UnXI3rQsxlBzBw z6`m|Jyfc95dER4$V@N{9N06{YNF~Xi)Bw^;OuRwlH$oCVrZp~fGTGn4Cqw&tm=L?E zbadqp#NHsv?I+IJ=V(U>t+0$0p{EulE1vNVBJ`shtgJ4aApW~hkJ66{YRzJelT91=lMg!j6Odt@_#`}mwBC;bbOkLaJG_Zd9ELnQwLNGrnf literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/PassiveSourceType.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/PassiveSourceType.class new file mode 100644 index 0000000000000000000000000000000000000000..7c1b0074a36dce41b3b7ad7fdffda5bebd799177 GIT binary patch literal 1856 zcmb7EZBH9V5PlX8-(e1inv`GyExFRvyo4(W=?kV515R*bY?mXhtf)fEaX1&*cj)en z6jl8j{T;25Le;2M)Q|m9RcF@*OwEUImUnh`X6NOZnf>SAKmG#n2)lz&@KqdNV@1V1 z6`45hU{x&N2+5j;@i?U%Pp#T>(2!4GO?zz=y~d!cFbh}ZpE(=p3D4BZpQ@|%I}?7cpAG7LkxopN?B zznR_7Ei-84+{Q*BxBrkKv5_xTN_+WIalc~iEHS9hi_eOsABwcIHn(#-*%^j$>53n7 z`=w*@lfXAE+BG;CR%a^N!ta#qCqiM42O_377S5q;(B1| zh(a0#At#@U=M%ViF@dCX=-VXDdy!L<7)&3xhjKcUQyG#<__}f6*F$6Fg>hxFNz^s0 z#GMZ-ZLbb19dw4(`0-~QWqeQVblLf$DHsOqy6;hmZ&O=c%1Q^X96O>mc--Bv5|m7r z+Qsl(-V|2p-q`hUlfPpDIKx7>;R`$0-^#2n(X)4l9#VBZC8`V%r9w+ewU(61Eh$x; zG*hA_fRPE&T*MDx5C%R0!whi-QSrrFU~ka(4*kCp$M7kwF)33?|2{tJ=r5yBp2m~P z-0v882Sw=jUC~d|iQd-2Eas$~dXuz-$0hXBk208>pFBhCHz~e!7susw6%S+zi&Dp= zKt8AI?Z79c13+m({eQ^A(C`puNAnkgOnfJAp;VJv{}~2P5tq!6A{kvW!vm5@Naj{d zG9!}tK$T2V`;#p6x9CZzl3U%X4z!T4s<9SEtg6~V(mDlui_z*CZYMu{gRxVnBEL4A p37Pf~vQTkE04Zqa^$5$P(}&0Sf~WxfOQKKdAE*5&w(tal{{bA(~p7E@8#ku))00T5I3_ zL1+3y+Bl<~I_>zmzofsS({oND0m)1W!+Gv=?z!ild+#}C|Ni%nzW`jsPn`(hvmox{ za}}nFY!DHA!NTR44GrgmghFx}F0gV_!$n3W~K7)u%q#>?!xP4DR6JGCZNy@x zWhU)aGi4?foUw|ftw_n;bW1tE9Lc#Aw@}=wdJ)I-%f(W{-S(mi)I}pj<{1Tjiu*JzN-6JeMaPd6PM=lGxrMY_%Cpag7`oi86Qt82vi>C z>3p3|e#>_&)e?DX8{>(dEw2(QxaD&F_7n_{)q`w#v)Wv)(Aa8bUm&Jm-JUzb(dOxK zf=;no%6T{Qd|SQEyr1IBQZSUP`jz~)m(G{-ba=z}ixsz$FZvYy*r6vc?|8ZVgM2Px zPy#G_zE^T9-exp}CGHny2;btFg46$7bRpcrcOlqV3tLihncQXMsGovT4Xd#+IQDa8k59e1v=^kz7o_ADr2H485)h;+5Trs7q*@T9auB475Tv3Iq`DBK(h#KT5TpVTq#B_} zhPVI$eVA*Qcsn|A6U$JrLM%+kzhDi@3mkimwqJ=Uh?DG)IhE{h;daCR5{`*B*cX`i z9qq3XVEbbS>@CuS>Q-1qLguLxkQMJZjW+rN)QQQFm+1ISrkmRZ(OjL;;Khu-YPkHq+hc2W-tdtcZGdY7GVL|=IGK(bbSI1U67Lgq)o_X+R704cyM|GMo*K>)^wuy&pw}?r zJcsfMlbM$|*Z1)YOg)FnPg~EV9(nOD`~y{SDK`SBKj|IZm8Z?%Q$o(SdxT%ne~`wL Js9+bJ{{b~$d@}$5 literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/Unit.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/Unit.class new file mode 100644 index 0000000000000000000000000000000000000000..6dce99dbe87b684a992425744df2af6ac00bbc9f GIT binary patch literal 2290 zcmah~ZBr9h6n?IR>?SO@O)V7!O9QO|k%(ej0Vy%8VQaFnEMQY=(RSW|FYft|z^ zth3nQolO;)B%ve^RZOw+2NhQtD=MZLe^haeaZAMv<4-EGjE_`YXZ%^kEMry04aQ$o z++=iA%rS1OxW!mg;3hGS$0|I=Jq5oC^xrjd>vr{lu~sdamcVGS71XnVv*QFcKg`yg zw$o_UJ8pKv_u2~rdOlYyubD=4#5VE*O5P~i=7udG3IghVvskW{S4-r(Waih(RogU5 zhDF<2$t)JlYOX}L83G9_XO*iDbL;B@=dH3;T`}3tEL*vvK$48|hP9q6kZEeIWZNrM z)1n~Rg}gUTvTUtT02|hQtNf6nSM2<%QOZpST$Jx{_MO^eH|snJT3MS`O^2SKOl;$?(QN-EHR^P8deH5*W@z;hmXBb+OhsxGH-r5X0{@7vKA+B`QMF zZgqm1d(YzxCAhg}I5h%8YaPGsHQh}w^ytAk-*2^@w%770;>@X{hWl>K+x2SM9F@4> z`flK~-JJyu-|)EI*3dvx;L>|~TEh~24SB3+_zGWZ$Y4^#6pO1YrdeELF~cIu;yR02 z7B^VjWHHC$7A6(6Xo~p4(@C3n-~^!?P>tR$G}EV;WzOA@qbLY5_G`en ziP5L6cSoC5(P-1EK;O5cP0JIbE&0)C6FnSlUY{Io(j1L8k<+71%4oD{aWLBHM}KJ8 z$8Xf5M-#-ICeT}Jw0vr!3)HJed*$stx5htMw~kMNO!UGrv%?`gI>}z?+~Cw@IXilSn-$k=jlob)H0O zK8e(S5~&3xQWw%qL)^}QKFqT~ycY?~V*vt-#L|TPNp>M#;M^PZJR>G>hh$vtDP+Hd zZx8I}a87EIso2yj^u9ri?a!UCUnY$fSs{nJa-ZgktoX)R^w1xmOkEv$iTIy#`{=qP zmPr#GS768|+>5=8IWS8`WJU1fQ zsGgMUvSgp>eUgny_PMS}me%|KrigpG^dniJXKHq(w~GP067NE{D@qqByP|e+!LI0} z8YCdyMFLU|6C}DAA)wM;Cg|&8j6mxmZ9j*2jq%D$Or*YefiIs!;W9*3ACT4Q!!szN fp9&E}l>YlD$}*H-5pr*o3G4Jt(s~>_*hS)hpl|_< literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDouble$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDouble$1.class new file mode 100644 index 0000000000000000000000000000000000000000..718b381975412ee028820391a1e4fc0513470338 GIT binary patch literal 256 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 V9q40!DDs%UnEC(e{sM2J_J6P*K^p)7 literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDouble.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDouble.class new file mode 100644 index 0000000000000000000000000000000000000000..b50d1ec38670bdf6f41c3764ee339c1e811dd7aa GIT binary patch literal 7116 zcmcgx>vtSw8UIa^-Pzr2lG2+^TVNZ~Hrm!F5z{GI zMf?Y^HwSIIST@RJOGK;3 zPa3C>cBlZSJoWj+@S5gGe<*cUiVo9w6SH zEk`sgA1`M4fCitD+uoU$@(GJt-KNMpM$T}ub}4hpm^x)-jOl5|oHoiuCo|{|M_e^% zc%)~(a{jj~wO5)?*A*yW3RPIEuaxraOjXin|9^PvnoWHf;(Y4rD>rkjVO7uAmcZEq z$4{DBvD4_3W#)6VHf@YHj!L5?Z+}%C6$<%?BJU9rFH|?wK*SS|lod6Iab?)`&KTFcp+FcEUzKxe(8`rV zzTYmdBCFYihE4Mp>ndJDD~Z-NTSargfhc-ziMR2`jVWVMYv(}nkR z47#qj9H^A(5B>63%|+!Hu33iIp^ z;&$vw;x+s_iEY@P#0}EiD9ugM+$_y4*qOv`8T|&oWo8TKV4>@!SziZChC@a!W!X7% zR+zlbgc*(p%uZ^__Z|&53hkv^o^W_Wn)A|JNMZoD>UcAWw{TI%r6k_QJ4xJz!6e?r zWgYJ&@jgD#@u7yR!_v4RwELjpuuP$6dV}WO4|bKA0=jl~vA8HYxvt(W+bGC9{1V z4%aF-GG>>=>H2!CSaB_a6;Fwt7La9I-?o4ds)}n!Tcr-Auq6>?N!XBN z?G1QpvHHIfbG6p=dH5D+IF50a%ZyzGS_Mr=3Q9hjXH3-$)ksYN#jyVL=~wAg$<$=9 zY(~f`o|MCi*<6ZD_dcA&NBEtF-mtg%!D-TqQh{1meEIi_zT=j>8v2$NLNsh$5YvQm z_#vajN_g`kPqPqS8j$Yo8dj)y$lNk^AP`Ag-RD(5i&Ops8J~>{J}6C+i8aAmZPd>42NJWw z&Tuxb)(HwjF#GZ`hb-H0&U$xQnOzg+$TI=6XA!Kb5)IouF6tMmSH0I`P$ex@iohJ9 zy(*ZugkgF`M?E4gO7H4_LRodR7AbHv3@s95m2%Kn{a+-j!z!u%kcrGl9%c{-a;aML zJTd$qvg_uTLEhe$BiO)y)#!$XjcCPMY(bjit^AjjCiJ3Hsv?f*zSz!{Pjf8)<^n{y zwu8MUHBy5e7ETRzSWPw9VTsjXhjka4Jp}#a+=N{rBrMA6-d!sN5O1uNnn(3<3}Kkq zM>t#0UjACnLwlXQhEcX6AFzxqOG37CGQ(b0Bk4x zPs!zf5PXdNfLu;*y@=+w(30*|eI$Lo>Z9q-7B$e*oe?#Nr8}cTtx6QQi#$WgNz z-NaFg8r{rMM2$rKQ8n7lH68mncBLI4mtEX*A7wx39`Kdh$C;?Cs@$N)`U4tk@ilf3 zhj>FY_E(}2WT)1>!WOt+wemDj1}bJKJcs$+$#0V1-RU>c@-|vuXCLwUsMqUWAM^US z97@RKGLpxZw_QT}ha?eH?*M(^R;uzg3OGnmLlk`&hdDaNM=sxqWk2r;caCHEs|t4u$9wqQ#V^b60e%mqdp|;lGK7{n z+*g}L=5Vk!i_T%FHq+;@qc)4pVUx_3(WvIIuC|ewLt9M^H8V?70`ReWv7ZKTfbt%s z42O`Tj1HxIm{LATl+WR)(nZRZ%Gbs7o-QaUPuxvSiB?(>?`@O6L|dE+Ifl==YN0JR zaRkJw@5ph`X6_5vOw6~Ld+<5${vg?l&BUu7R&&#Y+L)#*oCv&H+(#P6y?k9U*Zb+W;^9|ud!f<8@=j;M-?yn0+S#=1`qjljJ4dFz?aGoHXa|^&ZUKfsXt`MB3 z>%z%4grkSyyg)cFE&wN27mo7r5S*9m!Z91diG|_3N;t1A0A~u*w6iO-#hZvrVhP&u zg#ea_XM%40JV67raMB}kkiFP*G`*D`D}dba7%gQdU zxLi(gl&`Bf6%a#c{}@19^SVMq&8alyit7UXGd1^@0MPkf7l(}^L5b!zs2D;gzKpAm zX_v4(oRgki>M}OCldcO`Bb?njsa@UeKu6Q#Sl{#%XOD2N36J`<*_Sxq%x^9C XHnGRD82@kWI`r@f*5OC^3F7|-TqLN` literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDoubleArray$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDoubleArray$1.class new file mode 100644 index 0000000000000000000000000000000000000000..a2720e4c5ec0384c9c39b3919f6869ae8e0940c7 GIT binary patch literal 271 zcmbV{JqiLr4256(TU`aWwz9Bx5b*%w4_JtWC&;ej_%qBvW)-}eg$M9Z;@DVOnMd+? z5WbM->;3>RMms^0phZZx{vw559<3(yrpAaiTzZ-NOK$a4gm1$WUzyNdxWf8ybY`u~ zgWn}c2@@|y3GY}67u1>eXIA`$sGq#Sh|pO%r)6e21RV(3=Y+ECjN0TUU6h3JALOhL bLM1-d9EL1<{>%4V$<%hr0UohXDJyf&a-isvvZ}m>v@SKFBT{srDs91L**iN*6y&p>extBH*`pn3}H=W zo6l#fCTAtHIW|EY+zUM^_ts-cYo?ISPV)(UnsYm$)gi7@^6o=NtYm>-ew%PhMM)#Uct2QDqVBNOiow{^Jp%c$j?~G z^x$YsFakF41=9sV4G@))ZTg)Y`t?I_^47~PMNW~CE zKQ>A;D9u0=FXKDXJ0;C4QM`)pMX>}+qxe345XBGiqcBcK@fv;-#!sVo9d8gC=9V5& zoWakcSSCt0NwZv<71AW6>67N?I7=9)Ag4z0Ce9IB)ST+DxQB_$95LwKy&>MhJzU15 zrz}@YR`ymD6G#&VEAYU%xCs6J=`J5EgzNoE<=f8JeIjQ`$;n$&{`T_AQpu*~aN5d@a}^faDjmXgOMCB{$BiB(!p=m~`MqW) zJqta zMo2VbK8=vph&dWD(FoZZHKNhv)2PuJO^!yBXw=vmVbN&zX@s>#v!l^08ev-_A{s3| zjfmE0aWq;)BVudBlv}MzWr+)mNA0z@Iy$YQ6Jy6@i>e@7v>)xfMYRY~9TrkOR#Fse zr~%uk5r-(oslFMJgvWh;QURDv76IwO!26w&dnDDG4tfwH1V3$_k#LkI&L!2C^tH$Cb8V&p& zl;cyLN0bU4YYnco+XIm{mW5bLV8CqQrqbOq^B6^D~$A2kF^rgJ%LDLex$E?l*^Hh&V!UMFOAeqL4Ks? z80lM#^gJWIP%+Z6V5Ffkr0;mvQ9}B;V5GLw0Z89tq`zgP?|ZD3knRmc+T=(2M~`wj z($CL>l&?{Z)XmX;q#rQSKQYn|8R?%ZM*4+dq%~zo|KeFk3F*FIq_)!mNIznvA2ZT_ zdaRX@-WiCr*^l&7k8(NEyXHa4<&Q?{USd9^Mg;XnEn-F;+Ku{(k=`AQH0(!ew0hQ2 zLV8ayQrqcrq{h_<8P_0cTlB9$B8a*>EcsONqGGbjqbVq%ZwOx%9Q$0ay!+wTK1AQIEMs*Bt*chq-VG zVl21IY<%)Iy7yhg)g#O7TI3{udU0uW8ZliQ&EgvM?X^$|R1eq!jgElS)V4sI5(sI5 zm?I!1v@OuC1ZuQElOrG%vn{Yl352ykvm+n{vMtb|1R`3X#SxHt*cRwi0!-KTvh_5Y zoE>*Wx|W?Cc^lX5<1f$af6Xv}f8Zlr%XH-fX$9&T&I5=T52Dw22s@33F=;%4=Zq6L zV?2uA8;{}d#^d00hqZX6MD9fK{@bc;ND>Pn0hg;lI7(DUne9x!W%j;98n#bV!y#NRw|r%z-I z{CRh;R$j+HrS=ZRFQTgSy8~5iYGw5S3FkPoD00YyzfRdqL7UmaM!3l3Umoy28o_pC zUs%FDuQhB(K15}#$QBJ{@o11m`tL2u$BS!`XS5UQeK^LW299GL|Lo-P9{x}2wHzBW Q{ES$H|2O={_%3Sy141Bi@c;k- literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDoubleArray.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDoubleArray.class new file mode 100644 index 0000000000000000000000000000000000000000..531bb7679d22ea17f3dd9a02684961776f22bf2d GIT binary patch literal 7779 zcmd5>YjhN68Ga_&dzOR-i6qdnO#_4_%^E4t5DLu=2!@6x5E^T%lg$tYc4x!vECea` zhL_f=tyb;DYrRC+oa*ugm>=VSGP^ z4fsJAKaAlnx&J7PABXWq7(Y=EA2JNh?9ZtAyp~rG?knh-Da}-{I6z59p11fSHlWRzT3WTVDFx9necDj1f~hHJ^YQL+ zo-?X3of^m$CNo;kUaoH*Ef|)b)yDO_&beO0$XTjI;MA$9bcwf(jYgd%rhFl*Aehck z0-w~g(+VPI3aUwX1hBI_01tdwKmw^&KSMKykB<%=9UP@u63fh@=TZYyGke_BEzRVT z@aSOgKn3PeO{IUxTtBT@w%;7)(!2ULUvL!kE%43g3un_ z(5=11+rD*NLE~^PO|Pr;Jzu*#0qdkrL+-G}o9dKmrj2~+w0h#Sno_5yO>J7Wa%QU6 zBOTB5nx=Z5Nb~JJ8}@wE&!S1wQccd!xY{Up_~Ddwp%3E!DNm&^yb&$LSWyO3F^+0U zD_Gk;wAEQ{pS6+6Q(9V1YUqTnWu_R<$`G@`n5CvqA694FK&hQ6aA{Nf(DIeCOX#d5 z4X$lm{+@5S?_tRgjSS>v8DjIY$+9k?n7k`yjo;5bf+1*QP_V`SwyZcCwcwIWVN13N zv6f^FnX!ooXZoEC65*UniblPXPlV4V>NxYTms{??o=%nAs-TV%7X@`+N0~};is}tX zsuGYk5i_)NULDxyW|f;f_HC{JM$8lK)#MFNfRog!-#(bLPD(+0;FeG*u&Pp{=T_mb zIw#d(aF!LqP&2G_uB%x*oHIF6uz2e1*sjgl$Im%Deg+oV!P&GnV^_s6e#+W!vX(4L zUgwuQWE2J0$gy1Olk2=@vD}l+xHTj;mMfTPZNFVPTgujhPC3~M9AlO?3HccNDT< zsZ$Bvn9^oN^v_sLmnIwqJtC;es1un#mtjtZU&PUaJz@MZjyLgE7;ne%EBrc+2e3De z-{5i>@5FHhSHpN$!JU5mPF8L^qMB^Tct~9$&~c&FVoht^-O9cxXHKIwwp39ou zeVu1lCOq7wv#4CBUC28Z3pshGa%pmnYWYIOO5{!?rc_H!6gk*db&|&}1o_t8k6tM5 z%nK1b!q^)e7$1cV(kM|UG_>+s5bI07|Tk<_3scYee*EpXg3bt2~HWh5E z2yE0&a(!x^pDbH$kegpDRiJ6>Qn1FZ2CSe%BPB&+ty>`NhIq^}bz|BtySuCE4BEQv z#pkM9Tx_qZYHFOFb5-r!a|=6es^~bzADe?1yW~M5%`a9~JX*Ktjin8b4WzV#puhTb zLp9I4YuS6=<=>G!B{9y=0lU3Y&{gVN_hYBr21U`*ISb4I#-$Cj*n)d)m)kv+6XKwB zm#&1ec&Y-@sVV5YL6AksWk2AW{3a=W_XTI9$KZ)C-K7}j%hd4xvao)6E9bu3I?g|M zC3q=lMIBnO8CyuV^G{+m*otQ9>_{up*P#|E(!eKp)u0QX8rrOj<5m; z+r?JF3u+j8!bo-F93-xg<)ulz6LF&{Z{hxi0Vjmu)j=g-^z`OhcSD;+xoj&I% zb^um$WE;#;I8(gKY%sZins-Rll(25XAZOwZ1NP$ppJeeta&fT|<2}N;4q2SsHjmn5 z$2;yIWUhs~ERh$6d!TWAr`*;oT8cM#4+RGdQG6ZD^$q<$yB181@ zHN++w>lP6I0~eG!VlUO(NA(`0@p>6ueWdycasY=oju4^*Lz4r_bHoIJjS%t?zKbE! z5paH-c^IRvD*xd=V#rIbDzl{JS5##uX;FEY*KuBxyt2uTKVlUlY7QeV8JNR>O9toA z?UJE6bh>1C4)?fZWDe_GGCGGM{*F*T zya}k?-m#h{b+Rnfs2}Q|t_xK%fLIiGXZx!mCES literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyMeasurement$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyMeasurement$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..cabd504e31ac97d2d5e5c9727caf15db17f3d52e GIT binary patch literal 4234 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 Pm=%-YzgKQz7m5D?b~jkt literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyWindowed$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyWindowed$1.class new file mode 100644 index 0000000000000000000000000000000000000000..93fe2578da76d7a95e3550da9055612ac439af80 GIT binary patch literal 227 zcmaiuO$x$5429olwY3WN2qIlOh({0w5pm(d^*D{SKg_^PReCiS9>7D1ap%rFl1Cu# zBd_=431ER?h%m%JAU@cu)3h#X5=gex9t)G%J7u#{-ITz1Wpr(QVe%a{7n_BM1ybvB z=~SkiHeOchTq#*mD}UnYTwt^@hTO7N-jiqgmndsxa=Aa1q#J?he^4@kK!>0HR+k0d S0`%Ae^m#_yG2aMwB+&-|e>w&L literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyWindowed$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyWindowed$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..b3ef2d617041c7d25e507146248a41444e2bd30e GIT binary patch literal 5500 zcmbW5Yj9J?703T8>*`AK#a0Y9*r6d%1GbzZY`0KjN&#aC#KZ|Qq=dB1wRCM?EF@PC zzzI$IO44`I1d@;k=_AwhLqDXQ#!j1=B%QX?_w-xeou;&%e(dKyru3ZMmF~49*P=6? zy?1xdIeYfE=bp3jPyX|r*8vRTD^YAjnj43ksR+6-9mOWhaO3jW=?FEm{FdS7OcYt< zqL{;nOyqf_zyd{XN>Q}otci2{JkKNZY;cwv66ivSn|W5c&&2&v>P&Ixf{72Ccp!?K z@F4d;V&bDFK4#+M0-;jD$sbM&w2hs%&)SKMot;i3i+MLYJuDC|vullkV2aec53#hJtrL_G6Gv0F*eLbx*J$^n2tgqGVK(P zYt(Ccdh5ZC6g-i=J+%_O4J_tEVw|-zCBh$>u?yvu>7?!!XijAuJ6|5#M&4W(>t@Sh9Ji6zS9~#pK|7kZZ1m)pQkTRVCi{}Po8#C zMVkDCKyM?F*4-~-EpUE2x!1^1^^<$Y8?s#ffEu&P5g$0;FL1OGga#M+VZhymd zc2+w?1ztimz-dzx4Wi7^o{WqBN*qPXW${~vS; z6f5ma*`-WTTOC+#XZqy)PU)kgDD__qCT8-vb9||i(bQ3mRzar=-$uG@5_$v?;H*Pe z(*UOt`J_xDpOi7^xsGNiVUhGL)Z0NlLCj^QgTRO zK*~_&Q#QoCFr@5T@xDcb;-u0v(DyBbUq$3HHpgiossHJIWe0yw}!3EA!?lAG8|Y>uOcYym`u}x*YFcQY`)oYl-9l zeuE+W4u|o3r11yL64?ic;tTi_zKTEN+xQE9i@#FuZ$92vE4;4~?|1uo4{6>*inpK> z9#*_bhc1A0E=HU}_hots$Pft0!N2=H4MUq3*p2sS<&zXJ{26s}c=9nV&}*MB^gV-g z?j-mRG~=I$;a{}RfBSsztoYuEJ@j3(Pw&NEy-YtX!akZDsZE1lU+SeWd|sLrFZW@; zR^LlrvU*EglwE6@hMB7uo6pRxz+z%sxnD`;Sq zNc0R!V4@q%Vl!f53)YIQD*zj<4=h*%Y`f1(57@!_z?5rsfbAk+!vt)%&zcA95N_4@ z2lVNMDZ)5wd0SM>Mt%C>3h=`?qV?~g$e{zmdKqNKzy|p_b;dXNvYuyCVH-z_xC5)j zo#+zBeAw1&`(%yctcO+*xUD`mqXye4pQ9eOu?n`GI?f^-rp6Ltvf2m-rkL^>iBxub zv@R`9)ZWe%t(;Haqjmc-v_gJb<;3F)eMM`YXx&G&?k8FoR-iRrpH`@b)rtZhn9qnui*D&EHpINV5dc?SL)Xbg+&I>!Qp9Dd$&}AtqPnOu(*oAZqTDV8 zf`dw+wJgA;K?!t70YeMKUczb}c2YnU+qF_Aq-EBWWjNoH5hb&(@8z-AaMMY;Gi-Q+ zyak@XMZAqdge&YOgem1biLiJIz2a#c5toq_&){+KEG~-Ya7jEbcYZU;hv_F)Qs(nZ zh+qQ8rL`+McDSY%5V?lVN{$yMhOW_tM%7rE`-e=NNdB+k)+N$GC0jLkjbM}Q9o*a% z+ebf^-lvX%Tqzfk1>9T}vG|(r40TS7fhzvpT6u_`0osKTUqq94K~oh-DXR-bIiZp$ zPT?L9{T`U3`mO~tY=X)ZjnoG#UibE kFZBYj>FUJK6#D7eMdKT(-A+e(lKO~+>EEW0;nRrx7eWJ|Pyhe` literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyWindowed.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyWindowed.class new file mode 100644 index 0000000000000000000000000000000000000000..d98f9da870f2cfbc74ee7d718eaacd3168399136 GIT binary patch literal 5410 zcmbtX`+F2;6@Dk#?CdU^ivc183ey-$vVp8nT5W=8ZqTKHl!Sy*L>+b~$-riIJ3C82 z#MWDFz1F*Ey|pT}^?9ryr8Uo^^;duK-|;6O-!n5iI}97L)qS4%uID@FJ(usCZ~yt9 zzy1xtqxfSI8cHcVjIxZLlg3V=9Tgcl(o|)7S;cAsS5ipgs*2C6xTfL@DRkhvG+&hF zc_Drwg)iaDoA4EURi5H52b-bkF8!2ocs`au9zijJ~ydAIj*36qGVMZ-EtQ6 zV%2DSM0@$w_b>eG-#j@t@#NHrv3>>Hrc3rxRxj)MWh1L!woBPLj#l(h1@S7m<_ZeB zr!VT4^=whMma=n>ZCXp*O-&kQ+sNyVL5l6ORm(9~j0Lk|UML!4mQ`|ehfs*JCv>`g zh8z-=Qq|5IBB6~aZAU??VR5FOna!P^n(bGh-G|OBWhZr~x^l)g9m6IUb#`iOas%R7 zL#LTY+_7XhuK7GA74!}a-X|h3Ky0E^Fcfr7o0f61x^ls=PwUi0! zKBYX3uhRwG_Gx0yvPtdxUG}zK(Cxfc$zIYIFX`D!#?|ao#?>>XRVb|*1p+%Z5VDeQ z;|H!xm*|BMg*z88UC~7aNorkFxRqlCTL*H3A-b6h7md6_81Y5ZC>CgVCCBKQbM*YB z6MEU#sI^?>(Vl_a{U=3m{IUcY&xXS#;4B#C{dn3!qc@1CWTj5BwShfENSiA}!6s2D z2%k+nS)V0j&x@z-dnCCwlDG@@H;2UpCXAE8lmud&l>1owx z2bu_ifZhwprkS^uoMlM?`#y*a1+&dy8vTG++E?XPPF>;6wDcm=f^S}4S}zc0st$u_ zR6N;Qa-+!$geU>i%hZ*;QFc>^iXSoc*}TJb&fB7#b5@OUi)k^yBYeGW`u=df=-=Ix z7coaoxzSyr>o_d2slYQ(I5SqtM&4XB^Vu=x$zujnv1Gr|G={J*jZff68v8Mv#zAR* zjGv@gO7^C4NSdGG29rTF*9s#)bq4zKzK-h!jk&?NB3w@qUG%mvlhv0bZWUyNcXLrA zTz@9b&!u@ajmPk~ieIGhOZ-a3uhaMqUQ6R+_;?zx(Gzw2E8IxGsgy zb^EZtG}7lK;lArN>5{y(T)|+SqX1jWGa%`Gtx%PM=z=jUyHs2u#W0Tr!fRFT{}gYT z&s7c0tOMX9pp-XV46CNI>>}`F-78))VIaG&$Y9~jv*=ONt~i<$Zr0zGvKV##WbPSv zMa!2gM`z`eP;{9Kown-Mta~J|X0OA4TK}KfpTC~QAMhsgS~TKZV|@nY`bBz)jKfP0`lsTr>5@<9nhRzN5|a+q0pu86wQ+ zDYvfY`KV*28i`hrT5WRWhSNTcK5kmNeRaxm&$6QLib^C+C=B^daVw#M1K|gT{}^f{ zpvGD%qrjYGEV(eBh{E&>T_YwQO8@ACP}TxJCPh`jc#|M&oWo%iJn(v=CaJwR+saZK zcqzkD{3q@M9^X6eufP7od~kt(%rt(yxk#WFk6+G}9nra~Cat=Ab1+x*MP5O4=j9r!dBu93E#YhhIc1+SqGyI5Ttyt(kpy z5X)`RQvhnd`DFAc zCMa1(hd7Es!DOKNFlRzvQ$4ItHl$B1&}Rxqc|!ELL9Q+ACwIKb7Br~$6Ir|Y_46C# zcOdf@w7$(ICQbZZB&1iRUqkY2cj_)S{hf5Jt}Q*C54yPb5OIdCJ4ok^&~>77k0&$G zc@oF)BoXDfr=m@Z#Z;Bk<9N!4`42J{NauZ+r#O~h4Q7Vp$M{WT_PviZy>b(W{9)`S z24&dpdFUo~)Mx5VwAbN_&piCQhyn~4jcA96@^Qw&Bx7Kfw*NGyTpctIP@uzkUk8H3 zG)_=M(I$bomP)m^C#lFu%=qfmLr|{E(XX%u|Jc{?tKS4ZbMna&aD+){J(1U_yT? z+WBauS(vo-n-Ue_+lNL4-f++oRqMqj9~9p}>JD`HL3o>sm@si1qltw2dPg~yMlIJn jqZ8rlQG7iB;VD0RtxgtlD)5}Wz)POp+*RJ8?5MjJyO~jZ literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationExternalTime$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationExternalTime$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..eda9644c2b8a3eb53239dc2fa873dfe069be6a95 GIT binary patch literal 6858 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 literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationServerStatus$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationServerStatus$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..67a47eeb4ba9a8e29a00f06e5e4727bbda4a3560 GIT binary patch literal 5668 zcmb_gTX0)P8U9umA6q%~B~BdMbxTUz#+I8XwrS(kX&T#d+E6=bBV$Ng3dhp1eG*wx zjwCk?m(o(8<<=XwaA{$NVg@=8I>adr({_O2fd__1F0VYpD^G-P_Z&%US;8K>Gxi?s zp8x;$|G)pTEB)!eZ@&Xz7(a?&FXrTsltZcsU9cm#4fAqXkZX%g9GnQ6aZXOp%OM@X z5;75Fkuz{XzH{YrUWyhB6y04++-#nTgqmfLe`C0xm?;w zS_LPYi6u0JQGq5WHtq%v&~Vft$T5LnU;ixkp2()S zcgvKMu}>A3=4^MynoDzK=TtUnrDrYIk#m1BR9JKfY>XG3bjo&V@5xNYb|=zSK5z5I z_{R2*RczNy@AV;R;bh8>$haDdR^Hp13GfILCYiP^*IS9x zm<cmlvS`|YxdX{zCa|AExJkjgd>l*o;o>oP#&8m`f;}$hU5@6@p(Ke zKYc+CUo`P0Ja1wjdQE&8Uor7je9gqy@q&SuOuUR&41B}HH}Nfj*2*F5wRaQW#&=9y z#&=EJjynVnY}j-4USncE`qsdDox{ZU@O^=i4Z-SoZQ=)bRiM3MZn=sDdL^nJnK7or znPNuXT*_jSnb%C5!fAoyTQ#F}WC;va@40dI34E|xX?+Uu_};Q{tWF~_@xbKtSg%0m zy81}4QkE?ClAFB})*18P$tpj*{_V!TsXo^*@7U=SZ(89K@`J!_ef^KtF{4+B&=^A< z{io;Iqvd6y65#T6!*ueqR@zB%kavXP_4awz`;Z!h-^S%lA|$C6*zcbyy6+1%Z;5Oh z_j}Jc1=;z3$P%m$m%a}Vn7krXpt}aBPpH7YYLFV+2{fi`J2#Qd@%nYFo`0h?JX^mc zup^}|YCc`ONX2>0RG~@Og%fFOfe{KZGGwKZj#IKs$Vo_7TxR<@=~uds-v1bk5+ys+RJ|y6oLrIM#pba0okwAlP!qPU0h*rq|^Xs zcXKBAY>d8%&^3gAr6lj<7~vbRy%=~E2l&bK9VjY0pMH{f3F~Ho9>gqxdbx@ea=5U4G4e z4+Z=V&*JxZ4Syh$f7EzdDf6^Ko(}6gjr%-}D4qn#zsKW=SyjqNFNLm<+JFjJ10{ez z*T_aeqmKIek0HbW13fZ($nbu}VP|x|mS+{rosb`; zX)1$^W5NfC@hL&VQC3X_z@zFvnsT_T9LJ=ud{(sypi5E3%3DQebU>@F3ZUXi1h7K{ z(JDgNBf=U_U1grS$kQFlrW3V!3RUwYnl&pcJl$XB>A25Rb5xW}TSHc}47Y4Tq6?EK0knyzRx;g?G^tNVPc=ATp{ekc(5j6Y&s2|Gx_VkGQPUBdbl zVN_!A(yWTT!W$HR^ zIm;8})^}+Mpy5vP$858;A%Sb4OUvW-||JC}{; z0-EqJTb4w+lkm=vmTSEq~0n%P?dUkNehFYdadB`@iAZd2%j0o=a!of7M;>x=?J*(-6ynEgA&Si-%BYkPx#Q!U1@H-c eQavpk;qxVtH(b~u(=S4h+rvCvs^=>=> literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationServerStatus.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationServerStatus.class new file mode 100644 index 0000000000000000000000000000000000000000..144ebf8c2d00b69745a55a4541ce235ab9685e5d GIT binary patch literal 5716 zcmb_g`F9i775>JOHI|TV;sgW6P(^WqEgPw9Ex{DL$beXEY8$(h&}5Ltc!)eBMv}p$ zPMfsN(sW7JbYIeimbT|mC?P55wEa1MR8PMF&0-S^$^-Fx4?SNiBb z|M(|>{rGDX36x@Z8rNdj1Y3q>xm4s*m3Q+ht~cRE3{6;2@kJFkReVXsVhk;KMJ`{K z%U4AH)fisGS2y8n___>Vm*E?m@Fw0;@pcT`aIFd7lKZz+d?$uZyrbf~G3=82_f&je z#Sc{cP(eIrnz}t))XHVOtUw*A8pVQcE7)AtZ9^+g>2}$$%=5Xd0_Bu~=3&b$S2VLS zr4_4s<9nfZ-aWbNqiL?37(O|2cCbsqwlkJ}C8L$J{H&hQ=4~r8!KXQ`UqQHH%;^Lo zSS+iTY(1}4^n!xz<5g3pri`+2xu_4Crd81@)Jsb3XRd1VTBfL(S29a$2o@*9dEK6% zWR-FmN3E?DG&^sWGjo<{R4ki3N=1We2$q=$EFeJCC=C`0wqEAywt$w2ifx!zD4 z0?pQX#xV8K>fB}Bp44b21(72LcX?DnsJmxMHeu!IGL4Sov?mj;%o^O_;kC^(xMZq2 zOHFkL%#*dMMDJf4Zy87cz_YK*IN)3tmwusfYIX_nS;3a>Tu%UC?DADTU!fTzGlpI) z&_7C!p~*RXPoulr-VKuE<&Cbty!%Qxo-K95#VYS|70-iw*~ zbw6Qb*R!crLafU}p-W$1$F9~wagWktt-BTk-Dg#1B@qs-ZRNGWUfKAr`u{JxX}&Ib zYUBoUm8lh(alN2r8gpZQtXkoD>6aJ@SS;dbSQZ}>N67sfs zIDmt3`~*K$&{bc$1j8#%{=CHP#^Cbf9Ds0-n1X>dAy%p^S?^XOEj$8Pnia#mXS#Jq9BX^zC?6Mq-i1*OYeKT2EDCx<= zNtScVE+qSsrZy+zRmgb)Wi|*RMLp@7nbKa>PHRi0h~fn+PeIpQiM+**B`@KZU?alP zpSW&RW)qrOuq~sIU=ZnMCCyb%Z73%XU%Xi(BrOIfJh}y^-uUnZecs6H36UZ0T#5co zoSz&{beDV5$;Cb&guC~<4j;_7fo@jk_|~&P(8GLNUYNUV6@^lAcx-fZWO#BU%h%c5 zL~wY1^z`W1^l0+ZVr}QH%13uDyDaE4TD4fAeQN6hT>S=zg6^&_Ce3QGnB;amE0mpP zhx5{@IcF;Ey`sh4xy4I0A}2Mwa9y+Ygi)Z8dB}7-Va<3pPXwH{jG1U$ytEj{ZTwk5 zUwvTt=XJt6xPiV(!uBugUgNe`3Jz`b+$iW>lij!zA%;0ijmsH(pa+4htLS zu#U!cmBi)k|JgO2&H!d*im}xiG4pKQnJy34SH)Vrbu1AqUv%@3VQTh*x0XH8u6m7> z2^lzP)r#?Ep8(7I;o(s{hwGn9_=H%xt=NhWKZy`APE&6cn-Vy z+|3{L4d}skX)E~5f{!%cWcUnxlHUm5?d4sOCS#Qub{;FvbV#M<+72nsytg5W!{{g0 z5so@}mrwXElsmjD_zbV257^8rdmLUxGQ+#PZA?8t!{7MO5D?vo0lta50vN;)N3wXB zS6OT!gfQ=0WpS$aeT42Koa(zzv_1C`S%PavBgLMj@Ne)r!i5)_GJL2y#&56F-g>6nfO?1bM!7`pJVeulw&(-I{>Ax_V<>lLX<9skE_$_x9!-iah~xt6|#XJizoy>DTg zJT}wnx6r)AQ(WK@?Vw69R5}?ZDH`!04KctioMI>pa314WlOC8=u9vw|HDWt`5bzG(cTpE2YQ<(M^AEiR!5=r&ato1}*VjOD$A`zcR zghcieL&4{8VFen_zm4 M^6%Vl;G2m47nak_lK=n! literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationUptime$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationUptime$1.class new file mode 100644 index 0000000000000000000000000000000000000000..c2b76cef76996bacedbf9e9e49e518715be86a56 GIT binary patch literal 265 zcmb7gp=Em9>Sn!Ji9=C|HPvcz~D7D1v9hpo9y5;z z!#B+Hb$25Td<^~#hx8P2vy zkr5WwmCW&iJ7GMltWm)_#=i*mgBwo?{jD+5tu*&udP4rWz%(}{+n+8{1j6ipa6ST| a5nuaMGYT;!Xhl!ZjWC9bnlWhZ^_UZOTgmKEZue5IIncY8vKtLwOHvm9v~8<3QtSB8sheKHhnlu)s80oL0%g8OY8 z#RE1T#6uPyws9PfSa{UNV|ZMlZ81UEcmhw_cnVM3xKIo{gJ%``PyYbhcn;4iv@bZQ zogIZPu@}T|h~*lqb_9eusFo}5|gHz2#cr0 zN)7MXwRfmXVNG4nrr5nR4$tvAbCiN{`|sqm`BzKu?WwcU?9wvnx!DYF&ggELC|uax zbH@^4bZHT}G&IrgneA<+IBO)LxZ1j0M znBA1iTc1byI`bT%Aer_>h0eu=GAJ28r1FvmRH37R(HhtnEjH4?okDBIbqmA!!UGC} zOXWAvAhY@{g=HCiA^ULg+8p60gf30WE$_}cQ>;*gl_4sv1m7bv&B4lMu`}+ZQ^}Tn zXZ=gX?$;(*U%xo))b2nQZvk4}DmDx8lH|B;UPu^JLq;j@i1 zG8f-=adjnEiqF=>=ZMT9`WfdTT+A`fC-5XJQqm=y*+vcj}h8ApRzL6Wm*7_Ge-HuV!)9_c(hN%fF=aS+s>C<029f)fM%sk$$5p zuL7zoL^To_m$<_^?hR<={6)s}64u~lY{M(K7Ox_O*HFgmcnELkd{{d|C9*u=~f zE~Pdxnx|68!e;&luBI$`-_Q4?pYL%WGm{y^URfV@*biG?1;Vb&xV>Jrnz6hJs4kW9 zTddUE=)gM|z`NLq_pl%D^A`F5597l?#>ZN(x{tyV%@(uBmQKu`%VJpLwL}OY#Jf2vH z%AALviSjQ2Be9y1fre;FyDr!;X#E<{Z>{NXUjnU25UpzQ192I&ej{4H6Rkgp*2z<# zbxmWmB6Vo}83=R%t-;17t#7VU}OO;ep{G|DUz)|iHE+ys)KV_J=$wZ_a@>A zcH2j2_nT%G=T-@0rIv|oF)}NvGIC;SGVQ&ej(&r+2gykt-|3>>f-y3JVTlfQF7OYz zVji1V@tYaPm4ej~LB8ok@9!i_J!8bEPJvpu|Lg=B!b_5_f{^mN6*&a=wGP{u$L)zkK wBa7<)TNHY#S)|9kT!nBG_UY%%=;5=2`OV literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationUptime.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationUptime.class new file mode 100644 index 0000000000000000000000000000000000000000..d56ce369287008aeaba6a15916105faadee2918e GIT binary patch literal 4768 zcmbtYTX!2*75h_F z$VnOkl>4QHmOF*QV;^`a3DhlK3wY+2@CR6nCl=qH8A*fWG>L03pEE~i?{9y5pMCZo z`Jey&>)!x8gFnP@1o=3Q!iXb|4Owo=uq8`V!}Ta`#G#>}p{T)%qXQ)w$})UKB<(mV za5_-Mwk&VT@>U0K;}s2GjiVPv6kn71>l(fh$6>sx;hS*`$owr0-`4OQ4c}ErWG&0E zGX=d;F)9k$Ow}yp4O`(r#js7iuxi*9vt+GgXBE^Xh0aXLsyMpktm=iT5&74@|FgBS z^j4OdOPS~AE>90D9GWlLn`ynQ=eCTrzHOJ%OMEKoQwm|nEE)tNSbWwf+eS`zjJ(3( z#i}J+t7gSqFBsF7RdRHPc1fvk{<^-crwh8ZnQrJ1ti4+H;IylY+2y%KnohQuHcRPQ z-KiF@+NNXJ)Y2B`re_}_ylCi*0foCZ4abd*=Yc~1$Y_g+hIg4#p5ArOo0joHwYYBB z%R0Rw({rX}I_DKaBcrPdJ@cg;BdasM-1cR{&X!4UPrLB8p4aW1RY@01R4mzyX1QQ8 zSPV&ey79c?Mu0?5j0B@psuFjq^%Ku{Ae^3{LX3XaTnzD9p?4%Z8UR>Wzi#9l3HpX< z6!HwU;+c0YIePBKWxeeC5Gq%x+BcGI)fCh1+mbWX?P=ZT!O-rqn;r)lDe1l#QIZVdm1)tbi8{7Fj8EQwfYaqvw;Rl{an))@v-+%@;;tQlR#iU;_HO3_q6PCkcEKCpEm0z?=A~hMy(ybNnKK zQ+OtUU*cC9ex1N?@Ro+(DjaEcz^g06S9F^lg+;)BQ2lp?oZDq%XmW^cpk(KV#)mAu zDC?FW`&$*Z6xpYRiJD&%eubO}R7i^FOF0V88`h??l`L%}1G`DDZA?(gt!0&=$!m9N zrlp~9!zY$^>th`*Z)}@6BPlX$fyFWpAi1)fNsd%TCx-5h*Fii34}_5-m#ml;q1bjE z;g%$x?f5`1-%a3mcw1q-Ih6IBTJn=C(Awmne*efiUWZdS_4qlWF!oShi|&ce=oQ|X z6OSm(-uL)qhEFOy>83twLv|r>Lpr>}b6->3#yiUvnux-ZCaad z89KY4IyrpO)vfMJx7KI&Q{O$i#r@cw+P}T09(vGBSJuin8~vP>HE8KPLUWdR?9$}<*Rsr0 z_Z!JxARbF!^}|@!E@4=jmcq;%7RFPDygJ(I4WSX;l8cFS-?N5AY z3y2P2lAk0z0Zic>SEBqGj-vb}g!l{eigIe~J%s*(aBAG0BMq<~gef${@i@VTagY%Z z;H0PQ0~3aEIPV(kC9m_OqVU0U=kL?5!gOPtO z5cz05@}I-JuRl$8;##bh9*wk!yBk?VX-r6ZL5$T&#&Fq92Za~*q~jh^6P*|Lq_glq zI)N;k7EhT+!utE2O)GdBREY6-kn{=RoaoOaKS&2u6yWCjlGWpAK-})nodP^qEmGR z!q8Pel`ec9Yh?2hvBaBe{QCl4_R%l;=-v0wBj`_lfP*1iZHDhfm+A|^ch}*&@kN%E zAbb>Gu2-u|e!Nq==v~`EU(d(h!=d|7yEweYQn!Qt`{>@qfVUXDj~=n?RlhD*w;SCm phC%fNS339FuwJjYIj)cKub+EK&NvX||B{Zda>ZDi?%*zB{{vqpr||#) literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ExternalTimeProtocol.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ExternalTimeProtocol.class new file mode 100644 index 0000000000000000000000000000000000000000..453c2259220c14340e54bb2486bac538aef4a01a GIT binary patch literal 1932 zcmbVM|5F=96#p!_aLM%wHKnvrs%Jz^C?=xC)&!A=X^V}4@hA?{@rUKI4Oj0==I)Y; zj{lRwOmXb!^k@Gl$G4kMqQqZvne5xQ@9VzzdHdJjzyAr~V|7`4k0Z}G?p z;<6tGZW2ai-syO*!xJ|Q%Jm--5e3}ab$ziDg-PgyUX>xG?DfaZN6qbTn+&?W`LOLw9T+37^WL; zAevqOKt#Lzz@rmgx!-=u@Tkyu#(TW%@t|F{lgJI))#BJ`=Nh5Iy*(beGR`2F7I2?p z<}Lw3&+$b28WO+&UO*cpgU3+fqQfX>I5GD$H zbhp9pS}uAObnt$=b9Rj^&Z;|Z%NlILOcy(Nd&I-B026(0r8 zVMN3Jqlm5NZgOaGD<*i81zn;iA}b6Wv1}<<|Kr2wN5g*lZv3v7xH53xO>FU?Wwk`) z_UI_29Gs9^9dyHPZ25x6gxR=6smDkDLFmQ#$`h48olt062hU6XyPr)w#1y5(44s@a(8&REN}F5B0gF^h$QKquWgJI5VywDS#-!N>M@JXmGBQ|3aiH0u63K7pCA9rq zCUuJJ2@J(t(iCGV=5kswQ^}qO_euZ& literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ServerStatus.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ServerStatus.class new file mode 100644 index 0000000000000000000000000000000000000000..e31de08ca91a9aba225fcda836237be9ec180245 GIT binary patch literal 1709 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 Dm6_MY literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BatteryState$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BatteryState$1.class new file mode 100644 index 0000000000000000000000000000000000000000..fe403f6abcae18619b72909593ef9f483386ddf3 GIT binary patch literal 285 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 literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BatteryState.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BatteryState.class new file mode 100644 index 0000000000000000000000000000000000000000..e8bc1127c5febbda34aa5ea63d045dd4a3938335 GIT binary patch literal 6690 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 literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BloodPulseWave$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BloodPulseWave$1.class new file mode 100644 index 0000000000000000000000000000000000000000..bb2ba103b28d1e89035b7a127c7a1a4cf635a096 GIT binary patch literal 291 zcmbVHL23d)5Uf_?>PE;uVGlVwh_{fF5+MhPAei&G+pHtww9KsgxE%6;JSx~8a?Qam zx{HSHD(dI=>l?rvj~TKIV?w@_ORRY1JQK==lTKPEVV6#`g%_ze7oYgkc04`W&Jv#9 zLggj7(5$&VNSz@kyh?0Lw6%>@Nak!)avhufpP2ba_IXB_yobPX>Gh8jp}092Z$o1~ k_D8N-!pr>zMF~PrL*J^efNldkC=W2yInvJchLll^uEDTWCIA2c literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BloodPulseWave$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BloodPulseWave$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..90f3c44fd4ad002c3cbef450d4ef60f0c6a57994 GIT binary patch literal 6180 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 literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Energy$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Energy$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..7600246d8a4a5dee40df22f9e1bec0e1a311cb61 GIT binary patch literal 6050 zcmbtYX>43q75?sQ&oh0E*Se1F(j<0kdt5rT6Pm_TlEzzGaF)i#kTxvOGtc%*$1`RY z$7xzxC_6Ni(j{ri9%zw}Xc4s|Dz!xvv5S8!0t5&U5<)_h{9zH{ocr#~yY@UQ?L@Nf zd+*+JzI*O>wmbgO|GxbqfbIBN3|+8!nB`$EicZYO&<%%&qda$al!i;`x9v6t*>|~wdZh>HL-!x&5^HR zqXw&z3(FT7-BO5{0X z-YU48l8f&Yh^8{Om3L=$lNp!fqIz{AF9z$?5wsa)fH%`vF~OT_AtW~f)`V~K8luKC zIjcxKwa_L$!h3qhFY!DrWUCKwt2EeWp~KJWN^*7hndz!3a)lO+W6LRfk<*ic_5tF0jRy|Q9JNzLTKR~;u3A#4dq5^pVEG2J zy_Vn`Alpkd?Od)bwe8BOA6Om`Sg2+5WbK#v>*^gGUWKZsG}?GH}|&lQ<*L zu)frqcnY62@i~0nL@xvMAeiryL&I$~^{(@=ZEBLBFvj<(t zF@bKz(|O)YZaq}Wa%-=M@rj={F^MUGq1SIfxh*K`_1!KWKLXp z9Jy_5-`;MDgR0n`q$ppoDBnBWl+*22Yn+v;mFue)Kb5RPky*#ir0J#-9_JT;%hK`!r0Ak+$|zmgq-!Sa;&{fIBM*hhGsH>@w|I~8@`WHa%QpiLfG)jt zOY8!xSepYVtjx4MYn3u()WMBTsl2G0rQAp{-K!ZpHJ{HNFY-N67;N#e-oiqgrAd=2^wRx0<6Hm zDsG@R)0M*jc1Rg2u`Y(lBP?ZKjrXr25+{}5VE?yJcMj2Wh@D1%oaQcb=T~5=r4?NM zGB&NC{(0Jb1r5Q_6pMsdwXs??H0Y}GlBU|osv%c3%&JZ2(7bNfuu|nEsoJuFE1pLa ztA<_G2&=YMt45S6FKMc+tQrYTFp&^o{ zKBxFED*n$aA2N;716Nkl7*q%1C5^@^542UQmOa2rnrf8?HdoVF_5d$wG*)?_y;`;G z0bbHnH}b&GDPDhpcKi}a{0hVPHQt8bU-G5A7hZmzZ$#eLz`i za0Cape|@c?BCHu|C?J6mj4Jh=WF{XpD%FEianCAQFGM{I(V&4uD75{w?EWJ`2mljugXxCZUwT8ZywoF7}a`m+_PVk@B;>alg3KU*Om zwssL)LmG(3*6nzUqI{5^<=Em1=AF!CYeduc*m^4_l>QNN8CP;Qw!(v5GLbssU0Mb7 zFkQCx5nKC-tpmi?!427pOUw58vlXsl>#%01$JTy-w!%JarHHMx2I8@Gz?Us9+TO`r zwiYyfkFA3nuocnSDwiBB=3Taq5nIc|)^TF%o{O+`hd*19Dz+Zf4E5MLbhpmT* zt&Av#SvM^>^g#u<0g5S_}{iJ zX7P;X#jtB}1E~MsrIh&|z!@HnuOjGO;M~^ZD!au_DYGb!;GGZ>=3NSAlt8!%Mfe&Q z@W){)NkY-aZ%5=ch2P#yhyjWC9zR6!+7a1J6-3(6qOSmEkdn_d{qG&r^n!Hh?WEQl S#hvtxhC2Gc`eS$q(f}*J+ zRQuM}w)SOfUshYC+G-KxVRKH~-+GS!P0#7+k3Id|nc3N4vLO)nocX@*y`TH|-uvB8 z{`a@P19%A6W9URVj{9N9(SnLh=cPFxM=KU&v?$Hs zS{zB~f1%=+DqdIdD+P(HY3kNcK`WQ_vI2FmVifYarC>u@w+yW?rCVjAXr9atD^SK1 zG!GTcvaOl+lvb$dk$<0E`sB6$4tA1qa_F&m~ww_n8ZK7hz)|62;rVILjX%=nGrd&eWGJZ~**D?jooXyl| z$Sffg6M9ZJ=7q;SIu)5+99byoX5O$XmIxXpoMr1zRqiR_7y31Utz!)z2Y z!0J7pQRZc&^%F)}c`%HauJqw#pSWmdNxqq?dqXis%76HznEP%%%mt>cENKVF%e z)~yp7&7h#^h+!J`qY4^Q-BSuSju&%uiAKk8+dI=}pEYQv0}gvj%WGE7EN4n|DD9G& zHj48_v1DejI+`la^^G{TBG7CqXx?IleEV;^GFm8VcJPS1;KB=d%4J2j1h~0J6~t(r zs$m*9R4suqi_9&K%WBcjKmh-oNsXdNF!;LDc2Z(_7D{))0g~y?a5{EId-Q z&r0Gt@@X(Au-2kO|EI*>d|tB5$O1EssTG(HJx?p;1r=ZqO6mlMrQgQ~D*l?lWqhdOih}#XD!D1L>j}+b zEoMIR2FiafblQt0z4LG<3uw{GclLCe+MLYmIK$g4vmDC_%IK|X*6S6CUcX52aK4!1 zF*o}p^;$7a<~3VOvi#&K1@T&PdNJwKCG+~ck<)ug?R6$9Z=7tA3?-T}K zkV}}9GkjLemFTSG$rD4#RJpsi^J32}Osd&*HD7|!>nTu zC;2B+v`8j|bs1ML-QETB=iDbsGWFoTJ~70ZiwRuCM+$nvLE_)3N$+w6UM&)W*Y23c zeY_~xfA`U^VDGB9=sm{jpjKwqc;F6C^I3EEV7mGgY;x{2vt#ynARDZAgU@-oI&Z3B z=1a%XwI#k7RmZi*XXIHjT=#9zmKqJNyR}%32ObiWwq=;JPRf2{Ej6X9&!MfXiMCpk z*HQ~zxpQlg+rM^syH^bf1~#io+EOmaz=|c{%^e>Eaiyu ze`*Td9H;rWc^&p*n>-0PR^%XI1fQjpM>*ThUVe>Npj>9J;B#yR3HX0pVU`_WD-y_87z1Puj4UOp@r;nufT}RV3sOfEu&LCRj-cBf>0UK$; z1WnjR18zqTcGHL=@qo+KlSuxAIqIO;!@W^rl(mC6O8GK6#8D&nAM*{+%bBQEH9%0S zOhBtfU#l#}NFiFiL9QZUtm8elaO@$y$lA&80e%^NhteOR@g`!I*+;xyy@|NYqtY*7 z{ppQ~8)*IqPd7MxT+R0*$&g4n0dbIye3&*p6$LZrZ z?t%Rm84IwS2lf=l@~eW~$FammHr?}2w74F+MCkr3atYlsYjwSK2_3ar^b(qDN{Ihl zEp`wKXsaZ3>LvCg45u;Te~P%L86AV%O}emrO>&+lgo-EdB=r=XqG(Ds^B1E!6PWar z+Rt6_UbJdqj)NW?4|p)@d+-EKdh`R7EgpV{BOVZ#ue$S%dahD`1?ryz; zdxiVfkFl)*r^4*tM~m`7fPJgaz7=yYZ($!r(Jvrlp1spcXg_@e9UHe_$9-3!EMdoK zR-YT#c@=F-NV=0)obFPs+Vd-%0;Z#R2vh_Zln OG6%=F_9OflvHt^6468)| literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1GalvanicSkinResponse$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1GalvanicSkinResponse$1.class new file mode 100644 index 0000000000000000000000000000000000000000..74790132cceb0720abd63d87926c2930d6e098e2 GIT binary patch literal 309 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 literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1GalvanicSkinResponse.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1GalvanicSkinResponse.class new file mode 100644 index 0000000000000000000000000000000000000000..10386bb514b650bb6393318dbe491f93961b728f GIT binary patch literal 6052 zcmb_gYj+dp5q=h1UP;I{0pox%ARI$vVXQ(RG?=FG737+j+Q!69X}U;jdqG~QtCfLL zn%)a-nkK!ZO>b$^CM0Q-5(t=-bJ~9EX}|Xu^ndj9ncdZDk!8#|w$9OeopEHkR>)!x8fjbd&pcuttu%l=~Nu~?ZT!^9>7iDxwny@(2QvMkOkY}$AK_&cuSC%XJB*)5|5Ft|i(&_U zuHv;Q;?n;@#V=L7uHsh;VrkRVt%00YEb2uCYJbVdWpzuzhN5m6T5d|Wibmc%l^#@} zj3{Uv$eTr5GwmrYSJFe*{`KFh+Xvol<;jVG<3lI+J z&1=01>TP3QCnGY84(bI<&uF%uRj_ruWXjf*Q8dox^gh$f+nP#FCVB}MSnq8VdZ5g(1QMNih)Hk>S@wl#0lO%4M)on+^t{xP$CAyY~sOV@Q zFL0Yj4O4%%G=EmNCN=6rLBmnQH0-Ap)Fry66l@&LXJ{XdR^qltQ*X~1)LFm7-qNy~ zl`)H{073cRKtD!i;PA7tz&zC5r_kkpitHmY3%uj1=&D+nLW`z`TAg#>({bz!_4Xzh5sLzZL6aU zLq}!FdAJIW3-h&bXA$~GY2KFRoftlir&L^z;a$9^;{6!@gg?h{1XRHX_)x`PVz_~i zRNQ2it-hcetUFI?77GSOR&SvE=W>UAsi1cp>0p-6TiK584pW<#`HF_}NQgq{+6 z%D3+EQdy6m%1E5eXGk`#U5J;{d%VaRAZ~d@Ks>A2S`P`Gj8W`3^8Dp87AYaP;UUdB znaSsv)fbG69v2#xJo5!wEPiToAf708^>ke6zK=;coUg=;%8+`+TA6G4E;Y-UikKNm zx<2IDq7^4nx8{i_&X3K_-;cExS0}7Lh+{!2BwqQIKr->Lr|e@JRpSF45AxnIF1=Xo=1rpE$-VZG~uPI2uN zdV>t4j)^NvtYcNDycnC2>S(ZLiPDl74z9bYU&sUX%!F+j=ByLTkF7otb?$dKy}AaR z%H_c7Q>}~X+Uha&t`(NuE4mq<4%1YWCEAdg;co#()g#r(vYdt;RKZ+Ehw3*>&AQ~B zWl6Q8S|Vuz&y&Tflk^qr4?2feXV(%?W-Ud4z#QZ&a$r7H4b#i%wV1dly`v98Sq=#G zQa|wVJtW97=in>we>=2RtEBvsBUF$)#$XkcQhp~(uHpY?+qSf*@b_F}8l7#u57TySMS$G`!88@ToadqpaaWp-GBEVIM1q~=bWq!^9|Shj5JYWptRMdhQ?h70|<(T&t{r z;H^@DTh;rwN@Ij49Bp9bGbOcCB?C+bXm0bu?Bk zA@*}`v4dDZUB!8)9%4UAcN!u7=ZO0(y`!JIaTk_#j#bG766TNNC$CYqnaooNN&WknSd}&!YfjHqB>nh<~dmx+$Uci^V+wF4vj<&yt z4b#dZ9;uFhuP{=+0L>#m=mZWRD&$GhZxs5Vv%Ma`AEkR|xGx;C%W>FL&Ec&o4sICL zF+({LaE3j1ZMun;+0>lPjr$!CLzMdbhSm)5r>y?gQC*2E?EZKzgV-inl(;C9thbtQ& zt*cg?e*I1%Bg}lLbTB&;N*DFP#AsXA+Z#vUCyook>z8vJ7L8aq67uU2-56Kt?`_Rx hB1|7*=OYk0^5r$2Bq385&!S!Qr1zyV*&$Kn{R@S+P4fT% literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRate$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRate$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..9a4c825d1f6846b8908e25f11c72c010598ab2f7 GIT binary patch literal 6030 zcmbtYYit}>75?tN#=D)yj-9xPV`vh)wY@Ig+G$DSP1E`jHwEX>*cj4=$9Q*aZ@S(! zyR(kdw6sv(&`?SrNmJf|772+KQ9GhiTLcIwApY?XAV7eS5E7!~4-XN}xpQ~s+B;UN zjbz=Kx%Zs!p7Wh^&$;VY|M%^e0PMim66k=wakOJLfllOjIL34L#A(PUunu$l zS>U0Vz&zfYKnZ074zE>sdVxic^RSq}2AnW(FF#N6%zX@<=Ya&;vB<-HtaQJD_a*3K zhCd!K@SuVBC$JSC;O~bFe9*v$418E1;^gLR0Wl(A^6OzcW9Js^tU!F$wo1-n%i-lw zfhOXIIytKej_hmw`Q_-R`%hp{v?pT?7_FMDPd}2^wpicZWp2^qKz-92N+tOYBTw+b_2Fa4kjaZ}d%g@3_<%l+;Z188+dsg^!CLwt_A<(jdrqO)Sa)>39 zz%`+v?$OJ4!6frE%yrT>ZK6dt%sWXfx+VUsj^)j6TnXvTN2mBC3GAvj5X4BVWM_&c z0udDLjap{yUCh|?eC#Lz9~4-bb_b`9*%^mcJ|eKY&O_1JCyzyF@doms&P3`X4^Gy* zf3=Eow626#Z-CT&g71_*Q4^oRV+Niu@gzzfU7WgvG3EWgyQ8e)te3j~!kM5m7flh|h z2_K{oAFdR*fqP=?^fM;LF(GhET{cu3fI$E14KJNe0^3(B)usit!TKztQ)Y}0@7ue7 zuv1`DO}39y-p^T74Ys&PQRhmn$sSz0dTGaGnTk#4?0lAPDbZ1W5!lwkHK;C=n z2mmz!Giy&t2UoU%c@V_q3d;!g@8g*4; ztlCWn%ah?80|&8@@|5_C*iN9zOxZp+L z0!3gzkHC{ru}miwUEq-zr%zL?aB*q=CdekiCIy@p1MsBwJ#$rr+S{ zkFLR1L}$xOMjunMB|5N9bfQIEgEn!k#CK0z5L>qgvlXdfE2SCgv$Zdntw;b{yNIm; z4a8^b4!lKC-cQeJZgB|q^$6W7w!JJ*!5R9Qb~R-*_uTDh z0K{Wx5RcSJTZK-zf-~Hv7&W8qm{JWte(;4tzu?^qdBclL8EQV z>10G^@gcor={e2T^9r_%S4`QOG|I+wLGL%sqOIAKOGul>E@<;wrl6VUGqp2hmXH(U zdQLayg-2{w*DQOS3@KoQ3i$J9Dq6v?FA?L^c=q)0I58%dU^I%EAH%G!}_l&g-^gL|0V>?WwLMB5GzBEar)_b<8mJrz&&Px^-Hk+6tPE8m3`C zsh}a%HK}0zSTRQzXmkX(J(@;))}UDqJM1kjuUR>>oGHJVBZZ=72T9xo7h%9TE-M8O1-QAS^bQSFwM_%Z3O1&)T>-*V z(--udO?XW+hF-|iM@p9AHeqYI7fxy=Px*#Yg-17~vP(}2oThn+N}gT6be|rj+|y0~ zw$VFvfUD&y!Nxi^5&;oM0A1&?s)b*xceb{YAdPQ#1sm>?S+z@o#{xucLAfu8;!PqQQJ$F6lXA z#>i#*nf;IJEHIMh`x4lTo&-LJ{sex5-zJd3z61_R^ELo)%{yCLa&DG_W5RsZaVe7iD9yXlyqCad@Pvx1 z3H%A~tN0*+KjSY690B$I5Fe@dYXaBsv5M;o9tmsZrpC^vHH&4JdCVIq|GwN|Un=Px zM><$5i&nm)yTjDxWM1DT-hP?ISBNO4r>b9%S0Z}+5<%j8F-I~d0VTyrN!FWOr6BG~ zPG3s;q{+NKZ{+kI9&yrhx#P%lm#a{u4s*i;ns>^8&)Yqi6dJx8=1TNZ^33VMWUAcN z({ZKyE+*C7xe_zlLW;h%GS}H^-K(*jk!t3{3#jg-_GD_hG

LpNE%X?}OEg?u#Rt z+PAk?n4P51 z_esr%%Bt{m_OfC+7na#Cdn$0%*SZ1byg!|X(h&2ZL%ahH%qPMyy&7AOiHp)ZdM}jKJKQMsT*1J7f~;~5hO_^k-V`=T^%)*1Nwr~q z2}-F3{1P?%KQCLC)_ZTSYZ5#8U-VJ1Y$MA5o+)&3oaSHQHQ0kKQvNwsr0#R2mt$Z* zzb397V6VtyV3{304wl*Bi=pmLyA)({ZI>F%z6~)P#W6~GlCy2><=1!}$~E?UT(T7; z;D2m|skfi4P-fW6Y9zggH6L@ZCP2Ca16)bC1Q^5+XL5L$tsH(04T!McEr-*4ZlU2O z8q?iQA4%`Mg{GTO(_0#yLA1ubolrmnHqwL%ny`%q+=g!Kq7g;nL6@s1k^BjB#6hu} zdn3dsYlm>0@?~_GqekwZ@D0$znW$AYKv1hpK&wVyt1L!&LbQ5|Tt&j@)(_aiv4`{` zYX`r__+|JVPJe>N+lXCbAMtwiHsUgmN`D7y&#q4_qWK@BZgBXxn(s%FA(3(d;t(DA zIBj~^LAA-1>}x)X&tr_ZPLhL)NK)mG)2DFC1N$#B7GOCK>=eiHtAgFjvBXC<-ThCr zxE{Jn=>9Bn65dXPaY$q1bR!QpAL+nQxPNT&CEOAdWItI9# zbYc0LM1%!(UffFFGh97G2tn-pS$9{Xw||T2R%3z@L<&U;Ax!k&i7Nc zcraFt$y(^eosBaTJQ*-}%!e7{x`dj7sk(3+M~C2?s|)AZW#L4^aApYS{0eZ+;tQU3 z`yF_$b)0w$!7=N?c@AIn&iB&caWbvTy=< z!gbawg!Ae>;l%JfzU*nY(}_F!{tniiRTlA3IRCxDO!+)CkNlvMIDoj2r%AtF=!3!b zW&nSj;hp2YaL6ymVMCb1J0T8k8r3mFIg)Tjyl`!~j<)ok+t~OiHZ>sR73EztEAIu& z(Bj8z3xj8tXbkd_GCBn&mwl*K-(Q8-O0`ycvvL61*ye3+lp4@ pZEREC=d8rNHF(i4oEGQ1`L%Oz7kjLWvVe6k2gkVfL;MJ_{{g&SlDq%_ literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRateVariability$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRateVariability$1.class new file mode 100644 index 0000000000000000000000000000000000000000..e4f9a9460d142899913d85455201a231a9e60745 GIT binary patch literal 309 zcmbtQL23d)5Ufs&tD8Xf2_7WJ4B`jGV2FnxD0uH(o6X2L6J{n0el3SQAdd>R2hSeT zMR(EAT?O^~_x%H4iu(dZfgz#Xgs<4ht93$nn%mHYY=hsX!{kjk<~3*8aJS>L`({s_AQC1D<7Ya;JBHa?k8PRVv+>WiegDn6bN9+uuqd~y0MiBO&W pjAP%LRlS!c6K4OlsYW2&Xbk7NRY12M?v#7z>l|p8dPB;n1}CyRTa*9* literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRateVariability$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRateVariability$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..5e9343c51aa1193557e990503c51de90ded6b7ef GIT binary patch literal 6360 zcmb_hYit}>75?tN#=D)yj_um9V?q+UvAr(c+9{;*hS1oKlNLKkv&N7%JjT0Yd(!o; z*`0NqriDUz6=-Nn9|_@2phZHWMbwU{)D{8aE&lNkAc_DXAtXe}A08r{bLZ~P#5=20 ztR?I2%)RHFd(L;BBmd~X-+BSSPJA_nZkW8x@-i1i7v^K=fyK)S-n%`MXbJ{3a z#*CG<>{CQJF0k3}=#G-%P(=1vIm_NF5bW!prW;1{8M>iy!pfP4N((b)Vak}v(oXY4 zK5b+j;aO8{hU|H(D4>m$tZc?CkXE+!WTRo_UmyB$Q z{IAU$MMnh+lsg5Y=`6X+*_j}v*3r?8%33$N8Ho9@g;)9@X(lJf`6Z9Z%w{ zhI2YTh4TVUYa54-PvbK>K8w%k=wku>h_jT>(*WSo%HpWw3;3dr0VenoE(qLOZ^75` zWqgGSv3pS^-vxSDy4NH7C>)NKay;}@$k_g;bfhpPaIju=$}LY|Xzkrsk3xa%YniG; zh{l1sm89&|Qlkg=Pwwjx*i@A-DaxD$gKE!aC&j%8sxz(vyQ)vGZlkP^ky*>kW@xet zkMo1Tw!Z$mYN*j8Nk|z@ju3}usk-xU;yS!CzUWqQn�AEj(-Ntk%!bUWxRGP;G!G zk`O~K(5t$V*Y-J+rcx>+2b|wABBajov_RKdw|VcO)>M>$3UvAiRe%a~uNC5Roj^mz zG#5wni!_z*tz}=*$Fk}zfon2y@KbQnKsH8WtaMGvw8yi?9C;{2o*`6Pd2n$dFHbtL zSsr;@0rZ{Fu*5E)FNpuk0Tfnx#+)@u*|OB3T2?AAdeu^Hq?qpWC_6P@$e-lT4;g!H zYhiXAfNk`V)B}O*5ki0qA$`^bxSq*hDrxeUDi{53q7$m2M13Q@y@B2Y{WiqEfzT?# z&q~S!tuZiYecc~k%zU7StFq-Mk@$LYnZ-%ffopg7YX5)up8gT zt@sXA=I_GB_i!5D#~J(pU&jv#(;w6N6Z{1~#ozHWiEf*Nph6dTg*Emj%pao z9^fMnj8z`!tY$5HfR8+^wLI{1iq~JD6Td_fzrqN9jkn-8Si)~{AAX02@iLyp?{N`- zARqh@f5o5h5B%BVflCz+Tp|w)dp$6sJdkueAg~8-bUc6|@`sZ}PS`&~UJJ;$h{*lF z`D75)K)gxuAE&$x5>FRr3i+;ALcBTN>&XpQCdC8M{*xl^UueO<$=d&TEa<9O&_zMh zOE(DYBP5)BA5@xZ9KpezU%OIK5%wsmDM13G7*p)KNKH00D%pcmaaSu@FGM3W(c}>l ztq9rgix#J|D?_3sIz0Rh75?!WXob9JRf5r#DbW($*dTh)BCbcL*dgUR8Rv)A0e`eY zRcIwVin?eW^hYb?gVt_BYuF>iMe8=)t{@+x-*Rkm1#>NP&>HpdyJ)=`6N>*hxr{5h z6I@oosEgJif3(6rXr&3Q zj7Nxz)?r_?xM;hUIcP0-_+7M))IclZMXOwLJTdQ}b&}9pCbUiwTK8N9tvmeDid3QX zfJadmt)u>EMSReDh|oIY5#pjnUkgrbh|_Xj04_X_u4Ais&BTCH7S16Sr%Lt|T2w(= z!IpBfZkIHnoes^$G7Wc!3e6@-6IL|MWg2b+MB}vI4oMSHG;L)XuJ;w1&Vgqpp2yZ> zG*@hUQD(t8`i^@oMKt%^?PvhRV`vbM;|B2rj)*5=i?cW@h)VGH-g#;NR-$jfqtpqw zo}Wh)(|D_tc0pAa?y`AAFQcPUTNM1uVo literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRateVariability.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRateVariability.class new file mode 100644 index 0000000000000000000000000000000000000000..cf0f9cabf316e549133be19d37fa7a93a89785e6 GIT binary patch literal 6207 zcmb_g`*#!95&qV;ypoV@Ld?q$vp9yx##k|dkYJj|Pmp6mVjB}TrRiE)<0bM+S*;9| z()5)!v}v03kv4s$Nt@85O-djjip9P9BNX}&AXD{|s{aeN=IuEQn#K&C&G>1*roBfPHSjX2uiMDY{pf2!hVakS&- zD&C4ill~VfeyQSZ6~9uDNL!X+59Rb?(I_fV2TNuyYuF0b7Y*CgbJK=hH1pPp^soYD zOhMC7-YPn}1tbjQdl*g8?NWNX?inzK1$z_Rj=?ocivZ5ltLFY2kBZk|t@DO%I}>C$trPjInKPa9lr^egTdl2UOS(s)o}5TejZ6@^wgkDE zPYvr%Y2l=8I)+W5>cq&v@Cw8ehE5fdxcRiR9pX{1euwgu(p<&!h<_w>v!I?LytU;H(t!H&RV--^cnw8o~ z&6@eeyy!DESRPFm7y6FY&=_H-lVO$TO9at>*Ok#+UU$MI-hu}TQ z>Z+`!dX5!rOs2a+gvV#k7#WA~8s|(Sm!-LsH2rbX(K9a|(+j>H>I)?v-IPo(Jt=S+ z7sYLPcEi$r8kcgXTn}xfp=tnEi)Dh1HFP8bBCY^h(Pvfh&ldk|Wo0vIYMDU6{db5j zt7tPh)TVC@qp2vreHj6P>$fk%F(8Or#@QewjQifZ8u#k-xzUbqC0FgN0XOeitr4(D z-kFyWIJS296uiFr+xD;NEt}3tOdC1JxMt}&#$exv81lTQcD&^9G4+dA*XP|=<)@a~Y%H#%mS7W@NS*0V|xhRC7*SWyW=;#fM(S*V|SQJ)Ft;kuN@(FWDJm)RcI* zd&MBuD{ohUr}A(nDi(~4IcH{41I$ZD45mIwK>Z2qMQ;L6VjzLv;I|2+@NfeArTHD+ zN#Fn;P2iw3zsI}Myr-bEI?D-5KaU0aU|bv2vzlpTjdQ~P4@|7pafQL6vgAHq1xJPX zTDY?a{i8JROY=bjkKu6@mlOCCK2-5h0)NI|5;z2^;A4EE;;#u@!KW&&DtMs!f?jy; zd`7of8!(pogSuBPbU5b=M#rHJCiJ|W?da*S^aYu(Xeghw$YMe0DY3VF>s~*3^#;j{ z#Myj?WNr}D#B|zXCD&_N-O)9s#!M+ER@G+DYr$D9Yb=@>qnA9~^ik|M^!$Y~OerL| z;a?)_rl~-fcTf`=7Cs9F8dEzlHKZkrUA-L_d+uOTj_oTkqn@N{u~+6gUn50VxX(%A z4UjIQ7B?gHYE$!urWXo1lbTsD9NWxjW>I6L)9ifS;gW7?#g|ID&HenGRxD*QhFd*o zS#xgAunmiIEje*)a&ov!C|qb-p_F6g*dynQB{@s=ESR~RS)?ym+2S2Ks&yMb*ZiNC zB2cN`wB*Bk`@{~XE+%jdpDF06_S)ddPx@~^RM5$rxPH%Pyt+=oldFB43ihmslCH$3 zG^iID@E*EHYSw?Nh1S`}>cb634D;#Zp+L6Idlzoq@0Oy&4E(MGR+d<6tFF5ppOgA+ zxMmU6nj8(Ud*zCdhbpc~`lof;%{@m}pEx`FTuyJU0jF~Lvij1%!*pr&nEKZW%dQpO zj8BJYHO{hf#LDp33bVkW>f~N78(dW3+)IZVG%eje@1JD}*j_D>G@<9oa@s9Y6!e9i z!~Z2vOF)^m6fFXCn6Jo%`FJ%d9F z%0G%C1=k^Gtsnva5@Afn09&Cs>zH z&G$j0OC()~I6y-_N}V2bQEl=h2R9$XQy3?%W8|PBqN)6F`ZSLFVE;wN0xaW$J;||r z%3$|$EdG)1?)fL0JqukX^k5dbj4qkAc-Fd%ZIxN{GMXxv5c_$zXeSm>R~qlsOYDc~ zPGiLX9C6RmI|jL{d9Z?;Wc-^DDxSf!yrT`?xFCi-JS}Uakq}E6c(O#R<or4Mxfrp!?+e z-M|6Fg}j^e8-zaWY;T9~$LZb~?hA+Pavbij=I~w>2QQ2on4=sCIHSJ1HeW?+_nuqW z_&GM!qsl7E`)E==2&tht@Y!ZM&pgqXtGCyaqY)=6S4mR Di)ucP literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1LedCurrent$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1LedCurrent$1.class new file mode 100644 index 0000000000000000000000000000000000000000..09e7f7d4be7b4f81a4c20484c2924b2aff853f11 GIT binary patch literal 279 zcmbV{!D<3Q42J(y?buatAD{;hJ$H~o=~=N*uy`nVA7{flGMy^;ZIdQ#+NNJ=6G*Zt-6l~AO$p6MQ>rP2CR9tS^0NDqY}oFG z&2A`^ieDfoLcuR8ekP}D3;;lCLZGcVV?N}H=pF@5#HopZiuuI z4{}4Rjl9~3M_ACOOgtK;k0O6OX5zSs$D?S*6a4*Y6Q42hSreZV2o%zXZ2>VL5aZ!K zJ87q9?36%No?9^}5FF3jc2>Yh=LJH!v9W2pK!fe+Y`V}xgspA+Nl5*a7|P|x z6L~9T<&)Xz#1u`FR*BJcZYEbq=dy{u(rEwm;f^6Y)nCl#?QEf03G5c=Z@p3(e5_!u zFv0pQ9xhnPJNH;q@&E*&KzF4ZbhF^=D%7rQzUDe6V|jNm&|^vKsDOh$QV}AFjI$qQOkgDiA^;5-XScTL=FSdWT3SDK0EkafYP9F6Zuq zX}8jlDAh13Y1K!NsCSdA1&LJlM8~};iFgztioNRkMTn|ACd$%yk)$qt1xNXU32dv_ zG>lZi=NYb9->qt&{T;Ot7+&emHCkwRld4U@$y(-Ne^0F95w$K?W zb*>IN!?B7rC`FXYcjxPF9O)1!R;onzm2DmwPLF4;LNQPF`-K!`Oj$n(1{zl>E@;@h9_}?M_=IPsTjV9FUJr^dkkN}S7Z1Zz8=Fj@J$oX#PBS>W#Zd0 zdaO*{AWHVdruc>gfngTod@h}F*J)X`FFe1ErkR~J5+j9sCzw4F&& zO%ojCfxw2=wuAGi(JV%;<%{7+352sZLs6c~{Pz9(!(_A4w+X;kI zwmsFKo4SV_bH4L+`<%=>C9o(ZOCtpr6)yu+)Jf9}+l9f5HBJ@^kYxy!Wn2)rke3RE z=onWHt^lfx!!v9Gt5BH%$gN^2d(0|kN>V%LJEgLsu9h+*`E;wM?8rnucQ+T>()a4; z!t59T8|W3#3V}9+U~tf*w~WEDOZF7LWKU5__7tdOPqB*nMxvznN!;(CuWRW`P#=yz zkHA?3PfN;oQX8ce;LkAe7oq}U4jr~)o1~#Y?8q<-1esP$#M{pz6rY7z)!F_6!sie< zhv*5k$7ybnGe3)%TAIb;A7jZZs?X5ov#6;Gj4(-nS(kcQ1Dy^lFKMhxnKj_B2AQ?? z9O~xm8dR*jBw3fuV)+@=GHcLb4KZuImo=nVc}ZifXV#FzYBK8zFRQ6oc}Zhk!K|jk z8fMm&Ue>T;t!u@1TSf<9*e|o{Lu<{(7H=g)J5xNf3yNV zXdNZA?$d<0Xzj%<3i3|soebs#fA?e#S`TRaE?T!z>~u2VAu<_dFXdao&L(-q*2kN) z4B^Uj(0Yu}I!7ex@q4g4>b)L|Ac>%QEyK8* z2d!TcTEEhSxM&^lMT_&edol;D-)Q_UTDQ-GmZ_svj{2@l2dxW))*lG1KN4DhS^%ws z{%DyVwEm_k>Y{bXA1%`dtv3j*H#H$HTJQ5ki%S>xWD+f-O5=CYdjC9Vg>|$_iB5~B z5-npfmKaM=XH=uXs96B55BQ@Mo{N^TN>kKD>kfak!d|qDCYVOECd5UHUg=KU5wBC0 z;<$71JQ@$2#fG7FC*_<#G)`IaS=6ayH;av>LV1;>33NF$OG`9d36*IYBu!A!)Rt(t zymT0(IDbuWLKQ(k7%?Idh zaMh1wr2ai#L6fRrtcU*w}jO3)QAX)zEIkyGB*8C^voUH~_Nu?F@_0+Tf1mkB>&WmE^iA&}`bXT;_!1)j1sv`M?f?J) literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1LedCurrent.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1LedCurrent.class new file mode 100644 index 0000000000000000000000000000000000000000..7962bc594cbb53a77afeb9647480627c2f155907 GIT binary patch literal 6426 zcmb_hYkL%D8NO$e%^uh!kU}IOtxFo(&5~wIsSPB612JyD^KMmk# zVMOus0DcihyY#;d;8y|sI)L9Oh>RMBW)7y+Tu#d=2n-bTbV@T7tj}qtuBN9nGpA>a zqoYF#ltT*Y2Qx-4uNwI&HC@pB|4d)q`R|KY&hh5t;KAX;{T&K6k7dl+gql^8C$)q+ zZ)Osc9L=eH3TpHEoJK+<79P^Frj}ImT1r97M8S})DLto8r?q~=$mG>L`4Up|*eP{h zO{7(0Hc`GqViCD9p(QnaUTD;q(kdeg{IjN}847$l-%*#DnaOE+0z5V`dSrN_LqT*I zKs}QfQuBqmW2T++p z_FQ3ZS~HKRd^3^m(G5Mnk1vUJPAO;_%Ooj(m0IAobEY#PMrJ6}2m&j6k z6hdNJ&&+2;Y>9#5Xeu|iV@yj87EDt!@&tQ2=9XusK-zuxT^UJd)V%x1Y8UKBxRhrz zQ?S9s&nBiIL>U&vSHrP_O|j8V*TM1WQ(96UP&cD%=@iwdjM5w@^J?<+VKwW>rzTtA z)#ljf@|yyuZeFaGcbk^)Q|aV;#4^y0RA2?*0UDBhU{eJt3Io5zfZBCPmCdu!xm#YT zWzlO6chpe^Ouz)twx2SuLs0=*dJsQ^f&| z*+_CiUjzv}8Nm>SBe;Tv2zKD92%eGVxA67MN{9c+rDCqE}AR+D~ znUXx{9Rq4Asv9ZotZ;gdSBr!J{iFxZUt~Vf;(6W;Li#k_CCuFnH|roCetgw2G-M_Tv`^9o#t?Ae1Usx;u zz6ayGZADX|(KCsKSyT-hN!IaS68 zDg+elaI4y>g)1>Al9s|iU=Gm}ESS5!Fr7SKiHMETxq3g8MOUtsnnJbKJ!r@jg6( z7O6lurtt9;S9Wp?Jk76;YoB1x7*=(M^+}aGELy7Uu#%~=!}6x$POB6TMA9nt0{hJf zVL$qbY=E;i_VQPI4a!ya3I^E5dJE%c`{Vus2-+mJ{H&7ezvU-2~iJPdqfk3>a)*1xkEq-edinr8RgK(K& zJA$OsjamYVQ1}}u`ZkJq8-?FZ(f3g7g5{vi&%r{@Ja@>#w~Hz{MD()OgJ+3MM!Pwx zwMM-h`K?hOM(_*=`HWF1&&!Q1IRuKP3vz z?~^oyT{MOLG=ziX@;pb!`7)7KvyH4It!a#NU%{ui7eXKwu>QC(fl22%{~`+!-DT%F z7dV!`;&a6M#g>G`OZ?{IT_0h+t@#B^mS_G249jeTZ3PSHDbIon=q%4d3)oVgg%?m? zezI7I{pQDrSo9yG^@*m3sKp8D@N+l}gW9;rx4lkS^6sepgwne&JMZSRa0Evw6@ec{ zFjjBYR=ZExV%_Hu&61H-4=1&Wf8%WMI6To=YBuAi$#Qr9wCpg352Z;mBv2p zQc$P_G=xuE=B(g_if}B0DN(ciS+5A^GgaaEy>Lvz$*lnAMSQj-9ott#I+opf;GC}r z=OyaNmTo^qP?CI1 za>zT>4>;5tuc1Y#x8BB<8XWVIA4Y?3#6`ZbM7|LP%-=&kh%=?+e#nt`drj>uJ;BOg5nHdLc?s?IIQM!7}Km&z03%1h+Zq+)x> iR8kP8|5(I*5NiB-6?IPV)IgK5ffo0WD`E~YA`U;-+*fn} literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1OxygenSaturation$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1OxygenSaturation$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..afcada28b600feae3fee06d55d556d5f993fca60 GIT binary patch literal 6120 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 literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1PpgRaw$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1PpgRaw$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..4ea63ccaa5bc71cf45ad4bb9ba138243642b7608 GIT binary patch literal 7033 zcmbtZYjjjs75>i6%-qTJLP7!o!Yh!pNhXvbNi9NXXhH}@L!n8EQc!y{xk)BWGU+@5 zEv@y{`l>ChuVQ^`TOU=RmOx9F`a^%HKlGPt=`StnQWtA!?W(TUWpVFw&&)k!?yQs{ zE9;zd&)IvQeZIZV-uooKeCwqj1L(wy5i}#iO_rNnB^odrK?{y@bByQit)%9@2o~cw zf8Ni{0}*@>4@U4IeAvWCci1rN?7w zo3@HiXJRunO*+L!5~C5rtB;s6C$y4c}GkCHR>E9eWa+cRKp$8?z`RF5vHB;L!wl} zh@@2?L89J6ZWSa_*%KZ2rX-RhqUe(sj7_RWMCFcL6S(8x2wxt7o69l0XW#wUh3-vUbi# zi1K#jD{LHV7nmw%^RDtYtsF{>PutmCn(Xv5DaM|$;}cHIo=vA>nHeXZ7)!)sLux=* zgUqVV+G}T=a-wNhx2v$e)2N-bV^>HoQ?fv0D3wdco&E%;h!sB3d=m#b3mw?OO&2$v z7M{dO9({?Mr!0IKU$qcLn}x68>lVI&Z(8^kzHQIEy)oRo*6r+a}P& z@^r*|$iRcSY0k?9GCun`3pPdswq3mf`9QC<*LPdklLR)*SFzYBDAARn7TqgzXyJGnA5M!BP=R_Mp#`uT=L_-KP9Qw$I5Rs_GxrK~mpWgU z&&i6X1g;yEC5?iM3XeW2!lY@2oNRy69w!S0$TEb=Qcma|aJsvugmXr&_%Q0<8$a z;6O(&4uj*B>?vf)o+6X%DLBcV;uG}^L`gA|xNoAbo9RnXAC5kcz&QlZNXmCm8=)28 zuQ2g9q5>?J4qLEI(opbqWf%s6Oe-d$ZRZe*&cUqcXnO(S^Qb(J$Vs$CY3@3Aeh!ve zn!}=>V(}cR&eG;{sICYMGf9A1mlU%GI$Ty>(pZ-;YrtgtOB(BPW;I>bFte^GW(_M=UeZ`s zFl#t4%r>e3+h~xUfWSWq|5vdB|H4+hhFkGEhVXA>@gE$=8+a6N;uQXiIs6a5z+3n` zF5^`pL_iqgdQl-ZilEpbLgH>=ig8gXZC&TuQ`wp*|r3hW7O$-y=^b2g` zAEKv>to$LM{9#i06shfc#L8l`R;Z)$l00e&kEkzZ&3gndX{<#av8ov0yhreo25^x_ ztS)BFdjv0OtVJHNrkFMF5xk_a7J0;y;W4c|5S1BMJFZ zvo!g-XtNeOJef5_4bg?gVmoTZErdh2cLuD^pMggG6fxGF`M@B(z>4v@Q@@FE4=Bd;HM~6`}QWO;Hc6_xht1@ zebM4P?w!m<>vtNzht^#s&@y$j3Q^ya>7sR!(E1ah^=CrsFAJb`$R91U2(5o;ih5`r z_D9R~LF)}d>rG9Fht~Ui(c;p@JDEhwsL=R5wBBC=t+0+(KGA9MRH9`p!eV1FYKEGR%(iRXx;6PR=5}~qYnvkNY z%hPaeQ=nNbX-q}4JWs<#Oo3*NqzNmU6?q!2Rthw0+fEN$K+{2b8(jYr8L9t>SJ0>` z*eJa-U_=o%+OW~si2cTm$QqmQq!Gi*#%BD%XvZr?2QC_&63+(W3*+~Q%j)AIDlrO2 zO1-2qA=juUvFI{Z7Ag{9qUSQI3g1+__EZeL-ATib@+u}Tlc7n2Zf?e^d*}}|eDx0?S1-LqALDyf8G-by|DPcV8872dN=UNyxm%Xlir-6tE7ViHF{ z)gg&VDlvT|giEUsKi&*~ISe{c6y$_R4nGHYZi*z*%_E7^eiFsom&oO0K_cy#qAvq8 gxJUMBdfWi@G~bK{yps$+LErQqqJNh?jjy2c|7N@400000 literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1PpgRaw.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1PpgRaw.class new file mode 100644 index 0000000000000000000000000000000000000000..61a87809fa3df6c4a1279bae7b5e82494f69a848 GIT binary patch literal 6522 zcmbtZ`*##~75_|<%|6&9Kmkdhbx1?ISwfZo7Dy;IZ$hEO1OixVo$LxXwm$3IHd?LnCjMT2R!}({_L+FKX+z!ci3zQq&a84@9({z`}p2_ z7ykagJ9h!>zz0#Z;6eoR>qrr%qE@8bty{3wQvxER5k z(*GokpT?l#XJPz2hGyx15ymgW_*EFcRuCUDP2KLzYWcjLR}k)*HnJJrR5{vceIa^O_j-FA_I5KU@)|inu#oJf`KkXT%9jOc0Im=PM)wzSHCg3yGm>!yM#gL2elH2XB+9UB=s(m&Fo zKwSXOuu^@RGd*?8HXPk1jED8aJ#NOO%%CDU8PQQys&(i4pA#fu2qTHEB(gZr6QR2C|ms1dlxEf+s-0Y#uWO zs{;HyVhWt)N9=5ONvNvOcMjV>bAAODnZJ zGa}yl$UWQ&8mZ+4cY95cm$xgdBD_B6xp;&}{b7i!Lv;8Mm!ub&`aIv~iZ_ax`kCSj z-{<@3!#Prmf1ma^pIC+?7VmqHWZBF^mNO}FYVU`^puk>^3|$`*d)*m{H2r58ZA>l8 z@aNl^fyi_A!_yAkxl4>)ZMlB!Ic50)hSC1BX+7tL$}rwyP_!ABN|e`^Qywx4gsTjO z$hBp3y=}VK-gMTFN3l_B+D_{OhD53L6+%n9ycY$YB77)Mal=uECoRXy7))1ccVDlX z=%%Y$6RKmWea3|0XjwIFnKNE_(5hxMM^jH)w#qErrn(8ZO&uChH8aCK`?Q*~Y}ZTG z#PIN-YLkszX>BKGH>~HIJDXK)3T?utZ|;( z+tjTcPwm*f<6g9`%I-(mJ+M65hJ8Q6w9>K=i&^hS*ERb?P=4W39Dl}L1#RW;p%_R; z{fH7M*W|Um|G;;=s!hT6hkxh_wk(N@?#5@?qvaVYpM1d6tmhscOiKrg2RD2%B@7)7 z1ilsCYjMkSx0vi>l5qXBw8R=Y?3OEsPfE4bSFz+-lNboDd*z2557bAaj%}C|Zl2n+ zoJ88v;ohBI*4;uOvYZ0I<2$t+zFo`bw|PmIpkp(Y##p-bn`wq#M*q(86kaF}TpYoC zOIPSIOwB&$-(`vRSUE?Y2|ONFi*6~Rpd)Bjzv8aMpg>wm6M@-Bk9T3x{sn*ZuKSfn zB_bY5|LXlv7M^R3R5c2E9uQ=Ka?pQ^zarL^tEBMbBb1YT%TN;JQtxFo1x$d#L$E!ws73WeVO;WkAUymrBK{t{0aJG@X{MB58a)rHuUbccB{Pzrn zk-49(oJ_Ho)lhN{RaZHv3LJeL16+xF2QY~JoXO=OwsQFnsu5b+vOQN+_r+sDoVr z9n=(ca0t)whUnlgQTD8h-b`^SY5jQZmImn=kemwj?v7t1J&7!U(vUrFm^AkiY_D|6J#L|7V;s|Z{861L1 zYh0vkuM(EXt$HF9<-Y98O|ftUN2wKoA44Qj=l(@0{1`3gSyUdjctfOMDUO34aXjD= zk)lT&#|i&_H@S;PL<=uMgzyN&+zpM+J{~Yov|ZIByZo+e^UFE5dPu zNg14XE5bRsD4amV_FVZU;mq9^P81WE^liV%eV2S0^H_aCnZqOHx#=z+`2-CA_)dmy zd5AGNp5*y8az6MJ{}#X>!zrBRzEH?6MqzC^g@2Y&@KW3qLrRq!-Us~0Tz?Jgl3Q-! zBe$`>8f8|gdKz_A`vPjHFTUt{SjZ90XNgRtvH9iU_|yk|>J8V>DAb#7V?#BLm6PvB zebqpKd_$3Z1Ew)^5BUhr6qEY_U*E}jY&=g_3?%f77RPDjWDv4=lUFDxE7DDGaPw;Evo@6?#jPO4}TF^=pY{U=oV?_TC D37;66 literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1RespirationRate$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1RespirationRate$1.class new file mode 100644 index 0000000000000000000000000000000000000000..f24bebd47bf40e6677beb1e6fc3ef95ce746135d GIT binary patch literal 294 zcmbtP%ZkE45Ulocwul zi-N8y`gXru0eoQ?A&T%pNcQgRb6%T@36q6!jjN5bzu|wLaX1;TTbk*bXQgg5VZ5?= z<$|%rmg_%vjF1q1oG+BuN9}VP)Jcb68dis=n|kFtofAeIYuPU=5pp1;ZIr6CE!6H% ja$Xa@-$+P5LFmZeZFQv~tcSi}4+Gh;Od>ZVh%|lxQ%qIa literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1RespirationRate$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1RespirationRate$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..f4b1b6436cbba67296eb739d2958ceab33e7a18f GIT binary patch literal 6210 zcmb_hYit}>75?tN#=D)yj_ta!V<3s$+FqA#?G(~v)3mW2#|7t6+ZfV@$9Q*aZ@S(! z`*575r7Z=@tD%%W62hB6i-bgrs2x$MEds<_{3{?pfB+#OBt*#{9wMA`=kCt+&X`ne zr0CAfz2}^J&Uc>c{O~{Dd;!3Ad?ki1*u2d0G8aWB=40qahL>Z!cUP2_Yz!N)z@Ir@ z@-Zyp-7yqUG*IHRGH)+2>2Y3`V`#+*19$WDB=6kAqO-gZK_`}ZxrdqVHSnGoea!L4 zeFp9~@IVY(@Lv9Y(7^i)yx+hF1VW|Ef-N9M1WbONuv2zs$xaJ27VP3;reKva`P_t6 zVxm!jwwm4B%T_j1Iw26*oylcNdjx{LebXd&IG-k##_>$fK3HCuu?thyOqO<<$MY#G zJ8cy*{H-=arTI)zz!)lLvT3_Oy4;q_*@fY(RV>)SR_d+;)}l0pkQKPKu3M5U z{pNb~Op@~n%sIO>C7s*a+c$p9TCx&ZD>s)I$(IRu0>da)2*!Fx`s%q*LpZ!-Wy|Dd zW8Nw{w^KaaArMVvZL8qy>?eILk3Sogjat+yqqH5RiMzA0s*AhVOpWEkgG#r|d;eYYOE11=fb|p_yZLszfIb2@KVhXx#%c)dI^mkTrD$ zmpaMIphk2uGncbU#pkJA`N>*acHT7O05Sz@G3n_av!>w)W|LQ{5 za|JeW9d`2a23}ro;)D1QzkQgOkC^xnF-N9yF?CZ2D6sCNU*2T!$u=CL}Oed+nuzO<-FslQ&$bE!U$T zWu-AWJhtz^-fn?So{X5J+*q)vl5BQTSI14Aadz+Uo?hBKS?D6O89SS%X(~L*FBGr6 zeRr;-Mz{L&M(rO zyJtQ7l0KGsw*;<8%K=QmMbps;4Uy6{lXht|Yt4~|LgX1jrIm*Y7xKyg5}V~o#1%ke zdBYOBKu+oZhXW|A%(Ojgm9rJ8gX>wTyr`?C+(gLQabgJ$_J0En=Mg=R*ctT4Y3~YWe+8yG zTEUesVZ#aNzwsYuI6pFl(EaHKJJgNMmhd)<|fI(F%gm+C{%Jffopg7YX5)uoK_Ht@t+8NhV@N*>b3k>0xcnf}oCHxxq;x~8%zs0lo9nRzTuh3xZ1i__Va zA<+`;8h=BTe{>zRLONR2V02|lv_uy+h;FoqYtSLCmGYg8^FwRDKUyIVS_w^27p*aW zv_d{;?Ig5zX+m7IZo``taD*D?pKVU6EK>&+Nf{71=UT*;l-3J-S4MA{th z(kh@U(?RP1p>>eZIz(t4UKg#n)a-yiT44`bM>IuUv<~{C74|_ZMQEipAud{ne9_{f z?ONubwV?64XdPY$t%#0RrQ~Qa@1S*@&{`(6P7qpmUjnV${n3he(0Wi))J1E;AFYTF zS`QOir!*lhTJ#&ii4Ad5&I`b~=h1m&6|WiZcgn&U#Nt%Ro<8G-`+_Q15)C<{3ME3FOl6;l}I;Q^cBDiQu3Lm{~G``y&w&} Voz!}xxP!jY)Ifjte;f}Z`d_dd!^!{v literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1RespirationRate.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1RespirationRate.class new file mode 100644 index 0000000000000000000000000000000000000000..de12569a26647ea547acbe2940a76d44f8bf0867 GIT binary patch literal 5949 zcmb_g{dW}Q6@G?fGrP+s!5EMPge3;tEFo+7kV?=tpSWodO(2Mt+R5$&1~;?o>}-Hi zi*0SymbUi0*0xq#rPyi_D_MS#Ley!py6~9rC$eN~Z4HvX>SuZP4hbl%PuUiV%m37O|3e&n(Hj3u4?1%zo zTtV}2(Jb4VX-{i~iXPeX`P-;Gcg5t%so^I_4-a-L*f>$NPGz)`mOHIyw0WzTnc`?p z8&J?_8*@4tky(61FIjp{v-P}!j>(ECThm6_m?`LkrdhN#n{o+h!^9bFUdt3T^HipG zhRhOjVp7lP#=P)owe)hyu$*I)WJ@t)JRMqnrlJ)L`#kX;pUfT|oh07mBD_X1Gosm* zx#N~$>lQ_+lcR$pD-ciW8Wl(4mQ%XzDAc{Sg3eUWA`vx}3>Wjn+B#vF`csv;8QnUn zQ3VQ`4jQImKcS!@)ibT2ZK9Z?IW!uD+a67$ecGUk9(UMVT3)kqW;s)$F{zWxj8U8~ ziWW0N)zNf$u77f&o`^V`3hKC6p@4y9SH=oO%?^^d3og!pxm;EX?h9~pNfpGXrmBV- zI99MemF)=-9+^3#=WN1jnl$`c!Vm|&}+|ym+=p|dV)JPXh>tcDoj2k-c$k2pc=TLO zFFD~>#oG+57DHK$^TsgetXXBe#$e=MAL8q7D~KM<6}%7@pDI?YoIYkqVB5A_H0qN_ zsKC{6Fo%>&dd`?Na+yJ9ltVg`mZXk>1a_e>fiGb&f#2eH31sj{0(+(TJ>E%RA0AC$ zzchcqyVAU;pgWwOgr%2(d{r<&4QctLVdnL7!vBv z=6z{CNZ<>2OvU8{{){UsK1|>*_-g_Oz}tU>k5&9FfvfmL#We*FhVSNv*zTt_iwT|a z&>JZKxzJ^wFX>$ex|oHFR=%sZ%hcv%zMOeHsxp(ikWyG*^{#zh+UfJt4vF){9LWNK zEGcG7<~3VOGM(ir1+ijs=6upWmCWn&Mo#bJX(#TNyAC{mp^8mXJ~uq%c_+X4V%&pC zp<#(KSEBKf$BqssQ{|q%u9tfkFsTORm6%aEQeRjrbF~(x)f(ejNtQmyMY?eEM=~{2 znp=o6#LtV`cg^-Cx6nzZ9@*6|j8DFtz;%48pf~Ix{>z&3o>-vv5&ye!*Js=kNWs7= z-hhIgD*~kP=&?gunbG9oyQF57vLDt)D&m6HEQNqwKJR^2IbUFo@SQj?9}C0uQg}TkE=up{aww~>y-~^q1$4+-GF%2^ zm2=S9{ZfBJSS8h82$7N`Fh-)FlbPfO4)uzRTgtyl-jcxql{18|VAj%)gDfDoh z=I{13*oh9QD>zo9px{bB$G~oWOM+^t? zIHf$n*=F|g*LV%eRrU(L$X1Ym{}50ZqzBmwWrn@1M$)&i<`WLq1W31Hh${(~0K*vJ zOb(B-mBW|NfC&2?ayY&7CK_&_G2QF*k@T*cXu1J4-O=a_qBZWFgaRtCkt$43h3!<} zX7pk^l_(PTx?DYpdAxr&7GO&_v_qYvpt)>eKG^ULttpZ*k$w-LL_KH~N2ZNz0BmHrOao@h(l zLi0aJ-Qe(XZ@wEzxIqOb(kDfM3O51IDHC7Jh1;F zV*!@)z#ivV{;FViaV-9kP51s2Ev|(w6S_Z(Tt<(~T3u^h#-`dVdKt~NONjm4TWlc~ zP*+LbsgKwX(w)YM|5@Ump?3^%H|fIiZ<6zFLa2Be&+wjdrzo0|&HRh;I+K|4F14Gx zV!dcp!yE@KI1#X5)VJVK9P`c(QnpwyR`to6>&2aoV-!3cP_DUy8&1VGi$wIJjX{$1LSYz!~%0 zwdESx(>rft{b$(FfRI&`_tC6;5Ku#l@3Sp*p3_8Qke7tPGyGme!Q(DLQq0|Y4G#$S zjh~^T0msAaKSGQ0ae#fR&%PCNFc+|oqUa}(aZlgrJLo)d3!Bjnb literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Temperature$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Temperature$1.class new file mode 100644 index 0000000000000000000000000000000000000000..7cbb25319bcdc09ce2d9acae8c1ba680c9884cc4 GIT binary patch literal 282 zcmbV{JqiLr4256(TU`bB0)mCLgII{IqF^Bwiv75Tb!459nRO3m;Q>697z;}q6Ou|8XD4@QnBoiD3azIUocT4 literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Temperature$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Temperature$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..c81eae3755f15bed3ec8a99ef3c9267e8d49677b GIT binary patch literal 6739 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 literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Temperature.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Temperature.class new file mode 100644 index 0000000000000000000000000000000000000000..7435d879238e01e178ca1306751fcb0199626a0a GIT binary patch literal 6279 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 literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Acceleration$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Acceleration$1.class new file mode 100644 index 0000000000000000000000000000000000000000..c95e8d59463383dcb2fbba2dd477b1b40a95b224 GIT binary patch literal 274 zcmbV{JqiLr4256(TU`aWx3REx5XD|(1q-q81mhUim2pO9Ru5<40X&o#!P3fvH|FFuW=)69)PDqN~#Ae6}!#EeCPljZgZf3H{s|>tpGP4Od5h zNRSfdJ`^hGgAT?;b}uy aP?H}&QI~|c2AZM`w4}GCQkfx9WbHR6eoPzy literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Acceleration$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Acceleration$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..da0d526abfa703be4cbd2715c57db511f210e846 GIT binary patch literal 6460 zcmbtZdvH`&8ULNl?%rg%g%Bu@@UVpxLINxaSPDUGAPKF8f+WTA@NwC_NtSMQ!|o;p zYHd|&TOasVXnk9)k6OU7A=6fHe9WNEsQ=kIKHAz=?erg~>Zqf|-*@lby@%YJp|fOW z&$;)U@B7Yoe!uU0=ev`izxKpA0Bdn3f$NZ!W>}hB9Tp>>z%q_WOh-vx zN2M7{;0_#4;0TTyxKrldBg1!z=zFEPJAv7_$H4off4_`;K$>G>zbFl*7UOPdII$SV zMEza^A58EiColIIxZl772`s^f=R*_kmr&7s5m z_3(FuzoQEAO_^M#v{|91dBtujZq28uIHNa{vu_z4K42I6tpiz(H1y_ER(7{l$jG}l z7%dHDiVDV-(M&dN7r5BXxtv|tnzf2Wn-iOR^M%1=!Ae_&RIZpD;V`{O+QTDODU-62 z-QGj@y3SO}&e{bI=W|V-xekTS<}0%xTZ-jNL*m<2eI+Y(`*v%@ah_l)Y^ctBhnT&- zD$hE|AORb+OZ^T*vzu4+9<;`+WY)?JCcE;Z1eg0Zie-V$=B^c0t)!tC8?&;bcjQJoa)o5g@OI?~+YE0T+KA_ZKQgo8gg+LgrP~x{T>?%|HgA=P zO_WAC+1cE4#U4lL4Nb)z7x*CS?r~R;jn6T|M@+PcfmW;(E8pb(d2@1B*9T`Wzb_|4#RoEWHqFW+)*}xJ z*EX-%H-#HbjtHGGoa=AL0CTEbrarNi>(H(^-bh43<9RJ0=uZrRoS^Sea>iz#7e#t+r3KOOHj}EssXVbhGAc|4<=+hm^Zc?9G`Bvr7Q3 zW$nETBpxwDB-8P`AtDLO>6x>fo~g;{nVr}#qy&>Cwc7Z0J>L}j+LrGjdKR%Wj$}LA z1ZRL>!N9NiEdrRX9M)mIBg3rg+E7n8t3$17X+4X0%Q%dh_SWyCb^>)1NSs7#3&*Cp zD9=m0kI&xwUi9*<9XJSM$Zpr+!N<%ebx>|r)Y9SicB7Y0aH*Us|%(Io5iJutgLbtb4o9C$^ z$D(HKqmvw6ra5YOh7?cCHcx#$-IVlI=cw28xALFU&E`!!v!qJKb(Audv>ZA46aI~T!Xze9h z`!pjyTD{orLEg^Zy)oQm>+j4(E3N7KXx)Mxp8kGP#w6v%R;+!gbE+1#EY&iyZ_`C9 zN3`-pYlLVWni8#*j%Pc=(TWAoI;uJ9qxH6Mv|=G>9V1%zYDRptc7>uPmx#YJ7p>!( zzK>Sl6lleDv?{5~x9OsFf@qy2S`QMfhc1Iwe>ht409p@gj{0cb8je;x1g*!2)+x=1 zkJj!`wB+9Ocjlrsq3Qc*y?qL_3>~dZ7$M94#XRt*43BGnx?}Eq>d%CrM2(@5)KK@FW)RIg2;+wz^65BoZym`;TCjm%hhw zO}W&X=g36Yx-v7%GIA$ZWac|EF;AwUEF+gMW!&Pa(UFOJGIPo@a?4g^7C177Co{J! zBiCs~W?}2;-Y2nS4=cx|=bgOr1Ds=B>y}2#P{*6)kEm78Vx@WxJJs_jsXyU_dI3+V z7jaI#g!Agp4o=rlrRMm?x>bj5m^Fi|?qf<$pZBfX|@r|AsS- A8UO$Q literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Acceleration.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Acceleration.class new file mode 100644 index 0000000000000000000000000000000000000000..c263cec3b37b6458f0d72af63b13e297638879b6 GIT binary patch literal 6061 zcmbtYX?GLn6@JE+Jd%)YAmD;ch%lzHg|Wg?HdEqF1``O>1`|Wlc96zqh%{10lCh!C zHQk$}Te>%C)7EXe5eOLKbJ~9HkLW*W&uP!;hxS8HpF1;>hOvyn=$v_%dEfWm=PvKP zcl6i)eefp$yRi_)R$Pvt12YjcV^*eDq`4ZwYJ5sY*QB{F&8KC{XJp~CDn1v&=Oc*X z3o2e!@kJG1ieL@CEX`M>`Kp}wS_EImH&)>_ye`u>Wctlj_!hpc;=2*FVJ3v{N&kHn zKZxKd{7}V@BG@ARk5&9c#ZOhdr64+Dnz}WZ(Fz5sGLQyk|<65Sq2Pe+VzY#c9`Ug*r4IWLN=tuqk2j=riF$w!)KV!ET1a`bar&)baIq{Vv7J7xx|oGEM?DHMp3s& zOC3%24=uBKRM)5(Zf=^=i?+rbxfHZ^b}eF2m3c6irp(R94O4%N~r}6|6m;OHtn%wa#UCPoQ|wpbqxh+XoJr|< zJMO7?n-R`p$f;7^;HNxdmI>DxCNGtbuCuHlbSRZ^Lrr8XSF%$2upt4ct#;Vxk;|dL z(Wf_z7xH?_m^4y}eg^d;I`f7^@7^eSkceUcgHikpKab)W?2O_g(!7ITM6nn9qS!CZ z0cn1TUr95kpu?Xhgsz(jDw<&Q7|_x&!%XWl!sORXP5#@RLm=Q(l3+~_&QE$7BecN zlsl;FxY}Nv&Fk$4+nEM)R=T~r-PE!&uWc50y}-OGo5-f8EMAYB5PHf9fqT=r6n8Pp zX|YKwmyPY-q0JbDnC9e%Tvn&Q#tOPw$XT(=M)6{7%F?C{C+ljNSjtWFv8k9=h?SVA zdPvlc&V}}a=dYHrN)G0ND@oeU0u}CQecDLrG1V9Oik3wU%HjOKfLgR{;#!J_t zxQlxVy8TX7xr$@%o%ED5;<6t+^cknBQLtwv_eH_>Ws%Xa^zH$zz=-qoL+)n9vl2KR zJDG9qNWj=Sa?%q+Rym$&7p-=|HNC#zO|8f^B0|Bz%Vsy);-JmXS1Ip_js-nYd$->E7<8Zuv@OyVo)Y6*ec=lAGVejzK^hA>*ug*eCC`TbmnZfumgf@4Jr3clIJv3ywr4SctUy&_e{ z5-Y4amRMmavcwAOlbS27lK;uCRZ>3t7NR|jXUV^hvrX*f7q|)K273klYy~6uK~Jk- zkZm7l3HI_f7@tSodmPkxwr;@?-$b1aNMe{XIedg|AII;YoQUGqc38OV1@SXD zYC}p;*GCCh-tEN*!N_PoM*(|ufTJLH9;@i3hcl73tQW7ayFJ1ND#AX8<2=#FGdDfWVYI|>>RqPv(OycsnZX8uAj&Ris+Q=rIRuMZl6PAO*lE#wfms8iv}@D8DeJ zJdHE1th=}@Rt}Y|z_HiTqc#i2twR+{kK?R+zMss+(&4g8R~Z*gollQ>+Q+C49W1ow}-a z@D^^pert5&4ecc~w7sW;!m2BE(39$M>h)=&OFXj1;`A>Ujf-;7sa z-A6uzLM0s@bM+lxK-p*Ddl4%SC=<`|n!jQnxT|G>$N@Ur$^!pf;bBB8k5Fphm~w)>;l hL|EK|F2*1{=#RJPX+ozy9##8z(mv42b%#_@46ZnBOg8`k literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BatteryLevel$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BatteryLevel$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..33b9ac230bf3ff0a31ad3b89abd23a037cea4c4b GIT binary patch literal 5387 zcmbtYU2q%K75=WI^;*gj{}LR>O>trxSq>3)LgK`!!M_kt5{OLNgtV}h*7gQj64J_X zN-61o3oV868`{$Lp}+tGfdM-q9bno{r_+Z%)AqH`@Y<)Q=iI&0t|fVrQO2ITd+$Bx zyXSo8+;i{h@BjPgV*tDH`v`jRO>Q3I=HW29VMeeGv)rV3EFGrCieMw=xI53yLIgHW zNAL(TIu>~@%fmSq&2#f;1f3}8DDu-`REry$>*l#$lyodbsPiy)&gfXyaW;aj_!jpc z)A4N`kL&o3K*+HdEdenpVDRfPD`nYBR+_rArsG(Jvk7a-%8&(lJwy95(aPc;ZW7e`D|?47;}>%SI@OMA*FL%*Y^hM*9<|%_TFQF|+gW$y|xZ zCBOAzSzs(W+27DgJ{GklGgG1%>I-JkU6z7h%{Sl9>2 z{<96PUf$o0uFTsnuskU6Xk!M9T+hPcq&=TCol=2f_BRP+=FQZC6*rd(xp*;erR+I7 z6;G-cN@@zR@_5`VS_d0id}P!$+P_xXbjNn#0;Fnclqsm+1X`=> zo`L7_f`J$Dl7X)X^{$>p0^6#UYSV!ZsfG-rouwxy?w&e4 z)+f+aljBLs_C=HS{}y-q`I%C4yhHcZ&R*RwS(lpTY%7zd`-3*kF9N;M{s-4Fqfd&E zF}ghDj?Pgfn50XT3{BEeq78EI?IEM>~5L+g2|qUbkEg^_YP>N9p`p^!Vnms**7o2qGc13*{oUb@~>7!X8& z>l=Lx1h`DeCsitXcG3uyM3Ney-d^endN#-2M`#t=ds1>IwGo;D6(Ak2;#PVyTsiE* zpp>E7>SBl(G%33p8(2kCYz2C7Xy5}hUqtvKBIhv>qp=O{_zDa)wSpTy#l{u1d`OG0 zpfwnpVUZB4w$-YJhFn#i@~O75YRFa9Shf8kI;vLHlqye2)y@^%_#xU^RSV6q%R#Wq zyRd=UKae}Gp$o5LKi^VeS$!x6jYq zxMFTtGDjamIN&lznODwQH_a{(*#Q~CCXxXDQ72>R9*ToX{}e(La-fGZlQ`cYso5Oc z;mbu2vz?@Y&**FTpXk89$iaX69O$Vy(1WkiPNR!5MsbH)X;4|JbFu|@zg=bMe|(1O z3P@1Oj4AbfWF|Wlmg>Qom}ix{KR+kRzwm*CD4L&E%T}JnbRcuKNxQTuq zkr?gG*U_Q2*a~{e<$jZt3GH@e+R8Fqrz$cxNf}Maw3lVLl#`5Gz`F)6Brap?2|9JY z{E3WNiHgmaR59O5I|Jenn#DcXDelF6A^}Gnre8LW;EXsb{koZCn~}v4S$NJMjH9?u zBArwFfXnzv=vT10QjCO-;VWpV^r^fL2b0%27`Q@=5yb7>+}}Dzck^Q|mx$AoGfyK5 zZ>~x^JnIXD<{H-uI!tDi@_u@9Ahg&jg5D|a?r>MxJ*t#4i&A+$4k2N_reG!sgezkc zpXGu2ILsPJD2Dj$0eR%{+t&#(AQ4a0LloDJ$VWj1kyboOy#OA>Df#>cZlh;6jrUR; Tr^qF#kJe`T0rThhA;SL$DiiCg literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BatteryLevel.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BatteryLevel.class new file mode 100644 index 0000000000000000000000000000000000000000..a235e5685d61e4eb802f09cae250b26b87aa66f2 GIT binary patch literal 5355 zcmbtYYgZfB72Ovh2FU^(jH%5dkqNGaASk3Xag0lONI1CIIDnxfb(=vNU~DmxM~*Ow-tOx!FLsWParaB7@9erRSN~JAfSvD^=w8n1r8Q8Q&+R|npx0u#>L5`fH*7A zFrG6CmTFk@YPP5a-~G?OUvG(>Jx|Tq@#j+KM!N-$Oy$g#gql~=t6D-`H*<+uKCP)k z0=1UDrV)r>;iQ%~wX|w!8G)lSMMF-_>jix&tBo2)&QdMfC8gG>%j&wC$g0LlqO3!( zh}4+T(we?5F(ON6*E=`xKbUdeBnObXAryHKO;Y~H8nrWku$TMJEcS2js(@|+Pk#ZkWgJV8Fkm|{p z-+{Rzk%!*%%|te*T0;&WpX(h>fk%AGj;KJ0?kIU8z-NKOvB@5v;PldEEp3ra-LkG_ zGmMCsWHQZKYWm7KHSaDpkS|iTH8#0hQ_`thmpMn>=H2s*AMMWB>D9tmR3WYuN&<(g zxI`KV+6EXX7pk0GO|Gu*4Q2eE7C5xSY{@lJbEjO3-+I~EVMDv-?Y^dy5F1mf-tMM``F6^72c0`Bel@;~537NAPR>M!|0*_#JLVa1zf(@O%70!5b0$ z5r0zfXMxVjMLC78`+{n+MY1Zn58}#=E^8yNb)D*BU(1=9uD&iqU6bSL!EombY?M-n zX8KFZ>vzk0f2q7vHj_(JDygmOX)WsZx@cB5yME5vWwp?C>ctx+qp~}4!ljh4%eM!U zabTnjyZKt4;fP+G8;`~cJ^fub`*whoYTjO8T(xY)W^_+fm%ZJo%c#q;?|2M%tT4K4 z=GLN5My*_Qfc!4qjNmW$t3Y36Y`i?4bragx<7MPGA6Um}^#X(YNjrhwJ(BzNwQSgfhfO{2PwNTPA|*8o~+tj zTVfOb_fA`r;=WEiYni&SVpq$d{gw3Y0b6@xpW3D7xW9(v*uJ_y+d~gy^Z1_W!8B)G z5A#ftGSWP3vM!yfY$>H?Wi#;?epZ_mo%7 zKnYqNvn0(Vv)`uqY$Z*%^Hl?JSh}k3#j><{Yh{-e7<)jHC1igldneb{N|%%lyurNe z1S~9mE2UiDwG8j0pnZ22cISHL`9*h(--`l|LqQu(Ajan&eofXO&Tl$4Wj+hpjrrzD zJ_7^%)$!d^ybIZ)?=!=eU3I2SwnXZ-$u7uyGeS6pA!428sDpR;S9=>`lXrm+@ha^B z2YKZQfmbP+;9b5A#y#=KV+KM2Bk5lFS1U-Qk`l*9{8sXcx1LPVZB)yfi4R_KzNz#(<29csk zfeCM={TxaDrIq^W_xkA9di2lWIciAyuMtb)4!6I-tNiwN{^YxM{vPMAH~u%&-b4K+ z??Lyj+(T${8{x&~16zpvlTrcOY0mokxuyiV8RtGmd5{qvp+u`=$y?trCUKTLKEk;= z)OIL}!qF7Yx!g918Q|RWF1Hk) z!=c+o!(j4sFmd8^=t(+df(yC8v9N`1+DeD+6X!ZzR}R=pRQ8O*x+qckm78Y(4KIf=sd#5C$@ZiFI^V?!Rx5a#T} z5x7{Djvd4bItx|l%-@$zu#(P8q@(UZX8|AeyyN7o^p2fN6?9gs(pkg{o_A`>-r2du z9PeBu9rM0)QiKWNMSRSKJ7&k3&fZ4TqS(U0%8IdJi(hiZ2f0&aY{ODKPWeZqyg$0H z`1ptMaeRXF(%?(?Lujr@!orAc^iiVsECSKM1y$2 z=Y~cvNg9zxhKL%m(og|_DQyXd$Bv5n3}*6S@idIyKL@t8A+-a)Ih?3D0ETek^K;vzc4 nC62P3tHGMrPz;Wb^Vi0?Zr*XQp8teA#*!OiEBY$FhS2{2k=8Lq literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BloodVolumePulse$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BloodVolumePulse$1.class new file mode 100644 index 0000000000000000000000000000000000000000..f48a3ffce532b41d3dc104e3e4f17d42c3a1403b GIT binary patch literal 286 zcmbV{&uRie4936sZ*?nl-#`zZ9Yhb(qq2n_L_zRA&W3emoROJbAI^gh(1$9G&}%Oy zBp-o%zmV^r`vbrnZwZnF146p@O)&gfStg9~%T?Ev(fML!y)O>lHW%JCHuChWZ<_F) zJ7ayUT)E-;3)fS5QK;=ho@`DtX_CZsKEX>D(iB~@BE zPAMfo{|ht}`jh_9_MxRyGLSG}C!_;RVfxUAP9F<>?K8acM0(EMEA2*-CmESZ=I-vj z=Y02^@0@$imH+wK+wTC_i9bfrjj!|Y4IUm1qZ4KXTQI{zlIK!k8mtJ`W0pVXc$kmC z#;FJ%Lt4iIuVr{T%c40Rz8OI~@;VCqbQsm*fz~>Cts6xhixK*Gls``ESkiGOg3b6A ze?P9{+d7`m@g0GXV=q_&Vobo`*JD=FvKOtCK=VvGn@vq;)5QhrXfa)2sR@CGJ$A-+ zh6RGr-f7Yw&8BFjY0}PEhl>j{R({HyNz+X0WHxE0r_H?0-)b`C%-aP4eWYloQ&yh# z+@Hx<`O&mlC|I;GGMUZK#q(y$%qKI2c#fvYn7Fl&GaWl=#>dsm_}wEF#`P%3A%XGe z+ELgwE$hs)jkhEmGx^vdGbf!O?gZ|ye~Tf8-d(qaLljsdaL#h3WZ>GPy_2WRMKhi@ zGjs8=Y>~(&4)j7vU_3h3Tla20R<%VlU8K0`^Jc-_niAlIKscGU%)C1@M#g*&0c=v< zdAZo6-0{sQGrXCWvLW7F8zEI@ia^_SoK2*&rbCpq(H_;ZPKb~5H6{Whc77O^u2A28-&eU(n&{_=$C+xY5=@j!6%YRESGiN5} zt+=_E&&CTmD{0T#$#_D&&>^7EEAL0lf>nPEhK60^{rja%$BbXM$C~g3B8hA2BJnZt>6zE}8KkIub)W?b$Zq#KlcKP=PCUHpM!FtUo6?%bz$~|wKSpr)sm8#Q& znqJ+;(aF;jqYsTA+S?=0QI-1%It2?R)rs5O!oRlRy+-((GIn6<5RitZ=c z1iuJ$M|&Sx#f%;)LdNK_VIG;K%F8X-3vjtf8+KvZOxr0MxU=r8w$HU*LHZz6iRS(r zVyXqUsZQbdea@o06_td2?sJR;sjB}$psO-m{(Y!z6eOVnoi#uep#obgL27I#(3rBU z+-Np;Mqqd~|AuOKRy`%KE+wxwiY~f-jM3#xh9+S-6KQjfA{3&?5G(E6wmr&AJw7ta z&E5l``)uPPhro2|3jn2+k+NpZV!DJnu$q@Dihi?H7%8WtK4Yim^V!pUX_mRSv65yt z0CbJ-rk@ZL1_Tk{T1P)P0$j4>ld2Xy+i8Z%BT4nq*S+*5=-C*11ECdYm!#x&8Y8p< zDnvS7#+~$LxN_KmekntB*2NGpXi|11*0+L&*fR9sK;N5ayo~T=M9!lxMsw@j`DGYt zX&JY?hxN;7dW$w+MsqMU#UdeAZK+lb4Y;bj7p=5cReqdh35dMY{yn~1FE*9|~p1|L64)5ay566f0_HJf7Fe7WdhwvsgPANs}pA=>Z}Irv|n16^eYx^O?8G`d)07!RnO`jw?R zCtGmmg$hIe=QC7SK-96ZSE=tJGuffAR1Z$YJgeOE`7u%ci4P=P1{tZz79SrE!)5DJ zpMGOme{>bLLVmW&N#tQlwnPByMG$QwgifK|fUU9GY=tV>66<}2dTfo?W-C<9mgs;k zHu*q2wkEJoQO;G(t%zwAc!QUKe*yxU1~8Dy7V#RGz0H zB+OS7%ou@iWo+PH9;l7OtdWFbh~FNTEsx*6N{9i8c)S*(xOqfw1!Y9q@dSMZ@CZ)I d=htu-Jv(W>o5narE literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BloodVolumePulse.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BloodVolumePulse.class new file mode 100644 index 0000000000000000000000000000000000000000..1169ca04a4ac7fccd2056a40f44e359fa272ca06 GIT binary patch literal 5444 zcmb_g`*#~h75>Juyp|$AY9}Uf>_%}NA}g*%N}#D7Qa>c84o;ogiH%bNT}x|wQ)yRS ztsI+>LJO3ZLV1-}p}ZkbUT#8@6rTh9%uoCg{2d&=*%6y9(Y^@I8UpgkfmbSY9oaw32`_TGsP9%@SxWX_l_$XEm#&o5sb7w17A( z&@^TmC0jM@Sv6nQ!vFbq_{}|UzjcW#XU3k&oEzyC*gt7nODVOeW|y^;x?-8B8NLYgtWSkr=HDdDG0zn)z};J73P1q@Ho|nwy@ukeMd0_$FSunM$j6xiDwxwq_Ah zna+%)cMzV|R2qoF%}bi?7|z|EKxd+FlZx8b$IKilwM^=U_H?e zwHx2}dMLE|D~Vl4P!+|E@dqRlHtl7ZWkw&IkHCw&-__9nWj9S%Wdg~pGKm;!p6Sf< zDD#UO@Ka@*A?=){km8<;@>rp3%^Rx3KGPr>(@oA=U8bjB=OS#4aG$>-4aDPuq$9Rb(2{%l?pc`WB37n7{dTkF_u3*euTGTIDwDF@MHW$KHe7S4HgNB=9Ph}4VY0z)m&URa@wkd z{wdRZ@I>>N)`pzpBQPw%A0$MjvY*Mv&*kG6F?<}4EBIv$zrwE-{3eFq;zkT7@k9*2 z!|xTm6T=_yM+JWp=nihoO^ChcRf{E+*~@zotJiw$wW8KD*uy$#TDhM79z!k2{`OAs zWJ)ZqQjn?!D%%|J%E3UT98flAW+}xQr^Xj8vk)&Xo3>fZYxeS5sbDTyYH@jhVookD z^$b3Ht-?T-R!(^Qa!$^#;^njzJ*&l~46g!(BK;G;cwsD_DD@5WT<^aJq>?Ci0;36J z9k+Hy4VL*D@}ewQRhD^uY1xje3nkNX&Qm;L%t?NiugCCb{6(NY=%{L7&v+5;yBx?c zSikQz?j3zfv$zMs-8A*1Wa6 zfjk`4NEzQT6OZ@KwOsI(hp);IoS2G zEc5zupCl{D{^+h=g*$>KsobE$MOiYKbo^Q>@xN&s)n6J1HeQ|plAk408+z6)8pIr0&{1IPJo;Mikqg{%&@+1Inya?C)ak$a>=$0 z5e#C8Sf|+QVk^4I0p+4E~wBh8Vx6$w(lp1IU!W2HjB_Af}QS7Cix@f0i zjwW3oPYEGut+b=Ko7PE_mK-~Q3{?t@S9dzVp5$NIsh|EaAN~3&{WExqDeT3g*$-kohE*jU_hP_s~i^%#0qVsKg?jZILN`)Mwx%(U7o>J(g zpZn?M6ZG&fB|2P9)%~5u1kRGjCpp)E`YuIL*qg*TkJ~yiL!5iY^}r1@)!0gRxO6+I7z~~+22PR&JxQaCb0g;&9K)Q6y9BC~ zpYbS@6rRQusYvn)!d*>GO%d`w&k5JEk8x6ZrLkf?zWY5h?kI2rtFh{tY0P-*N2prv zG*StwS`bB@i77Nv-7rO5!$ztsBe>uMj=;q&={Qad(3#tk&g`~y!a+LEk&e0pojH7} zY8^LbrFEQG3eZ{JlFmFXRjpH3v(CLo%(c!7q+@MMCqtMBp2epr_$zyl1_kHXOA>b7;k0x=+XNKl#kTfHU91%5Q$=xjSyM$#A{fvj+auXdA z{X_3#e+Y9ycoofJ!3W<`g>Qk5EBC-R;`wUIJ?q&!xq$=ochK2(@HV<`L2RIVp85I? z9=?V44IFYi@muJSn%xxM?5u4;i@1m`ahbh5=ju?X78Ha1Bm8!9u9q!Z8~N|%VW!*& LOVQWxbwvILqB&MT literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4ElectroDermalActivity$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4ElectroDermalActivity$1.class new file mode 100644 index 0000000000000000000000000000000000000000..44614b8b0a756da4dae944b37d39cb9d1a619944 GIT binary patch literal 301 zcmbtP!Ab)`41LkoZP!Bg6ME>`LF`pT>ldW7b6!z^M~^Mo-la}LDGv?s$@cQHZz_> nXI39uy@v4kFOOyh!j-;%j%!WmG{8`CfE(>2ty*_T5zXiqXoy!S literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4ElectroDermalActivity$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4ElectroDermalActivity$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..93924e822b35f09bfb442f9e010aa68905774e42 GIT binary patch literal 5612 zcmb_gU2q#$75=WI^;*g{{!Qw*Can`gWI2s$r)|PXDVJnt+y3E5$3^vZi z@Dy@7R(UVa%LOJa^6=>xdg16O@zZ6g77w)7&wGO?>sX7?y$A?dmkm*8}gmlc?dFyz2bO50S^h(<={imxCs3CycR_lzH$FUn&RjE- zIWxbUOcl!H0D?p>RS4$dso~a+3?QwonYl7KTwgIu-uV<6X9S{|oMk%R%2CqjR(ZBV z+3AOChcYa%qIB_Bx~kgvYkefCVH^qcTnFK7u3)-^U>_aSgkdf|d+SW>BlVk{(=Y94 zvZ*a{UI|RL3OCu>=2)46L&604c3U8xX4W%S(X|VC3cGcI>x1pY;yJ1uwDX)ms>Re8 z8kNZrTEB-ZYB799$)Xop)u&QjTGoYgKD0h6@O+CZjo%VgqG@|MZ@OiNJpF-`Xco=P zij_3ioICELn$J(_(zWGb4Ct)^yF}bqBS6h(Ih|C_5Qz z*5(E^bc1HHk4vb5VcgHd7!L^p7w~z0`vMQo8~7r=Y+wi54KcB z4g46dQFZeVsAe+(!lHvtm?Za~Ea&-dP$gr#e_~)B#{_0t(xuWu1jcF)zH!J2?5bs| z4;gB#t!YRZs;8$PnK?E&M8&@@Gt!hJt0q;JJG?XwVyE^v(+|||-q=7{`r4LkE0?8v zkv7XO0)z44Cz_}+BuPjaUH0P>OH{SF&HJvdUIYxgbjr-xSsJ);@2}U-(_V=Th*0I7 z+k1rZ7TBX&P0;pbi|%w(FphZ76cJKK_^H4^tnakv%2ziE3>E&yH4|(O{ z5L@CKgfD>Z(d}#O0@MBf96(`ZWUVE$oU2G3Yi6bLVo)vRMvCcpK-q;Ar*NJx>oWGX z*TU>MfW9FH>HCG;fG|Q_`siyX#1%|Fsff|DmsY4+64eOJ?x&fcXM5r;L^h$lDJl2T z7^59fNz(Be?xr`xqr*OoN*XG=o(z$ICTTYlBb#VTY(Ni>jr!H0Kde;_!ZLlHC()bXYd=mgx}KNC2Zg= z3CniRbOj5rNuQUa1kAl8sSDw2Bp{^YKKcg^9U@}tSqitk3b!i?dp2Jpx4qu{u(E-- z0_N8tcY8f+1v%adu+|~h*Bm+Cx(Vd2P_Vp1U$<8=j^ASn@8WU1hc XYmKTfod-Sq1lnx6Np7$W;am-f1}U+zoQ2qkb(aQ7%)&ZU;qzNrqQJw6L?6S zG^#Y!IoQJc->6aap8-X6B}h=nOe*#Rq$V2_mF(e#gs+vCpZ_Ar{~Zt#tqPfHh!&@h zFT+FYKLP&sD*tp7v?4*YszKz-lxT?%wu&%%L|Gj>*!G_wt<04x!*2nBKtj>t_ls;sVdFwl15WB-4z-x zgC3L$=bT(&%Z`#4DqNr|T$Nfb9Pky}AkBAs}K jW+6O*v-0@~+(XZPS|6k_NuEp79G&g-3+;>e5~BYDMgB(c literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4ElectroDermalActivity.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4ElectroDermalActivity.class new file mode 100644 index 0000000000000000000000000000000000000000..e0c679418c924b958e11e7532f1d4627526cb702 GIT binary patch literal 5640 zcmb_g`F9&v75<)Wc`QY?QztQwmv-Vh#Fkx)6hqTEq+TSa4oRGP#SMXurLjGUG*V|q zPC^KUmZcCVW#9KDP@tpGEL@(uW!yuYE~>k)L}O$FbG z;0byErh;!N__l)Y2t+4MQ@6%5nr-X0fHGDvGHKls*lX*Sp=IWE%QkZ6++;#PoEB&t z&zZKPna;eHDd?e*b8p)#7oz{>%9-)!lV?YJ1lrEztd+Qy*HWu`TwAkp@fkj4wPAre z$H?jgB3LA$=Pf;@IeJ>);B>*1Q}c#xEM@dj)66-VL%pQbdghY0ro}Uwxe_n0Ay`zd znATIeu_iGN=ovlbSh<95Wwp#`$}!dq=Ngqwkle!b$S&#Dtj7Hc)Soa+ z!#OEX+uJuU&~hf1qU|+$fYZKAowI7t9?!Y(mX_A6lxfHF^c)Qk*Ry$AETzSh{zGyo zS!yd7KGrW}oj|CQcq5@&srD&2`KGQ$FlYIffsijMF z7unP=8+s;9*N91m*Nmg3E}zx%{+?^|1ukvvo!q)o(y3pQQOLC|Tj%LW>Ya51Za<{uOn?GXeS4t;z z(vP(NI~00+C_3TI-rYr23CaupM?oo+b5>;{I`xQ{3B10`O%6Z0%{5+;*(Q0F8OPKz zOn|<>nT))HF;#FF`tF&l&ADg53*brtCeq~9l%98!rGoD=En3V?W#qO>1W|CHsd^7!*imtVOjOdu)2cOAP@0pxe~4 za=e3kd_kMlSxQsiU~$8PekmC&mJ-UQb16!(K5FW+mCLF;lB!>4S^rpPRn0H7s;!%L z&QkTOEbDA0(yC^wStDiTY(vj-PVN2Yy_vp2b&idOs;MhlW=%7Vlxkl#OqEOWtoFK( zGDy{KS+Kj0U$|b}nymMn@Hd`z%TI}8T3<6#x+-PZpJem&zB)HMuJ+n}gWWdZMvnyUbM_F>+)6H}_ITgqYd%UP|n^(8l zN-%-C-YLJ5{i0j;r*%IFV#cuybH&Z!iCvbSo}(_z&E3Kj zEB-EPs>kNFU9uT|BrFc^7*sNS(ao|wGgEB9nMjXUR>fkybtwhQ79(iPFg5F%zm`sZ zyiy}&0wpa?BHPDwMtGvm^Hwvwh_ysLqDEd8bL#j<$z>tv%K zF!qoni^##SFE#P4l_n|n{-L}qUCc{CEyaVeWgDd*N*!DK2Y;?_oS6=#JrsNDKI-p5DTB5mMB&3+@_vFI!G7AQlXe>6 z+n5LBDRL$iFKO5Wc;E$YRT$bwvM8san@)-u?!;r#O1( z=K*?oh#nrHM60K%w7-*>#A)*QDCg=?*QqE9M`v)>=XRTzwVZpw=a%HN{1my#=z1nL z@DDV4R=#r96-iz}sI#%LF-+d)IpJCMX--P7G!(7J=b&dMTm@cWHIzIvjTwLaC{@dy zhKoT}4x)%VF@*-I8=;72*l>wu7_)BR2+UQb<2tc|&O%i>^V`x1RnmEhbhI7lEZ}1$ z>v%CMt>ea01)bHZbQbYq$vQP<>uf$^o^@U(9cx=UNy3D20U!6_4!M4&u{Y4XDAuvJ zGGknG#V`8eLp-U{w-G5Gqx@r1KIq+71NV+K427Th3r#DLBe3YYqpEBWyP{OeqGG`b%wUC}=>*LTIb0V#0Een@D%M?K z%YL?Gf0i%5-#-A}@R%XX@Ic77?KxQaXq*t{<=2T*W4T;ZK1p~NPJczm?&ZiG6K18i zu8obaKP4U7eTJN{YC~-T?>Sf>&52`dIx%vCnSZFyuY{+{dkJf&YZ3`Xf5&OQ5yq+`Of*k5a-AVn6w@m#jZzi> literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4InterBeatInterval$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4InterBeatInterval$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..c282ffef6ffda123e5686ee7cd1b5b62abef6ede GIT binary patch literal 5512 zcmb_gTXY-M72Q|Tcr0azpBTruX`Hx3mP3RcAP)zFUxI*>(8#1Dq=m6GwkODvkVcMa zc%-G!H-#43rset3($%scu!@}!7OvY);dsHoV5xw=4^&$+NX0VGjrH1*!-;~L(YO-6wt>@b|!5VXw!Y! ztW}uEn8l(+3lr11!hF17rp-bsTa4#vnyiUii+R(rQ)YZhy-eLKjq+R9uP{dh649#w z!_H|rXMwG}Ch3@|hxeO#=?2j!FxtQ#BaA(=b{j`1x=Zwo2dmW zZY~va@nYUe*>iR(o>VV%ASeM80pn)T+PiiVMn+xp{TrrD$BbXJNn;xbM3T8uA!Q|O zZYZ0+r1)>=@@HTGxAHK|L(IS_e23q@%fnL!zK3TF^y6y=zK{lt$^xDS=G+`lVg?DMMzrm z`H5Wq(aKfIZ=nLK<5}&Lz`C@&@+i9KMlwlPHW`|vrZJVhu(ks($(xs7|2mz#cM zj=R4HK=<6{B@ThhNWv=r>D+k#aifGj?X7kUPPbX_9sLpsaMhAeDqQsJq#3G^BsEB1x6+rOXLIabgjS)wBPF-d7@-wV zDbn!@ZlpKEmBV%nNf|1&E{2Ffld`L^!BsTHR-gxm2mg%bvk0F>nED~bXwp!KDu&c^TKGil>4Y{fstG1s-N7b&HQspJ7+PQ*j z-$OgAYM~i+IS6)nJJ!+oJ96ju=*An^jX&TH{1Hj~2@c-GNxX$;@izTCgB83hY3XuZ zSF`}D^wV#Mh`E`N+7P@z00AAh(0^dh9ulTLrFh$>csr-KXZIy@UA689l@Gk+bH9eU z>uOcY%<+;>wT8LwOEbqySHRpkN|yKOm*;tm-~)`~L)?dtu!N8CI6lF1_!RHpFF1?O ze9WDzFn5la+v#U+TrsyxGDj^HdtBxy^U7K4rr8-HJ0L^YL=wPX>trl78|+p3#}J~B z1HGJ?#Q9c9&4$=kUoLu>?IaESjed&%9Ub@wIrvYX1HBaodT|?_G`eJC6t}CLhLoi` zCtGmGn^lJX%V(&rfatP~F{Qqf%w&hcQav~m^Q>~u=f8>a|M)<{6_D||Z1M5&FkH6& z>(g(p=ucdNt&pFsN)maPk}VOydJ#m22%$%4mtkwNK3kz`w#0g$p&naP_1Oy5vL(8q ziw!;ykF5mmRFrd7b1R}-OgzsdTVk_M-(%}8>{I&3WbG~ImNvXao}CS`Enda(MbTwz z8?kjGv9+DpieHkgsI=_v`fO=6Z0+(H>alfCeYUhZY>g9J6Fv}+ExK8{-ilE=8{8*O zok!1+Ra`$k=qCDUL}GL{-#~{tVk_t^m-{X$6WZa*w3TJJPE};ClQNo;X)nugDJL1X zfOij`nLdw=N2u$3^&=Ux5*3@TsA9g6P6ot2G>f~jP27Wf#WWnTpZDMNb zZAKOcWZ^l1Fb?8giF8Vx11{r7p?geX`~8+x>(Xkcda>A&M(U*-JNG{XM})$tss literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4InterBeatInterval.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4InterBeatInterval.class new file mode 100644 index 0000000000000000000000000000000000000000..fc2a4dd880c04c180a8a9e74d0ac2a8763c9915c GIT binary patch literal 5634 zcmb_gYj+dZ72RW79!tnJF~$XBCxbCX7DfswO#oBsmrP6{CN`KlDQ(8m*dCB)l$nu% z(llw(N7}UM`~7~>rY`~wkg`_W)sOuR{SW;G?dm==BWaKgX5q+7Gxu@szWbhY?m0*P z*Z=rQyji_iHewh4^WTx-fB*A4TsbrLbnfIxzk+QiY-cg6m-PISk=0imJ3GVHvOc7s z$upM?0ud}RZj>A&uX{#8!S?C0B~!DeYt9#q5zDeY-Q&Kb)OF&#zM^M~y0w_Ctsz)a zR!kdt!(0)JM@-8zoKZvfCZ(~W7rD^{iJhIEJe`{+F>Mtw)6S0TUU~VfV{!>G)#=>G z_&UPVhE5GpxNXt!e9Z;tQ_!6nShYp%>|=I;XKz1YTE;Ww<$1$7t@Er3nva;4=^a(j zm>QT>&~d`fQ|~&p&*@O6$y+k1iybAxx0>F01^EaTiLa3UXwTEkKBb}64rEUdV?%KPepH41cL%1`_qo($RWn8S@$Xw`M z4`u%T5Qd6>J@xQjRD}r~eWO%jwznj~X6!v+q~Mhe9Bk;lIZ*3Gi6ps8j3$-@pzWbu z8E68>pDKHFZU0U++P;qm4q7k30GYd#H%fjGRKWn7bQpJP$lL0XC#?!_gK6>F)!_!y z3R;fji($M;%-CfoZ%mjHg|z#`j*Q$P1%Y~_f!!?`d2_+cXGa+3j~UD)63>T{7{tCL zj^e{fd>7wKB7_@jc}`jZ8rvHz6rFugL4g^h+?SNgomC8O_fA9JGZ6#54HEPYw}_c2Q- z~k~=89P;>qS>vGIYn|jPALbamjP^ zJWZ)BIQFu}OR9~|p3+=%kzSqA=IpYT*DWn?FVp7?e?C|)_SbY*OFj9xmetI8b0EW= z{YdZj9e(~wXrqh#K^Qay%>Sk@UV%lZbH;5ej+)GLP34c~FSnpHSOE?qW#z;vc9((P9*94V~ zfpBl_0`pda1zOI^v;1brJzSqRD;e2WMl`w6TSiSwcP@u(Svoyh zzawQLw~ck9pZ^u?k6Jz~dDq&Y0xdPC&>ZL8@M#{Zrx~XAwLk)v;nMrDtlaM=DJ2w) zJ|M{oa@57EWqen?N-EWVtRzW}u_wAqBbxZ`mBs13H_`YGn$m;*JC@#e6V2~Ht$}tSM&aFD@_vHuK_~UpLp=?1G#vni zn-G%P8uvHurFO{}`U;3Zefdu>|+%j<@)f ze~APi8Qa0{E`Il>|AMC5Xt~CBEPSiC5x;f^iMftVw~+ihr5b&u1?S7~Oj-2P&V#h_ z0a|#N5?#Sg)$<+2B#x8EM>yAvrXE#Q**k%gA-8M9Y~r=;}xf> zIZ?u&m_iG;8>UF0*m#v?9H)K9QE+BWI=&I>=$u`X&g?zu#Omq1Ksx$5bk5?VRqX^m zE86jWsgBOlnsnyyTva;_HSOGe#RBcTNIK3v>Es9#$Mg7D2)EO>GnIV@?Q_a4Y_5+O zmwoYbq4)vbRIzPB#M6|2MC7B^eKo>Afsf-8oRxEDf4J;EDx2%|($sNs3;BR6*< z^pCdd*pl9R8=dcBYa{BcqRgRHc`l-cwyKk~A&&wP4Pwb@7WiGnQiy&mL~p;2Eb@T)sTBU)OY$0w$I%{cgK#K=(z#q4tnPpuW#Ye z8`yFOj|Cm=2D)VDAcVL1YunMToI#Irj=du18n9eVC>Hy>`R(RhKi}Bg!vD?gWXO#( K6@3X`M*ROh8JG9~ literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4SensorStatus$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4SensorStatus$1.class new file mode 100644 index 0000000000000000000000000000000000000000..03ea232c111bae2a23800f37e8285a9a8aa9b5e8 GIT binary patch literal 274 zcmbV{L2AQ53`M^ZCr;f!z3--rt}~RHT%b6RMd`vPP$t54aA(5I*oVs^2gsp96zH<6 zN=P4p{u8=fPiFw{c+8RKcpwywAA*%l*9+mf{yB2$EZ0>dF8a_UPD5NBcx1v;?QHL3 z=h{z6-+rH?Agq08P2fET>!LYwjNK?kemUlE;OiSc4z703TA?e1vT6G@ikOBNw^P?W# zT&L)b?4cu97_1hvsvrkj%rZhF#)V*HWyOhLEKW;aMkriLsFJ{On)XGGbcYxki7Q@B zoSymV>S$1o~T))Dp z`WzU%l8NJ~>|~y$w#cx(p$$3HPI}5sIvNY|cvlH2LGG$)42N-3u;(boZ-Bs7* zgS$Pa!*gYvvXi{Te%-be5~;#WG3_46%Gt1?b{)S#&K(=Q*eT66Y5Hv3j|b%K)6#s# z#%J-MjV^4q@p(LC<6%5v<57IU!s9lcz*!4V+IR|2E3^ium{%rkoWnCVp2c%Et`h@W z(0z%RR|#zNpxegtIIpn1o(gBT4WH}yg~g82*R!{SJ;i5J?{^Sc zMD*KQ@*Qjw`~ob%!Xj?qo9)RViLF|ORnxPf?m|?{zSY~eh*&RG8n^a+7fmlC{xTBh z(AUec72fy)Z1ZUWSG|tr1+=`x$rsSt7#S0hh^VftR*h`+ROM4hb)~3AJk_YEw&^K1 zSEh^_y*911>Ls*^M%2@YiAMVpjhNAB_chu@BNiDGHjNNAH}hu`@G95+8hO5s0sH`a z@I$2VBb4!DoWW1K4xc)p22{1*H0d%Pciz%2fVdr0;nQv5ppjBnvDjLKi} zJN%8kzlV5VsPMi(-ZzDL?=!pyJl={C9`txKF8&VjQu;;4s6l5zj1s^WCK_2a8;R=@Jp&AM)M=Pjq!+VVKF~+Nb%IkGvvG^_U zwJ%iQ0)rl>gIJ*sp;e7ytvVdywB8t}DP~o-_UXN~IYp~D9SeCGa2ly_+GDb+xmWqF zT>`6_-=Wfostj!9hO9ML)_kxgu=Zem91%3G5L9do*M%0LI(Amn3vwZUn&jSI}{65gSJO zyy9>U3FchW3s_~!(gHgD<9M}}iEQ&^R{An>B2;A7Xql*yX?p>!CJVI;kJ+_aAZ7&G zeE})?N7VnLBSok6Rg%W^C4qqm`3Cvipe#tp|%~tNr_59h|!K* zOl0iCwAi36ex#N~_5WLxqqky_Gv38s100O&XBz!{c5r+n+Z!3uW9*}~iT}8M44*^% Ee^=T-RsaA1 literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4SensorStatus.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4SensorStatus.class new file mode 100644 index 0000000000000000000000000000000000000000..f79fb29e25639b415c92814cd0167b39829403fb GIT binary patch literal 5710 zcmb_g`*#z^75>(iw3d)0m!x@Fnpb4; z*AnpRnediFWU13tE^#l#VXt8{IpfB*hS~)SWbg>KttI z%PgL-Od5=f+vcpQYe-LB4V^u`cZsN*Vx(B0DcTR(j&*o(;gnULGO0S5?y()ax>rMU zPw%v7Q_Ry1CY`})wI)(MZBv(BE_~T6nB}}v$(HCu+9GQ$lxV!XnH^Pw(f&!-Hj}Om zNcGvCfQ@p+MIsN}_lvS)V2%3XQ4Dy<1Je+vHEM=v=2*kJp0VBl!1$>%R=z5(nYFF? z0v)1_F}}z#|KcIDq%>_VEpqGnp0T@kis;yqgdz6^o$e#+lsn}{+*-P#0ZF}5Td=Ny zMMOZ<6+k~JsCvA$tG)FvuF5J1?-b~VVVs*hUx+;dlmg~-VN|rb>(w~nSm*rXIjCam ze|3JhLZIDW>RD0v_y}HbKLmkjv3gok&EALOpuV^7AU6BqocC<-E1emMpWeac;=SA<^L3Gnm3FB`a^w+WG7d6Z(FOHA6D@KoWgO zC$Se_NaAPsc@o=@Nn(dIJJFxSlhRzqFEn(Ai-G{DwC}6Vv@vWJ4BIJK=LL0!btrsn z@A%{$8x4B|eWjr&l71=8ucY~P61(t}j^8BlTl`MP?~`~N?q*b5~($T&JRV)RscGhLU`cYxH=;c{R!gB0%a@~B>2_wjr~R@~ao z?{dd*12>~S(GuR=rJ7|t3`0ylU=$t8D9#$g(?`h27F*GugHl{`o9m(9Gj%UaJ zi(n7R7kzkq>g4$0le~&dPNj|dD97stDV(^J#Cv#OLpmH@{xO_X=P__!k>LHy1Ml&! zEgJe)a&k2EEz697!0;P3E6g@qA8<9VG%KOgyMwR2G z&MoQVvr>U`4X*_QE2}5n+ucNeVTHSEm3d{=(35?3WwHkzM&=XCI+sDpqLSbhYShW| z+RMbaJ6z9dmC|JrtUPq-ui!cnw*T{F4P9tKCq9F%9QW{NZWDU3L2d*bYjPFfmn_G?XZghV zZ998S?g#gn;icgoGrUPOoavNmP1H^)(CpXpm-B86P|6;@ZDKEfk!#Sdve)o=w!#Eh z&6XDzwz4wIUcN?CH_`NW4w?c>w_uQ8lHLLgVVG~Sd4#QOeihA#vNvRNs_#QI-#{dl zcKc{*+YQ808zMKL*Ks>Z0yJ8LCQBkk+I=)#8e3?#LC*AhcuE$L`8`KzGTOmWlRFY~ zHM=7*PlWTMzUmpi$@-e=L4C3TeImX-`>>xoM4!t<6$!bG@3DnzSm{O97Cu|~h-3Rx zA0YA(TCTE>sy-$!`qf*A&#Xz@#HxRCU9)RTPv;%fU?(;2XHY!Jf4k_er(8bkJ(<4F zIXr_gGCDv69Z^HqBckH7IH+j;o4`WpgrfNz$MRRBxsBriKKoMXe*6EASJpP->0`$7UpvjQ&9x~m}SeRfO9H-?6Ics=?d>u|G9Y_*~ zaF`m3HZ6!5t*wbfoQjO&h*D<?@(G;8muWFUFz7D1DY$WILh=Z_ z_d#Co#}mL3{QyCL9w9swcc;xJ%MD=^UvFGyn&Z`x)A@xfCJbY%^TKB~-I?-SBmqLg ztZ=DvoUqf@s~dZtRYsX_T>Wq+3&LP)t#RvIjK&k98m)4+soI||Mwf)?AH--3LPH*@ Wt0@h+T4;;5(2?Dh3B^OAh`JvJJwW#W literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Tag$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Tag$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..f74a2a7fdfaac56ee33a33a2c756953e64ce3fbf GIT binary patch literal 4420 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 literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Temperature$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Temperature$1.class new file mode 100644 index 0000000000000000000000000000000000000000..beeca35ed1caeba9bb421927559484fe66a82851 GIT binary patch literal 271 zcmbV{Ps+kT48>pkSM4X*wJR5{9Yj6BM+Fz+LN5@W~zsC;Q>697+t$EA$bJy zej$(N?G9juzX(x;9wFYA7jI>m7eW}O=ZfpxaysA1xf0Ly#mnTxS0)TnXNxlAE?Y}| zEDsT4!lLw<@qA!!T`(1gkYB~9_k%HCdE+Uezj99ef1w5mgyem~6znpy*`LJLgxL?| dWCTJ(AACns6FRlfR&Al9y{i@L4yhvPz5qkgOJx86 literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Temperature$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Temperature$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..dc044914f6411a8bfd56d1edbcfa06ce626e2d84 GIT binary patch literal 5362 zcmbtYTXY-M72Q|Tcr0b`o8TBX;KVet93pHJV&Y&DzsSQ$Xk-Ejp=B(M?Fq7^N+a8p zQquD3lajVP0+hBNZCEs`4Xk1(qzhPW7ax4|yN};~x4->rdd{6I%|wz{vXqsqJ2Us5 zv+p_koO{ldzxdzBp8y!buOjHdS9$mv4^M{C1v7#znB^hKbEz;5Rs>C$79y~5 zI)bN=*0IQI8J^CvXpV=kN6>-1jsia&MzwgLwJu)kK~cw2gg&0+k7XSzI-ZVTGrqy! z&*=E3j%RgzOCaRfi6wLCoj>Ol@q=h zWq~)-TDHNPYholX7X;d`A!#a|H67xpiQ)ZXd!th~>qHY9=*Mhv?ekA*vz+MyyXvEi zEN{qL$!wk=1V!amU;HOml2*>Kvl&X06@hD$Q=?B6P7I%fPD_>CwTkc#E=&gc za32qYJj4u~!MFMCJ3KsZ;03&7pci);cp2X{@I8Frzz^_49j_SpF<#Yi*1%8jQ-PMs zGH2jtc+J4;c*DS#8DJZtjPfS69#2-Db_3_|mVvkNj=)eIWy-+M@h;U754L>L1bP|J zPxC$s>#<^nyJlI8z5RuOX&e?9sl$R&ITjeK-0u1bB(SAYsX7&?A=P6SohUsqzJK!Y zzFvXOs_afso-dko>Th?Cou4PQ#wT-E_3HKAlEtWD&bHDix+iE;{36g3?R$J3GkT>6 z8KcXNc65%aC$~p0tmOu3*oEU}+D_5Ht#7E>KG%8$>4Q*ZmK$V=UxlHTR&mQ`Xj(<{N3{7W zT7sb&774LxYqe@<&{gFnpK2?shFn#RRogD1y<%5Qsq&Ik?O4UFAEAv^wa^T^90a?( z0~=`kHM#Q}bmBbj$9vd|_mRMF;ot(E!SC=2eoy}{Vig}sS~j|_D_Vdx`jIt2#N10r ztq5KvfPjvj^dH#0n}n$=Dc-g#-YzTd*?q~}#%lM2$_HNZxnITHZPltJ=6K1cTE$%F z`pogt4KR0^lI3Iijdukj_#?*f2_C_xSi)y`7JtI4_%lAhUvLSZ`Z6po+jehk09qsrBIrvYX1Kni@y72&=G`bvP6c4JM29%{bCtGmnLWQCK@)@ct zAo}HqeM)^7naK`?rFw8C=2_*Q&wmr;|M7u@%OGPl+2Z5lVYqDl*QeiD)*oMot&pFs zauRu%k}VNHlL(?+gwQ3l>##LZo2^hKTcXKlsK?f1ZMH(yY>7_jVv`TVV`~ZzDayI3 zxfRhZCZ1=KEwRO?@3FNX2bBIPS$j*lr44SCXJ=Dvt5% zm6jc>&6ZZh*09e|kF7(s+0tsTHAZZW`#?Ol=r-wkD@N&TaGyAH1zjiBaQk$>o9O2d ziP70Sk9Kv$R?%H5_Zy{5XvmdmEy-}5D$Cp^Wi%zzR+8aTPBLx*@9e)geFd9OP}jNR zQyH@&6`L=qV!oM92E+k0ii6lL4&h-j4M!ZNzhWH0vN$UJx|3uZk--sJc$N{yQ9LY> z&Zu+1W&9-ctJqX7MncE%RWz5ssk{#d6E`{;xJrx>#7-W*(z1_k=Eqzv5vM0-o<kEYD8rK49CNoO;etL2swAdPgUKe*yxU1~8Dy7V#RGyDRNSH?z%mjgOWo+PH z9;l7OtdWFbh~FNOEsx(GBgBA2JW&f#+&Ch)f-)lQc#^&XcpRtX^9kHT&n}wpp)pR8 ROVBr38tLzpKf;R${~zS*y|ckg$1-*Q030 zr{(1pdHIag_-quf;&To7JiZ`@UzEcyHQ>wmih|doID$ewzAo>tEBHnfUHGPgZ$@KoMhNvQ=jv#O=kbu*uu<{KvnaR2I3@OETQPT6Naf+@jn7XZ*L{nzcBjbAr&uA)r zL*b?s&31g|u1ugk(Ywn;dDUb2EGacl>4x@9acxO6=TxpzpzgG8==K?bP@;EUpk*qb zp~qGFoztF7t-Y$#3y(YSrkYjFjA5k;j2D-k;*#m7jG9V&59z_VvKz?sWFqLke38II z@B3yVmsjl}mrlU(uBN~P0cBTIAVP1H91-HPz@fxsZ$NN*>9Urw$);{u*K%0~L`*W3 zW^Fa|;(4{;tu$09Qnf8Hxm#1xsauyBN8Og)^9&#D&N<1|%1~4xu2?03LseWN4TK#7 zjFSgdPOWB7xBNyXK)}%g2X|O4d8SD!mg6DN8nj(@b=1(V_&e_@FPHw$VE1?cbo0xJ z{bY*|;HL8a&4=^$sw^QNxi1z1_P&-ebiec)ugIE^-e6rY)EtYG7c-U&H<71{HdEEv zBcZ&Lvu?sw3b4qfH!@nmDP#)XWXUpFLCVO7E0HIS5^#-fa2r+Ny3+#nr!zUPaztnI zMKhyK=(3))SFHjAayJOL&J31itDt4{Wj&J`VUa$ou@A^JFoo8 z*&6~w5`3STDDC`AUVbhwzlh<(ctXK1WB3(*t>8B?{1!K2IEg1?_#J+);H?<`fIlku zlR#JHn%wf%b3rxP7FmnD2l3{$Zu@FM>ps=ZUY0kr-TmE$x+cd}L*Y$Z?2S@}Rt8Fo z8}Lf{0Lz6_(kYwGXDG!!rN)=d{8~KF;o_ENSa~z9ZLo{7cW2{SZN=0yE1oyv+m`= z89(c#e&7rslVtOrb=;$Xz+?MJP=UTZiP4!%r%~17wmyE3(mW;XgH6u~b}wh+v3^ZX z2exd3n+(oL&pD%vv!XffFTawP|%L!NbtFrzcOo(V4Pgo&qsj*f zdK|6vQz!j2%(qDw$TLDndTZP<+(qwtu#o#FF?Q6r+*et zQ$x~!omdk0OvhWi%Krr1k9^m`@5B7|CI5=rJE-5}J?!0;JBVyM4ZUPY5w3cxq}@XgS1c?WzwUi3@uInUq8Z5&zLLVHWcZFJs( z*hbeP>-82MyoH0?c*q^ZZ=p?Ec1w7ZquY#TaS@&35=S}C)nLtUC8p#G$0V-Onh Y)@Pcskkmq3yoHY3t|*lbi6iU20Y#lg_y7O^ literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2Acceleration$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2Acceleration$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..870cf72c316da3bb7f37ea2880e9d6b96a7892d8 GIT binary patch literal 6362 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 ZA#Z)ADGNz0w8dNK$nA5w?0?i*GGM-u=5 literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2BatteryLevel$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2BatteryLevel$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..4658ea1548da95a60ddae92f167508214789d6c3 GIT binary patch literal 6746 zcmbtZYjjjs75>g-W^OXvk|&WS&_W3?On@Ot1tF1=2cc*vNKzE2kDHmB$N0 zorm{^@IJghggfv710UqI5ApPeS@akW$3tkqM+|(FpLg=iT_G&S-3C6!&yVxWJ-pdb z9!O<5j`MIA5BIRG69zsJqL)0s+-u-I1D_0GB|gRPpEmFr1D`eUIRSq@dDs>ZeF7%` z+-t||`JDS z`K7#?ray7)_JU(J_0NY()3SM|+Rvev7iyDbN+3 zw=y3jkjam-M^_Byt=P@GtTE{_0V;59*_J!mVq3ZXbP~4&PQuO)N$wiLYX%Nk6IL{3 zr4!M<%s7ES2Q_j9fv#}hnsPVM5DQFLsd1vp7`1ZFj>IXkUKLB(R@Ry6Bp>F_NwqqQ z8+_Hud2L4R?#|Q}_jl*ml1{up{S0*aQyD8y;IRFfa$Vv6*L4JPZ>B-Vy_s_ju6ue8 zEt=tDPbNdarpe0&*GpZzD}3PfxZ2>ls#|T8a4LWGg?ioTVuIJ}zPYoy?c(gBnWl^L zfniQ?fsXQ{htLUT?N}yD>VkrEk(L76kHqY;d@_@!Ou3IxoPqA{;X`&TPb>EeY%Dut zTiRsK`i^WMugi}3Hu5@C{+@;6HIMzc!1#`|2_(wiwsW4_RShN+X)8aTB~~s-8`hW= z8?~d>L^c!6joGo}NHP{3R6i(pi9~h89xG>emAh}}R>xI+o4A#?qBBg-$E-kTFf*Qw z+5Jhrs}_6QEbF=Qn$!zy+u z9yak!e9OSMO?(HB&_z1Cj+^){9yRe8PMKK82G%3WR!&n1b7f^!Gx0dSXJP}|Sl|h| ztz7|CQcRq|P801cGKndHXqh$J#5BH7HPy9T%r$`)Hl~x%O@!|qPjg#Q6k|lrns^T^ zflX!ZUbvG4+GlTd`LGhWX0}pkkkD;hu1}O(#$fOD+jn)hP=u7k`yfUBVT-8gNvD ztlBt@H_TEEDpg*Rs*5LaIB}^`zn@L`hs&g=TRVf_>CV5GtqlC$;OH~U@@{*=H7n840%KRNo z_y-~XPxRnlxDo%x1pY(+Xz^d%i~r#?Ud1$J-7kc|%fg3OgkJt_UFZvuNsX-}ZwUdUYh<=|8wjfDB)OcjHz;+5nrz+e8KLsb%3eH@L zfz^_#Ws%iduDUksNE)IE3q>>P#S%1$rS1`^-Z&M5E6)z9O!T>d>#DiDsT7eR@Zqpof(Ynzat$+tw#|W+Cnh_VReR#V%t&SF7BJRl?v`%RH zE?V!veowT5?No261}%#;YnPB~(?RQgLhB@<^#Gyu;GAf+Nwf}lqZKSc>mkii7p;Td zXazmcdX&(5Of%x5b(1Grd~doZbI_XB^j);xIR{#Xj#i;sYZbyl>qmsvj|r`x5L!RI z3|jBzA6NE?V#QM$7O(>nTF(Y0Zd>7Jd0Su_30Z?s6tQc@E3>PvM$@R;P%b zL?}Xa|6$at@;!+ag;uLs%J@4Rnc9L3-^oRpB~m7!WaD4C{$3}2^3nX6k*4V=Tu{nRa zJ>og!#h>V(o}R~f@d7T07jaSiS>m*ebSkMq8kX1OMbeBRE-gN(YBo1P$FSfMt}I@i z!a&a@R2Sc=IqInxe65o{FG=A!d5O59&939YuIZ-l_YsFh>d~Eg8X)pk&kA^4)IuQO z9HWN+<78ARZ>A@QKp--O3b%Kc*`kzXOGuqv;T8@ci9_51keQp6nLaYY_kEB%c%Qc& z#+M|Dc7kMwTT7lxkwu@hc-YILc#Q*>R literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2BatteryLevel.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2BatteryLevel.class new file mode 100644 index 0000000000000000000000000000000000000000..62f702fe811dcc025325317f02068215f7daf9fd GIT binary patch literal 6281 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 E18Ir{`2YX_ literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2HeartRate$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2HeartRate$1.class new file mode 100644 index 0000000000000000000000000000000000000000..409967dd22371a0c66a8c3a81d0d6cb5f301449f GIT binary patch literal 252 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 literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2HeartRateFiltered$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2HeartRateFiltered$1.class new file mode 100644 index 0000000000000000000000000000000000000000..d45b433adc3e0c76b65a0681fda9781cd1ca9c33 GIT binary patch literal 276 zcmbV{!A=4}42J(IIIxniFF@kKvlD^%0tBK51JNhw&Nl0k$t;-}csLI}01rj%a`$4J z_D`GkYkIzX{{UFv-oO})3B_l3j7~PK7s6~ORpn*=Djf3%=f0gKO8vCw6BDNE;Cz?b z(7a3j>S}|6@Y2P`My@%!knDj|YENPhSCah;`1nkiyoDff<#j_6q3my1&!Mr~YA-Gm gmj6MQ4OhmS+^24y3c`;oXsVz%tV-0W~RYv-pj zR-s^XVSF~1UySFil$B3r3-M)6(~9`AJx`4Ias3!MR5oZPohjORJ2l|KjVVk-Zx2CS z3g?PTV%r^wqLqB|h_$SZCs_*n8iOAb*gXwdHpU2&utmE#rz6xI9h^ODtyuAlm0gTa z=Sn1oejA0dz(jOXeNRCW``-CQ%5N$Y%&t=cr-M0j2jU179A zvS@Wv-cIK7#83>#oxa!~Tus``#dI#q6j@ccF)@zKpS6=kt~{$S)>zUG4C}NFtlm%i z8w>R??Z43A?&UMx=+1KF0;|IcPc>%1*zIiGl1MLRtzs$9nEh1)S<6;($&Onq`CPoP zY$wwT>0~_NzA%v)V%OtIt6(2!X!Egg$7ugvDXVD3Z@_ODTOpFjmGViOb(enKvr#$T zCH2X~Aoj>GB16o?MSMZtz9_?&One#7n;5`{O?(AkHSslk-NZNWO#?5O_%>cN@REs_ z@rpuwb+t3`9emfs_waoa9}$2ZhziON*o8bs#Khg7nwZ5Ag#(S4P%g^~Bh~xeJdYH%RV&pd1Y1)>hVg6} ziK#;ek4y|G^weZ|g86>VVgnq+%-9)duvy3?w77iO$%u|lj5x*JR>g({n5e4 zH!x#Bi_jQDx3*&otfkT@y}(vlshKXEv@+=w2kC*kYwdHacOiWcZqb!a84{WmcDQxl z@B5<78xIfv!_IS>f~?a&Q|PM>m46>Lf`TSgp|=jGOQ^#3YLGhHDKw{SdwD9ie1TW4 zjr<#{<5}&L!lsnIgt&C^qA<;?lMYS7F3x1EMMfyZ$dHw8X}KQd<;EOYkPhtu@Rr%U zA|cS1&ISU&v@%onf>p|tQAalN(v70uEH{kI>8Q`xxutyWyj*2;IH)?frjhJKIcD`>fb$R!NLIJe1}UxVo`t>KRM(7J}U zx48Kl+Jm7v5ebQEN3CjT#8H(cpK6Dwh8)$fsCHgKSJkdzS5=m@YWEuMd<&hT8V=2g z%Rz|CyReDlFX+xM(Sz5p55K}g_%#yv4T^XjPvf_E0l(wF%UHvknwHIu>n<(8I)88t zlb8pH)Pdl20t5^^$p66p{S;)*_b(5x&`L0GFjf{@4agn!yhn-ckmeA#R}fTGx#H3#Gmj6{){X5i;uah73Qvz zxxIeoCSB%6HFNy=gZ&P3%)D~eI%#&9WCwHznmCX}l_993OLc8g?x;B-w(yU#~Ls zKR!bZ7f3N>CS3KsG*cXE(dxmum}ix9KL1O~-}iyER6r){vL(mI!*JO8z^C6_(VyCY zt&pFsN)maPnk^MTs|un^h0v?QH(_hKK3kz`wp6RnP>-#H_1Oy5vZZ=ps4YGakF6Oz z>{2dO&8dh^G4VXpY^iNNeUGg}IPB`5(Y3dnTj7!I`s{3pZTBjUFNzLZJIU64WNR1M zif_nPR9p5)eYV0iY>oO1_1Jo}K3m~BY)z7_DIbW(7Vndew`!bcL;A$UYv?_-j=N`v zoJ7BbNQ`ImHFUX0Yz=+oa=%&2gmybJ9c3A*Qx%!Jv`pBQ=`71gDW{B6zHi}`1g#XIIoUrzwV`MGqO0U3(tA9 z;24f;q>Ju3kTQN6#&v9|6eDF|^g7xq-z@K=!Njdj2CkDaLOdwL$J-}(H$UNUi8!B< zd0|p`Z&ljiC0`)Ij&bc^GnsRh_wgx#2*=hD^t!ln!X0I&Rk_L{%JO^?O2d4@g_$OZ zRK_Oh<$?M*!Wt!9hUD!r-SXt^lSB+?#8dSU)vY5+E2toH$J6`@;BlPM&rjigK6^Re V&oR!(CHRf@X8z6cTX+sF{|9dT<81%{ literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2HeartRateFiltered.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2HeartRateFiltered.class new file mode 100644 index 0000000000000000000000000000000000000000..8e1d0b7e8bdb69c300fc3cfde4af15682b5a2bdc GIT binary patch literal 5446 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 uq09Vwd? z5u?%g*&k(`-If=DFTJKWJ3G(L%sw-7fBt^|1>hE*rJ&)aL95$3&g!^h;1ur4*F9;u zpG2=gQYjCT=$D%lNt~84uj8SC9!w`ukn*vP8HU*GVwvH3$qy=az}I=;c%fbAVdyr6 zUElCMVV8V|N3QQJ27c3B7eSsue_339y|DD0A-=FYS6rf<^2}WEMPZoXjPk|n+}RK| zZw9_yrd5s0W5X+j(yJl`%)RL_Vxq~b4G}Wj$YeV`tIhc9f}yA6dg5iHwkCpQzE-6j zT{&HN$56U189o4VUhmD!UbrM~#3y#WK>+T@letmCDrOmSHf{O7}?Klao%h9qQ4(M2cRc zHrdf7r>KZV*>41ncMIMAApz7=_%z2M8Qf!M*`phykKU&d;y09iJK_psZmMk-A2kB^ALYf9?rjWUv zDa*B|ET^W7fZ>PQnqLjAi8mGvC2h2aj8hBSpvl_r&;m%3oj zwy^eII1!cX&i?*V7s>B~?Y8^gN$Hi&^&d?U#j8t_7{>NH-t}|zsr>XfeT7cZcPu_V zAnO5;q>?B}RUylOEEaHLP*z?dk-`wpf#E!97D@RSn_yqj^&7Fzq%mBecS6~8!e7Lt zHvTrc)UJ`%M!q5b8=Ay-{fD<`$84c+8N

T|+1taU3!F0s6@3&^8iZlzA^)ic;D+ zuH%}zLPlY-l*kB1+ldUR0D!g${b0%_k{Cm_jjR(z@>%==Z8e>YZ6mb>Ln+5JrI<=N z9#=|t;wRx^n>3WGYY)iI4@6t9)> ab>s-s1sgX=N;=0$KBB)t>mE#E3aNh$e3dr< literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneAcceleration$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneAcceleration$1.class new file mode 100644 index 0000000000000000000000000000000000000000..bc893cef7a10dd1786eafeaf4e152dd22d94d32e GIT binary patch literal 253 zcmb7PY~l!TS6j9^>8jcfQJ&NYgf+j=JDY1 z!Ms1u7l0)O36cbTLU!`^V0c?vCXA0)?|5YlTMoJ|y_;A1p$VgnGuFq_6??9){*oXg z%zY?S&=(zyi|VFhEFY|H4MP2ZrVGMw=NyN%l_p0*-msO`u26?_#il0A{z2vw5L)t1 WGi_N&>Yyv$K~HWf%A`Z$$kQ+BY(&Zc literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneAcceleration$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneAcceleration$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..aba00674f8bcd5fc2bb85e141a08fe02bd57fd4b GIT binary patch literal 6303 zcmbVRdvH`&8ULNl?%rg%h45&A0I`J>LINxawKN1#AcR&!L6Ty5__*1Fy>C z)LON)))&4NTHjXdqZV*%$g~w4A2U^F)cpc5{m%KmZ-<}1`q+5@8*ny(Ymk-Zh%~u6G$EhBN{mQzo6HsJ*c20(jgkyU zr5Q`$c8n)*6vqtQA#3lJ={rUAJ<{BjzyiG2!26_szs%e%&2h0`l!j7GxJw!?G~u|Y z-(%q31P3`8e89kc20oa;a(qa}A2#q210OYTLLpkp9I+Ktw}L63d+n5+8MD)z8s}dR z|BmwSm_mGWCYLE~QK)HIy^o69^Jyy1>CNQqn?{ce*oA&;Aj_F~z4?@t-DedtGS-vP z(r~7zU~C)BWYczmo86ep*@f*{t5~$Ta9wY{FqAAJrWeVP;e5_c?vZwD zDrINwf>p}obIsaJmqKUD%rxZ)v3zM*e7T~pWTkH1WsNw_5*&s0>dbbDxph@}(nW>{ z$dFy?cNkdEvby)MHD)EVR&FTSogXE5JfBf43v{-0udZqbA4;(?D?3VVjA5(jZbuRi zDAc90wpDOvuBQVtBw>y|g?D-8Xt#YcdTVcHZe??CE=o(cD9pbEjGk=XDiMn)jdHQG zrDw*TM(G7j#GS4AA^YujElbB$cJ8W-xk{8|U+K8Y&Ryk4Y(Orv!ul$K<4NKLJC!fU zBO@tS`gq?lp0Y>eit~Ehr*P?|*gbIAPL;UwF@+7)UC`!s=ZZ$g*VEtXXl|#!nJRZH zzt3uSl4ledZ&$FY+pudU8`bq?hH_SEv_K9f9Rt>gl^V8_)>t8*ERNWz%wQ&!?9(5- zq@+xrY@1cIH&?Z3*A~}F{~l?pWF;@LTeVGvL|=Zikg|I+5_}s1v2vXR6%$EpmgahC z)|>b^J|SP9l;%?=K8??sXu)a|pTkKLr*OZC2k?0VUo`P0eA&QPOnenzQ>dRBqD(x9 zubcP=9x~A?2HLPjtbCKH!IO1fu!(Qs+a}hEz&dHZgNGH?R14-}Jb0EX4@RL` zEcxNxN*?!)<|M6E#N@!IO&q{Mg=?$Xx*SavI;QS(`KzL^e5z8AduEWT9O5%E`nKP& zW7pPZg++l2+{deY#Ny*!;=Uz6GI~v(+s5GP<mbWWG;t@kc zA{tBchy*65XKZqMh9IYB6k@-W5)6veYUk)WjuiXa*6$&D4zaV2WCz;>SAbu^z^_^E z1Ewp7Yq8OhVRUtEsK=b$q1LvxokP5J0!B?o+xJmBiMmN7PNA)pbFAlZ`=4%S_6W57PjXOMxJ2e>jU*G09i=3#IU~ir^I$RdE$ltJtnnwLT`36(*Bp@(q3_ zw`nG~XeJfjNOs*<-BEef?lU|?`XkO|i&FxsKIBC!Y^AfV{vkwpITKXvIR%I!?6i@fq>Z+8c_NBoXgqE?Osi`W{++)1Vdi zqg4rAo=q36lSJzj(Yl{#J#ZPc`oqzR2he)Z=ctF)&EaUpL(qDJXr1;M@zB~Aik9R} z?_@4olRkY9t+!2smf=UM9Ibs3!bR&xMC->y>nB9(rB+~@wErAl*W2a>(NjpYGVVWw`8s@0;Hq+|waAf) zZg6GhmSrR-S7a7DGBGVPuPh_Umojeg)ab~>wM;`zcL>)8BA5p8G!5Z}}_NeDjQh&lp^*o+XFW|g-5f{{- z9h|PBPAvx$wB)y8rqgBFNyd)8ES9D`06=!{0qkcs)6`I7WRf|5M=$_zdd)55NaiqW}N^ literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneAcceleration.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneAcceleration.class new file mode 100644 index 0000000000000000000000000000000000000000..8b02b5a3b64272c4322cbc45fe068091f29c2455 GIT binary patch literal 5928 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 literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneCall$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneCall$1.class new file mode 100644 index 0000000000000000000000000000000000000000..f918287cbd8121328aa5bdfaf8d2c8a190bd86ff GIT binary patch literal 229 zcma)$O$x$54255`+FC_>1Q*4ngLs6Z;6fBU!PpM{VVEg1wTE-z0X&qLZd{v?JOb~1 z7h< zNS7NgTIqe=E71;7@dKng!s29%a+zj_@`Pky3N1}3F84;|9U=V(m8?M+@!Lai6%-osDB~J(;ya|wGLK!A0poC&cLQ*t5lcGF)TqZZk&|xN>Oj3~6 z`e@bqXlWIdVy&;1s?|a*fkJKTqgCq<7RF3`NynG@`4#RtuH!*|p3w1Cem!n4Vvb7ZC=dcIrO|aT&GM2)?x5(?gehDDGP*OHTU@esr^iVgnuk7?Gl(^Jx0J-} zQo%oACdWy0eZ(BIhoRu?5eUU8Xc@a_6%AalpIDaCHcE1ucRwm%*shx zkS}WTg1U^ml(JK7ui3krysj?lnJ$4{-TwWYas--7)R{9~#)_vigb}p0RH~H@Z#opW zMmZhR=6;aQ0y+jLtqV-u+uQaZu;N)V`HnzqX+c^VlbJ<3w2B-pZMVkA(cLB5=F(=V z%$()4LotCJr47(=EySVz#Bj>Yj%P^R$0X1kHRB^z)SSqqqhq61JTa7rNBh+e$|V#F zHG@ub%vxX4U>zH5r`+6wX4Z^O;VYR-Al#oG&%~{s1fOvg`9pLiAH)XUflb_O+>NscMX`I(_!N4>4kwBF^*5z8WPY46g z;yDA)1p!`;234dweAgBgfQOc0Hb4;L( z&E5Q0Ut9u93PHuIhDv~v9H9-Q_jld2Y0Ji?0`)~py`L8SL6f%eTzi+fJyqX$Bd#s} zdi8n8bP^a!Sjj=EuKYdxLtt@p%id|+SSn4(8C{kX+lDCfaY5olKVPyKiLqT~GBHRE z*BI!AH1AxVJ_h|)fWdxvcPNb`x#;Hv{DZ9xhB{BJ=j3u9xiRihA zEGfMbdL6y3p*KO#VB|^o&cc6MT6RzyrZ2#2(D6Ff(=Wre!wtBR-k4*f%^_ZepKZmK zNb6YyB9qX|+FGAN@Ek(t5I&C92=$fQ{gW`%r%B9s9ua{z$QM1Ru@Bk zZ8nrYxuDey_1REALu<~VwqR7hg7PN`ojHkFXHdgXzYPsAv`*rd<-H9kT%82XK7%?& z1Z;%Pi24GAt`PMSG3N~G8KK*VAR`(I5J81#kchcw(7=eGZ-4_)1`fndxI0y{f$EKcl6^Q$l{+kf`8*)T*ec43zPUSUc}q@1FqmTA@DDuiCR%68iZd&L_lm3 zy66)j8PGaAXeyu-K6DbVKo^ZR6M-xAqUq?Sf55tRu~niBm)WRXR?Xb@) zj$N6WB!80goF?q^i=nx&^CuUyDC`TS4?BO7&}qWHuplJ4urHJ#udpvFK;*){NFuz# zzPJF93;SY;m_F>H3c9F9gQ!7=s70rkg_}hkCd6#qA?DzyXuxSP7w5!$Di9Xnl30kp zh{d=pmWWxRQOpy|#0s%o^ol02RkXOmzAYd2Z4~w%ci1~s*n4wf7q|(V?XXi}l*sFVej#>lWYWY0WIznpQ?jmv2x*5Bahezss2U0_GBI0iihqr+bbmOtPfLR+vu zl3;%#!TwBwy*jO6tEFI;w_tjaU~jm*bOamn7R+|dL$J#v*jpsne_U*iV8a;k5UjzO zpA<~6$(jce|8gd3)s*nNID2rQ9^<6;IZmRN|pQ9-QzsDkkw*1rnO;GYsc@j>+y=V8W*)SQpQDu3*u#@W%Y3pA&lZy$$Cj` z-Y#N&7&ER=YOxE^UI-n%S5TRMr~clu{!%+N+tQc<*OBq=9`o+bUZE(HAKl!HS8b#} zs!Z7Nrwf>UfcYuxEd?6}zjZAhwPC72x2Qu3%r`P#JpRa8lsVThx!V+2R_s)F+gC6$ z#bJCHR3j425k=EYBxOVs;LDii&BM}@MV==>JY4y6-|fUm`;Zv#@M09DGxoR{X~d5Z kzlJ;UQThBB-bK#_>W`oi8z}s@(K}sz=>HYZ(p@I>KmWl^-v9sr literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneCall.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneCall.class new file mode 100644 index 0000000000000000000000000000000000000000..37a2781d45a1d48a32ba744b6cadbd1a4ebf23fd GIT binary patch literal 6931 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 literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneCallType.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneCallType.class new file mode 100644 index 0000000000000000000000000000000000000000..7c7322c5f19ce221450d44396af5464f9e94b0b5 GIT binary patch literal 1787 zcmb7EYjYY^7=BJz*k!w>k<>J#iP|+*aw%(V>m^_eQkr53#BPGabo_8aHe@@?!t5^0 zbR7SKpZpz4W*WziPCxsj9N%*wAu;*Tz;NFC{eAi8-#`Bba39Z-Q1GRWudt@#wu+pN zo5+jjYav!;CCvXGHB&$v9?vN zZZa%aIzh_{_&yJserR=h7`lDO>K=A{$J!Qek$c|G%dV3nyV~x~W=+~9w#v3$dc=^d z*UH7xR-s&BP#9U;Ul>vB{HxC_)_k)gQ6V~SBPF<`QD!V0{VdeQ% z(n$2V*K$}l9!^|b2%S&|zB|3De+NABad>-`z z@)XMm!DP#ciXM$@*iweM%rMtW+pXoB-Y8W5Od=(}*UrCvh3hmp-R|^)rt{bpy-S_j zlC0<+L;6|IkKDFXcSD!jQ1Jau#3Q%kQyrNL8xeM$rhDKvtpe@GrsF#SkDUFSfe*$0 z-!@Re7TLY+rW&||s(}@(8h9Tc7??%cz?^t)iDzCs3rMS|F)RqL7yGri&4bVhXgnu~ zQT8b@*={Ek-Yte-eljCE4Rg(OsEg*RDdtSnxt5IBA)SDbQM~NQy=6!DmX-HLis8%l zUdIc~wddx^jS~0d>)_IdUVPRH)uh|vfADY zry0>eAD&%3Sz_*t+UXgLErnOIo4LGs6t64V$FO?V@u{E7t#TXp=pXAQ{RgTWX)!Z^ zAdO8znw*3*JPB!jq?r~22Bzl3st_GV5+*(Z!y-{8LGjTCV6QOo2C?6WV)&Tegp{eI ze+Qq8^dDeCa`lw5{0HK1pa}hmbNU(L7(*>AVOh#)(@0B1yoVTlseb+N(If5$c8@6*&maU@z6$iLRSqfLMEOtP0=L^6R{RmNn9w9!tn>W14OD2qtnX|loco&STcwXqcCJfislrH2p-Sahbmk2Ro z=6tHWzG!c3P?ZiLzq6|9y!xd~7KFjhTK20_Y#azl4OXSLsXCksHdn&*Z(cG6p&?(? W)s%)@Ewn{j=*aHM#Nr`QB;7CZ9YK@; literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneGyroscope$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneGyroscope$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..eb60e55e272eda4a98fdbd3f2a7e0504382e6503 GIT binary patch literal 6243 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 An*aa+ literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneInteractionState.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneInteractionState.class new file mode 100644 index 0000000000000000000000000000000000000000..e524b6a8b132825ef870803a6364294a22618fb4 GIT binary patch literal 1787 zcmbVN-A@}w5dSUyIQw!X;3fpSByBIWHN^4d1JV{#im^?gaqOrEL{^lC<=B{u?6Y-u zMvAIF^|gOYYot&$YL(~wQB`NxCZ@$N;Vkd$%+AioZ)Wb^{qyJF0PdrfL=?+99^h*Y zH#B^s<0`(D%ZfZHBru~BRm^Gvvr_n70%=Lt639sUy@sNWX_OPFNV=)vA%kY`6l>*; z2E)B-$8TCbKj6OO1y+{_fqNvZ?qSCh))TpId!g{T6S^JG4tXdF42j)ZwO)EuDbv>8 z+TAJFpVk=S8}<5*lxcQptMa%w&oHa3^DcJ|g~gBjj%CxX&B=x~zgMj8R&0j*&n^-} z{D`-DB4Aj~E?me!wA48e4412}Cu+U+zVLVWev2fUvRr?`u$isCZ6CkqoxeSLBYUvIU6?& zY+;+>&WE2%WebUJA}m`?Ng&jzY^OnowHZCP!GnA4(hXShQBGCHg8zZ6bLbzMH& zi7LIq8MXJ*F}f+O(!H7Sz>&YMgpMJ1*6@2f<8Kw#@6t={D!m@#>uFgkfGAZlIq$NGxMTCBUws>pq1o7Y1@yJ~gqw5+LRSLJ1 zPL2Y(jr=f>IpqL|_M!bhWCICU$PG1rA*kfzyg{^)N<>bOJch2AOHsubiuov}m`TN4 zjw@zL`-?6``ZUfB@?_YJSRa#iBi_f9eGK*n(~T3PQXjv@m1Af!nE`f_Dn}hl&|u>d eg)m6s4&^WLxW1Q&`sgLni{5EKPZ5Yv#hgrp?Z!@2MP9!i|9+&aU|XNEtI zd4HZS02_=sILC+~yZU=jdS6-1Fuj!C>0@Qec2&!Vq|MGL>tp52Nw=jhI5LK%4@Lx8 z$e>&ljf}B+Xwh`H;zyXT872qkbl6(5=*W$iqmHr(dEnJU;*c literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneLight$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneLight$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..a83063915dc65ae25276d04ced1cde575dde4025 GIT binary patch literal 5055 zcmbVQU344O5&o{E^-9VT{}LSI2Amio%T9!yLPDInjqMl$$`6qV$7$Xx@N$twOFVotjvkbCRQTyIs>K8C_3_>Ssyde9GQK4+Ebp#6n{Ri4V5m5N0h zsdTZtkSd!wvz#qdQYBg@3sR-UV!=us<}uBd3@ZI`fw9Cjs<6>o(OKlvugf@Q_K^c- zNt#Dg2qXjIjWf>HU}uk01jy+H%bAr7_auhWr_3cYl{X6usp(>s2qIVXN=;xaF+CIv z+Q)>pWag_xyuN5w+;b>G#|2{9yk(Z%l~FqRS{ZIvc6;g2t_=09s58Bl&ibj|T9lAv z`~Gi&N z?OV=TCC4rnD6Go@R|fOY+$k&T(9RPABLP!sa8xE!X!$m>FkpB_$-)ys@oTpwFgE9Q zXn9m16Yz-fYl4nt?1h5qRLjKd+fvgknb}1vWiFMAsY=Pp+Vgfcl~FI0Kokh&#H3lV z_5?d^e8M%$51um}Gj#=Ea4>;*rdTa!tr?pOT)S6~w)1T^FoZjJ7~>&n;4Hq&Z{OqL zNdw=<4-E|B76U)Rj}80;PZ@X`Kh^P!fuG}99nTr~1%4^e(O4S{{0h$-cmcmQa4Q3B zMS@X&Lq>SA@)8+1hu<3b9bOc;CD2Vb@Dg683+VyX6I@`BA^iO9r3f9V7Pvjs#n``B z45V>DU|XOwYgLQNcjEz9kG{a>My2McQf&@q2_?CnnYw%5fxUwQy-mrOp|m`0(q+5R zy$OCU)E-}!oz1&fcSPR$wt3si=cx5*GyEbjkQh3#h8crWgpAQ;sXsJNg^4?b7rJ^c zG3?4wGjHc;;GVFf**@2L1?huO6^uJagn1<E^uLYjBTjVUOG*v7;DloB@f8#AYYhDsqmy=ys(M64On!XNX zXfl>FlQ$PALJ^7#vC_kx$)mj1yW;cQ#5@4{REjQf2u$by3jn2+k+bH_YQBc5zIFU@ z@UuJaH%o<)aysENc6PB`Jj35(GWRw#((IzqXW;;Sl2RBDMu?SM**j+e2G-V9d`+c7F-s9d@jA_+~(t|o_9 z(Ux3+9v&P11ELoYyMXvP3@2%Aox8pQLv5|#x=*ow1??Zw;Vb9}M`l?h!m6Fks*y2Q zmA8DVova#hRW(-ax`6J6Q#GZ^TT-=W1=oLwE>_hdv+Qyh?DBT3qw#fe=MD7YP27pM z@HM=R4Bml*ckvkB!!!6j{X35pd?0Dr;JU780aoc3!zdB+WkTvi_%Z>6blgt=f!(`F zn0k%kZA9^QQE|`iOXfB-yB}6Q@Rra0CgyHvR;@9|TRzn$=6cs=j<*6Zcaf6iBl^K| z3FG)9Ch;-u$0u0Ar+6HH!n61@-p5~X0e|%|cd^dgMPhEJpSelJ+%CzSpm6MVnWN0B zWv!cL=ZWl)3}G8d0H3$WSV2bZQTitlp^yXpoSDS=R!PmqlTl-qG6=`Nm^g7SIfx0YMl*cN$rHYT@t6~`Avm#qzZ${T$*+x|?sJTV1gg^w-M$ z1}PKS;mUN@WVlY%Wp0o%nv&_N$#5wr8MlD<4xdk7!lq-?b#D4Z#;i)k=1Z!WZ=#z4 zu^&-!4@ShjI4sg|!~yz2e-LNHA?er6BpXEm2W8kxo2Lvk*?;qm^ literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneLight.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneLight.class new file mode 100644 index 0000000000000000000000000000000000000000..3eec3ad2d218bba1d19941179ff980b10a5587b1 GIT binary patch literal 5103 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 literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneMagneticField.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneMagneticField.class new file mode 100644 index 0000000000000000000000000000000000000000..8628c2732a5ca5c96d51e5b77112fb041ae5a7bc GIT binary patch literal 5915 zcmbVQ*>@Xf75|Mbdn84+v$~0$ri$ZGTXC#rX*P#8UK6KD6Kuz+lNOjrV|x;5B&3mJ zC#006?6gpzP_`Bd7|NC=O`Oym;JFX{2|V%2;lMdOzyt8RGb3p-mg6WoXTD{=``!Dy z%XjZL`ryCs{{g@rEQYWRm&0hsY#2?Llj#*{u7YxrJ2^amMZ9VFa7n6(;xhO-D})A+J9{DWN*8IjVCg>skoNa z64QEIo5^M3qa3BR9t8o*Nb6)oX5j%no6{4Tr6(0^8Y!5vG;ZXL3n{(VG&7cFQ7$1h zpSY;aXz`S0PQ}Z6$Sfi|M)ZVk%m@!)fA7Qs<@iNjmL8V`GCuYwRQRWwp9 z#|k!d40n16PhGgECoJNvpA_J9mNLvB8@05=rIT9LwL)#Sz^%<4!%KGxocbAwMebd@ zbe*oH+%Y@s*3(TDfUEf;!G;P(69IL$0Q%5nRSvo)cW?PkfHco3Sa*-CqCEm6=i+*= z9A{0$$kqvVB$AG^bIy!i*winV&gMZk-X1t0+TE=*bhe|qSSoFGLi}Mw)@7_|Nh$ju zQnG^SDna)=JlKZIk`o4JnHNkg#nj~biYdbh)>8$G;n*V%tIgPP=>(OZfIb_XP3T!W zjj4Ex2`k48Qs%tT&w1D^GOjU99u*&7XIVk;a3bYqj__!vkW1)8hUAk+mL`I333mmK z^}HE5pVbq_q>+gCGCv>HSpp;x_e9W*cm#dukKo7nNd!+|R|HQ=^EQ4O!9MJd;D9s- zrTH0tF3r4xc7MtjzHU-4S%LYWPfJD(GpWytkYBLM_|GE`S^1THG!#53%&QJOk?>1t z-jU{45gbB~ieE?Y8~j$q?;^O4cOy8A4@YnVH&whB!7bcYv7q2lzcx+|Yd@{!SQVLY z+=24Ht8La?R&P7h#!{BaCEL2%Of4<*rM__2@~n$OKoQ+Vox0tG-fbsz5+*YVlCVT+ z(aBsU9p(9n?%Ao$8u@72PV||y&H(Kushv0TZHLZZEsB=1$ORWz($3E%o=JViNa#_a zVHr5b@_vHoaBzO%dSTGu^Hib-uHX4GA3aBgL;vt?G3Qg2GI9IcE*)K*78iORE% z${m0H{n)+e=Bnc}w;Z1<)$zGm14s@;gwPhJH=x2L`vp9QsTNhhE&AS}bcu2QmfNvrW0R}O| znQT7F_6Wysqn1p`L^j8E+(zv!1Y%uwUl-eX8}+xK#x@1)K`^$d&K`uyVzxl#_8kb& zwh`>adfIn0F>R-PyJ<%e|CA%b6)%XNz%d(AoVGqj!18V%h6zSS2RI7Yqk|mPk@9%S zF5R4owne*mmEGe}Hc(Rb8JysbBiwVH{6*Gy>pN_LXY7`|*l*(_F(Q#5Ug?j$hrk_# zud}and-V=h$vo)xA?X(pnONJffW|*^SFLS&$0qw2gZpWf1B|MJ^zk90>mioIHp*rP zNy#STIEiP8^Ax!RQQxl0kMq;`h>QL&j1Gc1K!Bvn7U<9L7UsMf2ZEuiYh+2-}jH~NzE{m6gMK5sd_4J4>!U^kO$+bKRaPf4g7}Di{4ciOnsm1diM}$f^LwL>(P6ZPc;n>08gOjKT=iIVz>ilq0gp*zY z&UpfM;&?avqIK+;^ue(z!g&E7Em^0gY#lk^emK_%=f!2=4BO&ARuPVUG< literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneRelativeLocation$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneRelativeLocation$1.class new file mode 100644 index 0000000000000000000000000000000000000000..8f7e52c1e00f7e50e0a211c4d26e21c734a11cbc GIT binary patch literal 265 zcmb7(3EHK~NMuL9JmNDXp}lhjZZpJd~K(yD=eo1m61~ z@6YoEV2*BrBteIe9{oKSUKN%JgZ;%jKCsng@!*X&qTY?K`k@K^r8CyY!sS~oFaDe$ zCCq%tRnTW0jEm}~W0at}RT%XXHkuN8Yv(vDthhN6vWl;)cDdS}u53!ezy1feFc XRaKXUTn#iu8)(UH%cSBVQDp5eeauPM literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneRelativeLocation$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneRelativeLocation$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..25447a473e027f273b1586981ba3dc48e82b0d0f GIT binary patch literal 9147 zcmbtaeRNdC6~FgwcHd@sgph=88wtsmly?18bn@RRD zyq!1qcki9w+_`h-oxJ(U3oin|eE59=&VswS`3g7p6hke1H35xqFE?M~cV922W^V#Y z;6Co&&&@Xy@J)Ci0pEfLZFq>s9_H8kSo9HY9<|{yetw&q?{M>Y0w%+EZFqv8`}xh2 z+))W36^m+f%3rRhx>n@?{f z6!+E3qFi^XkF+iCPo>2KoYg%&UUo&A9QSBo(Ma=I$Ftht@e~F;e{wZS6-}+_+A0j@0Xd6Rz{Vqak#8u6MevwkCUN^a!bY5~=$RBlS*p7;1DGtGgw_tnq^FE(`X4`H)y^O=sMk;!Mjl z*R_6T9<(+&8{HTF1j&baSf+b47u{3HU^GrMX_vVwPB8x`Vbsrrn7iL0>E(V#OOU+o z5F+R}0uywj+c<3@oHKIVg>DBTGM4p{nJnRvw%Y__SFhZi^m;i{)8>DSjs%3EyMFDq z9bPg=gNG5$8!=`>P1np7xyagmHo1QC`*<$7zUvgM`ic2eEOPF&cF!Gci-u0O=~N9C zx2L*#++2T_mgl%o;`X}9Zm-cD$YvV*dc9<7dn(yTAtZiKR-)BZvs~`>d5cflaMKd$ ztZApy&AE+3bf1!5ghYF$Kb!PgQ+yg%hEjDFpDYeE!-d?matz?<-v13!mfI8?Ebf^*

75v(PMJ&+7&0=oehIbIo9>G{BB@X-s z-bE$5&=&_=Y|SFBpOW?2owOKGA?rU{cFHO3oSr7m-H^f`&t72BTj z(w$TvMqBv@!pyokn+v#6BSgpex)M*y zSoA!DG*AjAt)HXb0_q_>@ilkq_)jTCjT zND)KF=R=F;Nhl8)(D4i{lF%qa%Y@0<@hD6h#!g&8c}PGf55kngFp;5g2`v>KSNhm9gK5%$ z0CWA-oh1;3j+rFT?k63;qKyw@PuVH5soE0X$I#sS02USGa&e z8DSOqH3^DOkb{;DtLYD5(cDFg7Bx3F6NCyE73c4(IImKBg{CJXeQJIfMAUNdkf5YM zq)*F-`jO5<1~f0yrx%Fy=>ilM=`-?;`C-FDhOxXzpP3K!V}^$eXkMhB=0}Xq1Af5p zkboA7^jSVOB+_}z0Ea|+O$gfen#T-uNTkmWLHmyLn1L=B>0OjQyP*eWp@I$=aD#JUhO1#U6^r|4zt0>YxZ$|oZ73pn8q$8|>i)5tJ zIpUuRGL0XgEn^`YSMvOOju!B+p`%`U@ z#MYa{)?1^nb!j+TMR{z!YdEUe+7!-KQ3zXqBDVf)DA8UhG#MW(w63tdmC|g`->zPTm?lth5txUkyR>jsdk-ey7H|Wyki`FXndJx804?%_X zFjQOn48EoXDQp_0Fv(YMz?VM4#RVXbu>GOF?g|K7sB&0>PsY-)-FOh<)*(YnBFJ6Y zP{#Ofq30$UJ7(ZDV||4fvrWcy$)>eR#$F-DUM0p}BgS4Ig|S=##_~7h+o8Vp7ho)G zNB)5rd*9Ha85;;?jPFx=Zj!OT8FH>^~?8-)7G$9jJGG+UrR23aUhVEC>g+NRRRQO8xN);%X zA!KYNGr^bPTSy=?Q^>@X%tT*??;0c{uSTZ{nNr_a<$kE}lZYWTOG^3XssbrxPwJ|X zQoh0JKx&A^*$oHUjzPmF`lfTnOGGu$wR=6(Q(9O`1=s=@OLuyQmS-%S5h;Onk#Vpq zQVRD)#>4ZGGWcVp93znmoD-RVYaaW!1amlE7S-?sL^b;81C zl|uMR{vMQ{pyEtk$=d*JXgdMpf9d_mX4gK*}s-Hug8?5ldX6zG%0mlc?^KG(z1`Xdn0-|j@JP+;-d zgT7qI?{*{#H^I$-Ld`8oO$#aE`&x{@;L(N}dfSsu@T!qSpeIIp`11+ByOlIrLgQ^= x8u8O>-sYNHdlVr+fW;-*R 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 P4lrbl_+r)&Gm_{FyRA9u literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneSms$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneSms$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..94859dcb676260c0a0e765ebe8ce9948095e1ec4 GIT binary patch literal 8680 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 literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneSms.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneSms.class new file mode 100644 index 0000000000000000000000000000000000000000..569287344017502bf4a3a918821ecfc9afdcc33a GIT binary patch literal 7810 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 literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneSmsUnread$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneSmsUnread$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..fa3bb62595be3de7466068bbdb89f255215d9e66 GIT binary patch literal 5159 zcmbVQTXY*&72Q|TcqC=&XW}}J33Y0SEGJfM6DN&>A-0p&t(}C(3FHBEERF3+Wl4-A z$EB2p_p2=}K7X_3~OjN;=k}^zkHrT+y+vLfcvi<}1wuu8)e;ah0tUaHu~L@3W~BuprL1F_>EwKpmS+W8j@ntfI4KZ}4W1*# z>0Fu=+ve=7b+WX&XgLe!Vuofq=W;1CbIx>Z{#KKr;)-1m(5FgvCT%&i*=#mzInx=l zP_SrWY%b?4Cmb_vI;m_Sk*8_0B9ULoWv#?%9+Rtuv(lgeg)t#89=i`UHeSmWSJ;XN zl0`H1)V!IOW)dv|!%bjLFxF7xHcU`dh=gUUxFA{I9vhsyY_6G!jG0|d%;ZW$7`dev z$^zrDnZd^4eavWUW~M~J&{xcYyB9_60tGddu}sIEIY_(T59@8pelJzpl)=6kwXZkR zQQ6s>GYH8Is?4$-chNDMEn3T#Lwpzn?-Lu3&EB8k1{vkUX_XfFCbUJ)PJ#W+5JUF0 zI94j>kfI>QclaWDd_865i*_zcfnOK6JKU!hFI%Z1tvn}ipoyd#7?EigSU*6PHW9!P zvNYAqKIL=P)E;~y0_!6J7n|5>qUkLnNqaeK7E2B>enV=Tc{8uBRUPE5My`8P30Pi#K6@1me*YI@%-@x-aUNrDcyrko01K+|c0`1im z#=y7n9RuIR_YAzB0rn!sDBl<8@MP8TGjI(*Fz`eCNMNwxYGL5Vc$NI};3`K!V1Qx# zY#yVSohfCx{Zz!*%bysS!@R&q!~2#ipulMLCil(>fj!kqwQ;6;-?%k&4D{smW5?%@ z4G8qqq-l~8cGaX~xywB(eooXHAE!gLtM_(B)`*rR+sdS=y=o`;MW8=6cyS9e2BZiX zqs!KDYKcl2cONf=mHuSdg>z=cPSe0WW~|me*Lnr%gHSb(J5h+a71*n4t>5=$i>?NA zdLMP4GbBi5@}~lQ)$#G~Lv^?y2^HwA1F8rWc(@v*&UOOfv}NU|bNQzQCb#l$qK;>^ zQv%!4va>6?s1eW5%|nJJX%$ao%w>vDh$2I*baQX>DEE3`*v=L`0J@Ha*Ej@b@%{op zX=S9XC9{+%qmFLnrHZ28EEPt|>6p*hg%u}vh3|Ya_qwZTb^}1y&wjf4QWy|KfD0I1 zlmlFcg)jX0KqOWoK67&qmZy>Y@?F}ipkH#pifJ%*ySFxYo3|9`r7?Cnm zJY5VChbCn=<3pQhiEls;jt>0};hTuuMD!Yl;xxC-o!@|=mNxLfyJ+1&+ncoc2HJz6 z1r`ahYDcYVXw+5ZC7)^stA<=vja55uqN{3GO{wydRNcOT9dDwORkhFpyBq|&JdABL z{+!(T1$yur9>Fj1Vf+e7{2E2Pj%V;2yole@zw6k*4M|J4>$;)^*rZ=3BSg#x2&n_X zI|LBWaghE4M~;v%bsojrKE>ND#XY+(nd`1~Kd5}*C7=5>%sp7ET4s)ye5y6f^=!=? zFEzm2ElQTR=!em5OyKvJ!rM5Dcd&+c@htv;m+(itfj{9U{_JD!R)x7+#M~i2b5n}B z!;(2c;W*+lN10d7S~tzE6WIY7!WNPM{#qwv1sQcz>0d&KLJstCW)kOnB{e(adwsd+ zVRn)<@HhIU_;+;SALQUaeGc?h9O%Ob>7>z36_fao+G#{ts&ldh$6l{8^j|(hbp<3S zWsWKJLu4j96p`w|g}7&xdp`e7l>f&E5~+Yp)n$v1kB8y1^i*0c}AV~cK%uD4>6&Ib31tGCg6eiOUqhTKHIhG?A5 z=4r_SNK`Emtna;8dmvWME3wY1a^|{;FeV)3`d*6{U zD^am|k1FQ7>15E~RuC4CW1n~er^OtKVxIm;a1vL{&Hm)}rZH;q8C__jWfmGb1mIT^#C?aCD+*E~V6xnqAgX>WW!RW%yQ52PD+mdO;%) z!Q!J@$<(r{t>q*fn<^V(YF4-Og}gRo7)4vPX_u5*Ca$R~YAUZ9OR0(u!4#n}rDZjJ zMPS6rhN-E!%*6~1q)BLQDm^_mMM8-!g!E!+RJF^6Ia9YalUVZ9*wE-M!c#+CyCA}M2}ioqJt5J_g=<>YCZoDVUCZaV6%83%&AxI` zEqUvUl*&|V=}vFe5@hODM3hmldFwnkjW(y9fI7?#*oL-j`2t6_afvVxbqsKKJg7=I zHF>&~5rs0YkDVAhvdLz}D+(1uVl83IzLYQ>H?-@)X?w zSodoxTC|r%VtD#}Sd{ScK8OyyKY|U{#c3W}<%u@bJd=v&c^-B*5GTtv!_A5ENYRNq zH)yH_xHn^~S*_$GAQ|6dsu7u`f_$_ZIc@mBHM+rLP=)JGOQ=7a&3k7)o+*~itTwKT zOmJxP5$+eEEW!0yIFDK-Evql;+0+oT>UoWcTcpnc1$}rz!8v?H!T0e41^q}VEIfSt z5N|6ujb{}62tO8&pGfGcPR|0(OTfXpdAf(yTtYW;+Nyy5DJw$t36t8EKt%B$9yn;LUos8crcn5!w@ka?A)oXF{ zQP(BaWc^|S@m{3cH#_YcC9U&JCyP$e%yss48froGH~Zcjw^+TzB;ou0we)*wx8F&- z6wDQ~6mfHUqPUn~T1XT$%Tkv#i=IpHys%j)uJTQ_6U*v~mQam^Tc;ANqITKpCytXG zt0-td;W$tl^gX=;X@zp=?ZWPSCPfG|(7yO~Z zEyCq5d)9I5w}hTO2Pg~gu5{>OhSRWW@f@GrqqK+X2i8ODdDkiC2j`eEO{FJ82lRj& z7tTe@xkQXI!*DMu1L79s6u8MnQJY7%Es`w0;c>r2358Hi&Df@HEIGOJ$$g~qu2YUm zc0Ve9b=yasajjh0hn0bSqo3Gya~YXT+i_kK#*8d4eat`pRjj(iY`rg1Vpum+^M*dM;W^g&F6P0Xxo9fEIrkSvGmVd zttg%nhWAL)M-B&NaFJ}Oc8P!gjFv>kXD$d^@q>2DGJ?x_+twoM&GpRkv+6iM+9W&< z8Lc>pZoc>Mldc9yeps>Q@?8?emLpH{9XQ2b9mk$x%bU`UGpxwl>a>c|N8MIY?btRW zhBFu-)>-!2*^0l~yO7q{O879J!X9vtPhJ4{6p|^nVl0#9{iWoqihR zXwn7pj1ZFE8g&eJ&^x1~CB{x;j3yaDgTI&5AW`4A^ve(#V0r~41RJagyw35H>(haiNG&I`nbk9 zx#M1ZG~UIbWbXqUeh)_?sM-~29u3keeN7DDh%0elmdp>Kk($F(5kUhw>#+`zH~uxh}RiSkM0i9%ssp Lu@rp;ZzA@8)NTTU literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneStepCount$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneStepCount$1.class new file mode 100644 index 0000000000000000000000000000000000000000..9d9e5d661e8803e83e8ad9a4e659cde686e5b0b4 GIT binary patch literal 244 zcma)%O$x$54256(YpsF>FW|zB2oB;AM8Sn9^aNuY`a_v1Gu6Yn@Bki4OqcFVNFIUr zKFIs?d;!>D5+DdLCPaz7yOfV*&4l^2u!fVCo4vi8c2ntxCd>{dt*tLje&)8YS%8SJ zwk}srXWFI4t44cYK3FwfUj0&*Tf+2Y47+_THui+L1FKq_TwQJzr!8UiH!og*(33B^ W>Pthe0fwRjjAVy0k$6ZHargz!-9b_S literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneStepCount$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneStepCount$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..18daa5334bc469f877509077a30efcaa7d5b7079 GIT binary patch literal 5139 zcmbVQTXb8+72PB0`bx?rekI0n+<;TJk>$jS?ZydlY8u-K7@S8V6PiaU*V46pgCeQY zm19aNp}hK}(0BTv?MF*j%Yu*vc0#&<1zr8<2j6}C_8Wft)%2XXBi$QGUXikrHFIa? zoIU64bLPy*fB)Y*?*bUb@1p3#Biww2n@1z)ff>bi%yX0CxpagYD~gR+;Nc=SOHtT3 z7sX@9=s3@7S)R_ZXr7y|MzIM69YyXPMzy%1wH{vULrKSSlm?IT;DU}79gjz`4PWE& z6FR=G<4GOg5C}Q;c}qY{3mE))!b(~8vXvIlijI{p($b7T%KqG0GtX3^b?qIOy!lFC?S!JXMdyWbA$t;&8cO%w!#F(JBxZVS-j7W3idrGdN7fD2%AILJhQe&PIV<%@9F0wG^yW zu0V={7~brQ;Gvb2m3Qo1mIA#ZaC3N%&7ZSU4y`;Tu)B#Q>mQbB7FgL$mNpTvVX`#U z%s%CF)zlt*0s7+ zgHntFq#T+wi`Ie0cO0K^>=NHXSo@6KHdQ0?}lyR7hEeZ7z|WH&?VFt^o!HFviUY zH*o_O@ic#ZlbdG@Jd5WI^y4!IUck2ud>h{}@LhaQ$BPDjfR}WU-nX&@s@HQ}-V_aGh?Tz;X7rt);`yI1?huOHIHwe5OXWAL)BWp?~4{a1?cqN z=l0ViNM-W30=?Do@$W-*xF`t~=&1v$2o?BrHAtQ9=$=Vi{JzLPE-Du2!$vz#7Y<6X&&Xid(X}~9soVR!pj^2)49C>P+A#j zYr!mK%BUmjd8wl4H%o<)aysTSc5bPVyTETenR{K;G`j(yr)D2Lb14i6BESWV9>oE! zL$aq*MExe3p_)fhgEShWk)S>tzk<*jv^S;XPHLmH0xC5+UcoN`=2#@e zs_nI^p%GV=mwc-2tQvAvHCFAoiq5KCHKoc+QgzcRHouJyR@Fjt>~aw7@(?yq`+IWd z59r3LxCej47w{(}@n<-A4Nu^8yofjG-({@giln8>bzRW{tkJKKVIt;pgw&4U4FU-0 z*hBw;{rgFnZXU(kPQ}|b#XY+(nd_=`Kd5}*C7=5>%-vb5T4s)ye5y6fb+6AHFEzm2 zHAnu#JhM1?_nA5<4Jsgm+&Fp#9wh0fAcYSt-{nby z{DXcK{u7<}7diNEp98%W2YT^&I%)J$#RTqEI}IyKbxyY6=xbGm{>Nviu7Cuk%t58T zm&{~`B2qm#7x%1k&*#TP`6oV*NCjlFE?azjJPenu|N8X975%Ao*b4dCsw9zzDcKSM zY!pFsiV%8)b_=$q>$4TAW=m}J8S1fhs6JbvTDC+tbg{(;;<0rY_bJM`s<{=>Ehe64 zk}a{_r|+?KKW3EvSy_9_xuuP4m1k#5e5+S+d{K1S+DUBfBDRKzt;D))#iV5q)Mrbp zVQZhyP>-z#>$9cRVQZ4un(~2oY|+cn^;S&K+2DKP;&t?#TEo`aK{wGaAsVN%`6@cq z5nDxXx!iY2nb4>!(_WV0I#rRmQ_5&crlTywrJQ8k0^U7%dGfjN>pq< zrHc7BIvMo06okbC*eM>waWM-=9HBo79K{83O!{><$%c`|QCWB{AcA8!E|D&(bHHW% zH1r$TQYl74$G#hAt&FL>?+YdyofJ2SF@o5`%@^Aa(kuLg%Ow)jbLMG8;oVhfhnIbU z&|Kr%K$pp!Qoe_J4ulq8L(sd$-4pIAyH}M`W>G57Cm|%v!wP1aK)5ot@Le9LkHf5y zgkp%l9+Foce|?D%0}}C6Jw(wsB3}g+MB4E*jRH7>v$Fp(c2nO&^L^ANC~`>}qb*E- K$ooE?L*)M*1CS*E literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneStepCount.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneStepCount.class new file mode 100644 index 0000000000000000000000000000000000000000..2b9d857df7af281b51259e619e9aa35513ea8c4b GIT binary patch literal 5186 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 B^wR(U literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUsageEvent$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUsageEvent$1.class new file mode 100644 index 0000000000000000000000000000000000000000..7d1653160f0bf8532f46c169f6535ed331573bbf GIT binary patch literal 247 zcma)%OA5k35Jao}O^kwBcmNl!L>$B;h=L1I5DzdWO^k#YnTa`^3lHF-#Lm{0-BcF^ z#e;r-o-Y6^3>1_?pAeti!>7D0N+yhtS7-SgOwOB{ZMC?W+7Lz?o0cvVHs5n~b(um; zm^+_qZ!+Uk8}!|TP}HpN4M6{3rc1(bXD$16DLoE^q#^6l*jyhjH%=?U?0;Y~0ih+2 XG}D%aqz<~`9rWZzqF6d4jwJd5y$C`} literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUsageEvent$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUsageEvent$Builder.class new file mode 100644 index 0000000000000000000000000000000000000000..a6461b1fd553bedfaa2a99d91700662a1a80938b GIT binary patch literal 7328 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 M`c?6}_$JE#57~TI*8l(j literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUsageEvent.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUsageEvent.class new file mode 100644 index 0000000000000000000000000000000000000000..87234a8f605650d985efd9b2b5bd7d83a8bc6482 GIT binary patch literal 6900 zcmbVR>30*?6~AN49!ZvMLV(zYgh80ZmK`Zj0>LJ<-Vp(d+Qx)XnvSKhJw%>SMGuM~(we3i19`bvREh$L{UtS@Qw)K&6%|93 z^OK5ERCVoKdQc$Ylt7IGx>hu0&773;C8h3PFTAtzpPQe&ft}+6Cx_1TwF}g8S~q4= zazW0{Dk*v1&{N~+&B?t2g-mr$0V6Pr4k`sh$;zgZ6R35pr18?ET2!a^9t{xql02h~$}D2LZ`ZhKsM-wgU~x0Lv0&5e z^bdy>GdnwB!SnAO)Jp(_y%A+z(aed30+@GM8X9s=HnLhVRexCq2eGm2@s&Ni?>Z5^F! zM3jv`pyvR-`LwDjqouhi#h8$xn?Uu)RZTTd2vpnAImxEevv9l&_hZ?i37NAhoYB3W z=4V;|vibn{T8GaKjw#ojaa`r2Sv%wM;V9dj4_K=RY~`A%7JY$scBDIff-+N=m8=QS z_0y`7&%s?n8u31EBCO8H1;-Axg%Y;z>PWBM$x`a)`B-4DKZZQcBIMd3wgZmxg|!=G zV$mhoS;2BFpw1EiFFLHs@!#z1EzfXxob?}y)l$7<(S)6==vE1L$XGZF9awdQSm^4R zmH>_KT(tyRy^3IGvPdahDIrrjVgR^gYvSYn4Ek`Jy=3Z7Tswr2z%y(pc;ejY` zclIH0F0U)L+CKZlR?)QDCIo_R&T^hUyq>Dnw@+;aYw!PwvGEG0wV|s>ZJL}%nsVCD zLo^(t_h>OjPtm~`J2xX3p>=2jhH=B6vAoaCpSbyRjGm2S7OsMN|a53jRs=d?lUBI$7Y$3WPa53lb}NNYlC@W%GIw)q;esUQjgd%9 z3P})KH$ySrbMd+>nQIU%IJk0FBKNrFlzBC)NKAv8X|4dbN#`a8q>f@|GJd0b6%#jY zZ^R6$bHQV5%+*&9c}zVE7Ok2H^IV`=(VcXrdg6A-0H9+Whmpj_mh@=}iAT!IB@ICJH*-COznt}eBG__y>Ddgn^sc7nk(k-zN zNu8GDGPzomP)kaAwTNTMPAzF%)kvl;O)1he7kx^OU7J&;j}K?YhDOFR=SBxH-`_XzoHrQAj1H$qFgt!SGd3}BZUWu( zDC*q4fr)fx6r<71=urHU7ez1t-&mGv7B*?h&`UG3CWnxvK72TXDb4cJ6bhH}NK;ha zyvk9wfE$-?#OMKigxWNiN4(rT?j&hnsm)nxWz&1?id&$><`W~{5;nwxGmkXZFBfs+ zJh4e?2eX^c0xutdMA&{%pogvN0XJ$ota{7w8yQcwo=vDaxQH}PVd(FAK1`A2rtwKQ7&b*EZ((ncl8A861U>9M?g1Pl3z5Dl4b~ ztE`|ftg?b?vC0Zc$cig%T!aBh8`oWUworuns2|7%FxrDBe?qrOxP_-cgJ>B&(KfWG zUC}aS3QwM`ODt2(hv?M!NcYnSW@0u0ouo8Iy!jMb-uwa8l89$FZ%%aGquM13CAzI= zUE;|ls!z0rmPkyr)-6#u(OSPmk+O_9g|RnDA%Nf_dIwC}3S;kusSm)+T`)4sKWWQw zam$aR*%hEXZ6^Otp0PJiINzx;;xDOdLQ-a9rE-(O=qx! z^9NZX&l$;kPI>w`BczcnO zPFGx{{T2=UzDO|Sj&|i_aF^;iZ}?4f&4;DVGtKAeMQ8H~P_t?36I}>}AdpuOS+Dwl)O&WRhh2_Z zcKJd@AYu^6>lJ~>m4S#sAa4T5TN?nG@*L#1NH_@O?TSFMo_AJRBpd|tE`YpO6^I=v zIfQ>OPjjvaxaMX>Ak#Ec$u+(VY=`VU09mdIu(M{NH`xqx2HxLCpf^s&Uv6~gHGR}r)9*7wlNX^)NI+i%8Us66n3ooVnwn}(`Pesm?3-zxuB>7ormNlseaf+SVuf~JSf)MOAH7G9-63Ix z_Flm4zD&{`+POme>_PkvwXkH{Ax+laW@@f^miE*PVYFZ=ea$Oou4BwMRvXqH$CI{& T@h{YVWa0?^U-}vSf+GI|=1#8k literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUserInteraction$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUserInteraction$1.class new file mode 100644 index 0000000000000000000000000000000000000000..18b65aaeb693137521f35ef259db26c21a87c54f GIT binary patch literal 262 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 JU&2=q|1X<`gDwC7 literal 0 HcmV?d00001 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/UsageEventType.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/UsageEventType.class new file mode 100644 index 0000000000000000000000000000000000000000..4f5cba8ff08a10c309b0d2287c18f6aac13a4a18 GIT binary patch literal 1864 zcmb7EZBrUo6n?I}?6Pi+C2E7wB;C>$)Iv2$U&I&*L8T#(vcL?J>4z0>a5JzlyNfev zr+=V-qTli2~5d@LZu!RQ- z;tIAk#PCooJK`p*Vo@V0!6Ow*;xMOTS;)sKZV8!Jaa+h;6?cT(Q&7+_kD`jFLY5Si z8MNJUCBIiG*Gi8WR*PM?m3FN|%WXPdx@UQweazFnqpri#HP34C{4sa@>Z=~lkm;jr z?#Y>HI9D$17WNoabH7}v=4w@j=|ZWRuVi!8Lb=2cER{=n2F1+n=bvWd3^!ynt7kQj zc-lI4yJ?el9gAEm@p`sc%bN^q&##nI_}FUqxyO)7B(G)}%ykbr!?mLA@KV2Xz}>2K z(54ebx-7q7c$g@@w2rNG+j3fI(|2vBl}TPHy=bx9wAyvcwT16dfS_Y_C{FaEbB6Gi z?b!Y{!@?!83&}c_)jzW7y%E!HIhNmd$x|R9E@oQX&$X$A!>TeYCWgsgT5)x&*&c;@ zFp)^!>36oS@WgE~7iPEbHub_H*k#(G|Z~1oDp_e2s zjD^?ZP5Xu2OlN6G_PE1c%jbs~9Ulp9#C1Hww+zYuJ-a%RsOU%`t>Z%&Iu>zL$C6l< z#d1q5x5aV?HxlS}zxgK|^O=lau;81$9?A#L}HW+^X!SIPO#-_okn#P(T z`c3G3Wk%;7(Lr2Nz|xiO|MosS7gU`R;XoDq_?6NDrr z2x)xxqmC+SG%w@X7F}luHQU5{hB=y>@m=}gC2#uF=KGTqDPNqKP ACTIVE_SOURCES; + private static final Map MONITOR_SOURCES; + private static final Map PASSIVE_SOURCES; + + static { + try { + ACTIVE_SOURCES = initActiveSources(); + MONITOR_SOURCES = initMonitorSources(); + PASSIVE_SOURCES = initPassiveSources(); + } catch (IOException exc) { + throw new ExceptionInInitializerError(exc); + } + } + + private static Map initActiveSources() + throws IOException { + Map map = new HashMap<>(); + + Path baseFolder = BASE_PATH.resolve(NameFolder.ACTIVE.getName()); + + for (QuestionnaireType questionnaire : QuestionnaireType.values()) { + if (questionnaire.name().equals(QuestionnaireType.UNKNOWN.name())) { + continue; + } + + map.put(questionnaire, new YamlConfigLoader().load(new File( + baseFolder.resolve(questionnaire.name().toLowerCase().concat( + YAML_EXTENSION)).toUri()), QuestionnaireSource.class)); + } + + return map; + } + + private static Map initMonitorSources() throws IOException { + Map map = new HashMap<>(); + + Path baseFolder = BASE_PATH.resolve(NameFolder.MONITOR.getName()); + + for (MonitorSourceType source : MonitorSourceType.values()) { + if (source.name().equals(MonitorSourceType.UNKNOWN.name())) { + continue; + } + + map.put(source, new YamlConfigLoader().load(new File( + baseFolder.resolve(source.name().toLowerCase().concat(YAML_EXTENSION)).toUri()), + MonitorSource.class)); + } + + return map; + } + + private static Map initPassiveSources() throws IOException { + Map map = new HashMap<>(); + + Path baseFolder = BASE_PATH.resolve(NameFolder.PASSIVE.getName()); + + for (PassiveSourceType source : PassiveSourceType.values()) { + if (source.name().equals(PassiveSourceType.UNKNOWN.name())) { + continue; + } + + map.put(source, new YamlConfigLoader().load(new File( + baseFolder.resolve(source.name().toLowerCase().concat(YAML_EXTENSION)).toUri()), + PassiveSource.class)); + } + + return map; + } + + public static Map getActiveSources() { + return ACTIVE_SOURCES; + } + + public static Map getMonitorSources() { + return MONITOR_SOURCES; + } + + public static Map getPassiveSources() { + return PASSIVE_SOURCES; + } +} diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Source.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Source.java new file mode 100644 index 00000000..1b965818 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Source.java @@ -0,0 +1,37 @@ +package org.radarcns.specifications.util; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * TODO. + */ +public abstract class Source { + + private final String name; + + /** + * TODO. + * @param name TODO + */ + public Source(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/ActiveSource.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/ActiveSource.java new file mode 100644 index 00000000..440c8f3e --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/ActiveSource.java @@ -0,0 +1,73 @@ +package org.radarcns.specifications.util.active; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.radarcns.specifications.util.Source; + +/** + * TODO. + */ +public abstract class ActiveSource extends Source { + + private final String topicName; + + private final String keyClass; + + private final String valueClass; + + private final String doc; + + /** + * TODO. + * @param name TODO + * @param topicName TODO + * @param keyClass TODO + * @param valueClass TODO + * @param description TODO + */ + @JsonCreator + public ActiveSource( + @JsonProperty("name") String name, + @JsonProperty("topic_name") String topicName, + @JsonProperty("key_class") String keyClass, + @JsonProperty("value_class") String valueClass, + @JsonProperty("doc") String description) { + super(name); + this.topicName = topicName; + this.keyClass = keyClass; + this.valueClass = valueClass; + this.doc = description; + } + + public String getTopicName() { + return topicName; + } + + public String getKeyClass() { + return keyClass; + } + + public String getValueClass() { + return valueClass; + } + + public String getDoc() { + return doc; + } +} diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/Question.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/Question.java new file mode 100644 index 00000000..e60878e8 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/Question.java @@ -0,0 +1,70 @@ +package org.radarcns.specifications.util.active; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; + +/** + * TODO. + */ +public class Question { + + private final String lead; + + private final String content; + + private final String widget; + + private final List responses; + + /** + * TODO. + * @param lead TODO + * @param content TODO + * @param widget TODO + * @param responses TODO + */ + @JsonCreator + public Question( + @JsonProperty("lead") String lead, + @JsonProperty("content") String content, + @JsonProperty("widget") String widget, + @JsonProperty("responses") List responses) { + this.lead = lead; + this.content = content; + this.widget = widget; + this.responses = responses; + } + + public String getLead() { + return lead; + } + + public String getContent() { + return content; + } + + public String getWidget() { + return widget; + } + + public List getResponses() { + return responses; + } +} diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/QuestionnaireSource.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/QuestionnaireSource.java new file mode 100644 index 00000000..666b39b3 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/QuestionnaireSource.java @@ -0,0 +1,60 @@ +package org.radarcns.specifications.util.active; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; +import org.radarcns.active.questionnaire.QuestionnaireType; +import org.radarcns.catalogue.ActiveSourceType; + +/** + * TODO. + */ +public class QuestionnaireSource extends ActiveSource { + + private QuestionnaireType name; + + private ActiveSourceType assestmentType; + + private List questions; + + /** + * TODO. + * @param topicName TODO + * @param keyClass TODO + * @param valueClass TODO + * @param description TODO + * @param name TODO + * @param assessmentType TODO + * @param questions TODO + */ + @JsonCreator + public QuestionnaireSource( + @JsonProperty("name") QuestionnaireType name, + @JsonProperty("assessment_type") ActiveSourceType assessmentType, + @JsonProperty("description") String description, + @JsonProperty("topic_name") String topicName, + @JsonProperty("key_class") String keyClass, + @JsonProperty("value_class") String valueClass, + @JsonProperty("questions") List questions) { + super(name.name(), topicName, keyClass, valueClass, description); + this.name = name; + this.assestmentType = assessmentType; + this.questions = questions; + } +} diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/Response.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/Response.java new file mode 100644 index 00000000..e2e0f08c --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/Response.java @@ -0,0 +1,50 @@ +package org.radarcns.specifications.util.active; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * TODO. + */ +public class Response { + + private final String text; + private final Integer score; + + /** + * TODO. + * @param text TODO + * @param score TODO + */ + @JsonCreator + public Response( + @JsonProperty("text") String text, + @JsonProperty("score") Integer score) { + this.text = text; + this.score = score; + } + + public String getText() { + return text; + } + + public Integer getScore() { + return score; + } +} diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/MonitorSource.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/MonitorSource.java new file mode 100644 index 00000000..8be39267 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/MonitorSource.java @@ -0,0 +1,129 @@ +package org.radarcns.specifications.util.passive; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.radarcns.catalogue.DataType; +import org.radarcns.catalogue.MonitorSourceType; +import org.radarcns.catalogue.Unit; +import org.radarcns.specifications.util.Source; + +/** + * TODO. + */ +public class MonitorSource extends Source { + + private final MonitorSourceType name; + + private final String appProvider; + + private final String doc; + + private final double sampleRate; + + private final Unit unit; + + private final DataType dataType; + + private final String topicName; + + private final String keyClass; + + private final String valueClass; + + private final String aggregatorClass; + + /** + * TODO. + * + * @param name TODO + * @param appProvider TODO + * @param doc TODO + * @param sampleRate TODO + * @param unit TODO + * @param dataType TODO + * @param topicName TODO + * @param keyClass TODO + * @param valueClass TODO + * @param aggregatorClass TODO + */ + @JsonCreator + public MonitorSource( + @JsonProperty("name") MonitorSourceType name, + @JsonProperty("app_provider") String appProvider, + @JsonProperty("doc") String doc, + @JsonProperty("sample_rate") double sampleRate, + @JsonProperty("unit") Unit unit, + @JsonProperty("data_type") DataType dataType, + @JsonProperty("topic_name") String topicName, + @JsonProperty("key_class") String keyClass, + @JsonProperty("value_class") String valueClass, + @JsonProperty("aggregator_class") String aggregatorClass) { + super(name.name()); + this.name = name; + this.appProvider = appProvider; + this.doc = doc; + this.sampleRate = sampleRate; + this.unit = unit; + this.dataType = dataType; + this.topicName = topicName; + this.keyClass = keyClass; + this.valueClass = valueClass; + this.aggregatorClass = aggregatorClass; + } + + public MonitorSourceType getType() { + return name; + } + + public String getAppProvider() { + return appProvider; + } + + public String getDoc() { + return doc; + } + + public double getSampleRate() { + return sampleRate; + } + + public Unit getUnit() { + return unit; + } + + public DataType getDataType() { + return dataType; + } + + public String getTopicName() { + return topicName; + } + + public String getKeyClass() { + return keyClass; + } + + public String getValueClass() { + return valueClass; + } + + public String getAggregatorClass() { + return aggregatorClass; + } +} diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/PassiveSource.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/PassiveSource.java new file mode 100644 index 00000000..d17a68ea --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/PassiveSource.java @@ -0,0 +1,81 @@ +package org.radarcns.specifications.util.passive; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; +import org.radarcns.specifications.util.Source; + +/** + * TODO. + */ +public class PassiveSource extends Source { + + private final String vendor; + + private final String model; + + private final String appProvider; + + private final List sensors; + + private final List processors; + + /** + * TODO. + * @param vendor TODO + * @param model TODO + * @param appProvider TODO + * @param sensors TODO + * @param processors TODO + */ + @JsonCreator + public PassiveSource( + @JsonProperty("vendor") String vendor, + @JsonProperty("model") String model, + @JsonProperty("app_provider") String appProvider, + @JsonProperty("sensors") List sensors, + @JsonProperty("processors") List processors) { + super(vendor.concat("_").concat(model)); + this.vendor = vendor; + this.model = model; + this.appProvider = appProvider; + this.sensors = sensors; + this.processors = processors; + } + + public String getVendor() { + return vendor; + } + + public String getModel() { + return model; + } + + public String getAppProvider() { + return appProvider; + } + + public List getSensors() { + return sensors; + } + + public List getProcessors() { + return processors; + } +} diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/Processor.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/Processor.java new file mode 100644 index 00000000..11680f4e --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/Processor.java @@ -0,0 +1,86 @@ +package org.radarcns.specifications.util.passive; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.radarcns.catalogue.DataType; +import org.radarcns.catalogue.SensorName; +import org.radarcns.catalogue.Unit; + +/** + * TODO. + */ +public class Processor { + + private final SensorName name; + + private final String doc; + + private final double sampleRate; + + private final Unit unit; + + private final DataType dataType; + + private final String inputTopicName; + + private final String inputKeyClass; + + private final String inputValueClass; + + private final String outputTopicName; + + private final String aggregatorClass; + + /** + * TODO. + * @param name TODO + * @param doc TODO + * @param sampleRate TODO + * @param unit TODO + * @param dataType TODO + * @param inputTopicName TODO + * @param inputKeyClass TODO + * @param inputValueClass TODO + * @param outputTopicName TODO + * @param aggregatorClass TODO + */ + @JsonCreator + public Processor( + @JsonProperty("name") SensorName name, + @JsonProperty("doc") String doc, + @JsonProperty("sample_rate") double sampleRate, + @JsonProperty("unit") Unit unit, + @JsonProperty("data_type") DataType dataType, + @JsonProperty("input_topic_name") String inputTopicName, + @JsonProperty("input_key_class") String inputKeyClass, + @JsonProperty("input_value_class") String inputValueClass, + @JsonProperty("output_topic_name") String outputTopicName, + @JsonProperty("aggregator_class") String aggregatorClass) { + this.name = name; + this.doc = doc; + this.sampleRate = sampleRate; + this.unit = unit; + this.dataType = dataType; + this.inputTopicName = inputTopicName; + this.inputKeyClass = inputKeyClass; + this.inputValueClass = inputValueClass; + this.outputTopicName = outputTopicName; + this.aggregatorClass = aggregatorClass; + } +} diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/Sensor.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/Sensor.java new file mode 100644 index 00000000..5cce3336 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/Sensor.java @@ -0,0 +1,126 @@ +package org.radarcns.specifications.util.passive; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.radarcns.catalogue.DataType; +import org.radarcns.catalogue.SensorName; +import org.radarcns.catalogue.Unit; + +/** + * TODO. + */ +public class Sensor { + + private final SensorName name; + + private final String appProvider; + + private final String doc; + + private final double sampleRate; + + private final Unit unit; + + private final DataType dataType; + + private final String topicName; + + private final String keyClass; + + private final String valueClass; + + private final String aggregatorClass; + + /** + * TODO. + * @param name TODO + * @param appProvider TODO + * @param doc TODO + * @param sampleRate TODO + * @param unit TODO + * @param dataType TODO + * @param topicName TODO + * @param keyClass TODO + * @param valueClass TODO + * @param aggregatorClass TODO + */ + @JsonCreator + public Sensor( + @JsonProperty("name") SensorName name, + @JsonProperty("app_provider") String appProvider, + @JsonProperty("doc") String doc, + @JsonProperty("sample_rate") double sampleRate, + @JsonProperty("unit") Unit unit, + @JsonProperty("data_type") DataType dataType, + @JsonProperty("topic_name") String topicName, + @JsonProperty("key_class") String keyClass, + @JsonProperty("value_class") String valueClass, + @JsonProperty("aggregator_class") String aggregatorClass) { + this.name = name; + this.appProvider = appProvider; + this.doc = doc; + this.sampleRate = sampleRate; + this.unit = unit; + this.dataType = dataType; + this.topicName = topicName; + this.keyClass = keyClass; + this.valueClass = valueClass; + this.aggregatorClass = aggregatorClass; + } + + public SensorName getName() { + return name; + } + + public String getAppProvider() { + return appProvider; + } + + public String getDoc() { + return doc; + } + + public double getSampleRate() { + return sampleRate; + } + + public Unit getUnit() { + return unit; + } + + public DataType getDataType() { + return dataType; + } + + public String getTopicName() { + return topicName; + } + + public String getKeyClass() { + return keyClass; + } + + public String getValueClass() { + return valueClass; + } + + public String getAggregatorClass() { + return aggregatorClass; + } +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueTest.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueTest.java new file mode 100644 index 00000000..82efd863 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueTest.java @@ -0,0 +1,61 @@ +package org.radarcns.specifications; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertTrue; +import static org.radarcns.specifications.SourceCatalogue.getActiveSources; +import static org.radarcns.specifications.SourceCatalogue.getMonitorSources; +import static org.radarcns.specifications.SourceCatalogue.getPassiveSources; + +import java.util.List; +import org.apache.kafka.common.errors.InvalidTopicException; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import scala.MatchError; + +/** + * TODO. + */ +public class SourceCatalogueTest { + + private static final Logger LOGGER = LoggerFactory.getLogger(SourceCatalogueTest.class); + + @Test + public void validateTopicName() { + assertTrue(getActiveSources().values().stream().allMatch(source -> + validateTopicName(source.getName(), source.getTopicName()))); + + assertTrue(getMonitorSources().values().stream().allMatch(source -> + validateTopicName(source.getName(), source.getTopicName()))); + + assertTrue(getPassiveSources().values().stream() + .map(passiveSource -> passiveSource.getSensors()) + .flatMap(List::stream).allMatch(sensor -> + validateTopicName(sensor.getName().name(), sensor.getTopicName()))); + } + + private static boolean validateTopicName(String origin, String topicName) { + try { + kafka.common.Topic.validate(topicName); + return true; + } catch (InvalidTopicException | MatchError exc) { + LOGGER.error("Topic {} in {} is invalid", topicName, origin); + return false; + } + } +} diff --git a/java-sdk/radar-schemas-validator/build.gradle b/java-sdk/radar-schemas-validator/build.gradle index 4150d36b..7821e884 100644 --- a/java-sdk/radar-schemas-validator/build.gradle +++ b/java-sdk/radar-schemas-validator/build.gradle @@ -35,6 +35,32 @@ dependencies { testCompile group: 'org.radarcns', name: 'radar-commons', version: radarCommonsVersion } +//---------------------------------------------------------------------------// +// Exchange configuration with Java code // +//---------------------------------------------------------------------------// +ext.exchnageConfigPath = 'src/test/resources/gradle.properties' +task exchangeConfig() { + doLast { + if (file(exchnageConfigPath).createNewFile()) { + file(exchnageConfigPath).write("project.group=${project.group}") + } else { + throw new GradleException("File for exchanginf configuration between Gradle and Java cannot be created. Error while managing file at ${exchnageConfigPath}") + } + } +} +compileJava.dependsOn exchangeConfig + +task cleanExchangeConfig() { + doLast { + if (file(exchnageConfigPath).exists()) { + if (!file(exchnageConfigPath).delete()) { + throw new GradleException("File at ${exchnageConfigPath} cannot be delated.") + } + } + } +} +clean.dependsOn cleanExchangeConfig + //---------------------------------------------------------------------------// // Test definition // //---------------------------------------------------------------------------// diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java index de3173ad..89030934 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java @@ -17,8 +17,8 @@ */ import java.io.IOException; -import org.radarcns.validator.CatalogValidator.CommonsFolder; -import org.radarcns.validator.CatalogValidator.NameFolder; +import org.radarcns.validator.SchemaCatalogValidator.CommonsFolder; +import org.radarcns.validator.SchemaCatalogValidator.NameFolder; import org.radarcns.validator.util.AvroValidator; /** @@ -36,6 +36,7 @@ private CommonsValidator() { */ public static void validateAll() throws IOException { active(); + catalogue(); kafka(); monitor(); passive(); @@ -48,8 +49,15 @@ public static void validateAll() throws IOException { * @throws IOException TODO */ public static void active() throws IOException { - AvroValidator.analiseFiles(CommonsFolder.ACTIVE.getFolder(), NameFolder.ACTIVE, - null); + AvroValidator.analiseFiles(CommonsFolder.ACTIVE.getFolder(), NameFolder.ACTIVE); + } + + /** + * TODO. + * @throws IOException TODO + */ + public static void catalogue() throws IOException { + AvroValidator.analiseFiles(CommonsFolder.CATALOGUE.getFolder(), NameFolder.CATALOGUE); } /** @@ -57,8 +65,7 @@ public static void active() throws IOException { * @throws IOException TODO */ public static void kafka() throws IOException { - AvroValidator.analiseFiles(CommonsFolder.KAFKA.getFolder(), NameFolder.KAFKA, - null); + AvroValidator.analiseFiles(CommonsFolder.KAFKA.getFolder(), NameFolder.KAFKA); } /** @@ -66,8 +73,7 @@ public static void kafka() throws IOException { * @throws IOException TODO */ public static void monitor() throws IOException { - AvroValidator.analiseFiles(CommonsFolder.MONITOR.getFolder(), NameFolder.MONITOR, - null); + AvroValidator.analiseFiles(CommonsFolder.MONITOR.getFolder(), NameFolder.MONITOR); } /** @@ -75,7 +81,6 @@ public static void monitor() throws IOException { * @throws IOException TODO */ public static void passive() throws IOException { - AvroValidator.analiseFiles(CommonsFolder.PASSIVE.getFolder(), NameFolder.PASSIVE, - null); + AvroValidator.analiseFiles(CommonsFolder.PASSIVE.getFolder(), NameFolder.PASSIVE); } } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CatalogValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaCatalogValidator.java similarity index 93% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CatalogValidator.java rename to java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaCatalogValidator.java index c0b73dd6..66cd79fd 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CatalogValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaCatalogValidator.java @@ -48,17 +48,17 @@ * At moment, the {@code restapi} does not have a well defined structure. * TODO. */ -public class CatalogValidator { +public class SchemaCatalogValidator { /** Folder names. */ public enum NameFolder { ACTIVE("active"), + CATALOGUE("catalogue"), COMMONS("commons"), KAFKA("kafka"), MONITOR("monitor"), PASSIVE("passive"), - RESTAPI("restapi"), - SCHEMAS("schemas"), + REST_API("restapi"), SPECIFICATIONS("specifications"); private final String name; @@ -79,7 +79,7 @@ public enum RootPath { NameFolder.COMMONS.getName())), REST_API(Paths.get( new File(".").toURI()).getParent().getParent().getParent().resolve( - NameFolder.RESTAPI.getName())), + NameFolder.REST_API.getName())), SPECIFICATIONS(Paths.get( new File(".").toURI()).getParent().getParent().getParent().resolve( NameFolder.SPECIFICATIONS.getName())); @@ -115,6 +115,8 @@ public File getFolder() { /** Commons folders. */ public enum CommonsFolder { ACTIVE(new File(RootPath.COMMONS.getPath().resolve(NameFolder.ACTIVE.getName()).toUri())), + CATALOGUE(new File(RootPath.COMMONS.getPath().resolve( + NameFolder.CATALOGUE.getName()).toUri())), KAFKA(new File(RootPath.COMMONS.getPath().resolve(NameFolder.KAFKA.getName()).toUri())), MONITOR(new File(RootPath.COMMONS.getPath().resolve(NameFolder.MONITOR.getName()).toUri())), PASSIVE(new File(RootPath.COMMONS.getPath().resolve(NameFolder.PASSIVE.getName()).toUri())); @@ -137,9 +139,7 @@ public enum SpecificationFolder { MONITOR(new File(RootPath.SPECIFICATIONS.getPath().resolve( NameFolder.MONITOR.getName()).toUri())), PASSIVE(new File(RootPath.SPECIFICATIONS.getPath().resolve( - NameFolder.PASSIVE.getName()).toUri())), - SCHEMAS(new File(RootPath.SPECIFICATIONS.getPath().resolve( - NameFolder.SCHEMAS.getName()).toUri())); + NameFolder.PASSIVE.getName()).toUri())); private final File folder; diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java index fbaf2cf3..3fb77c24 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java @@ -22,7 +22,8 @@ import java.io.IOException; import org.apache.avro.Schema; import org.apache.avro.Schema.Parser; -import org.radarcns.validator.CatalogValidator.NameFolder; +import org.radarcns.validator.SchemaCatalogValidator.NameFolder; +import org.radarcns.validator.SchemaCatalogValidator.RootPath; import org.radarcns.validator.config.SkipConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -41,10 +42,13 @@ private AvroValidator() { * TODO. * @param file TODO. * @param packageName TODO. - * @param parentName TODO. * @throws IOException TODO. */ - public static void analiseFiles(File file, NameFolder packageName, String parentName) + public static void analiseFiles(File file, NameFolder packageName) throws IOException { + analiseFiles(file, packageName, null); + } + + private static void analiseFiles(File file, NameFolder packageName, String parentName) throws IOException { if (file.isDirectory()) { for (File son : file.listFiles()) { @@ -63,11 +67,13 @@ public static void analiseFiles(File file, NameFolder packageName, String parent ValidationResult result; if (SkipConfig.contains(schema)) { - result = SchemaValidator.validate(schema, file.toPath(), packageName, parentName, + result = SchemaValidator.validate(schema, file.toPath(), packageName, + isFirstLevel(file) ? null : parentName, SkipConfig.isNameRecordEnable(schema), SkipConfig.skippedNameFieldCheck(schema)); } else { - result = SchemaValidator.validate(schema, file.toPath(), packageName, parentName); + result = SchemaValidator.validate(schema, file.toPath(), packageName, + isFirstLevel(file) ? null : parentName); } assertTrue(getMessage(result), result.isValid()); @@ -76,6 +82,16 @@ public static void analiseFiles(File file, NameFolder packageName, String parent } } + private static boolean isFirstLevel(File file) { + for (RootPath root : RootPath.values()) { + if (root.getPath().equals(file.getParentFile().getParentFile().toPath())) { + return true; + } + } + + return false; + } + private static String getMessage(ValidationResult result) { StringBuilder messageBuilder = new StringBuilder(200); result.getReason().ifPresent(s -> messageBuilder.append(s)); diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java index 056d23c2..819a2964 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java @@ -34,7 +34,7 @@ import org.apache.avro.Schema; import org.apache.avro.Schema.Field; import org.apache.avro.Schema.Type; -import org.radarcns.validator.CatalogValidator.NameFolder; +import org.radarcns.validator.SchemaCatalogValidator.NameFolder; import org.radarcns.validator.config.SkipConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -85,7 +85,6 @@ public static ValidationResult validate(Schema schema, Path pathToSchema, NameFo Objects.requireNonNull(schema); Objects.requireNonNull(pathToSchema); Objects.requireNonNull(root); - Objects.requireNonNull(subfolder); CACHE.put(schema.getFullName(), schema); @@ -100,14 +99,18 @@ public static ValidationResult validate(Schema schema, Path pathToSchema, NameFo result = getActiveValidator(pathToSchema, root, subfolder, skipRecordName, skipFieldName).apply(schema); break; - case MONITOR: - result = getMonitorValidator(pathToSchema, root, subfolder, skipRecordName, - skipFieldName).apply(schema); + case CATALOGUE: + result = getGeneralRecordValidator(pathToSchema, root, subfolder, + skipRecordName, skipFieldName).apply(schema); break; case KAFKA: result = getGeneralRecordValidator(pathToSchema, root, subfolder, skipRecordName, skipFieldName).apply(schema); break; + case MONITOR: + result = getMonitorValidator(pathToSchema, root, subfolder, skipRecordName, + skipFieldName).apply(schema); + break; case PASSIVE: result = getPassiveValidator(pathToSchema, root, subfolder, skipRecordName, skipFieldName).apply(schema); diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java index 0342410b..b6dc5981 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java @@ -16,6 +16,7 @@ import static org.radarcns.validator.util.ValidationResult.invalid; import static org.radarcns.validator.util.ValidationResult.valid; import static org.radarcns.validator.util.ValidationSupport.extractEnumerationFields; +import static org.radarcns.validator.util.ValidationSupport.getNamespace; import static org.radarcns.validator.util.ValidationSupport.getRecordName; import java.nio.file.Path; @@ -28,7 +29,7 @@ import java.util.stream.Stream; import org.apache.avro.Schema; import org.apache.avro.Schema.Type; -import org.radarcns.validator.CatalogValidator.NameFolder; +import org.radarcns.validator.SchemaCatalogValidator.NameFolder; /* @@ -54,8 +55,6 @@ //TODO split in record and enumerator. interface SchemaValidatorRole extends Function { - String NAME_SPACE = "org.radarcns"; - String TIME = "time"; String TIME_RECEIVED = "timeReceived"; String TIME_COMPLETED = "timeCompleted"; @@ -149,8 +148,7 @@ public String getMessage() { * @return TODO */ static SchemaValidatorRole validateNameSpace(NameFolder rootFolder, String subFolder) { - String expected = NAME_SPACE.concat(".").concat( - rootFolder.getName()).concat(".").concat(subFolder); + String expected = getNamespace(rootFolder, subFolder); return schema -> Objects.nonNull(schema.getNamespace()) && schema.getNamespace() .matches(NAMESPACE_REGEX) diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java index 55939b1a..bc43eed9 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java @@ -19,8 +19,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.radarcns.validator.CatalogValidator.NameFolder.ACTIVE; -import static org.radarcns.validator.CatalogValidator.NameFolder.MONITOR; +import static org.radarcns.validator.SchemaCatalogValidator.NameFolder.ACTIVE; +import static org.radarcns.validator.SchemaCatalogValidator.NameFolder.MONITOR; import static org.radarcns.validator.util.SchemaValidatorRole.ENUMERATION_SYMBOL_REGEX; import static org.radarcns.validator.util.SchemaValidatorRole.FIELD_NAME_REGEX; import static org.radarcns.validator.util.SchemaValidatorRole.NAMESPACE_REGEX; diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java index 860642ac..3e2febfd 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java @@ -19,8 +19,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.radarcns.validator.CatalogValidator.NameFolder.KAFKA; -import static org.radarcns.validator.CatalogValidator.NameFolder.MONITOR; +import static org.radarcns.validator.SchemaCatalogValidator.NameFolder.KAFKA; +import static org.radarcns.validator.SchemaCatalogValidator.NameFolder.MONITOR; import static org.radarcns.validator.util.SchemaValidator.analyseCollision; import static org.radarcns.validator.util.SchemaValidator.getPath; import static org.radarcns.validator.util.SchemaValidator.resetCollision; diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java index 45399460..de900ff9 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java @@ -18,21 +18,28 @@ import static org.radarcns.validator.util.SchemaValidatorRole.UNKNOWN; +import java.io.IOException; import java.nio.file.Path; import java.util.LinkedList; import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.Properties; import org.apache.avro.JsonProperties; import org.apache.avro.Schema; import org.apache.avro.Schema.Field; import org.apache.avro.Schema.Type; +import org.radarcns.validator.SchemaCatalogValidator.NameFolder; /** * TODO. */ final class ValidationSupport { + private static final String GRADLE_PROPERTIES = "gradle.properties"; + private static final String PROPERTY_VALUE = "project.group"; + private static String projectGroup; + static final ValidationResult VALID = new ValidationResult() { public boolean isValid() { return true; @@ -52,6 +59,42 @@ static ValidationResult getValid() { return VALID; } + /** + * TODO. + * @return TODO + */ + public static String getProjectGroup() { + if (Objects.isNull(projectGroup)) { + try { + Properties prop = new Properties(); + prop.load(ValidationSupport.class.getClassLoader().getResourceAsStream( + GRADLE_PROPERTIES)); + projectGroup = prop.getProperty(PROPERTY_VALUE); + } catch (IOException exc) { + throw new IllegalStateException(PROPERTY_VALUE.concat( + " cannot be extracted from ").concat(GRADLE_PROPERTIES), exc); + } + } + + return projectGroup; + } + + /** + * TODO. + * @param rootFolder TODO + * @param subFolder TODO + * @return TODO + */ + public static String getNamespace(NameFolder rootFolder, String subFolder) { + String expected = getProjectGroup().concat(".").concat(rootFolder.getName()); + + if (!Objects.isNull(subFolder)) { + expected = expected.concat(".").concat(subFolder); + } + + return expected; + } + /** * TODO. * @param path TODO diff --git a/restapi/header/header.avsc b/restapi/header/header.avsc index 7ce00816..50b4d0f9 100644 --- a/restapi/header/header.avsc +++ b/restapi/header/header.avsc @@ -6,7 +6,7 @@ "fields": [ { "name": "subjectId", "type": "string", "doc": "Subject identifier." }, { "name": "sourceId", "type": "string", "doc": "Source identifier." }, - { "name": "source", "type": ["org.radarcns.catalogue.ActiveSource", "org.radarcns.catalogue.PassiveSource"], "doc": "Source information, it can be a device or assessment name." }, + { "name": "source", "type": ["org.radarcns.catalogue.ActiveSourceType", "org.radarcns.catalogue.PassiveSourceType"], "doc": "Source information, it can be a device or assessment name." }, { "name": "type", "type": ["org.radarcns.catalogue.SensorName", "org.radarcns.active.questionnaire.QuestionnaireType"], "doc": "Report the sensor name or specific type of assessment." }, { "name": "descriptiveStatistic", "type": "DescriptiveStatistic", "doc": "Statical value expressed by samples." }, { "name": "unit", "type": "org.radarcns.catalogue.Unit", "doc": "Unit used by the source." }, diff --git a/restapi/source/source.avsc b/restapi/source/source.avsc index 69a1211b..e6336a58 100644 --- a/restapi/source/source.avsc +++ b/restapi/source/source.avsc @@ -5,7 +5,7 @@ "doc": "Source details", "fields": [ {"name": "id", "type": "string", "doc": "Source identifier" }, - {"name": "type", "type": "org.radarcns.catalogue.PassiveSource", "doc": "Source name" }, + {"name": "type", "type": "org.radarcns.catalogue.PassiveSourceType", "doc": "Source name" }, {"name": "summary", "type": ["null", "SourceSummary"], "default": null, "doc": "Source details" } ] } diff --git a/restapi/spec/source_specification.avsc b/restapi/spec/source_specification.avsc index 612a7078..bbad0145 100644 --- a/restapi/spec/source_specification.avsc +++ b/restapi/spec/source_specification.avsc @@ -4,7 +4,7 @@ "name": "SourceSpecification", "doc": "Source specification", "fields": [ - {"name": "name", "type": "org.radarcns.catalogue.PassiveSource", "doc": "Source name"}, + {"name": "name", "type": "org.radarcns.catalogue.PassiveSourceType", "doc": "Source name"}, {"name": "sensors", "type": {"type": "map", "values": "SensorSpecification" }, "doc": "Specifications of on board sensors. It is a map where the key is the String conversion of a SensorType"} ] } diff --git a/specifications/active/esm.yml b/specifications/active/esm.yml new file mode 100644 index 00000000..5db0f6d7 --- /dev/null +++ b/specifications/active/esm.yml @@ -0,0 +1,14 @@ +#=============================== Experience Sampling Method (ESM) =================================# +name: ESM +assessment_type: QUESTIONNAIRE +doc: Experience Sampling Method (ESM) definition +topic_name: questionnaire_esm +key_class: .kafka.key.KeyMeasurement +value_class: .active.questionnaire.Questionnaire +questions: + - lead: #TODO + content: #TODO + widget: #TODO + responses: + - text: #TODO + score: #TODO diff --git a/specifications/active/phq8.yml b/specifications/active/phq8.yml index 06f42e45..c2733e79 100644 --- a/specifications/active/phq8.yml +++ b/specifications/active/phq8.yml @@ -1,6 +1,7 @@ -#===================== Personal Health Questionnaire Depression Scale (PHQ-8) =====================# -name: PHQ8 #QuestionnaireType -assestment_type: QUESTIONNAIRE +#==================== Personal Health Questionnaire Depression Scale (PHQ-8) ======================# +name: PHQ8 +assessment_type: QUESTIONNAIRE +doc: Personal Health Questionnaire Depression Scale (PHQ-8) definition topic_name: questionnaire_phq8 key_class: .kafka.key.KeyMeasurement value_class: .active.questionnaire.Questionnaire diff --git a/specifications/monitor/android_application.yml b/specifications/monitor/android_application.yml deleted file mode 100644 index e75e53f5..00000000 --- a/specifications/monitor/android_application.yml +++ /dev/null @@ -1,32 +0,0 @@ -#================================ Android Application Monitor =====================================# -name: APPLICATION -app_provider: .application.ApplicationServiceProvider -sensors: - - name: EXTERNAL_TIME - sample_rate: 0.08 - unit: NON_DIMENSIONAL - data_type: RAW - topic_name: application_external_time - key_class: .kafka.key.KeyMeasurement - value_class: .monitor.application.ApplicationExternalTime - - name: RECORD_COUNTS - sample_rate: 0.08 - unit: NON_DIMENSIONAL - data_type: RAW - topic_name: application_record_counts - key_class: .kafka.key.KeyMeasurement - value_class: .monitor.application.ApplicationRecordCounts - - name: SERVER_STATUS - sample_rate: 0.08 - unit: NON_DIMENSIONAL - data_type: RAW - topic_name: application_server_status - key_class: .kafka.key.KeyMeasurement - value_class: .monitor.application.ApplicationServerStatus - - name: UPTIME - sample_rate: 0.08 - unit: NON_DIMENSIONAL - data_type: RAW - topic_name: application_uptime - key_class: .kafka.key.KeyMeasurement - value_class: .monitor.application.ApplicationUptime diff --git a/specifications/monitor/external_time.yml b/specifications/monitor/external_time.yml new file mode 100644 index 00000000..ba33c366 --- /dev/null +++ b/specifications/monitor/external_time.yml @@ -0,0 +1,10 @@ +#==================================== External Time Monitor =======================================# +name: EXTERNAL_TIME +app_provider: .application.ApplicationServiceProvider +doc: Information sent by the Android pRMT about time synchronisation with a NTS different from the default one. +sample_rate: 0.08 +unit: NON_DIMENSIONAL +data_type: RAW +topic_name: application_external_time +key_class: .kafka.key.KeyMeasurement +value_class: .monitor.application.ApplicationExternalTime diff --git a/specifications/monitor/record_counts.yml b/specifications/monitor/record_counts.yml new file mode 100644 index 00000000..895725ad --- /dev/null +++ b/specifications/monitor/record_counts.yml @@ -0,0 +1,10 @@ +#==================================== Record Counts Monitor =======================================# +name: RECORD_COUNTS +app_provider: .application.ApplicationServiceProvider +doc: Monitor used by the Android pRMT to report the number of cached and created records. +sample_rate: 0.08 +unit: NON_DIMENSIONAL +data_type: RAW +topic_name: application_record_counts +key_class: .kafka.key.KeyMeasurement +value_class: .monitor.application.ApplicationRecordCounts diff --git a/specifications/monitor/server_status.yml b/specifications/monitor/server_status.yml new file mode 100644 index 00000000..99a626b6 --- /dev/null +++ b/specifications/monitor/server_status.yml @@ -0,0 +1,10 @@ +#==================================== Server Status Monitor =======================================# +name: SERVER_STATUS +app_provider: .application.ApplicationServiceProvider +doc: Monitor used by the Android pRMT to report the server connection status between the android client and the RADAR-CNS Platform. +sample_rate: 0.08 +unit: NON_DIMENSIONAL +data_type: RAW +topic_name: application_uptime +key_class: .kafka.key.KeyMeasurement +value_class: .monitor.application.ApplicationServerStatus diff --git a/specifications/monitor/uptime.yml b/specifications/monitor/uptime.yml new file mode 100644 index 00000000..0272aa3c --- /dev/null +++ b/specifications/monitor/uptime.yml @@ -0,0 +1,10 @@ +#======================================== Uptime Monitor ==========================================# +name: UPTIME +app_provider: .application.ApplicationServiceProvider +doc: Monitor used by the Android pRMT to notify the time duration since last reboot. +sample_rate: 0.08 +unit: NON_DIMENSIONAL +data_type: RAW +topic_name: application_uptime +key_class: .kafka.key.KeyMeasurement +value_class: .monitor.application.ApplicationUptime diff --git a/specifications/passive/adroid_phone.yml b/specifications/passive/android_phone.yml similarity index 99% rename from specifications/passive/adroid_phone.yml rename to specifications/passive/android_phone.yml index 94edde06..195ccff4 100644 --- a/specifications/passive/adroid_phone.yml +++ b/specifications/passive/android_phone.yml @@ -30,7 +30,7 @@ sensors: key_class: .kafka.key.KeyMeasurement value_class: .passive.phone.PhoneGyroscope aggregator_class: .kafka.aggregator.AggregatorDoubleArray - - name: LIGTH + - name: LIGHT app_provider: .phone.PhoneSensorProvider sample_rate: #TODO unit: LUX @@ -61,7 +61,7 @@ sensors: - name: RELATIVE_LOCATION app_provider: .phone.PhoneLocationProvider sample_rate: #TODO - unit: #TODO + unit: DEGREE data_type: RAW topic_name: android_phone_relative_location key_class: .kafka.key.KeyMeasurement diff --git a/specifications/passive/empatica_e4.yml b/specifications/passive/empatica_e4.yml index d24876e3..fcaf3cd9 100644 --- a/specifications/passive/empatica_e4.yml +++ b/specifications/passive/empatica_e4.yml @@ -51,11 +51,13 @@ sensors: key_class: .kafka.key.KeyMeasurement value_class: .passive.empatica.EmpaticaE4BatteryLevel aggregator_class: .kafka.aggregator.AggregatorDouble -processed: +processors: - name: HEART_RATE sample_rate: 1.0 unit: BEATS_PER_MIN data_type: RADAR input_topic_name: android_empatica_e4_inter_beat_interval + input_key_class: .kafka.key.KeyMeasurement + input_value_class: .passive.empatica.EmpaticaE4InterBeatInterval output_topic_name: android_empatica_e4_heartrate aggregator_class: .kafka.aggregator.AggregatorDouble diff --git a/specifications/passive/pebble_2.yml b/specifications/passive/pebble_2.yml index a4bfa671..83d139d6 100644 --- a/specifications/passive/pebble_2.yml +++ b/specifications/passive/pebble_2.yml @@ -30,7 +30,7 @@ sensors: - name: HEART_RATE_FILTERED sample_rate: 1.0 unit: BEATS_PER_MIN - data_type: VEDOR + data_type: VENDOR topic_name: android_pebble_2_heart_rate_filtered key_class: .kafka.key.KeyMeasurement value_class: .passive.pebble.Pebble2HeartRateFiltered From 161a37b84808f7ba0577ea1346b7db81e3628e0c Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Fri, 4 Aug 2017 18:04:09 +0100 Subject: [PATCH 045/112] First implementation of validation rules --- .gitignore | 7 + .../active/questionnaire/questionnaire.avsc | 2 +- commons/catalogue/radar_widget.avsc | 11 + .../catalogue}/time_frame.avsc | 5 +- .../active/questionnaire/Questionnaire.class | Bin 7520 -> 7514 bytes .../questionnaire/QuestionnaireType.class | Bin 1728 -> 1676 bytes .../org/radarcns/catalogue/SensorName.class | Bin 2751 -> 3465 bytes .../classes/org/radarcns/catalogue/Unit.class | Bin 2290 -> 2552 bytes .../radar-schemas-specifications/build.gradle | 44 ++-- .../specifications/SourceCatalogue.java | 112 +++++++++- .../specifications/source/Source.java | 74 ++++++ .../{util => source}/active/ActiveSource.java | 53 ++--- .../active/questionnaire}/Question.java | 9 +- .../questionnaire}/QuestionnaireSource.java | 19 +- .../active/questionnaire}/Response.java | 2 +- .../passive/MonitorSource.java | 72 +++--- .../passive/PassiveSource.java | 52 +++-- .../source/passive/Processor.java | 190 ++++++++++++++++ .../specifications/source/passive/Sensor.java | 191 ++++++++++++++++ .../specifications/util/TopicUtils.java | 146 ++++++++++++ .../radarcns/specifications/util/Utils.java | 82 +++++++ .../util/passive/Processor.java | 86 ------- .../specifications/util/passive/Sensor.java | 126 ----------- .../specifications/ActiveValidation.java | 71 ++++++ .../specifications/MonitorValidation.java | 58 +++++ .../specifications/SourceCatalogueTest.java | 61 ----- .../SourceCatalogueValidation.java | 80 +++++++ .../specifications/util/TopicUtilsTest.java | 114 ++++++++++ .../specifications/util/UtilsTest.java | 44 ++++ .../validator/GenericRoles.java | 210 ++++++++++++++++++ .../specifications/validator/Invalid.java | 61 +++++ .../specifications/validator/Message.java} | 23 +- .../validator/MonitorRoles.java | 117 ++++++++++ .../validator/PassiveSourceRoles.java | 133 +++++++++++ .../validator/ProcessorRoles.java | 133 +++++++++++ .../validator/QuestionRoles.java | 93 ++++++++ .../validator/QuestionnaireRoles.java | 104 +++++++++ .../validator/ResponseRoles.java | 67 ++++++ .../specifications/validator/SensorRoles.java | 137 ++++++++++++ .../validator/ValidationResult.java | 37 +++ .../validator/ValidationSupport.java | 153 +++++++++++++ .../specifications/validator/Validator.java | 188 ++++++++++++++++ .../validator/SchemaCatalogValidator.java | 21 +- .../validator/config/SkipConfigTest.java | 2 +- ...orRole.java => SchemaValidationRoles.java} | 86 +++---- ...st.java => SchemaValidationRolesTest.java} | 116 +++++----- .../validator/util/SchemaValidator.java | 10 +- .../validator/util/ValidationSupport.java | 2 +- restapi/header/header.avsc | 2 +- specifications/active/esm.yml | 14 -- specifications/active/phq8.yml | 8 +- specifications/monitor/external_time.yml | 6 +- specifications/monitor/record_counts.yml | 6 +- specifications/monitor/server_status.yml | 6 +- specifications/monitor/uptime.yml | 6 +- specifications/passive/android_phone.yml | 84 +++---- specifications/passive/biovotion_vsm1.yml | 96 ++++---- specifications/passive/empatica_e4.yml | 58 ++--- specifications/passive/pebble_2.yml | 32 +-- 59 files changed, 3048 insertions(+), 674 deletions(-) create mode 100644 commons/catalogue/radar_widget.avsc rename {restapi/header => commons/catalogue}/time_frame.avsc (76%) create mode 100644 java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Source.java rename java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/{util => source}/active/ActiveSource.java (53%) rename java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/{util/active => source/active/questionnaire}/Question.java (87%) rename java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/{util/active => source/active/questionnaire}/QuestionnaireSource.java (80%) rename java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/{util/active => source/active/questionnaire}/Response.java (94%) rename java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/{util => source}/passive/MonitorSource.java (62%) rename java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/{util => source}/passive/PassiveSource.java (53%) create mode 100644 java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Processor.java create mode 100644 java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Sensor.java create mode 100644 java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/TopicUtils.java create mode 100644 java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Utils.java delete mode 100644 java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/Processor.java delete mode 100644 java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/Sensor.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/ActiveValidation.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/MonitorValidation.java delete mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueTest.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueValidation.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/util/TopicUtilsTest.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/util/UtilsTest.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/GenericRoles.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Invalid.java rename java-sdk/radar-schemas-specifications/src/{main/java/org/radarcns/specifications/util/Source.java => test/java/org/radarcns/specifications/validator/Message.java} (72%) create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/MonitorRoles.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/PassiveSourceRoles.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ProcessorRoles.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/QuestionRoles.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/QuestionnaireRoles.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ResponseRoles.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/SensorRoles.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ValidationResult.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ValidationSupport.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Validator.java rename java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/{SchemaValidatorRole.java => SchemaValidationRoles.java} (82%) rename java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/{SchemaValidatorRoleTest.java => SchemaValidationRolesTest.java} (85%) delete mode 100644 specifications/active/esm.yml diff --git a/.gitignore b/.gitignore index 951a7c3f..12be7158 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,18 @@ .DS_Store build/ +out/ .idea/ *.iml .gradle/ .gradletasknamecache gradle.properties +exchange.properties *.java +#======================================== Schemas Common =======================================# +java-sdk/radar-schemas-commons/build +java-sdk/radar-schemas-commons/out + #======================================== Schemas Validator =======================================# !java-sdk/radar-schemas-validator/**/*.java java-sdk/radar-schemas-validator/build @@ -16,3 +22,4 @@ java-sdk/radar-schemas-validator/out !java-sdk/radar-schemas-specifications/**/*.java java-sdk/radar-schemas-specifications/build java-sdk/radar-schemas-specifications/out + diff --git a/commons/active/questionnaire/questionnaire.avsc b/commons/active/questionnaire/questionnaire.avsc index c645101e..8671ecac 100644 --- a/commons/active/questionnaire/questionnaire.avsc +++ b/commons/active/questionnaire/questionnaire.avsc @@ -6,7 +6,7 @@ "fields": [ { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the questionnaire is submitted to the subject." }, { "name": "timeCompleted", "type": "double", "doc": "timestamp in UTC (s) when subject marks the questionnaire as." }, - { "name": "name", "type": {"name": "QuestionnaireType", "type": "enum", "symbols": ["PHQ8", "ESM", "UNKNOWN"]}, "doc": "Questionnaire names.", "default": "UNKNOWN" }, + { "name": "name", "type": {"name": "QuestionnaireType", "type": "enum", "symbols": ["PHQ8", "UNKNOWN"]}, "doc": "Questionnaire names.", "default": "UNKNOWN" }, { "name": "version", "type": "string", "doc": "It reports the questionnaire version stated in the JSON specification." }, { "name": "answers", "type": { diff --git a/commons/catalogue/radar_widget.avsc b/commons/catalogue/radar_widget.avsc new file mode 100644 index 00000000..67847022 --- /dev/null +++ b/commons/catalogue/radar_widget.avsc @@ -0,0 +1,11 @@ +{ + "namespace": "org.radarcns.catalogue", + "type": "enum", + "name": "RadarWidget", + "doc": "User interface widget used in the Active Remote Monitor Technology to submit assessments to subjects.", + "symbols": [ + "RADIO" , + "SLIDER", + "UNKNOWN" + ] +} diff --git a/restapi/header/time_frame.avsc b/commons/catalogue/time_frame.avsc similarity index 76% rename from restapi/header/time_frame.avsc rename to commons/catalogue/time_frame.avsc index 01262783..b73fe2c6 100644 --- a/restapi/header/time_frame.avsc +++ b/commons/catalogue/time_frame.avsc @@ -1,5 +1,5 @@ { - "namespace": "org.radarcns.restapi.header", + "namespace": "org.radarcns.catalogue", "type": "enum", "name": "TimeFrame", "doc": "Interval between two consecutive samples", @@ -10,6 +10,7 @@ "TEN_MIN" , "ONE_HOUR" , "ONE_DAY" , - "ONE_WEEK" + "ONE_WEEK", + "UNKNOWN" ] } diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Questionnaire.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Questionnaire.class index 00ae24a709cb64f4cd66d41a1ef9f1e9d1b7cb13..8da76cf73a66c4626e6c56bf514fbf38ca301485 100644 GIT binary patch delta 35 tcmV+;0NnrJI@&sr>j>XFP}r@o=|r*f5()uClZ_4;vmXm%0<(w>*bg?b4?6$= delta 35 rcmca*^}uSvYmS>w^a>mb3cNOc7UE*`+RVmX!^G?w?7O+1_clKO8qN*X diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/QuestionnaireType.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/QuestionnaireType.class index 2e1d966b3e21ea404a3bd150e417ab6b498eefaf..59ec1e10a302c93aabc4c1dc70e54268ee4511b0 100644 GIT binary patch delta 519 zcmYk3OD_Xa7>1u|XL{OkT9i_)sup#>*8P5~jie$X(uJjkh_#i4y^YM)!XJ^sG|Qw>rozNsnLd~f z(`?8Y#hgo&#V|`|E-O~9DrJS+gj5omMfc$*``;)1^t!qKVU_X{JfB zVUh8wc8hl%%!Tq4EY7@-;A#DSdAq!GP|hEoYc?r)CHr-}QTp1eZRRw{lmKDcOe8d< zkedZNM1)IWk@gmxbfR6jkRVW^Wa#jf6DQsKU&)HDeV0ooIY9x_SJt$5>m-l`L$+cdsHx z_1**43(?9Gv3UI>4G*Y0@z&B}1ZD5a+bV{slbl+U0S1K+FeGg4&JmdlzSolfHOoAa EZx^96fB*mh delta 580 zcmYk3%TC)s7==H_cE)xlfd&F3p#cIE0s%^|Kre**rE1zLs*o2v0um1ZV!@V0E58UN zQjtI))_tg||4gfmclA6P5a_JrwB&J%ger?L*YZn;mo z`;DSW06__{C^@1OO+56LkOIa@$S{v_s3ax7To{pES{Nu%Mj5lpzF(gDU#W_&tt(=j z31KPIU1lY@@Q2R2-jJ?WF=abUTYpXRXP7nl!iQ}dcx}|BaEES&CZJC3uk%=5*LU-u$B<4+F6vn@C9nZC6+DRI_O`KK`36N+gZ4*ifrKxcywi|oKof$isCg}iSX(?iYVqOg-M=#TA|2%Mxn%fR-w#%PT>&q zd4(zF3kntHiwafd83l`ZRyASs;G9B@`I5q6=F18W^A!b``Kp4)d`+RwJg?ATzOFFM z3>9XWZz%Z8Hx-UB-%^-mzO69Fd`DrP`L4oI=6gAXfCumE_%MZWe4_9v^D`Zvpa1nj zGFkK;+b!6&@Pszo?5dQDB~Qb~YQAWhUbzrVmd(n9h8}yyFPc{1=DoU;_sX`VAyq5c zmKhZCm5PSss&T8X24j63)Gf!%)BZl1^6Xm0^h&;4wTn)^R`Tgs$E?t44Kt|Ng}k?c z&JF+6GGi&%GiyP?u3L1OZm(oIRl90>rbDjo=8I-vHcYM=b=P!)vPGqQfv?pvVxzI{ zTRGr`G`_%v(2ifxJccjRIEj1GxEZ&kF#$7;NtPl@iKWbPh-HeU!ct|iSZtOW%V8FW z#bxnW>MRYGX_grlpXCV4EOMlCJe+4a$`ZiT@s);c;dVV6{vE$8aT1GK?8vy%D z$v<6l4T)rEc#z!YImM?b#$IwN9V;| z+s%QghHs2e>7JR_j`93Jc!U;nxQ`M)roR-8$MFF^Lh?W4Tr3{| delta 963 zcmY+COLG!I6opR{LN~*h0ySDlHlfN*h#`bL$rE*ikiZ}e28IUMtz_QGpiwgY)Q5TmK26*zaLXvq!VUT%MVTie+FwDHBFv7g9Fv`54Fvh&8kYe6a zIgIn*w!#GSj>07KuEG@ap29S9RbhsCUm?wWAo0*Z438C_FrP|1bHn1jyDh4@kX@~1 ztU|qYvV;AQwCtEA$?Mx|M%+>^gC97PVZ7r%3EP;TNwMuzAZ#h<} z`NuQp={U*PVVQW24S{Yq(bm0UB8L|yY!po##|abtNSGL4NwN&G46zKejIfNdjIpFx z##tsS3_K$AjfQVvauqDg5q zDUc>*(xh0-9*(9bC>>b|^VI>tBcL0mx*dL;LIwg^H)KRQXKBty6(FgT!<_D%~n>+t^r4N`=8 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/Unit.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/Unit.class index 6dce99dbe87b684a992425744df2af6ac00bbc9f..2438392e5c4d5d7bc2c765582925aabb066d2fcb 100644 GIT binary patch delta 1053 zcmY+CNmCP16otT>Va z9VS&$C8a;Wl|R9yOUsoj_1>GZ(4_i&@4WlE-#xGUNA=Iz!slNfJ^|>(3qQO#5x_~D zGGH6X2hfSrEUR2OqtO*0iaD#%!;|MUdYNk)ea!P3{mcs*1I&vWgUm}BL(Iz>!^|rh zapqM$ixD1N(->u5*BE2o&=_al)R|LA1(;zZf2;vZ?g6Kkb5IrotEPX8fECVcqEJG~A zEOC|*mQj{5mT{H|mPr;1-3AKoZ%^Epfuoe|PIzB8l!G<3Hznx$8;ph&%>C-E^K-Cr zkni5{@c%K~Xk~}z8J@c$z=!NSzC*c_H;LqzFPvA*3Ke$|9sVLP{j0 zP(sQjq-a7)C!~PPD2J2@%1N!%^C1G}9?&t9uY@0mk$}RC`^MK$m!vr#Il!RGEas&0 z#n({yx00fIP*w$y#yq(SenX@)H139n{`7=stZ^H@cT(QHJ%HWY4IGiSva-gZEf=xG zTas^-4FGQu#ui#YcK0D6XdH!8UaB_f8>OFGcV8J>@f~<`HT%raHvA^Qys%Ht*Jl`D?~or1u|x9oIj6)`cvl*E7vv>aPdLBJ|PsZc7#1NDUB`HcR7{sy!0-gxT` zLIOsj;a2|x|G+D+yfS{@6k~8U`#y8{HuKD6e;xdJp!WUu=dVDH*Ks^92Fz3O8TMHS z=-`sZWnH;q=?sK!aMhC5$wf;>S+#U4uUUGO*Dbxu8mSsS>WXURT+cY`t z+_4NQmn}oeyFT{=+IeJotbF40^v$<&t0@@lOmVinRGuywlBMEArM$FIoGeYwErb;_ zy8g~&BaNr@0K*BM@jTp#9+@BKMS=;=Cpf{$1f6sxNNZ#?x;1(eNM8GReX~aACJ1l471Lr U#GFv?s4RRaZy^14?(u;5AMN~R&j0`b diff --git a/java-sdk/radar-schemas-specifications/build.gradle b/java-sdk/radar-schemas-specifications/build.gradle index 0c60d787..5af3fe2c 100644 --- a/java-sdk/radar-schemas-specifications/build.gradle +++ b/java-sdk/radar-schemas-specifications/build.gradle @@ -16,17 +16,7 @@ idea { } } -sourceSets { - main { - java.srcDir 'src/main/java' - resources.srcDir 'src/main/resources' - } - test { - java.srcDir 'src/test/java' - resources.srcDir 'src/test/resources' - } -} - +ext.apacheCommonsVersion = '3.6' ext.kafkaVersion = '0.10.2.1' ext.jacksonModuleParameterNamesVersion = '2.9.0' ext.junitVersion = '4.12' @@ -34,9 +24,9 @@ ext.radarCommonsVersion = '0.4.2' ext.slf4jVersion = '1.7.25' dependencies { - implementation project(':radar-schemas-commons') implementation group: 'org.radarcns', name: 'radar-commons', version: radarCommonsVersion + implementation group: 'org.apache.commons', name: 'commons-lang3', version: apacheCommonsVersion testCompile group: 'junit', name: 'junit', version: junitVersion testCompile group: 'org.slf4j', name: 'slf4j-simple', version: slf4jVersion @@ -56,13 +46,20 @@ dependencies { //---------------------------------------------------------------------------// // Exchange configuration with Java code // //---------------------------------------------------------------------------// -ext.exchnageConfigPath = 'src/main/resources/gradle.properties' +ext.exchnageConfigMainPath = 'src/main/resources/exchange.properties' +ext.exchnageConfigTestPath = 'src/test/resources/exchange.properties' task exchangeConfig() { doLast { - if (file(exchnageConfigPath).createNewFile()) { - file(exchnageConfigPath).write("project.group=${project.group}") + if (file(exchnageConfigMainPath).createNewFile()) { + file(exchnageConfigMainPath).write("project.group=${project.group}") } else { - throw new GradleException("File for exchanginf configuration between Gradle and Java cannot be created. Error while managing file at ${exchnageConfigPath}") + throw new GradleException("File for exchanging configuration between Gradle and Java cannot be created. Error while managing file at ${exchnageConfigMainPath}") + } + + if (file(exchnageConfigTestPath).createNewFile()) { + file(exchnageConfigTestPath).write("project.group=${project.group}") + } else { + throw new GradleException("File for exchanging configuration between Gradle and Java cannot be created. Error while managing file at ${exchnageConfigTestPath}") } } } @@ -70,9 +67,15 @@ compileJava.dependsOn exchangeConfig task cleanExchangeConfig() { doLast { - if (file(exchnageConfigPath).exists()) { - if (!file(exchnageConfigPath).delete()) { - throw new GradleException("File at ${exchnageConfigPath} cannot be delated.") + if (file(exchnageConfigMainPath).exists()) { + if (!file(exchnageConfigMainPath).delete()) { + throw new GradleException("File at ${exchnageConfigMainPath} cannot be delated.") + } + } + + if (file(exchnageConfigTestPath).exists()) { + if (!file(exchnageConfigTestPath).delete()) { + throw new GradleException("File at ${exchnageConfigTestPath} cannot be delated.") } } } @@ -99,7 +102,8 @@ test { checkstyle { // codacy version toolVersion '6.16' - ignoreFailures false + //ignoreFailures = false TODO set back + ignoreFailures = true configFile = file("$projectDir/config/checkstyle/checkstyle.xml") } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/SourceCatalogue.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/SourceCatalogue.java index a10435d1..dbbed902 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/SourceCatalogue.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/SourceCatalogue.java @@ -16,23 +16,27 @@ * limitations under the License. */ +import static java.util.Collections.singleton; + import java.io.File; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import org.radarcns.active.questionnaire.QuestionnaireType; import org.radarcns.catalogue.ActiveSourceType; import org.radarcns.catalogue.MonitorSourceType; import org.radarcns.catalogue.PassiveSourceType; import org.radarcns.config.YamlConfigLoader; -import org.radarcns.specifications.util.Source; -import org.radarcns.specifications.util.active.ActiveSource; -import org.radarcns.specifications.util.active.QuestionnaireSource; -import org.radarcns.specifications.util.passive.MonitorSource; -import org.radarcns.specifications.util.passive.PassiveSource; -import org.radarcns.specifications.util.passive.Sensor; +import org.radarcns.specifications.source.Source; +import org.radarcns.specifications.source.active.questionnaire.QuestionnaireSource; +import org.radarcns.specifications.source.passive.MonitorSource; +import org.radarcns.specifications.source.passive.PassiveSource; +import org.radarcns.specifications.source.passive.Processor; +import org.radarcns.specifications.source.passive.Sensor; /** * TODO. @@ -58,20 +62,30 @@ public String getName() { public static final String BASE_FOLDER_NAME = "specifications"; - private static final String YAML_EXTENSION = ".yml"; + public static final String YAML_EXTENSION = ".yml"; - private static final Path BASE_PATH = Paths.get(new File(".").toURI()) + public static final Path BASE_PATH = Paths.get(new File(".").toURI()) .getParent().getParent().getParent().resolve(BASE_FOLDER_NAME); private static final Map ACTIVE_SOURCES; private static final Map MONITOR_SOURCES; private static final Map PASSIVE_SOURCES; + private static final Set SOURCES; + static { try { ACTIVE_SOURCES = initActiveSources(); MONITOR_SOURCES = initMonitorSources(); PASSIVE_SOURCES = initPassiveSources(); + + int initCapacity = (int) Math.ceil((ACTIVE_SOURCES.size() + + MONITOR_SOURCES.size() + PASSIVE_SOURCES.size()) * 100d / 75d); + SOURCES = new HashSet<>(initCapacity); + + SOURCES.addAll(ACTIVE_SOURCES.values()); + SOURCES.addAll(MONITOR_SOURCES.values()); + SOURCES.addAll(PASSIVE_SOURCES.values()); } catch (IOException exc) { throw new ExceptionInInitializerError(exc); } @@ -132,15 +146,97 @@ private static Map initPassiveSources() throws return map; } + /** + * TODO. + * @return TODO + */ public static Map getActiveSources() { return ACTIVE_SOURCES; } + /** + * TODO. + * @param type TODO + * @return TODO + */ + public static QuestionnaireSource getActiveSource(QuestionnaireType type) { + return ACTIVE_SOURCES.get(type); + } + + /** + * TODO. + * @return TODO + */ public static Map getMonitorSources() { return MONITOR_SOURCES; } + /** + * TODO. + * @param type TODO + * @return TODO + */ + public static MonitorSource getMonitorSource(MonitorSourceType type) { + return MONITOR_SOURCES.get(type); + } + + /** + * TODO. + * @return TODO + */ public static Map getPassiveSources() { return PASSIVE_SOURCES; } + + /** + * TODO. + * @param type TODO + * @return TODO + */ + public static PassiveSource getPassiveSource(PassiveSourceType type) { + return PASSIVE_SOURCES.get(type); + } + + /** + * TODO. + * @return TODO + */ + public static Set getTopics() { + Set set = new HashSet<>(); + SOURCES.forEach(source -> set.addAll(source.getTopics())); + return set; + } + + /** + * TODO. + * @return TODO + */ + public static Map>> getTopicsVerbose() { + Map>> map = new HashMap<>(); + + for (QuestionnaireSource source : ACTIVE_SOURCES.values()) { + Map> details = new HashMap<>(); + details.put(source.getQuestionnaireType().name(), singleton(source.getTopic())); + map.put(ActiveSourceType.QUESTIONNAIRE.name(), details); + } + + for (MonitorSource source : MONITOR_SOURCES.values()) { + Map> details = new HashMap<>(); + details.put(source.getType().name(), source.getTopics()); + map.put(NameFolder.MONITOR.getName().toUpperCase(), details); + } + + for (PassiveSource source : PASSIVE_SOURCES.values()) { + Map> details = new HashMap<>(); + for (Sensor sensor : source.getSensors()) { + details.put(sensor.getName().name(), sensor.getTopics()); + } + for (Processor proc : source.getProcessors()) { + details.put(proc.getName().name(), proc.getTopics()); + } + map.put(source.getType().name(), details); + } + + return map; + } } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Source.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Source.java new file mode 100644 index 00000000..982cd22e --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Source.java @@ -0,0 +1,74 @@ +package org.radarcns.specifications.source; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.util.Set; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; + +/** + * TODO. + */ +public abstract class Source { + + private final String name; + + private final String doc; + + public Source(String name, String doc) { + this.name = name; + this.doc = doc; + } + + public String getName() { + return name; + } + + public String getDoc() { + return doc; + } + + /** + * TODO. + * @return TODO. + */ + public abstract Set getTopics(); + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (!(o instanceof Source)) { + return false; + } + + Source source = (Source) o; + + return new EqualsBuilder() + .append(name, source.name) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder(17, 37) + .append(name) + .toHashCode(); + } +} diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/ActiveSource.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/ActiveSource.java similarity index 53% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/ActiveSource.java rename to java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/ActiveSource.java index 440c8f3e..27bee31b 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/ActiveSource.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/ActiveSource.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications.util.active; +package org.radarcns.specifications.source.active; /* * Copyright 2017 King's College London and The Hyve @@ -18,56 +18,57 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import org.radarcns.specifications.util.Source; +import java.util.Collections; +import java.util.Set; +import org.radarcns.specifications.source.Source; +import org.radarcns.specifications.util.Utils; /** * TODO. */ public abstract class ActiveSource extends Source { - private final String topicName; + private final String topic; - private final String keyClass; + private final String key; - private final String valueClass; - - private final String doc; + private final String value; /** * TODO. * @param name TODO - * @param topicName TODO - * @param keyClass TODO - * @param valueClass TODO + * @param topic TODO + * @param key TODO + * @param value TODO * @param description TODO */ @JsonCreator public ActiveSource( @JsonProperty("name") String name, - @JsonProperty("topic_name") String topicName, - @JsonProperty("key_class") String keyClass, - @JsonProperty("value_class") String valueClass, + @JsonProperty("topic") String topic, + @JsonProperty("key") String key, + @JsonProperty("value") String value, @JsonProperty("doc") String description) { - super(name); - this.topicName = topicName; - this.keyClass = keyClass; - this.valueClass = valueClass; - this.doc = description; + super(name, description); + this.topic = topic; + this.key = key; + this.value = value; } - public String getTopicName() { - return topicName; + public String getTopic() { + return topic; } - public String getKeyClass() { - return keyClass; + public String getKey() { + return Utils.getProjectGroup().concat(key); } - public String getValueClass() { - return valueClass; + public String getValue() { + return Utils.getProjectGroup().concat(value); } - public String getDoc() { - return doc; + @Override + public Set getTopics() { + return Collections.singleton(topic); } } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/Question.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/Question.java similarity index 87% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/Question.java rename to java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/Question.java index e60878e8..f7e8facb 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/Question.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/Question.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications.util.active; +package org.radarcns.specifications.source.active.questionnaire; /* * Copyright 2017 King's College London and The Hyve @@ -19,6 +19,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; +import org.radarcns.catalogue.RadarWidget; /** * TODO. @@ -29,7 +30,7 @@ public class Question { private final String content; - private final String widget; + private final RadarWidget widget; private final List responses; @@ -44,7 +45,7 @@ public class Question { public Question( @JsonProperty("lead") String lead, @JsonProperty("content") String content, - @JsonProperty("widget") String widget, + @JsonProperty("widget") RadarWidget widget, @JsonProperty("responses") List responses) { this.lead = lead; this.content = content; @@ -60,7 +61,7 @@ public String getContent() { return content; } - public String getWidget() { + public RadarWidget getWidget() { return widget; } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/QuestionnaireSource.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/QuestionnaireSource.java similarity index 80% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/QuestionnaireSource.java rename to java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/QuestionnaireSource.java index 666b39b3..ac456fb4 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/QuestionnaireSource.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/QuestionnaireSource.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications.util.active; +package org.radarcns.specifications.source.active.questionnaire; /* * Copyright 2017 King's College London and The Hyve @@ -21,6 +21,7 @@ import java.util.List; import org.radarcns.active.questionnaire.QuestionnaireType; import org.radarcns.catalogue.ActiveSourceType; +import org.radarcns.specifications.source.active.ActiveSource; /** * TODO. @@ -29,7 +30,7 @@ public class QuestionnaireSource extends ActiveSource { private QuestionnaireType name; - private ActiveSourceType assestmentType; + private ActiveSourceType assessmentType; private List questions; @@ -54,7 +55,19 @@ public QuestionnaireSource( @JsonProperty("questions") List questions) { super(name.name(), topicName, keyClass, valueClass, description); this.name = name; - this.assestmentType = assessmentType; + this.assessmentType = assessmentType; this.questions = questions; } + + public QuestionnaireType getQuestionnaireType() { + return name; + } + + public ActiveSourceType getAssessmentType() { + return assessmentType; + } + + public List getQuestions() { + return questions; + } } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/Response.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/Response.java similarity index 94% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/Response.java rename to java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/Response.java index e2e0f08c..cce96c17 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/active/Response.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/Response.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications.util.active; +package org.radarcns.specifications.source.active.questionnaire; /* * Copyright 2017 King's College London and The Hyve diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/MonitorSource.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/MonitorSource.java similarity index 62% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/MonitorSource.java rename to java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/MonitorSource.java index 8be39267..b78aa298 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/MonitorSource.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/MonitorSource.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications.util.passive; +package org.radarcns.specifications.source.passive; /* * Copyright 2017 King's College London and The Hyve @@ -18,10 +18,14 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Collections; +import java.util.Objects; +import java.util.Set; import org.radarcns.catalogue.DataType; import org.radarcns.catalogue.MonitorSourceType; import org.radarcns.catalogue.Unit; -import org.radarcns.specifications.util.Source; +import org.radarcns.specifications.source.Source; +import org.radarcns.specifications.util.Utils; /** * TODO. @@ -32,21 +36,19 @@ public class MonitorSource extends Source { private final String appProvider; - private final String doc; - private final double sampleRate; private final Unit unit; private final DataType dataType; - private final String topicName; + private final String topic; - private final String keyClass; + private final String key; - private final String valueClass; + private final String value; - private final String aggregatorClass; + private final String aggregator; /** * TODO. @@ -57,10 +59,10 @@ public class MonitorSource extends Source { * @param sampleRate TODO * @param unit TODO * @param dataType TODO - * @param topicName TODO - * @param keyClass TODO - * @param valueClass TODO - * @param aggregatorClass TODO + * @param topic TODO + * @param key TODO + * @param value TODO + * @param aggregator TODO */ @JsonCreator public MonitorSource( @@ -70,21 +72,20 @@ public MonitorSource( @JsonProperty("sample_rate") double sampleRate, @JsonProperty("unit") Unit unit, @JsonProperty("data_type") DataType dataType, - @JsonProperty("topic_name") String topicName, - @JsonProperty("key_class") String keyClass, - @JsonProperty("value_class") String valueClass, - @JsonProperty("aggregator_class") String aggregatorClass) { - super(name.name()); + @JsonProperty("topic") String topic, + @JsonProperty("key") String key, + @JsonProperty("value") String value, + @JsonProperty("aggregator") String aggregator) { + super(name.name(), doc); this.name = name; this.appProvider = appProvider; - this.doc = doc; this.sampleRate = sampleRate; this.unit = unit; this.dataType = dataType; - this.topicName = topicName; - this.keyClass = keyClass; - this.valueClass = valueClass; - this.aggregatorClass = aggregatorClass; + this.topic = topic; + this.key = key; + this.value = value; + this.aggregator = aggregator; } public MonitorSourceType getType() { @@ -92,11 +93,7 @@ public MonitorSourceType getType() { } public String getAppProvider() { - return appProvider; - } - - public String getDoc() { - return doc; + return Utils.getProjectGroup().concat(appProvider); } public double getSampleRate() { @@ -111,19 +108,24 @@ public DataType getDataType() { return dataType; } - public String getTopicName() { - return topicName; + public String getTopic() { + return topic; + } + + public String getKey() { + return Utils.getProjectGroup().concat(key); } - public String getKeyClass() { - return keyClass; + public String getValue() { + return Utils.getProjectGroup().concat(value); } - public String getValueClass() { - return valueClass; + public String getAggregator() { + return Objects.isNull(aggregator) ? null : Utils.getProjectGroup().concat(aggregator); } - public String getAggregatorClass() { - return aggregatorClass; + @Override + public Set getTopics() { + return Collections.singleton(topic); } } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/PassiveSource.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/PassiveSource.java similarity index 53% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/PassiveSource.java rename to java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/PassiveSource.java index d17a68ea..ed37a980 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/PassiveSource.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/PassiveSource.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications.util.passive; +package org.radarcns.specifications.source.passive; /* * Copyright 2017 King's College London and The Hyve @@ -18,23 +18,28 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.List; -import org.radarcns.specifications.util.Source; +import java.util.HashSet; +import java.util.Set; +import org.radarcns.catalogue.PassiveSourceType; +import org.radarcns.specifications.source.Source; +import org.radarcns.specifications.util.Utils; /** * TODO. */ public class PassiveSource extends Source { + private final PassiveSourceType type; + private final String vendor; private final String model; private final String appProvider; - private final List sensors; + private final Set sensors; - private final List processors; + private final Set processors; /** * TODO. @@ -48,10 +53,12 @@ public class PassiveSource extends Source { public PassiveSource( @JsonProperty("vendor") String vendor, @JsonProperty("model") String model, + @JsonProperty("doc") String description, @JsonProperty("app_provider") String appProvider, - @JsonProperty("sensors") List sensors, - @JsonProperty("processors") List processors) { - super(vendor.concat("_").concat(model)); + @JsonProperty("sensors") Set sensors, + @JsonProperty("processors") Set processors) { + super(vendor.concat("_").concat(model), description); + this.type = PassiveSourceType.valueOf(vendor.concat("_").concat(model)); this.vendor = vendor; this.model = model; this.appProvider = appProvider; @@ -59,6 +66,10 @@ public PassiveSource( this.processors = processors; } + public PassiveSourceType getType() { + return type; + } + public String getVendor() { return vendor; } @@ -68,14 +79,29 @@ public String getModel() { } public String getAppProvider() { - return appProvider; + return Utils.getProjectGroup().concat(appProvider); + } + + public Set getSensors() { + return sensors == null ? new HashSet<>() : sensors; } - public List getSensors() { - return sensors; + public Set getProcessors() { + return processors == null ? new HashSet<>() : processors; } - public List getProcessors() { - return processors; + @Override + public Set getTopics() { + Set set = new HashSet<>(); + + if (sensors != null && !sensors.isEmpty()) { + sensors.forEach(sensor -> set.addAll(sensor.getTopics())); + } + + if (processors != null && !processors.isEmpty()) { + processors.forEach(proc -> set.addAll(proc.getTopics())); + } + + return set; } } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Processor.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Processor.java new file mode 100644 index 00000000..cefd005b --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Processor.java @@ -0,0 +1,190 @@ +package org.radarcns.specifications.source.passive; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.HashSet; +import java.util.Set; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.radarcns.catalogue.DataType; +import org.radarcns.catalogue.SensorName; +import org.radarcns.catalogue.Unit; +import org.radarcns.specifications.util.TopicUtils; +import org.radarcns.specifications.util.Utils; + +/** + * TODO. + */ +public class Processor { + + private final SensorName name; + + private final String doc; + + private final double sampleRate; + + private final Unit unit; + + private final DataType dataType; + + private final String inputTopic; + + private final String inputKey; + + private final String inputValue; + + private final String baseOutputTopic; + + private final String aggregator; + + /** + * TODO. + * @param name TODO + * @param doc TODO + * @param sampleRate TODO + * @param unit TODO + * @param dataType TODO + * @param inputTopic TODO + * @param inputKey TODO + * @param inputValue TODO + * @param baseOutputTopic TODO + * @param aggregator TODO + */ + @JsonCreator + public Processor( + @JsonProperty("name") SensorName name, + @JsonProperty("doc") String doc, + @JsonProperty("sample_rate") double sampleRate, + @JsonProperty("unit") Unit unit, + @JsonProperty("data_type") DataType dataType, + @JsonProperty("input_topic") String inputTopic, + @JsonProperty("input_key") String inputKey, + @JsonProperty("input_value") String inputValue, + @JsonProperty("base_output_topic") String baseOutputTopic, + @JsonProperty("aggregator") String aggregator) { + this.name = name; + this.doc = doc; + this.sampleRate = sampleRate; + this.unit = unit; + this.dataType = dataType; + this.inputTopic = inputTopic; + this.inputKey = inputKey; + this.inputValue = inputValue; + this.baseOutputTopic = baseOutputTopic; + this.aggregator = aggregator; + } + + public SensorName getName() { + return name; + } + + public String getDoc() { + return doc; + } + + public double getSampleRate() { + return sampleRate; + } + + public Unit getUnit() { + return unit; + } + + public DataType getDataType() { + return dataType; + } + + public String getInputTopic() { + return inputTopic; + } + + public String getInputKey() { + return Utils.getProjectGroup().concat(inputKey); + } + + public String getInputValue() { + return Utils.getProjectGroup().concat(inputValue); + } + + public String getBaseOutputTopic() { + return baseOutputTopic; + } + + public String getAggregator() { + return Utils.getProjectGroup().concat(aggregator); + } + + /** + * TODO. + * @return TODO + */ + public Set getTopics() { + Set set = new HashSet<>(); + + if (Utils.isTimedAggregator(aggregator)) { + set.addAll(TopicUtils.getTimedOutputStateStoreTopics(baseOutputTopic)); + } else { + set.add(TopicUtils.getOutTopic(baseOutputTopic)); + } + + return set; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (!(o instanceof Processor)) { + return false; + } + + Processor processor = (Processor) o; + + return new EqualsBuilder() + .append(sampleRate, processor.sampleRate) + .append(name, processor.name) + .append(doc, processor.doc) + .append(unit, processor.unit) + .append(dataType, processor.dataType) + .append(inputTopic, processor.inputTopic) + .append(inputKey, processor.inputKey) + .append(inputValue, processor.inputValue) + .append(baseOutputTopic, processor.baseOutputTopic) + .append(aggregator, processor.aggregator) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder(17, 37) + .append(name) + .append(doc) + .append(sampleRate) + .append(unit) + .append(dataType) + .append(inputTopic) + .append(inputKey) + .append(inputValue) + .append(baseOutputTopic) + .append(aggregator) + .toHashCode(); + } +} diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Sensor.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Sensor.java new file mode 100644 index 00000000..7cf04477 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Sensor.java @@ -0,0 +1,191 @@ +package org.radarcns.specifications.source.passive; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.HashSet; +import java.util.Set; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.radarcns.catalogue.DataType; +import org.radarcns.catalogue.SensorName; +import org.radarcns.catalogue.Unit; +import org.radarcns.specifications.util.TopicUtils; +import org.radarcns.specifications.util.Utils; + +/** + * TODO. + */ +public class Sensor { + + private final SensorName name; + + private final String appProvider; + + private final String doc; + + private final double sampleRate; + + private final Unit unit; + + private final DataType dataType; + + private final String topic; + + private final String key; + + private final String value; + + private final String aggregator; + + /** + * TODO. + * @param name TODO + * @param appProvider TODO + * @param doc TODO + * @param sampleRate TODO + * @param unit TODO + * @param dataType TODO + * @param topic TODO + * @param key TODO + * @param value TODO + * @param aggregator TODO + */ + @JsonCreator + public Sensor( + @JsonProperty("name") SensorName name, + @JsonProperty("app_provider") String appProvider, + @JsonProperty("doc") String doc, + @JsonProperty("sample_rate") double sampleRate, + @JsonProperty("unit") Unit unit, + @JsonProperty("data_type") DataType dataType, + @JsonProperty("topic") String topic, + @JsonProperty("key") String key, + @JsonProperty("value") String value, + @JsonProperty("aggregator") String aggregator) { + this.name = name; + this.appProvider = appProvider; + this.doc = doc; + this.sampleRate = sampleRate; + this.unit = unit; + this.dataType = dataType; + this.topic = topic; + this.key = key; + this.value = value; + this.aggregator = aggregator; + } + + public SensorName getName() { + return name; + } + + public String getAppProvider() { + return Utils.getProjectGroup().concat(appProvider); + } + + public String getDoc() { + return doc; + } + + public double getSampleRate() { + return sampleRate; + } + + public Unit getUnit() { + return unit; + } + + public DataType getDataType() { + return dataType; + } + + public String getTopic() { + return topic; + } + + public String getKey() { + return Utils.getProjectGroup().concat(key); + } + + public String getValue() { + return Utils.getProjectGroup().concat(value); + } + + public String getAggregator() { + return Utils.getProjectGroup().concat(aggregator); + } + + /** + * TODO. + * @return TODO + */ + public Set getTopics() { + Set set = new HashSet<>(); + set.add(topic); + + if (Utils.isTimedAggregator(aggregator)) { + set.addAll(TopicUtils.getTimedOutputStateStoreTopics(topic)); + } else { + set.add(TopicUtils.getOutTopic(topic)); + } + + return set; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (!(o instanceof Sensor)) { + return false; + } + + Sensor sensor = (Sensor) o; + + return new EqualsBuilder() + .append(sampleRate, sensor.sampleRate) + .append(name, sensor.name) + .append(appProvider, sensor.appProvider) + .append(doc, sensor.doc) + .append(unit, sensor.unit) + .append(dataType, sensor.dataType) + .append(topic, sensor.topic) + .append(key, sensor.key) + .append(value, sensor.value) + .append(aggregator, sensor.aggregator) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder(17, 37) + .append(name) + .append(appProvider) + .append(doc) + .append(sampleRate) + .append(unit) + .append(dataType) + .append(topic) + .append(key) + .append(value) + .append(aggregator) + .toHashCode(); + } +} diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/TopicUtils.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/TopicUtils.java new file mode 100644 index 00000000..1dafeeab --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/TopicUtils.java @@ -0,0 +1,146 @@ +package org.radarcns.specifications.util; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import org.radarcns.catalogue.TimeFrame; + +/** + * TODO. + */ +public final class TopicUtils { + + public static final String FROM_LABEL = "From-"; + public static final String TO_LABEL = "-To-"; + + public static final String OUTPUT_LABEL = "_output"; + + /** Folder names. */ + public enum TimeLabel { + TEN_SECOND(TimeFrame.TEN_SECOND, TimeUnit.SECONDS.toMillis(10), "_10sec"), + THIRTY_SECOND(TimeFrame.THIRTY_SECOND, TimeUnit.SECONDS.toMillis(30), "_30sec"), + ONE_MIN(TimeFrame.ONE_MIN, TimeUnit.MINUTES.toMillis(1), "_1min"), + TEN_MIN(TimeFrame.TEN_MIN, TimeUnit.MINUTES.toMillis(10), "_10min"), + ONE_HOUR(TimeFrame.ONE_HOUR, TimeUnit.HOURS.toMillis(1), "_1hour"), + ONE_DAY(TimeFrame.ONE_DAY, TimeUnit.DAYS.toMillis(1), "_1day"), + ONE_WEEK(TimeFrame.ONE_WEEK, TimeUnit.DAYS.toMillis(7), "_1week"); + + private final TimeFrame timeFrame; + private final long intervalInMilliSec; + private final String label; + + TimeLabel(TimeFrame timeFrame, long intervalInMilliSec, String label) { + this.timeFrame = timeFrame; + this.intervalInMilliSec = intervalInMilliSec; + this.label = label; + } + + public TimeFrame getTimeFrame() { + return timeFrame; + } + + public long getIntervalInMilliSec() { + return intervalInMilliSec; + } + + public String getLabel() { + return label; + } + } + + private TopicUtils() { + //Static class + } + + /** + * TODO. + * @param topicName TODO + * @return TODO + */ + public static String getOutTopic(String topicName) { + return topicName.concat(OUTPUT_LABEL); + } + + /** + * TODO. + * @param topicName TODO + * @return TODO + */ + public static Set getTimedOutTopics(String topicName) { + Set set = new HashSet<>(); + + for (TimeLabel label : TimeLabel.values()) { + set.add(topicName.concat(label.getLabel())); + } + + return set; + } + + /** + * TODO. + * @param topicName TODO + * @return TODO + */ + public static long getTimeInterval(String topicName) { + Objects.requireNonNull(topicName); + + for (TimeLabel label : TimeLabel.values()) { + if (topicName.endsWith(label.getLabel())) { + return label.getIntervalInMilliSec(); + } + } + + throw new IllegalArgumentException( + topicName.concat(" does not have any default time interval.")); + } + + /** + * Kafka Streams allows for stateful stream processing. The internal state is managed in + * so-called state stores. A fault-tolerant state store is an internally created and + * compacted changelog topic. This function return the changelog topic name. + * + * @param inputTopic {@link String} stating the input topic name read by the stateful stream + * @param outputTopic {@link String} stating the output topic name written by the stateful + * stream + * + * @return {@code String} representing the changelog topic name + */ + public static String getStateStoreName(String inputTopic, String outputTopic) { + Objects.requireNonNull(inputTopic); + Objects.requireNonNull(outputTopic); + + return FROM_LABEL + inputTopic + TO_LABEL + outputTopic; + } + + /** + * TODO. + * @param topicName TODO + * @return TODO + */ + public static Set getTimedOutputStateStoreTopics(String topicName) { + Set set = new HashSet<>(); + + Set output = TopicUtils.getTimedOutTopics(topicName); + set.addAll(output); + output.forEach(stateStore -> set.add(TopicUtils.getStateStoreName(topicName, stateStore))); + + return set; + } +} diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Utils.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Utils.java new file mode 100644 index 00000000..ae99f0f2 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Utils.java @@ -0,0 +1,82 @@ +package org.radarcns.specifications.util; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.io.IOException; +import java.util.HashSet; +import java.util.Objects; +import java.util.Properties; +import java.util.Set; +import org.radarcns.kafka.aggregator.AggregatorDouble; +import org.radarcns.kafka.aggregator.AggregatorDoubleArray; + +/** + * TODO. + */ +public final class Utils { + + private static final String GRADLE_PROPERTIES = "exchange.properties"; + private static final String PROPERTY_VALUE = "project.group"; + private static String projectGroup; + + private static final Set TIMED_AGGREGATOR; + + static { + TIMED_AGGREGATOR = new HashSet<>(); + TIMED_AGGREGATOR.add(AggregatorDouble.class.getCanonicalName()); + TIMED_AGGREGATOR.add(AggregatorDoubleArray.class.getCanonicalName()); + } + + private Utils() { + //Static class + } + + /** + * TODO. + * @return TODO + */ + public static String getProjectGroup() { + if (Objects.isNull(projectGroup)) { + try { + Properties prop = new Properties(); + + + //System.out.println(); + + prop.load( + ClassLoader.getSystemClassLoader().getResourceAsStream(GRADLE_PROPERTIES)); + projectGroup = prop.getProperty(PROPERTY_VALUE); + } catch (IOException exc) { + throw new IllegalStateException(PROPERTY_VALUE.concat( + " cannot be extracted from ").concat(GRADLE_PROPERTIES), exc); + } + } + + return projectGroup; + //return "org.radarcns"; + } + + /** + * TODO. + * @param aggregator TODO + * @return TODO + */ + public static boolean isTimedAggregator(String aggregator) { + return TIMED_AGGREGATOR.contains(aggregator); + } + +} diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/Processor.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/Processor.java deleted file mode 100644 index 11680f4e..00000000 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/Processor.java +++ /dev/null @@ -1,86 +0,0 @@ -package org.radarcns.specifications.util.passive; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; -import org.radarcns.catalogue.DataType; -import org.radarcns.catalogue.SensorName; -import org.radarcns.catalogue.Unit; - -/** - * TODO. - */ -public class Processor { - - private final SensorName name; - - private final String doc; - - private final double sampleRate; - - private final Unit unit; - - private final DataType dataType; - - private final String inputTopicName; - - private final String inputKeyClass; - - private final String inputValueClass; - - private final String outputTopicName; - - private final String aggregatorClass; - - /** - * TODO. - * @param name TODO - * @param doc TODO - * @param sampleRate TODO - * @param unit TODO - * @param dataType TODO - * @param inputTopicName TODO - * @param inputKeyClass TODO - * @param inputValueClass TODO - * @param outputTopicName TODO - * @param aggregatorClass TODO - */ - @JsonCreator - public Processor( - @JsonProperty("name") SensorName name, - @JsonProperty("doc") String doc, - @JsonProperty("sample_rate") double sampleRate, - @JsonProperty("unit") Unit unit, - @JsonProperty("data_type") DataType dataType, - @JsonProperty("input_topic_name") String inputTopicName, - @JsonProperty("input_key_class") String inputKeyClass, - @JsonProperty("input_value_class") String inputValueClass, - @JsonProperty("output_topic_name") String outputTopicName, - @JsonProperty("aggregator_class") String aggregatorClass) { - this.name = name; - this.doc = doc; - this.sampleRate = sampleRate; - this.unit = unit; - this.dataType = dataType; - this.inputTopicName = inputTopicName; - this.inputKeyClass = inputKeyClass; - this.inputValueClass = inputValueClass; - this.outputTopicName = outputTopicName; - this.aggregatorClass = aggregatorClass; - } -} diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/Sensor.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/Sensor.java deleted file mode 100644 index 5cce3336..00000000 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/passive/Sensor.java +++ /dev/null @@ -1,126 +0,0 @@ -package org.radarcns.specifications.util.passive; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; -import org.radarcns.catalogue.DataType; -import org.radarcns.catalogue.SensorName; -import org.radarcns.catalogue.Unit; - -/** - * TODO. - */ -public class Sensor { - - private final SensorName name; - - private final String appProvider; - - private final String doc; - - private final double sampleRate; - - private final Unit unit; - - private final DataType dataType; - - private final String topicName; - - private final String keyClass; - - private final String valueClass; - - private final String aggregatorClass; - - /** - * TODO. - * @param name TODO - * @param appProvider TODO - * @param doc TODO - * @param sampleRate TODO - * @param unit TODO - * @param dataType TODO - * @param topicName TODO - * @param keyClass TODO - * @param valueClass TODO - * @param aggregatorClass TODO - */ - @JsonCreator - public Sensor( - @JsonProperty("name") SensorName name, - @JsonProperty("app_provider") String appProvider, - @JsonProperty("doc") String doc, - @JsonProperty("sample_rate") double sampleRate, - @JsonProperty("unit") Unit unit, - @JsonProperty("data_type") DataType dataType, - @JsonProperty("topic_name") String topicName, - @JsonProperty("key_class") String keyClass, - @JsonProperty("value_class") String valueClass, - @JsonProperty("aggregator_class") String aggregatorClass) { - this.name = name; - this.appProvider = appProvider; - this.doc = doc; - this.sampleRate = sampleRate; - this.unit = unit; - this.dataType = dataType; - this.topicName = topicName; - this.keyClass = keyClass; - this.valueClass = valueClass; - this.aggregatorClass = aggregatorClass; - } - - public SensorName getName() { - return name; - } - - public String getAppProvider() { - return appProvider; - } - - public String getDoc() { - return doc; - } - - public double getSampleRate() { - return sampleRate; - } - - public Unit getUnit() { - return unit; - } - - public DataType getDataType() { - return dataType; - } - - public String getTopicName() { - return topicName; - } - - public String getKeyClass() { - return keyClass; - } - - public String getValueClass() { - return valueClass; - } - - public String getAggregatorClass() { - return aggregatorClass; - } -} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/ActiveValidation.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/ActiveValidation.java new file mode 100644 index 00000000..e9d7037b --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/ActiveValidation.java @@ -0,0 +1,71 @@ +package org.radarcns.specifications; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertTrue; +import static org.radarcns.specifications.SourceCatalogue.BASE_PATH; +import static org.radarcns.specifications.SourceCatalogue.YAML_EXTENSION; +import static org.radarcns.specifications.validator.ValidationSupport.getMessage; + +import java.io.File; +import java.io.IOException; +import org.junit.Test; +import org.radarcns.active.questionnaire.QuestionnaireType; +import org.radarcns.config.YamlConfigLoader; +import org.radarcns.specifications.SourceCatalogue.NameFolder; +import org.radarcns.specifications.source.active.questionnaire.Question; +import org.radarcns.specifications.source.active.questionnaire.QuestionnaireSource; +import org.radarcns.specifications.source.active.questionnaire.Response; +import org.radarcns.specifications.validator.ValidationResult; +import org.radarcns.specifications.validator.Validator; + +/** + * TODO. + */ +public class ActiveValidation { + + @Test + public void validate() throws IOException { + for (QuestionnaireType type : QuestionnaireType.values()) { + + if (type.name().equals(QuestionnaireType.UNKNOWN.name())) { + continue; + } + + File file = new File(BASE_PATH.resolve( + NameFolder.ACTIVE.getName()).resolve( + type.name().toLowerCase().concat(YAML_EXTENSION)).toUri()); + + QuestionnaireSource source = new YamlConfigLoader().load(file, + QuestionnaireSource.class); + + ValidationResult result = Validator.validateQuestionnaire(source, file); + assertTrue(getMessage(file, result), result.isValid()); + + for (Question question : source.getQuestions()) { + result = Validator.validateQuestion(question); + assertTrue(getMessage(file, result), result.isValid()); + + for (Response response : question.getResponses()) { + result = Validator.validateResponse(response); + assertTrue(getMessage(file, result), result.isValid()); + } + } + } + } + +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/MonitorValidation.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/MonitorValidation.java new file mode 100644 index 00000000..3034fb03 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/MonitorValidation.java @@ -0,0 +1,58 @@ +package org.radarcns.specifications; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertTrue; +import static org.radarcns.specifications.SourceCatalogue.BASE_PATH; +import static org.radarcns.specifications.SourceCatalogue.YAML_EXTENSION; +import static org.radarcns.specifications.validator.ValidationSupport.getMessage; + +import java.io.File; +import java.io.IOException; +import org.junit.Test; +import org.radarcns.catalogue.MonitorSourceType; +import org.radarcns.config.YamlConfigLoader; +import org.radarcns.specifications.SourceCatalogue.NameFolder; +import org.radarcns.specifications.source.passive.MonitorSource; +import org.radarcns.specifications.validator.ValidationResult; +import org.radarcns.specifications.validator.Validator; + +/** + * TODO. + */ +public class MonitorValidation { + + @Test + public void validate() throws IOException { + for (MonitorSourceType type : MonitorSourceType.values()) { + + if (type.name().equals(MonitorSourceType.UNKNOWN.name())) { + continue; + } + + File file = new File(BASE_PATH.resolve( + NameFolder.MONITOR.getName()).resolve( + type.name().toLowerCase().concat(YAML_EXTENSION)).toUri()); + + MonitorSource source = new YamlConfigLoader().load(file, MonitorSource.class); + + ValidationResult result = Validator.validateMonitor(source, file); + assertTrue(getMessage(file, result), result.isValid()); + } + } + +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueTest.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueTest.java deleted file mode 100644 index 82efd863..00000000 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueTest.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.radarcns.specifications; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertTrue; -import static org.radarcns.specifications.SourceCatalogue.getActiveSources; -import static org.radarcns.specifications.SourceCatalogue.getMonitorSources; -import static org.radarcns.specifications.SourceCatalogue.getPassiveSources; - -import java.util.List; -import org.apache.kafka.common.errors.InvalidTopicException; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import scala.MatchError; - -/** - * TODO. - */ -public class SourceCatalogueTest { - - private static final Logger LOGGER = LoggerFactory.getLogger(SourceCatalogueTest.class); - - @Test - public void validateTopicName() { - assertTrue(getActiveSources().values().stream().allMatch(source -> - validateTopicName(source.getName(), source.getTopicName()))); - - assertTrue(getMonitorSources().values().stream().allMatch(source -> - validateTopicName(source.getName(), source.getTopicName()))); - - assertTrue(getPassiveSources().values().stream() - .map(passiveSource -> passiveSource.getSensors()) - .flatMap(List::stream).allMatch(sensor -> - validateTopicName(sensor.getName().name(), sensor.getTopicName()))); - } - - private static boolean validateTopicName(String origin, String topicName) { - try { - kafka.common.Topic.validate(topicName); - return true; - } catch (InvalidTopicException | MatchError exc) { - LOGGER.error("Topic {} in {} is invalid", topicName, origin); - return false; - } - } -} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueValidation.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueValidation.java new file mode 100644 index 00000000..cfd1afa0 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueValidation.java @@ -0,0 +1,80 @@ +package org.radarcns.specifications; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertTrue; +import static org.radarcns.specifications.SourceCatalogue.getActiveSource; +import static org.radarcns.specifications.SourceCatalogue.getMonitorSource; +import static org.radarcns.specifications.SourceCatalogue.getPassiveSource; +import static org.radarcns.specifications.validator.ValidationSupport.isValidTopic; + +import java.util.Arrays; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import org.junit.Test; +import org.radarcns.active.questionnaire.QuestionnaireType; +import org.radarcns.catalogue.MonitorSourceType; +import org.radarcns.catalogue.PassiveSourceType; + +/** + * TODO. + */ +public class SourceCatalogueValidation { + + @Test + public void checkActiveSourceType() { + assertTrue("Not all " + QuestionnaireType.class.getName() + " has a specification", + Arrays.stream(QuestionnaireType.values()) + .filter(type -> !type.name().equals(QuestionnaireType.UNKNOWN.name())) + .allMatch(type -> getActiveSource(type) != null)); + } + + @Test + public void checkMonitorSourceType() { + assertTrue("Not all " + MonitorSourceType.class.getName() + " has a specification", + Arrays.stream(MonitorSourceType.values()) + .filter(type -> !type.name().equals(MonitorSourceType.UNKNOWN.name())) + .allMatch(type -> getMonitorSource(type) != null)); + } + + @Test + public void checkPassiveSourceType() { + assertTrue("Not all " + PassiveSourceType.class.getName() + " has a specification", + Arrays.stream(PassiveSourceType.values()) + .filter(type -> !type.name().equals(PassiveSourceType.UNKNOWN.name())) + .allMatch(type -> getPassiveSource(type) != null)); + } + + @Test + public void validateTopicNamesVerbose() { + for (Entry>> source + : SourceCatalogue.getTopicsVerbose().entrySet()) { + for (Entry> details : source.getValue().entrySet()) { + details.getValue().forEach(topic -> assertTrue( + topic + " in " + source.getKey() + "-" + details.getKey() + + " is invalid", isValidTopic(topic))); + } + } + } + + @Test + public void validateTopicNames() { + SourceCatalogue.getTopics().forEach(topic -> + assertTrue(topic + " is invalid", isValidTopic(topic))); + } +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/util/TopicUtilsTest.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/util/TopicUtilsTest.java new file mode 100644 index 00000000..ba34761d --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/util/TopicUtilsTest.java @@ -0,0 +1,114 @@ +package org.radarcns.specifications.util; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.radarcns.specifications.util.TopicUtils.getStateStoreName; +import static org.radarcns.specifications.util.TopicUtils.getTimeInterval; +import static org.radarcns.specifications.validator.ValidationSupport.isValidTopic; + +import java.util.HashSet; +import java.util.Set; +import org.junit.Test; + +/** + * TODO. + */ +public class TopicUtilsTest { + + @Test + public void getOutTopicTest() { + assertEquals("topic_name_output", TopicUtils.getOutTopic("topic_name")); + } + + @Test + public void getOutTopicWithTimeTest() { + Set expected = new HashSet<>(); + expected.add("topic_name_output_10sec"); + expected.add("topic_name_output_30sec"); + expected.add("topic_name_output_1min"); + expected.add("topic_name_output_10min"); + expected.add("topic_name_output_1hour"); + expected.add("topic_name_output_1day"); + expected.add("topic_name_output_1week"); + + assertEquals(expected, TopicUtils.getTimedOutTopics("topic_name_output")); + } + + @Test(expected = NullPointerException.class) + public void getTimeIntervalNullTest() { + getTimeInterval(null); + } + + @Test(expected = IllegalArgumentException.class) + public void getTimeIntervalExceptionTest() { + getTimeInterval("topic_name_10secs"); + } + + @Test + public void getTimeIntervalTest() { + assertEquals(10000, getTimeInterval("topic_name_10sec"), 0); + } + + @Test + public void getStateStoreNameTest() { + assertEquals("`ic_in-To-topic_out", + getStateStoreName("topic_in", "topic_out")); + + assertTrue(isValidTopic(getStateStoreName("topic_in", "topic_out"))); + } + + @Test(expected = NullPointerException.class) + public void getStateStoreNullInputTest() { + getStateStoreName(null, "topic_out"); + } + + @Test(expected = NullPointerException.class) + public void getStateStoreNullOutputTest() { + getStateStoreName("topic_in", null); + } + + @Test(expected = NullPointerException.class) + public void getStateStoreNullTest() { + getStateStoreName(null, null); + } + + @Test + public void getTimedOutputStateStoreTopicTest() { + Set expected = new HashSet<>(); + expected.add("topic_name_10sec"); + expected.add("From-topic_name-To-topic_name_10sec"); + expected.add("topic_name_10sec"); + expected.add("From-topic_name-To-topic_name_10sec"); + expected.add("topic_name_30sec"); + expected.add("From-topic_name-To-topic_name_30sec"); + expected.add("topic_name_1min"); + expected.add("From-topic_name-To-topic_name_1min"); + expected.add("topic_name_10min"); + expected.add("From-topic_name-To-topic_name_10min"); + expected.add("topic_name_1hour"); + expected.add("From-topic_name-To-topic_name_1hour"); + expected.add("topic_name_1day"); + expected.add("From-topic_name-To-topic_name_1day"); + expected.add("topic_name_1week"); + expected.add("From-topic_name-To-topic_name_1week"); + + assertEquals(expected, TopicUtils.getTimedOutputStateStoreTopics("topic_name")); + } + +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/util/UtilsTest.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/util/UtilsTest.java new file mode 100644 index 00000000..9bc917e8 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/util/UtilsTest.java @@ -0,0 +1,44 @@ +package org.radarcns.specifications.util; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static junit.framework.TestCase.assertFalse; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.radarcns.kafka.aggregator.AggregatorDouble; +import org.radarcns.kafka.aggregator.AggregatorDoubleArray; + +/** + * TODO. + */ +public class UtilsTest { + + @Test + public void projectGroupTest() { + assertEquals("org.radarcns", Utils.getProjectGroup()); + } + + @Test + public void timedAggregatorTest() { + assertTrue(Utils.isTimedAggregator(AggregatorDouble.class.getCanonicalName())); + assertTrue(Utils.isTimedAggregator(AggregatorDoubleArray.class.getCanonicalName())); + assertFalse(Utils.isTimedAggregator(getClass().getCanonicalName())); + } + +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/GenericRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/GenericRoles.java new file mode 100644 index 00000000..a60b47f3 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/GenericRoles.java @@ -0,0 +1,210 @@ +package org.radarcns.specifications.validator; + +import static org.radarcns.specifications.validator.ValidationResult.invalid; +import static org.radarcns.specifications.validator.ValidationResult.valid; +import static org.radarcns.specifications.validator.GenericRoles.Package.AGGREGATOR; +import static org.radarcns.specifications.validator.GenericRoles.Package.KAFKA_KEY; +import static org.radarcns.specifications.validator.ValidationSupport.isValidClass; +import static org.radarcns.specifications.validator.ValidationSupport.isValidTopic; +import static org.radarcns.specifications.validator.ValidationSupport.isValidTopicVerbose; +import static org.radarcns.specifications.validator.ValidationSupport.isValidTopicsVerbose; + +import java.util.Collection; +import java.util.Objects; +import java.util.function.Function; +import java.util.function.Predicate; +import org.radarcns.catalogue.Unit; +import org.radarcns.specifications.util.Utils; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * TODO. + */ +interface GenericRoles extends Function { + + /** Package names. */ + enum Package { + AGGREGATOR(".kafka.aggregator"), + KAFKA_KEY(".kafka.key"), + MONITOR(".monitor"), + QUESTIONNAIRE(".active.questionnaire"),; + + private final String name; + + Package(String name) { + this.name = name; + } + + public String getName() { + return name; + } + } + + /** Messages. */ + enum GeneralInfo implements Message { + AGGREGATOR("Kafka aggregator class is invalid, cannot be null and must be a valid AVRO " + .concat("schema located at").concat(Package.AGGREGATOR.getName()).concat(".")), + DOCUMENTATION("Documentation should not be null and should be ended by a dot."), + KEY("Kafka key class is invalid, cannot be null and must be a valid AVRO schema located at " + .concat(Utils.getProjectGroup()).concat(KAFKA_KEY.getName()).concat(".")), + NAME("Name cannot be null"), + SAMPLE_RATE("Sample rate cannot be null."), + TOPIC("Topic name is invalid."), + UNIT("Unit cannot be null or equal to ".concat(Unit.UNKNOWN.name()).concat(".")), + VALUE("Kafka value class is invalid. It cannot be null and must be a valida AVRO schema" + + "located at"); + + private final String message; + + GeneralInfo(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + + public String getMessage(String info) { + return message.concat(" ").concat(info); + } + } + + /** + * TODO. + * @param name + * @return TODO + */ + static GenericRoles validateName(String name) { + return object -> Objects.nonNull(name) ? valid() : invalid(GeneralInfo.NAME.getMessage()); + } + + /** + * TODO. + * @param key + * @return TODO + */ + static GenericRoles validateKey(String key) { + return object -> Objects.nonNull(key) + && isValidClass(key) + && key.startsWith(Utils.getProjectGroup().concat(KAFKA_KEY.getName())) ? + valid() : invalid(GeneralInfo.KEY.getMessage()); + } + + /** + * TODO. + * @param packageName + * @param value + * @return TODO + */ + static GenericRoles validateValue(Package packageName, String value) { + return object -> Objects.nonNull(packageName) && Objects.nonNull(value) + && isValidClass(value) + && value.startsWith(Utils.getProjectGroup().concat(packageName.getName())) ? + valid() : invalid(GeneralInfo.VALUE.getMessage()); + } + + /** + * TODO. + * @param aggregator TODO + * @param nullable TODO + * @return TODO + */ + static GenericRoles validateAggregator(String aggregator, boolean nullable) { + return object -> nullable && Objects.isNull(aggregator) + || Objects.nonNull(aggregator) + && isValidClass(aggregator) + && aggregator.startsWith(Utils.getProjectGroup().concat(AGGREGATOR.getName())) ? + valid() : invalid(GeneralInfo.AGGREGATOR.getMessage()); + } + + /** + * TODO. + * @param topic TODO + * @return TODO + */ + static GenericRoles validateTopic(String topic) { + return object -> Objects.nonNull(topic) && isValidTopic(topic) ? valid() + : invalid(GeneralInfo.TOPIC.getMessage(isValidTopicVerbose(topic))); + } + + /** + * TODO. + * @param topics TODO + * @return TODO + */ + static GenericRoles validateTopics(Collection topics) { + return object -> Objects.nonNull(topics) + && !topics.isEmpty() + && topics.stream().allMatch(topic -> isValidTopic(topic)) + ? valid() : invalid(GeneralInfo.TOPIC.getMessage(isValidTopicsVerbose(topics))); + } + + /** + * TODO. + * @param doc TODO + * @param nullable TODO + * @return TODO + */ + static GenericRoles validateDoc(String doc, boolean nullable) { + return object -> nullable || Objects.nonNull(doc) && doc.endsWith(".") ? + valid() : invalid(GeneralInfo.DOCUMENTATION.getMessage()); + } + + /** + * TODO. + * @param rate TODO + * @return TODO + */ + static GenericRoles validateSampleRate(double rate) { + return object -> Objects.nonNull(rate) ? valid() + : invalid(GeneralInfo.SAMPLE_RATE.getMessage()); + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateUnit(Unit unit) { + return object-> Objects.nonNull(unit) && !unit.name().equals(Unit.UNKNOWN)? + valid() : invalid(GeneralInfo.UNIT.getMessage()); + } + + /** + * + * TODO. + * @param predicate TODO + * @param message TODO + * @return TODO + */ + static GenericRoles validate(Predicate predicate, Message message) { + return object -> predicate.test(object) ? valid() + : invalid(message.getMessage()); + } + + /** + * TODO. + * @param other TODO + * @return TODO + */ + default GenericRoles and(GenericRoles other) { + return object -> { + final ValidationResult result = this.apply((T)object); + return result.isValid() ? other.apply((T) object) : result; + }; + } +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Invalid.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Invalid.java new file mode 100644 index 00000000..eb3213c7 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Invalid.java @@ -0,0 +1,61 @@ +package org.radarcns.specifications.validator; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.util.Optional; + +/** + * TODO. + */ +public class Invalid implements ValidationResult { + + private final String reason; + + Invalid(String reason) { + this.reason = reason; + } + + public boolean isValid() { + return false; + } + + public Optional getReason() { + return Optional.of(reason); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (!(o instanceof Invalid)) { + return false; + } + + Invalid invalid = (Invalid) o; + + return new org.apache.commons.lang3.builder.EqualsBuilder().append( + reason, invalid.reason).isEquals(); + } + + @Override + public int hashCode() { + return new org.apache.commons.lang3.builder.HashCodeBuilder( + 17, 37).append(reason).toHashCode(); + } +} diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Source.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Message.java similarity index 72% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Source.java rename to java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Message.java index 1b965818..9f1141c7 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Source.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Message.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications.util; +package org.radarcns.specifications.validator; /* * Copyright 2017 King's College London and The Hyve @@ -16,22 +16,23 @@ * limitations under the License. */ + + /** * TODO. */ -public abstract class Source { - - private final String name; +public interface Message { /** * TODO. - * @param name TODO + * @return TODO */ - public Source(String name) { - this.name = name; - } + String getMessage(); - public String getName() { - return name; - } + /** + * TODO. + * @param info TODO + * @return TODO + */ + String getMessage(String info); } diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/MonitorRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/MonitorRoles.java new file mode 100644 index 00000000..565567c7 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/MonitorRoles.java @@ -0,0 +1,117 @@ +package org.radarcns.specifications.validator; + +import static org.radarcns.specifications.SourceCatalogue.YAML_EXTENSION; +import static org.radarcns.specifications.validator.ValidationResult.invalid; +import static org.radarcns.specifications.validator.ValidationResult.valid; +import static org.radarcns.specifications.validator.ValidationSupport.removeExtension; + +import java.io.File; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; +import org.radarcns.catalogue.DataType; +import org.radarcns.specifications.source.passive.MonitorSource; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * TODO. + */ +interface MonitorRoles extends GenericRoles { + + String APP_PROVIDER_NAME = "org.radarcns.application.ApplicationServiceProvider"; + + /** Messages. */ + enum MonitorInfo implements Message { + APP_PROVIDER("App provider cannot be null and must be equal to ".concat( + APP_PROVIDER_NAME).concat(".")), + DATA_TYPE("The only data type should be ".concat(DataType.RAW.name()).concat(".")), + NOT_AGGREGATOR("Aggregator is not defined yet."), + SOURCE_TYPE("Source type cannot be null and should match the file name."), + TOPICS("Topic set is invalid. It should contain only to the topic specified in " + + "the configuration file."); + + private final String message; + + MonitorInfo(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + + public String getMessage(String info) { + return message.concat(" ").concat(info); + } + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateAggregator() { + return monitor -> Objects.isNull(monitor.getAggregator()) ? valid() + : invalid(MonitorInfo.NOT_AGGREGATOR.getMessage()); + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateAppProvider() { + return monitor -> Objects.nonNull(monitor.getAppProvider()) + && monitor.getAppProvider().equals(APP_PROVIDER_NAME) ? + valid() : invalid(MonitorInfo.APP_PROVIDER.getMessage()); + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateDataType() { + return monitor -> Objects.nonNull(monitor.getDataType()) + && monitor.getDataType().name().equals(DataType.RAW.name()) ? + valid() : invalid(MonitorInfo.DATA_TYPE.getMessage()); + } + + /** + * TODO. + * @param file + * @return TODO + */ + static GenericRoles validateSourceType(File file) { + return monitor -> Objects.nonNull(monitor.getType()) + && removeExtension(file, YAML_EXTENSION).equalsIgnoreCase(monitor.getType().name())? + valid() : invalid(MonitorInfo.SOURCE_TYPE.getMessage()); + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateTopics() { + return monitor -> { + Set input = monitor.getTopics(); + return Objects.nonNull(input) && input.size() == 1 + && input.contains(monitor.getTopic()) ? + valid() : invalid(MonitorInfo.TOPICS.getMessage( + input == null ? "" : input.stream().map(Object::toString).collect( + Collectors.joining(",")))); + }; + } +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/PassiveSourceRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/PassiveSourceRoles.java new file mode 100644 index 00000000..d07acf74 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/PassiveSourceRoles.java @@ -0,0 +1,133 @@ +package org.radarcns.specifications.validator; + +import static org.radarcns.specifications.SourceCatalogue.YAML_EXTENSION; +import static org.radarcns.specifications.validator.ValidationResult.invalid; +import static org.radarcns.specifications.validator.ValidationResult.valid; +import static org.radarcns.specifications.validator.ValidationSupport.removeExtension; + +import java.io.File; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.radarcns.specifications.source.passive.PassiveSource; +import org.radarcns.specifications.util.Utils; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * TODO. + */ +interface PassiveSourceRoles extends GenericRoles { + + /** + * TODO. + * @return TODO + */ + static Set allowedProvider() { + return Stream.of( + Utils.getProjectGroup().concat(".phone.PhoneLocationProvider"), + Utils.getProjectGroup().concat(".phone.PhoneLogProvider"), + Utils.getProjectGroup().concat(".phone.PhoneUsageProvider"), + Utils.getProjectGroup().concat(".phone.PhoneSensorProvider"), + Utils.getProjectGroup().concat(".biovotion.BiovotionServiceProvider"), + Utils.getProjectGroup().concat(".empatica.E4ServiceProvider"), + Utils.getProjectGroup().concat(".pebble.PebbleServiceProvider") + ).collect(Collectors.toSet()); + } + + /** Messages. */ + enum PassiveSourceInfo implements Message { + APP_PROVIDER("App provider cannot be null and must be equal to one of the following " + .concat(allowedProvider().stream().map( + Object::toString).collect(Collectors.joining(","))).concat(".")), + TOPICS("There is no correspondence between topics set at source level al the union of all " + + "sensors and processors topic sets."), + TYPE("Passive Source Type cannot be null and should be equal to vendor concatenated to " + + "name in uppercase."), + VENDOR_AND_NAME("Vendor and name values cannot be null. Vendor concatenated to name must " + + "be equal to the source file name."); + + private final String message; + + PassiveSourceInfo(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + + public String getMessage(String info) { + return message.concat(" ").concat(info); + } + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateAppProvider() { + return passive -> Objects.isNull(passive.getAppProvider()) + || allowedProvider().contains(passive.getAppProvider()) ? + valid() : invalid(PassiveSourceInfo.APP_PROVIDER.getMessage()); + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateTopics() { + return passive -> { + Set topics = passive.getTopics(); + boolean check = Objects.nonNull(topics) + && !topics.isEmpty() + && passive.getSensors().stream().allMatch( + sensor -> topics.containsAll(sensor.getTopics())); + + if (Objects.nonNull(passive.getProcessors())) { + check = check && passive.getProcessors().stream().allMatch( + processor -> topics.containsAll(processor.getTopics())); + } + + return check ? valid() : invalid(PassiveSourceInfo.TOPICS.getMessage()); + }; + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateSourceType() { + return passive -> Objects.nonNull(passive.getType()) ? + valid() : invalid(PassiveSourceInfo.TYPE.getMessage()); + } + + /** + * TODO. + * @param file + * @return TODO + */ + static GenericRoles validateModelAndVendor(File file) { + return passive -> Objects.nonNull(passive.getVendor()) + && Objects.nonNull(passive.getModel()) + && removeExtension(file, YAML_EXTENSION).equalsIgnoreCase( + passive.getVendor().toLowerCase().concat( + passive.getModel().toLowerCase())) ? valid() + : invalid(PassiveSourceInfo.VENDOR_AND_NAME.getMessage()); + } +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ProcessorRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ProcessorRoles.java new file mode 100644 index 00000000..320f5f1f --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ProcessorRoles.java @@ -0,0 +1,133 @@ +package org.radarcns.specifications.validator; + +import static org.radarcns.specifications.validator.PassiveSourceRoles.allowedProvider; +import static org.radarcns.specifications.validator.ValidationResult.invalid; +import static org.radarcns.specifications.validator.ValidationResult.valid; + +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; +import org.radarcns.catalogue.DataType; +import org.radarcns.catalogue.SensorName; +import org.radarcns.specifications.source.passive.Processor; +import org.radarcns.specifications.source.passive.Sensor; +import org.radarcns.specifications.util.TopicUtils; +import org.radarcns.specifications.util.TopicUtils.TimeLabel; +import org.radarcns.specifications.util.Utils; +import org.radarcns.specifications.validator.PassiveSourceRoles.PassiveSourceInfo; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * TODO. + */ +interface ProcessorRoles extends GenericRoles { + + /** Messages. */ + enum ProcessorInfo implements Message { + DATA_TYPE("Processor data type should be equal to ".concat( + DataType.RADAR.name()).concat(".")), + NAME("Processor name must be not null and different from ".concat( + SensorName.UNKNOWN.name()).concat(".")), + OUTPUT("Processor output base topic cannot be null."), + TOPICS("Topic set is not compliant with the provided aggregator. In case of non " + + "timed aggregator, it should contain the input topic and the correspondent " + + "output topic. In case of timed aggregator, then the set should contain the " + + "input topic name and all the 7 related time frame topics."); + + private final String message; + + ProcessorInfo(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + + public String getMessage(String info) { + return message.concat(" ").concat(info); + } + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateDataType() { + return processor -> Objects.nonNull(processor.getDataType()) + && processor.getDataType().name().equals(DataType.RADAR.name()) + ? valid() : invalid(ProcessorInfo.DATA_TYPE.getMessage()); + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateName() { + return processor -> Objects.nonNull(processor.getName()) + && !processor.getName().name().equals(SensorName.UNKNOWN.name()) + ? valid() : invalid(ProcessorInfo.NAME.getMessage()); + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateBaseOutputTopic() { + return processor -> Objects.nonNull(processor.getBaseOutputTopic()) + ? valid() : invalid(ProcessorInfo.OUTPUT.getMessage()); + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateTopics() { + return processor -> { + boolean check = true; + Set topics = processor.getTopics(); + if (Utils.isTimedAggregator(processor.getAggregator())) { + check = check && topics.size() == 1 + TimeLabel.values().length; + check = check && topics.contains(processor.getInputTopic()); + check = check && topics.contains(processor.getBaseOutputTopic().concat( + TimeLabel.TEN_SECOND.getLabel())); + check = check && topics.contains(processor.getBaseOutputTopic().concat( + TimeLabel.THIRTY_SECOND.getLabel())); + check = check && topics.contains(processor.getBaseOutputTopic().concat( + TimeLabel.ONE_MIN.getLabel())); + check = check && topics.contains(processor.getBaseOutputTopic().concat( + TimeLabel.TEN_MIN.getLabel())); + check = check && topics.contains(processor.getBaseOutputTopic().concat( + TimeLabel.ONE_HOUR.getLabel())); + check = check && topics.contains(processor.getBaseOutputTopic().concat( + TimeLabel.ONE_DAY.getLabel())); + check = check && topics.contains(processor.getBaseOutputTopic().concat( + TimeLabel.ONE_WEEK.getLabel())); + } else { + check = check && topics.size() == 2; + check = check && topics.contains(processor.getInputTopic()); + check = check && topics.contains(TopicUtils.getOutTopic( + processor.getBaseOutputTopic())); + } + + return check ? valid() : invalid(ProcessorInfo.TOPICS.getMessage( + topics.stream().map(Object::toString).collect(Collectors.joining(",")) + )); + }; + } +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/QuestionRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/QuestionRoles.java new file mode 100644 index 00000000..a2d4fc8b --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/QuestionRoles.java @@ -0,0 +1,93 @@ +package org.radarcns.specifications.validator; + +import static org.radarcns.specifications.validator.ValidationResult.invalid; +import static org.radarcns.specifications.validator.ValidationResult.valid; + +import java.util.Objects; +import org.radarcns.catalogue.RadarWidget; +import org.radarcns.specifications.source.active.questionnaire.Question; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * TODO. + */ +interface QuestionRoles extends GenericRoles { + + /** Messages. */ + enum QuestionInfo implements Message { + CONTENT("Question content cannot be null and should be ended by a point."), + LEAD("Question lead cannot be null and should be ended by a question mark."), + WIDGET("Widget cannot be null and must be different from ".concat( + RadarWidget.UNKNOWN.name()).concat(".")), + RESPONSES("Responses list cannot be null or empty."); + + private final String message; + + QuestionInfo(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + + public String getMessage(String info) { + return message.concat(" ").concat(info); + } + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateContent() { + return question -> Objects.nonNull(question.getContent()) + && question.getContent().endsWith(".") + ? valid() : invalid(QuestionInfo.CONTENT.getMessage()); + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateLead() { + return question -> Objects.nonNull(question.getLead()) + && question.getLead().endsWith("?") + ? valid() : invalid(QuestionInfo.LEAD.getMessage()); + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateWidget() { + return question -> Objects.nonNull(question.getWidget()) + && !question.getWidget().name().equals(RadarWidget.UNKNOWN.name()) + ? valid() : invalid(QuestionInfo.WIDGET.getMessage()); + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateResposnses() { + return question -> Objects.nonNull(question.getResponses()) + && !question.getResponses().isEmpty() + ? valid() : invalid(QuestionInfo.RESPONSES.getMessage()); + } +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/QuestionnaireRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/QuestionnaireRoles.java new file mode 100644 index 00000000..6ad44575 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/QuestionnaireRoles.java @@ -0,0 +1,104 @@ +package org.radarcns.specifications.validator; + +import static org.radarcns.specifications.SourceCatalogue.YAML_EXTENSION; +import static org.radarcns.specifications.validator.ValidationResult.invalid; +import static org.radarcns.specifications.validator.ValidationResult.valid; +import static org.radarcns.specifications.validator.ValidationSupport.removeExtension; + +import java.io.File; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; +import org.radarcns.catalogue.ActiveSourceType; +import org.radarcns.specifications.source.active.questionnaire.QuestionnaireSource; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +interface QuestionnaireRoles extends GenericRoles { + + /** Messages. */ + enum QuestionnaireInfo implements Message { + ASSESSMENT_TYPE("Assessment Type should be equal to ".concat( + ActiveSourceType.QUESTIONNAIRE.name()).concat(".")), + QUESTIONS("Questions list cannot null or empty."), + QUESTIONNAIRE_TYPE("Questionnaire Type cannot be null and should match with the " + + "configuration file name."), + TOPICS("Topic set is invalid. It should contain only to the topic specified in " + + "the configuration file."); + + private final String message; + + QuestionnaireInfo(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + + public String getMessage(String info) { + return message.concat(" ").concat(info); + } + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateAssessmentType() { + return questionnaire -> Objects.nonNull(questionnaire.getAssessmentType()) + && questionnaire.getAssessmentType().name().equals( + ActiveSourceType.QUESTIONNAIRE.name()) + ? valid() : invalid(QuestionnaireInfo.ASSESSMENT_TYPE.getMessage()); + } + + /** + * TODO. + * @param file + * @return TODO + */ + static GenericRoles validateQuestionnaireType(File file) { + return questionnaire -> Objects.nonNull(questionnaire.getQuestionnaireType()) + && removeExtension(file, YAML_EXTENSION).equalsIgnoreCase( + questionnaire.getQuestionnaireType().name()) + ? valid() : invalid(QuestionnaireInfo.QUESTIONNAIRE_TYPE.getMessage()); + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateQuestions() { + return questionnaire -> Objects.nonNull(questionnaire.getQuestions()) + && !questionnaire.getQuestions().isEmpty() + ? valid() : invalid(QuestionnaireInfo.QUESTIONS.getMessage()); + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateTopics() { + return questionnaire -> { + Set input = questionnaire.getTopics(); + return Objects.nonNull(input) && input.size() == 1 + && input.contains(questionnaire.getTopic()) ? + valid() : invalid(QuestionnaireInfo.TOPICS.getMessage( + input == null ? "" : input.stream().map(Object::toString).collect( + Collectors.joining(",")))); + }; + } +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ResponseRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ResponseRoles.java new file mode 100644 index 00000000..e7e60dc3 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ResponseRoles.java @@ -0,0 +1,67 @@ +package org.radarcns.specifications.validator; + +import static org.radarcns.specifications.validator.ValidationResult.invalid; +import static org.radarcns.specifications.validator.ValidationResult.valid; + +import java.util.Objects; +import org.radarcns.specifications.source.active.questionnaire.Response; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * TODO. + */ +interface ResponseRoles extends GenericRoles { + + /** Messages. */ + enum ResponseInfo implements Message { + SCORE("Answer score cannot be null."), + TEXT("Answer text cannot be null."); + + private final String message; + + ResponseInfo(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + + public String getMessage(String info) { + return message.concat(" ").concat(info); + } + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateScore() { + return response -> Objects.nonNull(response.getScore()) + ? valid() : invalid(ResponseInfo.SCORE.getMessage()); + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateText() { + return response -> Objects.nonNull(response.getText()) + ? valid() : invalid(ResponseInfo.TEXT.getMessage()); + } +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/SensorRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/SensorRoles.java new file mode 100644 index 00000000..db31c647 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/SensorRoles.java @@ -0,0 +1,137 @@ +package org.radarcns.specifications.validator; + +import static org.radarcns.specifications.validator.PassiveSourceRoles.validateSourceType; +import static org.radarcns.specifications.validator.ValidationResult.invalid; +import static org.radarcns.specifications.validator.ValidationResult.valid; +import static org.radarcns.specifications.validator.PassiveSourceRoles.allowedProvider; + +import java.util.Objects; +import java.util.Set; +import java.util.function.BooleanSupplier; +import java.util.stream.Collectors; +import org.radarcns.catalogue.DataType; +import org.radarcns.catalogue.SensorName; +import org.radarcns.specifications.source.passive.Sensor; +import org.radarcns.specifications.util.TopicUtils; +import org.radarcns.specifications.util.TopicUtils.TimeLabel; +import org.radarcns.specifications.util.Utils; +import org.radarcns.specifications.validator.PassiveSourceRoles.PassiveSourceInfo; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * TODO. + */ +interface SensorRoles extends GenericRoles { + + /** Messages. */ + enum SensorInfo implements Message { + DATA_TYPE("Sensor data type cannot be null and should differ from ".concat( + DataType.UNKNOWN.name()).concat(".")), + NAME("Sensor name must be not null and different from ".concat( + SensorName.UNKNOWN.name()).concat(".")), + TOPICS("Topic set is not compliant with the provided aggregator. In case of null " + + "aggregator, the set should contain only the provided topic. In case of non " + + "timed aggregator, it should contain the specified topic and the correspondent " + + "output topic. In case of timed aggregator, then the set should contain the set " + + "topic name and all the 7 related time frame topics."); + + private final String message; + + SensorInfo(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + + public String getMessage(String info) { + return message.concat(" ").concat(info); + } + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateAppProvider() { + return passive -> Objects.isNull(passive.getAppProvider()) + || allowedProvider().contains(passive.getAppProvider()) ? + valid() : invalid(PassiveSourceInfo.APP_PROVIDER.getMessage()); + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateDataType() { + return sensor -> Objects.nonNull(sensor.getDataType()) + && !sensor.getDataType().name().equals(DataType.UNKNOWN.name()) + ? valid() : invalid(SensorInfo.DATA_TYPE.getMessage()); + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateName() { + return sensor -> Objects.nonNull(sensor.getName()) + && !sensor.getName().name().equals(SensorName.UNKNOWN.name()) + ? valid() : invalid(SensorInfo.NAME.getMessage()); + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateTopics() { + return sensor -> { + boolean check = true; + Set topics = sensor.getTopics(); + if (Objects.isNull(sensor.getAggregator())) { + check = check && topics.size() == 1; + check = check && topics.contains(sensor.getTopic()); + } else if (Utils.isTimedAggregator(sensor.getAggregator())) { + check = check && topics.size() == 1 + TimeLabel.values().length; + check = check && topics.contains(sensor.getTopic()); + check = check && topics.contains(sensor.getTopic().concat( + TimeLabel.TEN_SECOND.getLabel())); + check = check && topics.contains(sensor.getTopic().concat( + TimeLabel.THIRTY_SECOND.getLabel())); + check = check && topics.contains(sensor.getTopic().concat( + TimeLabel.ONE_MIN.getLabel())); + check = check && topics.contains(sensor.getTopic().concat( + TimeLabel.TEN_MIN.getLabel())); + check = check && topics.contains(sensor.getTopic().concat( + TimeLabel.ONE_HOUR.getLabel())); + check = check && topics.contains(sensor.getTopic().concat( + TimeLabel.ONE_DAY.getLabel())); + check = check && topics.contains(sensor.getTopic().concat( + TimeLabel.ONE_WEEK.getLabel())); + } else { + check = check && topics.size() == 2; + check = check && topics.contains(sensor.getTopic()); + check = check && topics.contains(TopicUtils.getOutTopic(sensor.getTopic())); + } + + return check ? valid() : invalid(SensorInfo.TOPICS.getMessage( + topics.stream().map(Object::toString).collect(Collectors.joining(",")) + )); + }; + } +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ValidationResult.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ValidationResult.java new file mode 100644 index 00000000..0fcfda90 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ValidationResult.java @@ -0,0 +1,37 @@ +package org.radarcns.specifications.validator; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.util.Optional; + +/** + * TODO. + */ +public interface ValidationResult { + + static ValidationResult valid() { + return ValidationSupport.getValid(); + } + + static ValidationResult invalid(String reason) { + return new Invalid(reason); + } + + boolean isValid(); + + Optional getReason(); +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ValidationSupport.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ValidationSupport.java new file mode 100644 index 00000000..577dade2 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ValidationSupport.java @@ -0,0 +1,153 @@ +package org.radarcns.specifications.validator; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.io.File; +import java.util.Collection; +import java.util.Objects; +import java.util.Optional; +import org.apache.kafka.common.errors.InvalidTopicException; +import scala.MatchError; + +/** + * TODO. + */ +public final class ValidationSupport { + + static final ValidationResult VALID = new ValidationResult() { + public boolean isValid() { + return true; + } + + public Optional getReason() { + return Optional.empty(); + } + }; + + + private ValidationSupport() { + //Static class + } + + static ValidationResult getValid() { + return VALID; + } + + /** + * TODO. + * @param className TODO. + * @return TODO. + */ + public static boolean isValidClass(String className){ + try { + Class.forName(className); + return true; + } catch( ClassNotFoundException e ) { + return false; + } + } + + /** + * TODO. + * @param topicName TODO + * @return TODO + */ + public static boolean isValidTopic(String topicName) { + try { + kafka.common.Topic.validate(topicName); + return true; + } catch (InvalidTopicException | MatchError exc) { + return false; + } + } + + /** + * TODO. + * @param topicName TODO + * @return TODO + */ + public static String isValidTopicVerbose(String topicName) { + if (topicName == null) { + return ". Topic is null."; + } + try { + kafka.common.Topic.validate(topicName); + return ""; + } catch (InvalidTopicException | MatchError exc) { + return exc.toString(); + } + } + + /** + * TODO. + * @param topicNames TODO + * @return TODO + */ + public static String isValidTopicsVerbose(Collection topicNames) { + Objects.requireNonNull(topicNames); + + StringBuilder reason = new StringBuilder(topicNames.size() * 100); + boolean first = true; + String temp; + for (String value : topicNames) { + temp = isValidTopicVerbose(value); + if (!temp.isEmpty()) { + if (first) { + reason.append(temp); + first = false; + } else { + reason.append(", ".concat(temp)); + } + } + } + + if (first) { + return ""; + } + + return reason.toString(); + } + + /** + * TODO. + * @param file TODO + * @return TODO + */ + public static String getMessage(File file, ValidationResult result) { + if (result.isValid()) { + return ""; + } + + return result.getReason().get().concat(" ").concat( + file.getAbsolutePath()).concat(" is invalid."); + } + + /** + * TODO. + * @param file TODO + * @param extension TODO + * @return TODO + */ + public static String removeExtension(File file, String extension) { + String value = file.getName(); + if (value.endsWith(extension)) { + value = value.substring(0, value.length() - extension.length()); + } + return value; + } + +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Validator.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Validator.java new file mode 100644 index 00000000..bea43fd2 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Validator.java @@ -0,0 +1,188 @@ +package org.radarcns.specifications.validator; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.radarcns.specifications.validator.MonitorRoles.validateAggregator; +import static org.radarcns.specifications.validator.MonitorRoles.validateDataType; +import static org.radarcns.specifications.validator.PassiveSourceRoles.validateModelAndVendor; +import static org.radarcns.specifications.validator.ProcessorRoles.validateBaseOutputTopic; +import static org.radarcns.specifications.validator.QuestionRoles.validateContent; +import static org.radarcns.specifications.validator.QuestionRoles.validateLead; +import static org.radarcns.specifications.validator.QuestionRoles.validateResposnses; +import static org.radarcns.specifications.validator.QuestionRoles.validateWidget; +import static org.radarcns.specifications.validator.QuestionnaireRoles.validateQuestionnaireType; +import static org.radarcns.specifications.validator.QuestionnaireRoles.validateQuestions; +import static org.radarcns.specifications.validator.ResponseRoles.validateScore; +import static org.radarcns.specifications.validator.ResponseRoles.validateText; +import static org.radarcns.specifications.validator.GenericRoles.validateDoc; +import static org.radarcns.specifications.validator.GenericRoles.validateKey; +import static org.radarcns.specifications.validator.GenericRoles.validateSampleRate; +import static org.radarcns.specifications.validator.GenericRoles.validateTopic; +import static org.radarcns.specifications.validator.GenericRoles.validateUnit; +import static org.radarcns.specifications.validator.GenericRoles.validateValue; + +import java.io.File; +import org.radarcns.specifications.source.active.questionnaire.Question; +import org.radarcns.specifications.source.active.questionnaire.QuestionnaireSource; +import org.radarcns.specifications.source.active.questionnaire.Response; +import org.radarcns.specifications.source.passive.MonitorSource; +import org.radarcns.specifications.source.passive.PassiveSource; +import org.radarcns.specifications.source.passive.Processor; +import org.radarcns.specifications.source.passive.Sensor; +import org.radarcns.specifications.validator.GenericRoles.Package; + +//TODO validate enum to be different from UNKNOWN + +/** + * TODO + */ +public final class Validator { + + private Validator() { + //Static class + } + + /** + * TODO. + * @param source TODO + * @param file TODO + * @return TODO + */ + public static ValidationResult validateMonitor(MonitorSource source, File file) { + return (ValidationResult) MonitorRoles.validateAppProvider() + .and(validateAggregator()) + .and(validateDataType()) + .and(validateDoc(source.getDoc(), false)) + .and(validateKey(source.getKey())) + .and(GenericRoles.validateName(source.getName())) + .and(validateSampleRate(source.getSampleRate())) + .and(MonitorRoles.validateSourceType(file)) + .and(validateTopic(source.getTopic())) + .and(MonitorRoles.validateTopics()) + .and(GenericRoles.validateTopics(source.getTopics())) + .and(validateValue(Package.MONITOR, source.getValue())) + .and(validateUnit(source.getUnit())) + .apply(source); + } + + /** + * TODO. + * @param question TODO + * @return TODO + */ + public static ValidationResult validateQuestion(Question question) { + return (ValidationResult) validateContent() + .and(validateLead()) + .and(validateWidget()) + .and(validateResposnses()) + .apply(question); + } + + /** + * TODO. + * @param source TODO + * @param file TODO + * @return TODO + */ + public static ValidationResult validateQuestionnaire(QuestionnaireSource source, File file) { + return (ValidationResult) QuestionnaireRoles.validateAssessmentType() + .and(validateDoc(source.getDoc(), false)) + .and(validateKey(source.getKey())) + .and(GenericRoles.validateName(source.getName())) + .and(validateQuestions()) + .and(validateQuestionnaireType(file)) + .and(validateTopic(source.getTopic())) + .and(QuestionnaireRoles.validateTopics()) + .and(GenericRoles.validateTopics(source.getTopics())) + .and(validateValue(Package.QUESTIONNAIRE, source.getValue())) + .apply(source); + } + + /** + * TODO. + * @param source TODO + * @param file TODO + * @return TODO + */ + public static ValidationResult validatePassive(PassiveSource source, File file) { + return (ValidationResult) PassiveSourceRoles.validateAppProvider() + .and(validateDoc(source.getDoc(), true)) + .and(validateModelAndVendor(file)) + .and(GenericRoles.validateName(source.getName())) + .and(PassiveSourceRoles.validateSourceType()) + .and(PassiveSourceRoles.validateTopics()) + .and(GenericRoles.validateTopics(source.getTopics())) + .apply(source); + } + + /** + * TODO. + * @param response TODO + * @return TODO + */ + public static ValidationResult validateResponse(Response response) { + return (ValidationResult) validateScore() + .and(validateText()) + .apply(response); + } + + /** + * TODO. + * @param sensor TODO + * @param packageName TODO + * @return TODO + */ + public static ValidationResult validateSensor(Package packageName, Sensor sensor) { + return (ValidationResult) + validateAggregator(sensor.getAggregator(), true) + .and(SensorRoles.validateAppProvider()) + .and(SensorRoles.validateDataType()) + .and(validateDoc(sensor.getDoc(), true)) + .and(validateKey(sensor.getKey())) + .and(SensorRoles.validateName()) + .and(validateSampleRate(sensor.getSampleRate())) + .and(validateTopic(sensor.getTopic())) + .and(SensorRoles.validateTopics()) + .and(GenericRoles.validateTopics(sensor.getTopics())) + .and(validateUnit(sensor.getUnit())) + .and(validateValue(packageName, sensor.getValue())) + .apply(sensor); + } + + /** + * TODO. + * @param processor TODO + * @param packageName TODO + * @return TODO + */ + public static ValidationResult validateProcessor(Package packageName, Processor processor) { + return (ValidationResult) + validateAggregator(processor.getAggregator(), false) + .and(validateBaseOutputTopic()) + .and(ProcessorRoles.validateDataType()) + .and(validateDoc(processor.getDoc(), true)) + .and(validateKey(processor.getInputKey())) + .and(ProcessorRoles.validateName()) + .and(validateSampleRate(processor.getSampleRate())) + .and(validateTopic(processor.getInputTopic())) + .and(ProcessorRoles.validateTopics()) + .and(GenericRoles.validateTopics(processor.getTopics())) + .and(validateUnit(processor.getUnit())) + .and(validateValue(packageName, processor.getInputValue())) + .apply(processor); + } +} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaCatalogValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaCatalogValidator.java index 66cd79fd..62230e8d 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaCatalogValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaCatalogValidator.java @@ -45,7 +45,7 @@ *

  • passive
  • * * - * At moment, the {@code restapi} does not have a well defined structure. + * At moment, the {@code restApi} does not have a well defined structure. * TODO. */ public class SchemaCatalogValidator { @@ -58,7 +58,7 @@ public enum NameFolder { KAFKA("kafka"), MONITOR("monitor"), PASSIVE("passive"), - REST_API("restapi"), + REST_API("restApi"), SPECIFICATIONS("specifications"); private final String name; @@ -153,11 +153,19 @@ public File getFolder() { } @Before + /** + * Verifies that {@link SkipConfig} is valid. Without this configuration, the validation cannot + * take place. + */ public void validateSkipConfig() { assertTrue(SkipConfig.validate()); } @Test + /** + * Validates the {@code RADAR-Schemas/commons} folder applying specific tests to each subfolder. + * @see CommonsValidator + */ public void commons() throws IOException { assertEquals(true, RootFolder.COMMONS.getFolder().isDirectory()); @@ -169,18 +177,25 @@ public void commons() throws IOException { } @Test - public void restapi() { + //TODO + public void restApi() { assertEquals(true, RootFolder.REST_API.getFolder().isDirectory()); //TODO check whether it is possible to define a structure } @Test + /** + * Checks only the folder structure, the validation is left the to the + * {@code radar-schemas-specifications} module. + */ public void specifications() { assertEquals(true, RootFolder.SPECIFICATIONS.getFolder().isDirectory()); for (SpecificationFolder folder : SpecificationFolder.values()) { assertEquals(true, folder.getFolder().isDirectory()); } + + //TODO verify that there are only YML files } } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfigTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfigTest.java index 66fe1162..d8f2b4ce 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfigTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfigTest.java @@ -80,7 +80,7 @@ public void testSkipFile() { skipPaths.add(Paths.get("commons/**/*.avsc")); assertTrue(skipFile(new File(root.concat("commons/monitor/application/" + "application_external_time.avsc")), skipPaths)); - assertFalse(skipFile(new File(root.concat("restapi/data/acceleration.avsc")), skipPaths)); + assertFalse(skipFile(new File(root.concat("restApi/data/acceleration.avsc")), skipPaths)); } @Test diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidationRoles.java similarity index 82% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java rename to java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidationRoles.java index b6dc5981..e73111ef 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRole.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidationRoles.java @@ -1,18 +1,18 @@ package org.radarcns.validator.util; -import static org.radarcns.validator.util.SchemaValidatorRole.Message.DEFAULT_VALUE; -import static org.radarcns.validator.util.SchemaValidatorRole.Message.DOC; -import static org.radarcns.validator.util.SchemaValidatorRole.Message.ENUMERATION_SYMBOL; -import static org.radarcns.validator.util.SchemaValidatorRole.Message.ENUMERATION_UNKNOWN_SYMBOL; -import static org.radarcns.validator.util.SchemaValidatorRole.Message.FIELDS; -import static org.radarcns.validator.util.SchemaValidatorRole.Message.FILED_NAME; -import static org.radarcns.validator.util.SchemaValidatorRole.Message.NOT_TIME_COMPLETED_FIELD; -import static org.radarcns.validator.util.SchemaValidatorRole.Message.NOT_TIME_RECEIVED_FIELD; -import static org.radarcns.validator.util.SchemaValidatorRole.Message.RECORD_NAME; -import static org.radarcns.validator.util.SchemaValidatorRole.Message.SYMBOLS; -import static org.radarcns.validator.util.SchemaValidatorRole.Message.TIME_COMPLETED_FIELD; -import static org.radarcns.validator.util.SchemaValidatorRole.Message.TIME_FIELD; -import static org.radarcns.validator.util.SchemaValidatorRole.Message.TIME_RECEIVED_FIELD; +import static org.radarcns.validator.util.SchemaValidationRoles.Message.DEFAULT_VALUE; +import static org.radarcns.validator.util.SchemaValidationRoles.Message.DOC; +import static org.radarcns.validator.util.SchemaValidationRoles.Message.ENUMERATION_SYMBOL; +import static org.radarcns.validator.util.SchemaValidationRoles.Message.ENUMERATION_UNKNOWN_SYMBOL; +import static org.radarcns.validator.util.SchemaValidationRoles.Message.FIELDS; +import static org.radarcns.validator.util.SchemaValidationRoles.Message.FILED_NAME; +import static org.radarcns.validator.util.SchemaValidationRoles.Message.NOT_TIME_COMPLETED_FIELD; +import static org.radarcns.validator.util.SchemaValidationRoles.Message.NOT_TIME_RECEIVED_FIELD; +import static org.radarcns.validator.util.SchemaValidationRoles.Message.RECORD_NAME; +import static org.radarcns.validator.util.SchemaValidationRoles.Message.SYMBOLS; +import static org.radarcns.validator.util.SchemaValidationRoles.Message.TIME_COMPLETED_FIELD; +import static org.radarcns.validator.util.SchemaValidationRoles.Message.TIME_FIELD; +import static org.radarcns.validator.util.SchemaValidationRoles.Message.TIME_RECEIVED_FIELD; import static org.radarcns.validator.util.ValidationResult.invalid; import static org.radarcns.validator.util.ValidationResult.valid; import static org.radarcns.validator.util.ValidationSupport.extractEnumerationFields; @@ -53,7 +53,7 @@ */ @SuppressWarnings("PMD.GodClass") //TODO split in record and enumerator. -interface SchemaValidatorRole extends Function { +interface SchemaValidationRoles extends Function { String TIME = "time"; String TIME_RECEIVED = "timeReceived"; @@ -147,7 +147,7 @@ public String getMessage() { * @param subFolder TODO * @return TODO */ - static SchemaValidatorRole validateNameSpace(NameFolder rootFolder, String subFolder) { + static SchemaValidationRoles validateNameSpace(NameFolder rootFolder, String subFolder) { String expected = getNamespace(rootFolder, subFolder); return schema -> Objects.nonNull(schema.getNamespace()) @@ -162,7 +162,7 @@ static SchemaValidatorRole validateNameSpace(NameFolder rootFolder, String subFo * @param path TODO * @return TODO */ - static SchemaValidatorRole validateRecordName(Path path) { + static SchemaValidationRoles validateRecordName(Path path) { return validateRecordName(path, false); } @@ -172,7 +172,7 @@ static SchemaValidatorRole validateRecordName(Path path) { * @param skip TODO * @return TODO */ - static SchemaValidatorRole validateRecordName(Path path, boolean skip) { + static SchemaValidationRoles validateRecordName(Path path, boolean skip) { String expected = getRecordName(path); return schema -> @@ -186,7 +186,7 @@ static SchemaValidatorRole validateRecordName(Path path, boolean skip) { * TODO. * @return TODO */ - static SchemaValidatorRole validateSchemaDocumentation() { + static SchemaValidationRoles validateSchemaDocumentation() { return validate(schema -> Objects.nonNull(schema.getDoc()), DOC); } @@ -194,7 +194,7 @@ static SchemaValidatorRole validateSchemaDocumentation() { * TODO. * @return TODO */ - static SchemaValidatorRole validateFields() { + static SchemaValidationRoles validateFields() { return validate(schema -> !schema.getFields().isEmpty(), FIELDS); } @@ -202,7 +202,7 @@ static SchemaValidatorRole validateFields() { * TODO. * @return TODO */ - static SchemaValidatorRole validateFieldName() { + static SchemaValidationRoles validateFieldName() { return validateFieldName(null); } @@ -211,7 +211,7 @@ static SchemaValidatorRole validateFieldName() { * @param skip TODO * @return TODO */ - static SchemaValidatorRole validateFieldName(Set skip) { + static SchemaValidationRoles validateFieldName(Set skip) { return validate(schema -> schema.getFields() .stream() @@ -228,7 +228,7 @@ static SchemaValidatorRole validateFieldName(Set skip) { * TODO. * @return TODO */ - static SchemaValidatorRole validateFieldDocumentation() { + static SchemaValidationRoles validateFieldDocumentation() { return validate(schema -> schema.getFields() .stream() @@ -241,7 +241,7 @@ static SchemaValidatorRole validateFieldDocumentation() { * TODO. * @return TODO */ - static SchemaValidatorRole validateSymbols() { + static SchemaValidationRoles validateSymbols() { return validate(schema -> !schema.getEnumSymbols().isEmpty(), SYMBOLS); } @@ -249,7 +249,7 @@ static SchemaValidatorRole validateSymbols() { * TODO. * @return TODO */ - static SchemaValidatorRole validateEnumerationSymbols() { + static SchemaValidationRoles validateEnumerationSymbols() { return validate(schema -> extractEnumerationFields(schema).stream() .allMatch(symbol -> symbol.matches( @@ -261,7 +261,7 @@ static SchemaValidatorRole validateEnumerationSymbols() { * TODO. * @return TODO */ - static SchemaValidatorRole validateDefault() { + static SchemaValidationRoles validateDefault() { return validate(schema -> ValidationSupport.validateDefault(schema), DEFAULT_VALUE); } @@ -269,7 +269,7 @@ static SchemaValidatorRole validateDefault() { * TODO. * @return TODO */ - static SchemaValidatorRole validateTime() { + static SchemaValidationRoles validateTime() { return validate(schema -> Objects.nonNull(schema.getField(TIME)) && schema.getField(TIME).schema().getType().equals(Type.DOUBLE), TIME_FIELD); } @@ -278,7 +278,7 @@ static SchemaValidatorRole validateTime() { * TODO. * @return TODO */ - static SchemaValidatorRole validateTimeCompleted() { + static SchemaValidationRoles validateTimeCompleted() { return validate(schema -> Objects.nonNull(schema.getField(TIME_COMPLETED)) && schema.getField(TIME_COMPLETED).schema().getType().equals(Type.DOUBLE), TIME_COMPLETED_FIELD); @@ -288,7 +288,7 @@ static SchemaValidatorRole validateTimeCompleted() { * TODO. * @return TODO */ - static SchemaValidatorRole validateNotTimeCompleted() { + static SchemaValidationRoles validateNotTimeCompleted() { return validate(schema -> Objects.isNull(schema.getField(TIME_COMPLETED)), NOT_TIME_COMPLETED_FIELD); } @@ -297,7 +297,7 @@ static SchemaValidatorRole validateNotTimeCompleted() { * TODO. * @return TODO */ - static SchemaValidatorRole validateTimeReceived() { + static SchemaValidationRoles validateTimeReceived() { return validate(schema -> Objects.nonNull(schema.getField(TIME_RECEIVED)) && schema.getField(TIME_RECEIVED).schema().getType().equals(Type.DOUBLE), TIME_RECEIVED_FIELD); @@ -307,7 +307,7 @@ static SchemaValidatorRole validateTimeReceived() { * TODO. * @return TODO */ - static SchemaValidatorRole validateNotTimeReceived() { + static SchemaValidationRoles validateNotTimeReceived() { return validate(schema -> Objects.isNull(schema.getField(TIME_RECEIVED)), NOT_TIME_RECEIVED_FIELD); } @@ -316,7 +316,7 @@ static SchemaValidatorRole validateNotTimeReceived() { * TODO. * @return TODO */ - static SchemaValidatorRole validateUnknownSymbol() { + static SchemaValidationRoles validateUnknownSymbol() { return validate(schema -> extractEnumerationFields(schema).contains(UNKNOWN), ENUMERATION_UNKNOWN_SYMBOL); } @@ -327,7 +327,7 @@ static SchemaValidatorRole validateUnknownSymbol() { * @param message TODO * @return TODO */ - static SchemaValidatorRole validate(Predicate predicate, Message message) { + static SchemaValidationRoles validate(Predicate predicate, Message message) { return schema -> predicate.test(schema) ? valid() : invalid(message.getMessage(schema)); } @@ -336,7 +336,7 @@ static SchemaValidatorRole validate(Predicate predicate, Message message * @param other TODO * @return TODO */ - default SchemaValidatorRole and(SchemaValidatorRole other) { + default SchemaValidationRoles and(SchemaValidationRoles other) { return schema -> { final ValidationResult result = this.apply(schema); return result.isValid() ? other.apply(schema) : result; @@ -350,7 +350,7 @@ default SchemaValidatorRole and(SchemaValidatorRole other) { * @param subfolder TODO * @return TODO */ - static SchemaValidatorRole getGeneralRecordValidator(Path pathToSchema, NameFolder root, + static SchemaValidationRoles getGeneralRecordValidator(Path pathToSchema, NameFolder root, String subfolder) { return validateNameSpace(root, subfolder) .and(validateRecordName(pathToSchema)) @@ -370,7 +370,7 @@ static SchemaValidatorRole getGeneralRecordValidator(Path pathToSchema, NameFold * @param skipFieldName TODO * @return TODO */ - static SchemaValidatorRole getGeneralRecordValidator(Path pathToSchema, NameFolder root, + static SchemaValidationRoles getGeneralRecordValidator(Path pathToSchema, NameFolder root, String subfolder, boolean skipRecordName, Set skipFieldName) { return validateNameSpace(root, subfolder) .and(validateRecordName(pathToSchema, skipRecordName)) @@ -388,7 +388,7 @@ static SchemaValidatorRole getGeneralRecordValidator(Path pathToSchema, NameFold * @param subfolder TODO * @return TODO */ - static SchemaValidatorRole getActiveValidator(Path pathToSchema, NameFolder root, + static SchemaValidationRoles getActiveValidator(Path pathToSchema, NameFolder root, String subfolder) { return getGeneralRecordValidator(pathToSchema, root, subfolder) .and(validateTime()) @@ -405,7 +405,7 @@ static SchemaValidatorRole getActiveValidator(Path pathToSchema, NameFolder root * @param skipFieldName TODO * @return TODO */ - static SchemaValidatorRole getActiveValidator(Path pathToSchema, NameFolder root, + static SchemaValidationRoles getActiveValidator(Path pathToSchema, NameFolder root, String subfolder, boolean skipRecordName, Set skipFieldName) { return getGeneralRecordValidator(pathToSchema, root, subfolder, skipRecordName, skipFieldName) @@ -421,7 +421,7 @@ static SchemaValidatorRole getActiveValidator(Path pathToSchema, NameFolder root * @param subfolder TODO * @return TODO */ - static SchemaValidatorRole getMonitorValidator(Path pathToSchema, NameFolder root, + static SchemaValidationRoles getMonitorValidator(Path pathToSchema, NameFolder root, String subfolder) { return getGeneralRecordValidator(pathToSchema, root, subfolder) .and(validateTime()); @@ -436,7 +436,7 @@ static SchemaValidatorRole getMonitorValidator(Path pathToSchema, NameFolder roo * @param skipFieldName TODO * @return TODO */ - static SchemaValidatorRole getMonitorValidator(Path pathToSchema, NameFolder root, + static SchemaValidationRoles getMonitorValidator(Path pathToSchema, NameFolder root, String subfolder, boolean skipRecordName, Set skipFieldName) { return getGeneralRecordValidator(pathToSchema, root, subfolder, skipRecordName, skipFieldName) @@ -450,7 +450,7 @@ static SchemaValidatorRole getMonitorValidator(Path pathToSchema, NameFolder roo * @param subfolder TODO * @return TODO */ - static SchemaValidatorRole getPassiveValidator(Path pathToSchema, NameFolder root, + static SchemaValidationRoles getPassiveValidator(Path pathToSchema, NameFolder root, String subfolder) { return getGeneralRecordValidator(pathToSchema, root, subfolder) .and(validateTime()) @@ -467,7 +467,7 @@ static SchemaValidatorRole getPassiveValidator(Path pathToSchema, NameFolder roo * @param skipFieldName TODO * @return TODO */ - static SchemaValidatorRole getPassiveValidator(Path pathToSchema, NameFolder root, + static SchemaValidationRoles getPassiveValidator(Path pathToSchema, NameFolder root, String subfolder, boolean skipRecordName, Set skipFieldName) { return getGeneralRecordValidator(pathToSchema, root, subfolder, skipRecordName, skipFieldName) @@ -483,7 +483,7 @@ static SchemaValidatorRole getPassiveValidator(Path pathToSchema, NameFolder roo * @param subfolder TODO * @return TODO */ - static SchemaValidatorRole getGeneralEnumValidator(Path pathToSchema, NameFolder root, + static SchemaValidationRoles getGeneralEnumValidator(Path pathToSchema, NameFolder root, String subfolder) { return validateNameSpace(root, subfolder) .and(validateRecordName(pathToSchema)) @@ -501,7 +501,7 @@ static SchemaValidatorRole getGeneralEnumValidator(Path pathToSchema, NameFolder * @param skipRecordName TODO * @return TODO */ - static SchemaValidatorRole getGeneralEnumValidator(Path pathToSchema, NameFolder root, + static SchemaValidationRoles getGeneralEnumValidator(Path pathToSchema, NameFolder root, String subfolder, boolean skipRecordName) { return validateNameSpace(root, subfolder) .and(validateRecordName(pathToSchema, skipRecordName)) diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidationRolesTest.java similarity index 85% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java rename to java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidationRolesTest.java index bc43eed9..e30f640d 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorRoleTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidationRolesTest.java @@ -21,10 +21,10 @@ import static org.junit.Assert.assertTrue; import static org.radarcns.validator.SchemaCatalogValidator.NameFolder.ACTIVE; import static org.radarcns.validator.SchemaCatalogValidator.NameFolder.MONITOR; -import static org.radarcns.validator.util.SchemaValidatorRole.ENUMERATION_SYMBOL_REGEX; -import static org.radarcns.validator.util.SchemaValidatorRole.FIELD_NAME_REGEX; -import static org.radarcns.validator.util.SchemaValidatorRole.NAMESPACE_REGEX; -import static org.radarcns.validator.util.SchemaValidatorRole.RECORD_NAME_REGEX; +import static org.radarcns.validator.util.SchemaValidationRoles.ENUMERATION_SYMBOL_REGEX; +import static org.radarcns.validator.util.SchemaValidationRoles.FIELD_NAME_REGEX; +import static org.radarcns.validator.util.SchemaValidationRoles.NAMESPACE_REGEX; +import static org.radarcns.validator.util.SchemaValidationRoles.RECORD_NAME_REGEX; import java.nio.file.Path; import java.nio.file.Paths; @@ -38,7 +38,7 @@ /** * TODO. */ -public class SchemaValidatorRoleTest { +public class SchemaValidationRolesTest { private static final String ACTIVE_NAME_SPACE_MOCK = "org.radarcns.active.test"; private static final String MONITOR_NAME_SPACE_MOCK = "org.radarcns.monitor.test"; @@ -93,7 +93,7 @@ public void recordNameRegex() { public void fieldNameRegex() { assertTrue("interBeatInterval".matches(FIELD_NAME_REGEX)); assertTrue("x".matches(FIELD_NAME_REGEX)); - assertTrue(SchemaValidatorRole.TIME.matches(FIELD_NAME_REGEX)); + assertTrue(SchemaValidationRoles.TIME.matches(FIELD_NAME_REGEX)); assertTrue("subjectId".matches(FIELD_NAME_REGEX)); assertTrue("listOfSeveralThings".matches(FIELD_NAME_REGEX)); assertFalse("Time".matches(FIELD_NAME_REGEX)); @@ -124,7 +124,7 @@ public void nameSpaceTest() { .fields() .endRecord(); - result = SchemaValidatorRole.validateNameSpace(ACTIVE, + result = SchemaValidationRoles.validateNameSpace(ACTIVE, "questionnaire").apply(schema); assertTrue(result.isValid()); @@ -135,7 +135,7 @@ public void nameSpaceTest() { .fields() .endRecord(); - result = SchemaValidatorRole.validateNameSpace(MONITOR, "test").apply(schema); + result = SchemaValidationRoles.validateNameSpace(MONITOR, "test").apply(schema); assertFalse(result.isValid()); @@ -151,7 +151,7 @@ public void nameSpaceTest() { .fields() .endRecord(); - result = SchemaValidatorRole.validateNameSpace(MONITOR, "test").apply(schema); + result = SchemaValidationRoles.validateNameSpace(MONITOR, "test").apply(schema); assertFalse(result.isValid()); @@ -167,7 +167,7 @@ public void nameSpaceTest() { .fields() .endRecord(); - result = SchemaValidatorRole.validateNameSpace(MONITOR, "test").apply(schema); + result = SchemaValidationRoles.validateNameSpace(MONITOR, "test").apply(schema); assertFalse(result.isValid()); @@ -189,7 +189,7 @@ public void recordNameTest() { .fields() .endRecord(); - result = SchemaValidatorRole.validateRecordName( + result = SchemaValidationRoles.validateRecordName( Paths.get("/path/to/schema.avsc")).apply(schema); assertTrue(result.isValid()); @@ -203,7 +203,7 @@ public void recordNameTest() { .fields() .endRecord(); - result = SchemaValidatorRole.validateRecordName(filePath).apply(schema); + result = SchemaValidationRoles.validateRecordName(filePath).apply(schema); assertFalse(result.isValid()); @@ -213,7 +213,7 @@ public void recordNameTest() { + fieldName + INVALID_TEXT), result.getReason()); - result = SchemaValidatorRole.validateRecordName(filePath, true).apply(schema); + result = SchemaValidationRoles.validateRecordName(filePath, true).apply(schema); assertTrue(result.isValid()); } @@ -229,7 +229,7 @@ public void fieldsTest() { .fields() .endRecord(); - result = SchemaValidatorRole.validateFields().apply(schema); + result = SchemaValidationRoles.validateFields().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("Avro Record must have field list. " @@ -242,7 +242,7 @@ public void fieldsTest() { .optionalBoolean("optional") .endRecord(); - result = SchemaValidatorRole.validateFields().apply(schema); + result = SchemaValidationRoles.validateFields().apply(schema); assertTrue(result.isValid()); } @@ -259,7 +259,7 @@ public void timeTest() { .requiredString("string") .endRecord(); - result = SchemaValidatorRole.validateTime().apply(schema); + result = SchemaValidationRoles.validateTime().apply(schema); assertFalse(result.isValid()); @@ -272,10 +272,10 @@ public void timeTest() { .builder("org.radarcns.time.test") .record(RECORD_NAME_MOCK) .fields() - .requiredDouble(SchemaValidatorRole.TIME) + .requiredDouble(SchemaValidationRoles.TIME) .endRecord(); - result = SchemaValidatorRole.validateTime().apply(schema); + result = SchemaValidationRoles.validateTime().apply(schema); assertTrue(result.isValid()); } @@ -292,13 +292,13 @@ public void timeCompletedTest() { .requiredString("field") .endRecord(); - result = SchemaValidatorRole.validateTimeCompleted().apply(schema); + result = SchemaValidationRoles.validateTimeCompleted().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("Any ACTIVE schema must have a \"timeCompleted\" field formatted " + "in DOUBLE. org.radarcns.active.test." + RECORD_NAME_MOCK + INVALID_TEXT), result.getReason()); - result = SchemaValidatorRole.validateNotTimeCompleted().apply(schema); + result = SchemaValidationRoles.validateNotTimeCompleted().apply(schema); assertTrue(result.isValid()); schema = SchemaBuilder @@ -308,10 +308,10 @@ public void timeCompletedTest() { .requiredDouble("timeCompleted") .endRecord(); - result = SchemaValidatorRole.validateTimeCompleted().apply(schema); + result = SchemaValidationRoles.validateTimeCompleted().apply(schema); assertTrue(result.isValid()); - result = SchemaValidatorRole.validateNotTimeCompleted().apply(schema); + result = SchemaValidationRoles.validateNotTimeCompleted().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("\"timeCompleted\" is allow only in ACTIVE schemas. " + getFinalMessage(ACTIVE_NAME_SPACE_MOCK, RECORD_NAME_MOCK)), @@ -330,13 +330,13 @@ public void timeReceivedTest() { .requiredString("field") .endRecord(); - result = SchemaValidatorRole.validateTimeReceived().apply(schema); + result = SchemaValidationRoles.validateTimeReceived().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("Any PASSIVE schema must have a \"timeReceived\" field formatted " + "in DOUBLE. org.radarcns.monitor.test." + RECORD_NAME_MOCK + INVALID_TEXT), result.getReason()); - result = SchemaValidatorRole.validateNotTimeReceived().apply(schema); + result = SchemaValidationRoles.validateNotTimeReceived().apply(schema); assertTrue(result.isValid()); schema = SchemaBuilder @@ -346,10 +346,10 @@ public void timeReceivedTest() { .requiredDouble("timeReceived") .endRecord(); - result = SchemaValidatorRole.validateTimeReceived().apply(schema); + result = SchemaValidationRoles.validateTimeReceived().apply(schema); assertTrue(result.isValid()); - result = SchemaValidatorRole.validateNotTimeReceived().apply(schema); + result = SchemaValidationRoles.validateNotTimeReceived().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("\"timeReceived\" is allow only in PASSIVE schemas. " + getFinalMessage(MONITOR_NAME_SPACE_MOCK, RECORD_NAME_MOCK)), @@ -368,7 +368,7 @@ public void fieldNameTest() { .requiredString(FIELD_NUMBER_MOCK + "value") .endRecord(); - result = SchemaValidatorRole.validateFieldName().apply(schema); + result = SchemaValidationRoles.validateFieldName().apply(schema); assertFalse(result.isValid()); String message = "Field name does not respect lowerCamelCase name convention. " @@ -386,7 +386,7 @@ public void fieldNameTest() { .requiredString(FIELD_NUMBER_MOCK) .endRecord(); - result = SchemaValidatorRole.validateFieldName().apply(schema); + result = SchemaValidationRoles.validateFieldName().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of(message + getFinalMessage(MONITOR_NAME_SPACE_MOCK, RECORD_NAME_MOCK)), @@ -397,11 +397,11 @@ public void fieldNameTest() { .record(RECORD_NAME_MOCK) .fields() .requiredString(FIELD_NUMBER_MOCK) - .requiredString(SchemaValidatorRole.TIME) + .requiredString(SchemaValidationRoles.TIME) .endRecord(); - result = SchemaValidatorRole.validateFieldName( - Collections.singleton(SchemaValidatorRole.TIME)).apply(schema); + result = SchemaValidationRoles.validateFieldName( + Collections.singleton(SchemaValidationRoles.TIME)).apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of(message + getFinalMessage(MONITOR_NAME_SPACE_MOCK,RECORD_NAME_MOCK)), @@ -414,7 +414,7 @@ public void fieldNameTest() { .requiredDouble("timeReceived") .endRecord(); - result = SchemaValidatorRole.validateFieldName().apply(schema); + result = SchemaValidationRoles.validateFieldName().apply(schema); assertTrue(result.isValid()); schema = SchemaBuilder @@ -422,10 +422,10 @@ public void fieldNameTest() { .record(RECORD_NAME_MOCK) .fields() .requiredString(FIELD_NUMBER_MOCK) - .requiredString(SchemaValidatorRole.TIME) + .requiredString(SchemaValidationRoles.TIME) .endRecord(); - result = SchemaValidatorRole.validateFieldName( + result = SchemaValidationRoles.validateFieldName( Collections.singleton(FIELD_NUMBER_MOCK)).apply(schema); assertTrue(result.isValid()); } @@ -441,7 +441,7 @@ public void filedDocumentationTest() { + "{\"name\": \"userId\", \"type\": \"string\" , \"doc\": \"Documentation\"}," + "{\"name\": \"sourceId\", \"type\": \"string\"} ]}"); - result = SchemaValidatorRole.validateFieldDocumentation().apply(schema); + result = SchemaValidationRoles.validateFieldDocumentation().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("Documentation is mandatory for any schema and field. The " @@ -455,7 +455,7 @@ public void filedDocumentationTest() { + "\"type\": \"record\", \"name\": \"key\", \"type\": \"record\", \"fields\": [" + "{\"name\": \"userId\", \"type\": \"string\" , \"doc\": \"Documentation.\"}]}"); - result = SchemaValidatorRole.validateFieldDocumentation().apply(schema); + result = SchemaValidationRoles.validateFieldDocumentation().apply(schema); assertTrue(result.isValid()); } @@ -470,7 +470,7 @@ public void schemaDocumentationTest() { .fields() .endRecord(); - result = SchemaValidatorRole.validateSchemaDocumentation().apply(schema); + result = SchemaValidationRoles.validateSchemaDocumentation().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("Documentation is mandatory for any schema and field. The " @@ -488,7 +488,7 @@ public void schemaDocumentationTest() { .fields() .endRecord(); - result = SchemaValidatorRole.validateSchemaDocumentation().apply(schema); + result = SchemaValidationRoles.validateSchemaDocumentation().apply(schema); assertTrue(result.isValid()); } @@ -501,13 +501,13 @@ public void enumerationSymbolsTest() { schema = SchemaBuilder.enumeration(ENUMERATOR_NAME_SPACE_MOCK) .symbols("TEST", UNKNOWN_MOCK); - result = SchemaValidatorRole.validateSymbols().apply(schema); + result = SchemaValidationRoles.validateSymbols().apply(schema); assertTrue(result.isValid()); schema = SchemaBuilder.enumeration(ENUMERATOR_NAME_SPACE_MOCK).symbols(); - result = SchemaValidatorRole.validateSymbols().apply(schema); + result = SchemaValidationRoles.validateSymbols().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("Avro Enumerator must have symbol list. " @@ -526,7 +526,7 @@ public void enumerationSymbolTest() { .enumeration(enumName) .symbols(connected, "DISCONNECTED", UNKNOWN_MOCK); - result = SchemaValidatorRole.validateEnumerationSymbols().apply(schema); + result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); assertTrue(result.isValid()); @@ -540,7 +540,7 @@ public void enumerationSymbolTest() { schema = new Parser().parse(schemaTxtInit.concat( "\"CONNECTED\", \"NOT_CONNECTED\", \"" + UNKNOWN_MOCK + "\"".concat(schemaTxtEnd))); - result = SchemaValidatorRole.validateEnumerationSymbols().apply(schema); + result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); assertTrue(result.isValid()); @@ -548,7 +548,7 @@ public void enumerationSymbolTest() { .enumeration(enumName) .symbols(connected, "disconnected", UNKNOWN_MOCK); - result = SchemaValidatorRole.validateEnumerationSymbols().apply(schema); + result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); String invalidMessage = "Enumerator items should be written in uppercase characters " + "separated by underscores. " @@ -561,7 +561,7 @@ public void enumerationSymbolTest() { .enumeration(enumName) .symbols(connected, "Not_Connected", UNKNOWN_MOCK); - result = SchemaValidatorRole.validateEnumerationSymbols().apply(schema); + result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of(invalidMessage), result.getReason()); @@ -570,7 +570,7 @@ public void enumerationSymbolTest() { .enumeration(enumName) .symbols(connected, "NotConnected", UNKNOWN_MOCK); - result = SchemaValidatorRole.validateEnumerationSymbols().apply(schema); + result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of(invalidMessage), result.getReason()); @@ -578,7 +578,7 @@ public void enumerationSymbolTest() { schema = new Parser().parse(schemaTxtInit.concat( "\"CONNECTED\", \"Not_Connected\", \"" + UNKNOWN_MOCK + "\"".concat(schemaTxtEnd))); - result = SchemaValidatorRole.validateEnumerationSymbols().apply(schema); + result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of(invalidMessage), result.getReason()); @@ -586,7 +586,7 @@ public void enumerationSymbolTest() { schema = new Parser().parse(schemaTxtInit.concat( "\"Connected\", \"NotConnected\", \"" + UNKNOWN_MOCK + "\"".concat(schemaTxtEnd))); - result = SchemaValidatorRole.validateEnumerationSymbols().apply(schema); + result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of(invalidMessage), result.getReason()); @@ -600,14 +600,14 @@ public void unknownSymbolTest() { schema = SchemaBuilder.enumeration(ENUMERATOR_NAME_SPACE_MOCK) .symbols("VALUE", UNKNOWN_MOCK); - result = SchemaValidatorRole.validateUnknownSymbol().apply(schema); + result = SchemaValidationRoles.validateUnknownSymbol().apply(schema); assertTrue(result.isValid()); schema = SchemaBuilder.enumeration(ENUMERATOR_NAME_SPACE_MOCK) .symbols("FIELD", "UN_KNOWN"); - result = SchemaValidatorRole.validateUnknownSymbol().apply(schema); + result = SchemaValidationRoles.validateUnknownSymbol().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("Enumerator must contain the \"UNKNOWN\" symbol. It is " @@ -618,7 +618,7 @@ public void unknownSymbolTest() { @Test(expected = IllegalArgumentException.class) public void defaultValueExceptionTest() { - SchemaValidatorRole.validateDefault().apply( + SchemaValidationRoles.validateDefault().apply( SchemaBuilder.enumeration(ENUMERATOR_NAME_SPACE_MOCK) .symbols("VAL", UNKNOWN_MOCK)); } @@ -648,7 +648,7 @@ public void defaultValueTest() { .nullableBytes("nullableBytes", new byte[1]) //check with text schema .endRecord(); - result = SchemaValidatorRole.validateDefault().apply(schema); + result = SchemaValidationRoles.validateDefault().apply(schema); assertTrue(result.isValid());*/ @@ -659,7 +659,7 @@ public void defaultValueTest() { + "[ {\"name\": \"nullableBytes\", \"type\": [ \"null\", \"bytes\"], " + "\"default\": \"null\" } ] }"); - result = SchemaValidatorRole.validateDefault().apply(schema); + result = SchemaValidationRoles.validateDefault().apply(schema); assertTrue(result.isValid()); @@ -670,7 +670,7 @@ public void defaultValueTest() { .nullableDouble("nullableDouble", -1) .endRecord(); - result = SchemaValidatorRole.validateDefault().apply(schema);*/ + result = SchemaValidationRoles.validateDefault().apply(schema);*/ /*assertFalse(result.isValid()); assertEquals(Optional.of(invalidMessage), result.getReason()); @@ -682,7 +682,7 @@ public void defaultValueTest() { .nullableInt("nullableInt", -1) .endRecord(); - result = SchemaValidatorRole.validateDefault().apply(schema); + result = SchemaValidationRoles.validateDefault().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of(invalidMessage), result.getReason()); @@ -694,7 +694,7 @@ public void defaultValueTest() { .nullableLong("nullableLong", -1) .endRecord(); - result = SchemaValidatorRole.validateDefault().apply(schema); + result = SchemaValidationRoles.validateDefault().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of(invalidMessage), result.getReason());*/ @@ -704,7 +704,7 @@ public void defaultValueTest() { + "\"enum\", \"symbols\": [\"Connected\", \"NotConnected\", \"UNKNOWN\"] }, " + "\"default\": \"UNKNOWN\" } ] }"); - result = SchemaValidatorRole.validateDefault().apply(schema); + result = SchemaValidationRoles.validateDefault().apply(schema); assertTrue(result.isValid()); @@ -713,7 +713,7 @@ public void defaultValueTest() { + "\"enum\", \"symbols\": [\"Connected\", \"NotConnected\", \"UNKNOWN\"] }, " + "\"default\": \"null\" } ] }"); - result = SchemaValidatorRole.validateDefault().apply(schema); + result = SchemaValidationRoles.validateDefault().apply(schema); String invalidMessage = "Any NULLABLE Avro field must specify a default value. " + "The allowed default values are: \"UNKNOWN\" for ENUMERATION, \"MIN_VALUE\" or " @@ -729,7 +729,7 @@ public void defaultValueTest() { + "[ {\"name\": \"nullableBoolean\", \"type\": [ \"null\", \"boolean\"], " + "\"default\": \"null\" } ] }"); - result = SchemaValidatorRole.validateDefault().apply(schema); + result = SchemaValidationRoles.validateDefault().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of(invalidMessage), result.getReason());*/ diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java index 819a2964..6abf41f4 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java @@ -16,11 +16,11 @@ * limitations under the License. */ -import static org.radarcns.validator.util.SchemaValidatorRole.getActiveValidator; -import static org.radarcns.validator.util.SchemaValidatorRole.getGeneralEnumValidator; -import static org.radarcns.validator.util.SchemaValidatorRole.getGeneralRecordValidator; -import static org.radarcns.validator.util.SchemaValidatorRole.getMonitorValidator; -import static org.radarcns.validator.util.SchemaValidatorRole.getPassiveValidator; +import static org.radarcns.validator.util.SchemaValidationRoles.getActiveValidator; +import static org.radarcns.validator.util.SchemaValidationRoles.getGeneralEnumValidator; +import static org.radarcns.validator.util.SchemaValidationRoles.getGeneralRecordValidator; +import static org.radarcns.validator.util.SchemaValidationRoles.getMonitorValidator; +import static org.radarcns.validator.util.SchemaValidationRoles.getPassiveValidator; import java.io.IOException; import java.nio.file.Path; diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java index de900ff9..07382dcc 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java @@ -16,7 +16,7 @@ * limitations under the License. */ -import static org.radarcns.validator.util.SchemaValidatorRole.UNKNOWN; +import static org.radarcns.validator.util.SchemaValidationRoles.UNKNOWN; import java.io.IOException; import java.nio.file.Path; diff --git a/restapi/header/header.avsc b/restapi/header/header.avsc index 50b4d0f9..b41f3169 100644 --- a/restapi/header/header.avsc +++ b/restapi/header/header.avsc @@ -10,7 +10,7 @@ { "name": "type", "type": ["org.radarcns.catalogue.SensorName", "org.radarcns.active.questionnaire.QuestionnaireType"], "doc": "Report the sensor name or specific type of assessment." }, { "name": "descriptiveStatistic", "type": "DescriptiveStatistic", "doc": "Statical value expressed by samples." }, { "name": "unit", "type": "org.radarcns.catalogue.Unit", "doc": "Unit used by the source." }, - { "name": "timeFrame", "type": "TimeFrame", "doc": "Time interval between two consecutive samples." }, + { "name": "timeFrame", "type": "org.radarcns.catalogue.TimeFrame", "doc": "Time interval between two consecutive samples." }, { "name": "effectiveTimeFrame", "type": "EffectiveTimeFrame", "doc": "Timestamps of the first and the last samples contained in the dataset." } ] } diff --git a/specifications/active/esm.yml b/specifications/active/esm.yml deleted file mode 100644 index 5db0f6d7..00000000 --- a/specifications/active/esm.yml +++ /dev/null @@ -1,14 +0,0 @@ -#=============================== Experience Sampling Method (ESM) =================================# -name: ESM -assessment_type: QUESTIONNAIRE -doc: Experience Sampling Method (ESM) definition -topic_name: questionnaire_esm -key_class: .kafka.key.KeyMeasurement -value_class: .active.questionnaire.Questionnaire -questions: - - lead: #TODO - content: #TODO - widget: #TODO - responses: - - text: #TODO - score: #TODO diff --git a/specifications/active/phq8.yml b/specifications/active/phq8.yml index c2733e79..3efc222c 100644 --- a/specifications/active/phq8.yml +++ b/specifications/active/phq8.yml @@ -1,10 +1,10 @@ #==================== Personal Health Questionnaire Depression Scale (PHQ-8) ======================# name: PHQ8 assessment_type: QUESTIONNAIRE -doc: Personal Health Questionnaire Depression Scale (PHQ-8) definition -topic_name: questionnaire_phq8 -key_class: .kafka.key.KeyMeasurement -value_class: .active.questionnaire.Questionnaire +doc: Personal Health Questionnaire Depression Scale (PHQ-8) definition. +topic: questionnaire_phq8 +key: .kafka.key.KeyMeasurement +value: .active.questionnaire.Questionnaire questions: - lead: Over the past two weeks, how often have you been bothered by any of the following problems? content: Little interest or pleasure in doing things. diff --git a/specifications/monitor/external_time.yml b/specifications/monitor/external_time.yml index ba33c366..34716380 100644 --- a/specifications/monitor/external_time.yml +++ b/specifications/monitor/external_time.yml @@ -5,6 +5,6 @@ doc: Information sent by the Android pRMT about time synchronisation with a NTS sample_rate: 0.08 unit: NON_DIMENSIONAL data_type: RAW -topic_name: application_external_time -key_class: .kafka.key.KeyMeasurement -value_class: .monitor.application.ApplicationExternalTime +topic: application_external_time +key: .kafka.key.KeyMeasurement +value: .monitor.application.ApplicationExternalTime diff --git a/specifications/monitor/record_counts.yml b/specifications/monitor/record_counts.yml index 895725ad..e9ba406d 100644 --- a/specifications/monitor/record_counts.yml +++ b/specifications/monitor/record_counts.yml @@ -5,6 +5,6 @@ doc: Monitor used by the Android pRMT to report the number of cached and created sample_rate: 0.08 unit: NON_DIMENSIONAL data_type: RAW -topic_name: application_record_counts -key_class: .kafka.key.KeyMeasurement -value_class: .monitor.application.ApplicationRecordCounts +topic: application_record_counts +key: .kafka.key.KeyMeasurement +value: .monitor.application.ApplicationRecordCounts diff --git a/specifications/monitor/server_status.yml b/specifications/monitor/server_status.yml index 99a626b6..32078159 100644 --- a/specifications/monitor/server_status.yml +++ b/specifications/monitor/server_status.yml @@ -5,6 +5,6 @@ doc: Monitor used by the Android pRMT to report the server connection status bet sample_rate: 0.08 unit: NON_DIMENSIONAL data_type: RAW -topic_name: application_uptime -key_class: .kafka.key.KeyMeasurement -value_class: .monitor.application.ApplicationServerStatus +topic: application_uptime +key: .kafka.key.KeyMeasurement +value: .monitor.application.ApplicationServerStatus diff --git a/specifications/monitor/uptime.yml b/specifications/monitor/uptime.yml index 0272aa3c..a0572ca6 100644 --- a/specifications/monitor/uptime.yml +++ b/specifications/monitor/uptime.yml @@ -5,6 +5,6 @@ doc: Monitor used by the Android pRMT to notify the time duration since last reb sample_rate: 0.08 unit: NON_DIMENSIONAL data_type: RAW -topic_name: application_uptime -key_class: .kafka.key.KeyMeasurement -value_class: .monitor.application.ApplicationUptime +topic: application_uptime +key: .kafka.key.KeyMeasurement +value: .monitor.application.ApplicationUptime diff --git a/specifications/passive/android_phone.yml b/specifications/passive/android_phone.yml index 195ccff4..1d87084b 100644 --- a/specifications/passive/android_phone.yml +++ b/specifications/passive/android_phone.yml @@ -8,103 +8,103 @@ sensors: sample_rate: #TODO unit: G data_type: RAW - topic_name: android_phone_acceleration - key_class: .kafka.key.KeyMeasurement - value_class: .passive.phone.PhoneAcceleration - aggregator_class: .kafka.aggregator.AggregatorDoubleArray + topic: android_phone_acceleration + key: .kafka.key.KeyMeasurement + value: .passive.phone.PhoneAcceleration + aggregator: .kafka.aggregator.AggregatorDoubleArray - name: BATTERY app_provider: .phone.PhoneSensorProvider sample_rate: #TODO unit: PERCENTAGE data_type: RAW - topic_name: android_phone_battery_level - key_class: .kafka.key.KeyMeasurement - value_class: .passive.phone.PhoneBatteryLevel - aggregator_class: .kafka.aggregator.AggregatorDouble + topic: android_phone_battery_level + key: .kafka.key.KeyMeasurement + value: .passive.phone.PhoneBatteryLevel + aggregator: .kafka.aggregator.AggregatorDouble - name: GYROSCOPE app_provider: .phone.PhoneSensorProvider sample_rate: #TODO unit: RADAIAN_PER_SEC data_type: RAW - topic_name: android_phone_gyroscope - key_class: .kafka.key.KeyMeasurement - value_class: .passive.phone.PhoneGyroscope - aggregator_class: .kafka.aggregator.AggregatorDoubleArray + topic: android_phone_gyroscope + key: .kafka.key.KeyMeasurement + value: .passive.phone.PhoneGyroscope + aggregator: .kafka.aggregator.AggregatorDoubleArray - name: LIGHT app_provider: .phone.PhoneSensorProvider sample_rate: #TODO unit: LUX data_type: RAW - topic_name: android_phone_ligth - key_class: .kafka.key.KeyMeasurement - value_class: .passive.phone.PhoneLight - aggregator_class: .kafka.aggregator.AggregatorDouble + topic: android_phone_ligth + key: .kafka.key.KeyMeasurement + value: .passive.phone.PhoneLight + aggregator: .kafka.aggregator.AggregatorDouble - name: MAGNETIC_FIELD app_provider: .phone.PhoneSensorProvider sample_rate: #TODO unit: MICRO_TESLA data_type: RAW - topic_name: android_phone_magnetic_field - key_class: .kafka.key.KeyMeasurement - value_class: .passive.phone.PhoneMagneticField - aggregator_class: .kafka.aggregator.AggregatorDoubleArray + topic: android_phone_magnetic_field + key: .kafka.key.KeyMeasurement + value: .passive.phone.PhoneMagneticField + aggregator: .kafka.aggregator.AggregatorDoubleArray - name: STEP_COUNT app_provider: .phone.PhoneSensorProvider sample_rate: #TODO unit: NON_DIMENSIONAL data_type: VENDOR - topic_name: android_phone_step_count - key_class: .kafka.key.KeyMeasurement - value_class: .passive.phone.PhoneStepCount - aggregator_class: .kafka.aggregator.AggregatorDouble + topic: android_phone_step_count + key: .kafka.key.KeyMeasurement + value: .passive.phone.PhoneStepCount + aggregator: .kafka.aggregator.AggregatorDouble # Location - name: RELATIVE_LOCATION app_provider: .phone.PhoneLocationProvider sample_rate: #TODO unit: DEGREE data_type: RAW - topic_name: android_phone_relative_location - key_class: .kafka.key.KeyMeasurement - value_class: .passive.phone.PhoneRelativeLocation + topic: android_phone_relative_location + key: .kafka.key.KeyMeasurement + value: .passive.phone.PhoneRelativeLocation # Log - name: PHONE_CALL app_provider: .phone.PhoneLogProvider sample_rate: #TODO unit: NON_DIMENSIONAL data_type: RAW - topic_name: android_phone_call - key_class: .kafka.key.KeyMeasurement - value_class: .passive.phone.PhoneCall + topic: android_phone_call + key: .kafka.key.KeyMeasurement + value: .passive.phone.PhoneCall - name: PHONE_SMS app_provider: .phone.PhoneLogProvider sample_rate: #TODO unit: NON_DIMENSIONAL data_type: RAW - topic_name: android_phone_sms - key_class: .kafka.key.KeyMeasurement - value_class: .passive.phone.PhoneSms + topic: android_phone_sms + key: .kafka.key.KeyMeasurement + value: .passive.phone.PhoneSms - name: PHONE_SMS_UNREAD app_provider: .phone.PhoneLogProvider sample_rate: #TODO unit: NON_DIMENSIONAL data_type: RAW - topic_name: android_phone_sms_unread - key_class: .kafka.key.KeyMeasurement - value_class: .passive.phone.PhoneSmsUnread + topic: android_phone_sms_unread + key: .kafka.key.KeyMeasurement + value: .passive.phone.PhoneSmsUnread # Usage - name: USAGE_EVENT app_provider: .phone.PhoneUsageProvider sample_rate: #TODO unit: NON_DIMENSIONAL data_type: RAW - topic_name: android_phone_user_event - key_class: .kafka.key.KeyMeasurement - value_class: .passive.phone.PhoneUsageEvent + topic: android_phone_user_event + key: .kafka.key.KeyMeasurement + value: .passive.phone.PhoneUsageEvent - name: USER_INTERACTION app_provider: .phone.PhoneUsageProvider sample_rate: #TODO unit: NON_DIMENSIONAL data_type: RAW - topic_name: android_phone_user_interaction - key_class: .kafka.key.KeyMeasurement - value_class: .passive.phone.PhoneUserInteraction + topic: android_phone_user_interaction + key: .kafka.key.KeyMeasurement + value: .passive.phone.PhoneUserInteraction diff --git a/specifications/passive/biovotion_vsm1.yml b/specifications/passive/biovotion_vsm1.yml index e9fe79ba..fef32857 100644 --- a/specifications/passive/biovotion_vsm1.yml +++ b/specifications/passive/biovotion_vsm1.yml @@ -7,95 +7,95 @@ sensors: sample_rate: 51.2 unit: G data_type: RAW - topic_name: android_biovotion_vsm1_acceleration - key_class: .kafka.key.KeyMeasurement - value_class: .passive.biovotion.BiovotionVsm1Acceleration - aggregator_class: .kafka.aggregator.AggregatorDoubleArray + topic: android_biovotion_vsm1_acceleration + key: .kafka.key.KeyMeasurement + value: .passive.biovotion.BiovotionVsm1Acceleration + aggregator: .kafka.aggregator.AggregatorDoubleArray - name: BATTERY sample_rate: 1.0 unit: PERCENTAGE data_type: RAW - topic_name: android_biovotion_vsm1_battery_state - key_class: .kafka.key.KeyMeasurement - value_class: .passive.biovotion.BiovotionVsm1BatteryState - aggregator_class: .kafka.aggregator.AggregatorDouble + topic: android_biovotion_vsm1_battery_state + key: .kafka.key.KeyMeasurement + value: .passive.biovotion.BiovotionVsm1BatteryState + aggregator: .kafka.aggregator.AggregatorDouble - name: BLOOD_PULSE_WAVE sample_rate: 1.0 unit: NON_DIMENSIONAL data_type: VENDOR - topic_name: android_biovotion_vsm1_acceleration - key_class: .kafka.key.KeyMeasurement - value_class: .passive.biovotion.BiovotionVsm1BloodPulseWave - aggregator_class: .kafka.aggregator.AggregatorDouble + topic: android_biovotion_vsm1_acceleration + key: .kafka.key.KeyMeasurement + value: .passive.biovotion.BiovotionVsm1BloodPulseWave + aggregator: .kafka.aggregator.AggregatorDouble - name: ENERGY sample_rate: 1.0 unit: CALORIES_PER_SEC data_type: VENDOR - topic_name: android_biovotion_vsm1_energy - key_class: .kafka.key.KeyMeasurement - value_class: .passive.biovotion.BiovotionVsm1Energy - aggregator_class: .kafka.aggregator.AggregatorDouble + topic: android_biovotion_vsm1_energy + key: .kafka.key.KeyMeasurement + value: .passive.biovotion.BiovotionVsm1Energy + aggregator: .kafka.aggregator.AggregatorDouble - name: GALVANIC_SKIN_RESPONSE sample_rate: 1.0 unit: KILO_OHM data_type: VENDOR - topic_name: android_biovotion_vsm1_galvanic_skin_response - key_class: .kafka.key.KeyMeasurement - value_class: .passive.biovotion.BiovotionVsm1GalvanicSkinResponse - aggregator_class: .kafka.aggregator.AggregatorDoubleArray + topic: android_biovotion_vsm1_galvanic_skin_response + key: .kafka.key.KeyMeasurement + value: .passive.biovotion.BiovotionVsm1GalvanicSkinResponse + aggregator: .kafka.aggregator.AggregatorDoubleArray - name: HEART_RATE sample_rate: 1.0 unit: BEATS_PER_MIN data_type: VENDOR - topic_name: android_biovotion_vsm1_heart_rate - key_class: .kafka.key.KeyMeasurement - value_class: .passive.biovotion.BiovotionVsm1HeartRate - aggregator_class: .kafka.aggregator.AggregatorDouble + topic: android_biovotion_vsm1_heart_rate + key: .kafka.key.KeyMeasurement + value: .passive.biovotion.BiovotionVsm1HeartRate + aggregator: .kafka.aggregator.AggregatorDouble - name: HEART_RATE_VARIABILITY sample_rate: 1.0 unit: RMSSD_IN_MILLI_SEC data_type: VENDOR - topic_name: android_biovotion_vsm1_heart_rate_variability - key_class: .kafka.key.KeyMeasurement - value_class: .passive.biovotion.BiovotionVsm1HeartRateVariability - aggregator_class: .kafka.aggregator.AggregatorDouble + topic: android_biovotion_vsm1_heart_rate_variability + key: .kafka.key.KeyMeasurement + value: .passive.biovotion.BiovotionVsm1HeartRateVariability + aggregator: .kafka.aggregator.AggregatorDouble - name: LED sample_rate: 1.0 unit: MILLI_AMPERE data_type: VENDOR - topic_name: android_biovotion_vsm1_led_current - key_class: .kafka.key.KeyMeasurement - value_class: .passive.biovotion.BiovotionVsm1LedCurrent - aggregator_class: .kafka.aggregator.AggregatorDoubleArray + topic: android_biovotion_vsm1_led_current + key: .kafka.key.KeyMeasurement + value: .passive.biovotion.BiovotionVsm1LedCurrent + aggregator: .kafka.aggregator.AggregatorDoubleArray - name: PHOTOPLETHYSMOGRAPHY sample_rate: 51.2 unit: NON_DIMENSIONAL data_type: VENDOR - topic_name: android_biovotion_vsm1_ppg_current - key_class: .kafka.key.KeyMeasurement - value_class: .passive.biovotion.BiovotionVsm1PpgRaw - aggregator_class: .kafka.aggregator.AggregatorDoubleArray + topic: android_biovotion_vsm1_ppg_current + key: .kafka.key.KeyMeasurement + value: .passive.biovotion.BiovotionVsm1PpgRaw + aggregator: .kafka.aggregator.AggregatorDoubleArray - name: RESPIRATION_RATE sample_rate: 1.0 unit: BEATS_PER_MIN data_type: VENDOR - topic_name: android_biovotion_vsm1_respiration_rate - key_class: .kafka.key.KeyMeasurement - value_class: .passive.biovotion.BiovotionVsm1RespirationRate - aggregator_class: .kafka.aggregator.AggregatorDouble + topic: android_biovotion_vsm1_respiration_rate + key: .kafka.key.KeyMeasurement + value: .passive.biovotion.BiovotionVsm1RespirationRate + aggregator: .kafka.aggregator.AggregatorDouble - name: OXYGEN_SATURATION sample_rate: 1.0 unit: PERCENTAGE data_type: RAW - topic_name: android_biovotion_vsm1_oxygen_saturation - key_class: .kafka.key.KeyMeasurement - value_class: .passive.biovotion.BiovotionVsm1OxygenSaturation - aggregator_class: .kafka.aggregator.AggregatorDouble + topic: android_biovotion_vsm1_oxygen_saturation + key: .kafka.key.KeyMeasurement + value: .passive.biovotion.BiovotionVsm1OxygenSaturation + aggregator: .kafka.aggregator.AggregatorDouble - name: THERMOMETER sample_rate: 1.0 unit: CELSIUS data_type: RAW - topic_name: android_biovotion_vsm1_temperature - key_class: .kafka.key.KeyMeasurement - value_class: .passive.biovotion.BiovotionVsm1Temperature - aggregator_class: .kafka.aggregator.AggregatorDouble + topic: android_biovotion_vsm1_temperature + key: .kafka.key.KeyMeasurement + value: .passive.biovotion.BiovotionVsm1Temperature + aggregator: .kafka.aggregator.AggregatorDouble diff --git a/specifications/passive/empatica_e4.yml b/specifications/passive/empatica_e4.yml index fcaf3cd9..03bd3a82 100644 --- a/specifications/passive/empatica_e4.yml +++ b/specifications/passive/empatica_e4.yml @@ -7,57 +7,57 @@ sensors: sample_rate: 32.0 unit: G data_type: RAW - topic_name: android_empatica_e4_acceleration - key_class: .kafka.key.KeyMeasurement - value_class: .passive.empatica.EmpaticaE4Acceleration - aggregator_class: .kafka.aggregator.AggregatorDoubleArray + topic: android_empatica_e4_acceleration + key: .kafka.key.KeyMeasurement + value: .passive.empatica.EmpaticaE4Acceleration + aggregator: .kafka.aggregator.AggregatorDoubleArray - name: BATTERY sample_rate: 1.0 unit: PERCENTAGE data_type: RAW - topic_name: android_empatica_e4_battery_level - key_class: .kafka.key.KeyMeasurement - value_class: .passive.empatica.EmpaticaE4BatteryLevel - aggregator_class: .kafka.aggregator.AggregatorDouble + topic: android_empatica_e4_battery_level + key: .kafka.key.KeyMeasurement + value: .passive.empatica.EmpaticaE4BatteryLevel + aggregator: .kafka.aggregator.AggregatorDouble - name: BLOOD_VOLUME_PULSE sample_rate: 64.0 unit: NANO_WATT data_type: RAW - topic_name: android_empatica_e4_blood_volume_pulse - key_class: .kafka.key.KeyMeasurement - value_class: .passive.empatica.EmpaticaE4BloodVolumePulse - aggregator_class: .kafka.aggregator.AggregatorDouble + topic: android_empatica_e4_blood_volume_pulse + key: .kafka.key.KeyMeasurement + value: .passive.empatica.EmpaticaE4BloodVolumePulse + aggregator: .kafka.aggregator.AggregatorDouble - name: ELECTRODERMAL_ACTIVITY sample_rate: 4.0 unit: MICRO_SIEMENS data_type: RAW - topic_name: android_empatica_e4_electrodermal_activity - key_class: .kafka.key.KeyMeasurement - value_class: .passive.empatica.EmpaticaE4ElectroDermalActivity - aggregator_class: .kafka.aggregator.AggregatorDouble + topic: android_empatica_e4_electrodermal_activity + key: .kafka.key.KeyMeasurement + value: .passive.empatica.EmpaticaE4ElectroDermalActivity + aggregator: .kafka.aggregator.AggregatorDouble - name: INTER_BEAT_INTERVAL sample_rate: 1.0 unit: BEATS_PER_MIN data_type: VENDOR - topic_name: android_empatica_e4_inter_beat_interval - key_class: .kafka.key.KeyMeasurement - value_class: .passive.empatica.EmpaticaE4InterBeatInterval - aggregator_class: .kafka.aggregator.AggregatorDouble + topic: android_empatica_e4_inter_beat_interval + key: .kafka.key.KeyMeasurement + value: .passive.empatica.EmpaticaE4InterBeatInterval + aggregator: .kafka.aggregator.AggregatorDouble - name: THERMOMETER sample_rate: 4.0 unit: CELSIUS data_type: RAW - topic_name: android_empatica_e4_temperature - key_class: .kafka.key.KeyMeasurement - value_class: .passive.empatica.EmpaticaE4BatteryLevel - aggregator_class: .kafka.aggregator.AggregatorDouble + topic: android_empatica_e4_temperature + key: .kafka.key.KeyMeasurement + value: .passive.empatica.EmpaticaE4BatteryLevel + aggregator: .kafka.aggregator.AggregatorDouble processors: - name: HEART_RATE sample_rate: 1.0 unit: BEATS_PER_MIN data_type: RADAR - input_topic_name: android_empatica_e4_inter_beat_interval - input_key_class: .kafka.key.KeyMeasurement - input_value_class: .passive.empatica.EmpaticaE4InterBeatInterval - output_topic_name: android_empatica_e4_heartrate - aggregator_class: .kafka.aggregator.AggregatorDouble + input_topic: android_empatica_e4_inter_beat_interval + input_key: .kafka.key.KeyMeasurement + input_value: .passive.empatica.EmpaticaE4InterBeatInterval + base_output_topic: android_empatica_e4_heartrate + aggregator: .kafka.aggregator.AggregatorDouble diff --git a/specifications/passive/pebble_2.yml b/specifications/passive/pebble_2.yml index 83d139d6..be4d35b6 100644 --- a/specifications/passive/pebble_2.yml +++ b/specifications/passive/pebble_2.yml @@ -7,31 +7,31 @@ sensors: sample_rate: 10.0 unit: G data_type: RAW - topic_name: android_pebble_2_acceleration - key_class: .kafka.key.KeyMeasurement - value_class: .passive.pebble.Pebble2Acceleration - aggregator_class: .kafka.aggregator.AggregatorDoubleArray + topic: android_pebble_2_acceleration + key: .kafka.key.KeyMeasurement + value: .passive.pebble.Pebble2Acceleration + aggregator: .kafka.aggregator.AggregatorDoubleArray - name: BATTERY sample_rate: 1.0 unit: PERCENTAGE data_type: RAW - topic_name: android_pebble_2_battery_level - key_class: .kafka.key.KeyMeasurement - value_class: .passive.pebble.Pebble2BatteryLevel - aggregator_class: .kafka.aggregator.AggregatorDouble + topic: android_pebble_2_battery_level + key: .kafka.key.KeyMeasurement + value: .passive.pebble.Pebble2BatteryLevel + aggregator: .kafka.aggregator.AggregatorDouble - name: HEART_RATE sample_rate: 1.0 unit: BEATS_PER_MIN data_type: RAW - topic_name: android_pebble_2_heart_rate - key_class: .kafka.key.KeyMeasurement - value_class: .passive.pebble.Pebble2HeartRate - aggregator_class: .kafka.aggregator.AggregatorDouble + topic: android_pebble_2_heart_rate + key: .kafka.key.KeyMeasurement + value: .passive.pebble.Pebble2HeartRate + aggregator: .kafka.aggregator.AggregatorDouble - name: HEART_RATE_FILTERED sample_rate: 1.0 unit: BEATS_PER_MIN data_type: VENDOR - topic_name: android_pebble_2_heart_rate_filtered - key_class: .kafka.key.KeyMeasurement - value_class: .passive.pebble.Pebble2HeartRateFiltered - aggregator_class: .kafka.aggregator.AggregatorDouble + topic: android_pebble_2_heart_rate_filtered + key: .kafka.key.KeyMeasurement + value: .passive.pebble.Pebble2HeartRateFiltered + aggregator: .kafka.aggregator.AggregatorDouble From 5b93a8b555e330ffb34b5f6159dbb28f5b9f1ffa Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Wed, 9 Aug 2017 15:20:08 +0100 Subject: [PATCH 046/112] Fixed pojo implementation --- ...avsc => biovotion_vsm1_battery_level.avsc} | 2 +- .../BiovotionVsm1BatteryState$1.class | Bin 285 -> 0 bytes .../BiovotionVsm1BatteryState$Builder.class | Bin 7363 -> 0 bytes .../biovotion/BiovotionVsm1BatteryState.class | Bin 6690 -> 0 bytes .../radar-schemas-specifications/build.gradle | 13 +- .../specifications/SourceCatalogue.java | 10 +- .../specifications/source/Aggregatable.java | 35 ++ .../specifications/source/KafkaActor.java | 111 +++++++ .../specifications/source/Source.java | 10 + .../radarcns/specifications/source/Topic.java | 302 ++++++++++++++++++ .../source/active/ActiveSource.java | 58 ++-- .../source/active/questionnaire/Question.java | 23 +- .../questionnaire/QuestionnaireSource.java | 49 +-- .../source/active/questionnaire/Response.java | 17 +- .../source/passive/MonitorSource.java | 100 +++--- .../source/passive/PassiveSource.java | 103 ++++-- .../source/passive/Processor.java | 170 ++-------- .../specifications/source/passive/Sensor.java | 147 +++------ .../radarcns/specifications/util/Labels.java | 54 ++++ .../specifications/util/TopicUtils.java | 146 --------- .../radarcns/specifications/util/Utils.java | 5 - .../specifications/ActiveValidation.java | 4 +- .../specifications/MonitorValidation.java | 4 +- .../specifications/PassiveValidation.java | 90 ++++++ .../SourceCatalogueValidation.java | 27 +- .../{TopicUtilsTest.java => TopicTest.java} | 26 +- .../validator/ActiveSourceRoles.java | 81 +++++ .../validator/AggregatableRoles.java | 114 +++++++ .../validator/GenericRoles.java | 62 +--- .../specifications/validator/Message.java | 2 - .../validator/MonitorRoles.java | 54 ++-- .../validator/PassiveSourceRoles.java | 86 +++-- .../validator/ProcessorRoles.java | 66 +--- .../validator/QuestionRoles.java | 14 +- .../validator/QuestionnaireRoles.java | 41 +-- .../specifications/validator/SensorRoles.java | 65 +--- .../specifications/validator/TopicRoles.java | 137 ++++++++ .../validator/ValidationSupport.java | 21 ++ .../specifications/validator/Validator.java | 175 +++++----- .../specifications/value/Utility.java | 274 ++++++++++++++++ .../specifications/value/active/Phq8Test.java | 143 +++++++++ .../value/monitor/ExternalTimeTest.java | 60 ++++ .../value/monitor/RecordCountsTest.java | 60 ++++ .../value/monitor/ServerStatusTest.java | 60 ++++ .../value/monitor/UptimeTest.java | 60 ++++ .../value/passive/AndroidPhoneTest.java | 224 +++++++++++++ .../value/passive/BiovotionTest.java | 256 +++++++++++++++ .../value/passive/EmpaticaE4Test.java | 185 +++++++++++ .../value/passive/Pebble2Test.java | 136 ++++++++ java-sdk/radar-schemas-validator/build.gradle | 5 +- .../validator/SchemaCatalogValidator.java | 6 +- .../validator/SpecificationsValidator.java | 96 ++++++ specifications/monitor/server_status.yml | 2 +- specifications/passive/android_phone.yml | 28 +- specifications/passive/biovotion_vsm1.yml | 16 +- specifications/passive/empatica_e4.yml | 2 +- specifications/passive/pebble_2.yml | 6 +- 57 files changed, 3078 insertions(+), 965 deletions(-) rename commons/passive/biovotion/{biovotion_vsm1_battery_state.avsc => biovotion_vsm1_battery_level.avsc} (94%) delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BatteryState$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BatteryState$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BatteryState.class create mode 100644 java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Aggregatable.java create mode 100644 java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/KafkaActor.java create mode 100644 java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Topic.java create mode 100644 java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Labels.java delete mode 100644 java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/TopicUtils.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/PassiveValidation.java rename java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/util/{TopicUtilsTest.java => TopicTest.java} (83%) create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ActiveSourceRoles.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/AggregatableRoles.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/TopicRoles.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/Utility.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/active/Phq8Test.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/ExternalTimeTest.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/RecordCountsTest.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/ServerStatusTest.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/UptimeTest.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/AndroidPhoneTest.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/BiovotionTest.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/EmpaticaE4Test.java create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/Pebble2Test.java create mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SpecificationsValidator.java diff --git a/commons/passive/biovotion/biovotion_vsm1_battery_state.avsc b/commons/passive/biovotion/biovotion_vsm1_battery_level.avsc similarity index 94% rename from commons/passive/biovotion/biovotion_vsm1_battery_state.avsc rename to commons/passive/biovotion/biovotion_vsm1_battery_level.avsc index ed8a9a9b..fb0cfeeb 100644 --- a/commons/passive/biovotion/biovotion_vsm1_battery_state.avsc +++ b/commons/passive/biovotion/biovotion_vsm1_battery_level.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.passive.biovotion", "type": "record", - "name": "BiovotionVsm1BatteryState", + "name": "BiovotionVsm1BatteryLevel", "doc": "Device battery state.", "fields": [ { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BatteryState$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BatteryState$1.class deleted file mode 100644 index fe403f6abcae18619b72909593ef9f483386ddf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 285 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 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BatteryState.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BatteryState.class deleted file mode 100644 index e8bc1127c5febbda34aa5ea63d045dd4a3938335..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6690 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 diff --git a/java-sdk/radar-schemas-specifications/build.gradle b/java-sdk/radar-schemas-specifications/build.gradle index 5af3fe2c..e3e3869b 100644 --- a/java-sdk/radar-schemas-specifications/build.gradle +++ b/java-sdk/radar-schemas-specifications/build.gradle @@ -25,6 +25,7 @@ ext.slf4jVersion = '1.7.25' dependencies { implementation project(':radar-schemas-commons') + implementation group: 'org.radarcns', name: 'radar-commons', version: radarCommonsVersion implementation group: 'org.apache.commons', name: 'commons-lang3', version: apacheCommonsVersion @@ -47,19 +48,13 @@ dependencies { // Exchange configuration with Java code // //---------------------------------------------------------------------------// ext.exchnageConfigMainPath = 'src/main/resources/exchange.properties' -ext.exchnageConfigTestPath = 'src/test/resources/exchange.properties' task exchangeConfig() { doLast { - if (file(exchnageConfigMainPath).createNewFile()) { + if (file(exchnageConfigMainPath).delete()) { + file(exchnageConfigMainPath).createNewFile() file(exchnageConfigMainPath).write("project.group=${project.group}") } else { - throw new GradleException("File for exchanging configuration between Gradle and Java cannot be created. Error while managing file at ${exchnageConfigMainPath}") - } - - if (file(exchnageConfigTestPath).createNewFile()) { - file(exchnageConfigTestPath).write("project.group=${project.group}") - } else { - throw new GradleException("File for exchanging configuration between Gradle and Java cannot be created. Error while managing file at ${exchnageConfigTestPath}") + throw new GradleException("Error while creating file at ${exchnageConfigMainPath}") } } } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/SourceCatalogue.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/SourceCatalogue.java index dbbed902..2fb1d367 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/SourceCatalogue.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/SourceCatalogue.java @@ -16,8 +16,6 @@ * limitations under the License. */ -import static java.util.Collections.singleton; - import java.io.File; import java.io.IOException; import java.nio.file.Path; @@ -27,7 +25,6 @@ import java.util.Map; import java.util.Set; import org.radarcns.active.questionnaire.QuestionnaireType; -import org.radarcns.catalogue.ActiveSourceType; import org.radarcns.catalogue.MonitorSourceType; import org.radarcns.catalogue.PassiveSourceType; import org.radarcns.config.YamlConfigLoader; @@ -35,8 +32,6 @@ import org.radarcns.specifications.source.active.questionnaire.QuestionnaireSource; import org.radarcns.specifications.source.passive.MonitorSource; import org.radarcns.specifications.source.passive.PassiveSource; -import org.radarcns.specifications.source.passive.Processor; -import org.radarcns.specifications.source.passive.Sensor; /** * TODO. @@ -212,7 +207,8 @@ public static Set getTopics() { * @return TODO */ public static Map>> getTopicsVerbose() { - Map>> map = new HashMap<>(); + return null; + /*Map>> map = new HashMap<>(); for (QuestionnaireSource source : ACTIVE_SOURCES.values()) { Map> details = new HashMap<>(); @@ -237,6 +233,6 @@ public static Map>> getTopicsVerbose() { map.put(source.getType().name(), details); } - return map; + return map;*/ } } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Aggregatable.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Aggregatable.java new file mode 100644 index 00000000..b8e7be91 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Aggregatable.java @@ -0,0 +1,35 @@ +package org.radarcns.specifications.source; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.util.Set; +import org.radarcns.specifications.source.Topic.TopicMetadata; + +/** + * TODO + */ +public interface Aggregatable { + + boolean isAggregatable(); + + String getAggregator(); + + String getInputTopic(); + + Set getOutputTopics(); + +} diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/KafkaActor.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/KafkaActor.java new file mode 100644 index 00000000..bd4ac526 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/KafkaActor.java @@ -0,0 +1,111 @@ +package org.radarcns.specifications.source; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.radarcns.specifications.util.Labels.DATA_TYPE; +import static org.radarcns.specifications.util.Labels.SAMPLE_RATE; +import static org.radarcns.specifications.util.Labels.TOPIC; +import static org.radarcns.specifications.util.Labels.UNIT; + +import java.util.Objects; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.radarcns.catalogue.DataType; +import org.radarcns.catalogue.Unit; +import org.radarcns.specifications.source.passive.Sensor; + +public class KafkaActor { + + private final String doc; + + private final double sampleRate; + + private final Unit unit; + + private final DataType dataType; + + private final Topic topic; + + private static final String NULL_MESSAGE = " in ".concat( + Sensor.class.getName()).concat(" cannot be null."); + + public KafkaActor(String doc, double sampleRate, Unit unit, DataType dataType, Topic topic) { + + Objects.requireNonNull(dataType, DATA_TYPE.concat(NULL_MESSAGE)); + Objects.requireNonNull(sampleRate, SAMPLE_RATE.concat(NULL_MESSAGE)); + Objects.requireNonNull(topic, TOPIC.concat(NULL_MESSAGE)); + Objects.requireNonNull(unit, UNIT.concat(NULL_MESSAGE)); + + this.doc = doc; + this.sampleRate = sampleRate; + this.unit = unit; + this.dataType = dataType; + this.topic = topic; + } + + public String getDoc() { + return doc; + } + + public double getSampleRate() { + return sampleRate; + } + + public Unit getUnit() { + return unit; + } + + public DataType getDataType() { + return dataType; + } + + public Topic getTopic() { + return topic; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (!(o instanceof KafkaActor)) { + return false; + } + + KafkaActor that = (KafkaActor) o; + + return new EqualsBuilder() + .append(sampleRate, that.sampleRate) + .append(doc, that.doc) + .append(unit, that.unit) + .append(dataType, that.dataType) + .append(topic, that.topic) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder(17, 37) + .append(doc) + .append(sampleRate) + .append(unit) + .append(dataType) + .append(topic) + .toHashCode(); + } +} diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Source.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Source.java index 982cd22e..3cad56ea 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Source.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Source.java @@ -16,6 +16,9 @@ * limitations under the License. */ +import static org.radarcns.specifications.util.Labels.NAME; + +import java.util.Objects; import java.util.Set; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; @@ -29,7 +32,14 @@ public abstract class Source { private final String doc; + /** + * TODO. + * @param name TODO + * @param doc TODO + */ public Source(String name, String doc) { + Objects.requireNonNull(name, NAME.concat(" in ").concat( + Source.class.getName()).concat(" cannot be null")); this.name = name; this.doc = doc; } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Topic.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Topic.java new file mode 100644 index 00000000..520aa31c --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Topic.java @@ -0,0 +1,302 @@ +package org.radarcns.specifications.source; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.radarcns.catalogue.TimeFrame; +import org.radarcns.specifications.util.Utils; + +/** + * TODO. + */ +public class Topic implements Aggregatable{ + + public static final String FROM_LABEL = "From-"; + public static final String TO_LABEL = "-To-"; + + public static final String OUTPUT_LABEL = "_output"; + + /** Folder names. */ + public enum TimeLabel { + TEN_SECOND(TimeFrame.TEN_SECOND, TimeUnit.SECONDS.toMillis(10), "_10sec"), + THIRTY_SECOND(TimeFrame.THIRTY_SECOND, TimeUnit.SECONDS.toMillis(30), "_30sec"), + ONE_MIN(TimeFrame.ONE_MIN, TimeUnit.MINUTES.toMillis(1), "_1min"), + TEN_MIN(TimeFrame.TEN_MIN, TimeUnit.MINUTES.toMillis(10), "_10min"), + ONE_HOUR(TimeFrame.ONE_HOUR, TimeUnit.HOURS.toMillis(1), "_1hour"), + ONE_DAY(TimeFrame.ONE_DAY, TimeUnit.DAYS.toMillis(1), "_1day"), + ONE_WEEK(TimeFrame.ONE_WEEK, TimeUnit.DAYS.toMillis(7), "_1week"), + NOT_APPLICABLE(null, -1, null); + + private final TimeFrame timeFrame; + private final long intervalInMilliSec; + private final String label; + + TimeLabel(TimeFrame timeFrame, long intervalInMilliSec, String label) { + this.timeFrame = timeFrame; + this.intervalInMilliSec = intervalInMilliSec; + this.label = label; + } + + public TimeFrame getTimeFrame() { + return timeFrame; + } + + public long getIntervalInMilliSec() { + return intervalInMilliSec; + } + + public String getLabel() { + return label; + } + } + + private final String inputTopic; + private final String inputKey; + private final String inputValue; + + private final String aggregator; + + private final String baseOutput; + + private final Set output; + + /** + * TODO. + */ + public class TopicMetadata { + private final TimeFrame timeFrame; + private final long intervalInMilliSec; + private final String input; + private final String stateStore; + private final String output; + + public TopicMetadata(TimeLabel timeLabel, String input, String stateStore, String output) { + this.timeFrame = timeLabel.getTimeFrame(); + this.intervalInMilliSec = timeLabel.getIntervalInMilliSec(); + this.input = input; + this.stateStore = stateStore; + this.output = output; + } + + public TimeFrame getTimeFrame() { + return timeFrame; + } + + public long getIntervalInMilliSec() { + return intervalInMilliSec; + } + + public String getInput() { + return input; + } + + public String getStateStore() { + return stateStore; + } + + public String getOutput() { + return output; + } + } + + /** + * TODO. + * @param inputTopic TODO + * @param inputKey TODO + * @param inputValue TODO + * @param aggregator TODO + * @param baseOutput TODO + */ + public Topic(String inputTopic, String inputKey, String inputValue, String aggregator, + String baseOutput) { + Objects.requireNonNull(inputTopic); + Objects.requireNonNull(inputKey); + Objects.requireNonNull(inputValue); + + this.inputTopic = inputTopic; + this.inputKey = Utils.getProjectGroup().concat(inputKey); + this.inputValue = Utils.getProjectGroup().concat(inputValue); + this.aggregator = Objects.isNull(aggregator) ? null : + Utils.getProjectGroup().concat(aggregator); + + this.baseOutput = Objects.nonNull(baseOutput) ? baseOutput : inputTopic; + + this.output = new HashSet<>(); + + if (Objects.nonNull(this.aggregator) && Utils.isTimedAggregator(this.aggregator)) { + for (TimeLabel label : TimeLabel.values()) { + if (label.intervalInMilliSec != -1) { + this.output.add(new TopicMetadata(label, inputTopic, + getStateStoreName(inputTopic, getOutTopic(this.baseOutput, label)), + getOutTopic(this.baseOutput, label))); + } + } + } else if (Objects.nonNull(this.aggregator) && Utils.isTimedAggregator(this.aggregator)) { + this.output.add(new TopicMetadata(TimeLabel.NOT_APPLICABLE, inputTopic, + getStateStoreName(inputTopic, getOutTopic(this.baseOutput)), + getOutTopic(this.baseOutput))); + } + } + + @Override + public String getInputTopic() { + return inputTopic; + } + + @Override + public Set getOutputTopics() { + return output; + } + + @Override + public boolean isAggregatable() { + return Objects.nonNull(aggregator); + } + + @Override + public String getAggregator() { + return aggregator; + } + + /** + * TODO. + * @return TODO + */ + public String getInputKey() { + return inputKey; + } + + /** + * TODO. + * @return TODO + */ + public String getInputValue() { + return inputValue; + } + + /** + * TODO. + * @return TODO + */ + public Set getTopicNames() { + Set names = new HashSet<>(); + names.add(inputTopic); + + if (isAggregatable()) { + for (TopicMetadata metadata : output) { + names.add(metadata.getStateStore()); + names.add(metadata.getOutput()); + } + } + + return names; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (!(o instanceof Topic)) { + return false; + } + + Topic topic = (Topic) o; + + return new EqualsBuilder() + .append(inputTopic, topic.inputTopic) + .append(inputKey, topic.inputKey) + .append(inputValue, topic.inputValue) + .append(aggregator, topic.aggregator) + .append(baseOutput, topic.baseOutput) + .append(output, topic.output) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder(17, 37) + .append(inputTopic) + .append(inputKey) + .append(inputValue) + .append(aggregator) + .append(baseOutput) + .append(output) + .toHashCode(); + } + + /** + * TODO. + * @param topicName TODO + * @return TODO + */ + public static String getOutTopic(String topicName) { + return topicName.concat(OUTPUT_LABEL); + } + + /** + * TODO. + * @param topicName TODO + * @param timeLabel TODO + * @return TODO + */ + public static String getOutTopic(String topicName, TimeLabel timeLabel) { + return topicName.concat(timeLabel.getLabel()); + } + + /** + * TODO. + * @param topicName TODO + * @return TODO + */ + public static Set getTimedOutTopics(String topicName) { + Set set = new HashSet<>(); + + for (TimeLabel label : TimeLabel.values()) { + if (label.getIntervalInMilliSec() != -1) { + set.add(topicName.concat(label.getLabel())); + } + } + + return set; + } + + /** + * Kafka Streams allows for stateful stream processing. The internal state is managed in + * so-called state stores. A fault-tolerant state store is an internally created and + * compacted changelog topic. This function return the changelog topic name. + * + * @param inputTopic {@link String} stating the inputTopic topic name read by the stateful + * stream + * @param outputTopic {@link String} stating the output topic name written by the stateful + * stream + * + * @return {@code String} representing the changelog topic name + */ + public static String getStateStoreName(String inputTopic, String outputTopic) { + Objects.requireNonNull(inputTopic); + Objects.requireNonNull(outputTopic); + + return FROM_LABEL + inputTopic + TO_LABEL + outputTopic; + } +} diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/ActiveSource.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/ActiveSource.java index 27bee31b..66e24c82 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/ActiveSource.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/ActiveSource.java @@ -16,23 +16,34 @@ * limitations under the License. */ +import static org.radarcns.specifications.util.Labels.ASSESSMENT_TYPE; +import static org.radarcns.specifications.util.Labels.DOC; +import static org.radarcns.specifications.util.Labels.KEY; +import static org.radarcns.specifications.util.Labels.NAME; +import static org.radarcns.specifications.util.Labels.TOPIC; +import static org.radarcns.specifications.util.Labels.VALUE; + import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.Collections; +import java.util.Objects; import java.util.Set; +import org.radarcns.catalogue.ActiveSourceType; import org.radarcns.specifications.source.Source; -import org.radarcns.specifications.util.Utils; +import org.radarcns.specifications.source.Topic; /** * TODO. */ public abstract class ActiveSource extends Source { - private final String topic; + private ActiveSourceType assessmentType; + + private final Topic topic; - private final String key; + private final Set topics; - private final String value; + private static final String NULL_MESSAGE = " in ".concat( + ActiveSource.class.getName()).concat(" cannot be null."); /** * TODO. @@ -44,31 +55,36 @@ public abstract class ActiveSource extends Source { */ @JsonCreator public ActiveSource( - @JsonProperty("name") String name, - @JsonProperty("topic") String topic, - @JsonProperty("key") String key, - @JsonProperty("value") String value, - @JsonProperty("doc") String description) { + @JsonProperty(ASSESSMENT_TYPE) ActiveSourceType assessmentType, + @JsonProperty(NAME) String name, + @JsonProperty(TOPIC) String topic, + @JsonProperty(KEY) String key, + @JsonProperty(VALUE) String value, + @JsonProperty(DOC) String description) { super(name, description); - this.topic = topic; - this.key = key; - this.value = value; - } - public String getTopic() { - return topic; + Objects.requireNonNull(assessmentType, ASSESSMENT_TYPE.concat(NULL_MESSAGE)); + Objects.requireNonNull(key, KEY.concat(NULL_MESSAGE)); + Objects.requireNonNull(topic, TOPIC.concat(NULL_MESSAGE)); + Objects.requireNonNull(value, VALUE.concat(NULL_MESSAGE)); + + this.assessmentType = assessmentType; + + this.topic = new Topic(topic, key, value, null, null); + + this.topics = this.topic.getTopicNames(); } - public String getKey() { - return Utils.getProjectGroup().concat(key); + public ActiveSourceType getAssessmentType() { + return assessmentType; } - public String getValue() { - return Utils.getProjectGroup().concat(value); + public Topic getTopic() { + return topic; } @Override public Set getTopics() { - return Collections.singleton(topic); + return topics; } } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/Question.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/Question.java index f7e8facb..4d89d070 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/Question.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/Question.java @@ -16,9 +16,15 @@ * limitations under the License. */ +import static org.radarcns.specifications.util.Labels.CONTENT; +import static org.radarcns.specifications.util.Labels.LEAD; +import static org.radarcns.specifications.util.Labels.RESPONSES; +import static org.radarcns.specifications.util.Labels.WIDGET; + import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; +import java.util.Objects; import org.radarcns.catalogue.RadarWidget; /** @@ -34,6 +40,9 @@ public class Question { private final List responses; + private static final String NULL_MESSAGE = " in ".concat( + Question.class.getName()).concat(" cannot be null."); + /** * TODO. * @param lead TODO @@ -43,10 +52,16 @@ public class Question { */ @JsonCreator public Question( - @JsonProperty("lead") String lead, - @JsonProperty("content") String content, - @JsonProperty("widget") RadarWidget widget, - @JsonProperty("responses") List responses) { + @JsonProperty(LEAD) String lead, + @JsonProperty(CONTENT) String content, + @JsonProperty(WIDGET) RadarWidget widget, + @JsonProperty(RESPONSES) List responses) { + + Objects.requireNonNull(lead, LEAD.concat(NULL_MESSAGE)); + Objects.requireNonNull(content, CONTENT.concat(NULL_MESSAGE)); + Objects.requireNonNull(widget, WIDGET.concat(NULL_MESSAGE)); + Objects.requireNonNull(responses, RESPONSES.concat(NULL_MESSAGE)); + this.lead = lead; this.content = content; this.widget = widget; diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/QuestionnaireSource.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/QuestionnaireSource.java index ac456fb4..09c5aa79 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/QuestionnaireSource.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/QuestionnaireSource.java @@ -16,9 +16,18 @@ * limitations under the License. */ +import static org.radarcns.specifications.util.Labels.ASSESSMENT_TYPE; +import static org.radarcns.specifications.util.Labels.DOC; +import static org.radarcns.specifications.util.Labels.KEY; +import static org.radarcns.specifications.util.Labels.NAME; +import static org.radarcns.specifications.util.Labels.QUESTIONS; +import static org.radarcns.specifications.util.Labels.TOPIC; +import static org.radarcns.specifications.util.Labels.VALUE; + import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; +import java.util.Objects; import org.radarcns.active.questionnaire.QuestionnaireType; import org.radarcns.catalogue.ActiveSourceType; import org.radarcns.specifications.source.active.ActiveSource; @@ -28,43 +37,39 @@ */ public class QuestionnaireSource extends ActiveSource { - private QuestionnaireType name; - - private ActiveSourceType assessmentType; + private QuestionnaireType type; private List questions; /** * TODO. - * @param topicName TODO - * @param keyClass TODO - * @param valueClass TODO - * @param description TODO + * @param topic TODO + * @param key TODO + * @param value TODO + * @param doc TODO * @param name TODO * @param assessmentType TODO * @param questions TODO */ @JsonCreator public QuestionnaireSource( - @JsonProperty("name") QuestionnaireType name, - @JsonProperty("assessment_type") ActiveSourceType assessmentType, - @JsonProperty("description") String description, - @JsonProperty("topic_name") String topicName, - @JsonProperty("key_class") String keyClass, - @JsonProperty("value_class") String valueClass, - @JsonProperty("questions") List questions) { - super(name.name(), topicName, keyClass, valueClass, description); - this.name = name; - this.assessmentType = assessmentType; + @JsonProperty(ASSESSMENT_TYPE) ActiveSourceType assessmentType, + @JsonProperty(NAME) QuestionnaireType name, + @JsonProperty(DOC) String doc, + @JsonProperty(TOPIC) String topic, + @JsonProperty(KEY) String key, + @JsonProperty(VALUE) String value, + @JsonProperty(QUESTIONS) List questions) { + super(assessmentType, name.name(), topic, key, value, doc); + this.type = name; + + Objects.requireNonNull(questions, QUESTIONS.concat(" in ").concat( + QuestionnaireSource.class.getName()).concat(" cannot be null.")); this.questions = questions; } public QuestionnaireType getQuestionnaireType() { - return name; - } - - public ActiveSourceType getAssessmentType() { - return assessmentType; + return type; } public List getQuestions() { diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/Response.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/Response.java index cce96c17..58833c15 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/Response.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/Response.java @@ -16,8 +16,12 @@ * limitations under the License. */ +import static org.radarcns.specifications.util.Labels.SCORE; +import static org.radarcns.specifications.util.Labels.TEXT; + import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Objects; /** * TODO. @@ -27,6 +31,9 @@ public class Response { private final String text; private final Integer score; + private static final String NULL_MESSAGE = " in ".concat( + Response.class.getName()).concat(" cannot be null."); + /** * TODO. * @param text TODO @@ -34,10 +41,14 @@ public class Response { */ @JsonCreator public Response( - @JsonProperty("text") String text, - @JsonProperty("score") Integer score) { - this.text = text; + @JsonProperty(TEXT) String text, + @JsonProperty(SCORE) Integer score) { + + Objects.requireNonNull(score, SCORE.concat(NULL_MESSAGE)); + Objects.requireNonNull(text, TEXT.concat(NULL_MESSAGE)); + this.score = score; + this.text = text; } public String getText() { diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/MonitorSource.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/MonitorSource.java index b78aa298..1613613b 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/MonitorSource.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/MonitorSource.java @@ -16,15 +16,27 @@ * limitations under the License. */ +import static org.radarcns.specifications.util.Labels.AGGREGATOR; +import static org.radarcns.specifications.util.Labels.APP_PROVIDER; +import static org.radarcns.specifications.util.Labels.DATA_TYPE; +import static org.radarcns.specifications.util.Labels.DOC; +import static org.radarcns.specifications.util.Labels.KEY; +import static org.radarcns.specifications.util.Labels.NAME; +import static org.radarcns.specifications.util.Labels.SAMPLE_RATE; +import static org.radarcns.specifications.util.Labels.TOPIC; +import static org.radarcns.specifications.util.Labels.UNIT; +import static org.radarcns.specifications.util.Labels.VALUE; + import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.Collections; import java.util.Objects; import java.util.Set; import org.radarcns.catalogue.DataType; import org.radarcns.catalogue.MonitorSourceType; import org.radarcns.catalogue.Unit; +import org.radarcns.specifications.source.KafkaActor; import org.radarcns.specifications.source.Source; +import org.radarcns.specifications.source.Topic; import org.radarcns.specifications.util.Utils; /** @@ -32,23 +44,14 @@ */ public class MonitorSource extends Source { - private final MonitorSourceType name; + private final MonitorSourceType type; private final String appProvider; - private final double sampleRate; - - private final Unit unit; - - private final DataType dataType; - - private final String topic; - - private final String key; + private final KafkaActor kafkaActor; - private final String value; - - private final String aggregator; + private static final String NULL_MESSAGE = " in ".concat( + MonitorSource.class.getName()).concat(" cannot be null."); /** * TODO. @@ -66,66 +69,41 @@ public class MonitorSource extends Source { */ @JsonCreator public MonitorSource( - @JsonProperty("name") MonitorSourceType name, - @JsonProperty("app_provider") String appProvider, - @JsonProperty("doc") String doc, - @JsonProperty("sample_rate") double sampleRate, - @JsonProperty("unit") Unit unit, - @JsonProperty("data_type") DataType dataType, - @JsonProperty("topic") String topic, - @JsonProperty("key") String key, - @JsonProperty("value") String value, - @JsonProperty("aggregator") String aggregator) { + @JsonProperty(NAME) MonitorSourceType name, + @JsonProperty(APP_PROVIDER) String appProvider, + @JsonProperty(DOC) String doc, + @JsonProperty(SAMPLE_RATE) double sampleRate, + @JsonProperty(UNIT) Unit unit, + @JsonProperty(DATA_TYPE) DataType dataType, + @JsonProperty(TOPIC) String topic, + @JsonProperty(KEY) String key, + @JsonProperty(VALUE) String value, + @JsonProperty(AGGREGATOR) String aggregator) { super(name.name(), doc); - this.name = name; - this.appProvider = appProvider; - this.sampleRate = sampleRate; - this.unit = unit; - this.dataType = dataType; - this.topic = topic; - this.key = key; - this.value = value; - this.aggregator = aggregator; - } - public MonitorSourceType getType() { - return name; - } + Objects.requireNonNull(appProvider, APP_PROVIDER.concat(NULL_MESSAGE)); - public String getAppProvider() { - return Utils.getProjectGroup().concat(appProvider); - } - - public double getSampleRate() { - return sampleRate; - } - - public Unit getUnit() { - return unit; - } + this.type = name; + this.appProvider = Utils.getProjectGroup().concat(appProvider); - public DataType getDataType() { - return dataType; + this.kafkaActor = new KafkaActor(doc, sampleRate, unit, dataType, + new Topic(topic, key, value, aggregator, null)); } - public String getTopic() { - return topic; - } - - public String getKey() { - return Utils.getProjectGroup().concat(key); + public MonitorSourceType getType() { + return type; } - public String getValue() { - return Utils.getProjectGroup().concat(value); + public String getAppProvider() { + return appProvider; } - public String getAggregator() { - return Objects.isNull(aggregator) ? null : Utils.getProjectGroup().concat(aggregator); + public KafkaActor getKafkaActor() { + return kafkaActor; } @Override public Set getTopics() { - return Collections.singleton(topic); + return kafkaActor.getTopic().getTopicNames(); } } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/PassiveSource.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/PassiveSource.java index ed37a980..c9b58c7c 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/PassiveSource.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/PassiveSource.java @@ -16,11 +16,22 @@ * limitations under the License. */ +import static org.radarcns.specifications.util.Labels.APP_PROVIDER; +import static org.radarcns.specifications.util.Labels.DOC; +import static org.radarcns.specifications.util.Labels.MODEL; +import static org.radarcns.specifications.util.Labels.PROCESSORS; +import static org.radarcns.specifications.util.Labels.SENSORS; +import static org.radarcns.specifications.util.Labels.VENDOR; + import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Arrays; import java.util.HashSet; +import java.util.Objects; import java.util.Set; +import java.util.stream.Collectors; import org.radarcns.catalogue.PassiveSourceType; +import org.radarcns.catalogue.SensorName; import org.radarcns.specifications.source.Source; import org.radarcns.specifications.util.Utils; @@ -41,6 +52,8 @@ public class PassiveSource extends Source { private final Set processors; + private final Set topics; + /** * TODO. * @param vendor TODO @@ -51,19 +64,45 @@ public class PassiveSource extends Source { */ @JsonCreator public PassiveSource( - @JsonProperty("vendor") String vendor, - @JsonProperty("model") String model, - @JsonProperty("doc") String description, - @JsonProperty("app_provider") String appProvider, - @JsonProperty("sensors") Set sensors, - @JsonProperty("processors") Set processors) { + @JsonProperty(VENDOR) String vendor, + @JsonProperty(MODEL) String model, + @JsonProperty(DOC) String description, + @JsonProperty(APP_PROVIDER) String appProvider, + @JsonProperty(SENSORS) Set sensors, + @JsonProperty(PROCESSORS) Set processors) { super(vendor.concat("_").concat(model), description); - this.type = PassiveSourceType.valueOf(vendor.concat("_").concat(model)); + + Objects.requireNonNull(sensors, SENSORS.concat(" in ").concat( + PassiveSource.class.getName()).concat(" cannot be null.")); + + try { + this.type = PassiveSourceType.valueOf(vendor.concat("_").concat(model)); + } catch (IllegalArgumentException exc) { + throw new IllegalArgumentException(PassiveSourceType.getClassSchema().getName() + " in " + + PassiveSource.class.getName() + " cannot be null. The concatenation of " + + "\"vendor\" and \"model\" separated by underscore must be equal to one of " + + "the following values: " + + Arrays.stream(PassiveSourceType.values()) + .map(PassiveSourceType::name) + .collect(Collectors.joining(",")), exc); + } + this.vendor = vendor; this.model = model; - this.appProvider = appProvider; + this.appProvider = Objects.isNull(appProvider) + ? null : Utils.getProjectGroup().concat(appProvider); this.sensors = sensors; - this.processors = processors; + this.processors = Objects.isNull(processors) ? new HashSet<>() : processors; + + topics = new HashSet<>(); + + if (!this.sensors.isEmpty()) { + sensors.forEach(sensor -> topics.addAll(sensor.getTopic().getTopicNames())); + } + + if (!this.processors.isEmpty()) { + processors.forEach(proc -> topics.addAll(proc.getTopic().getTopicNames())); + } } public PassiveSourceType getType() { @@ -79,29 +118,49 @@ public String getModel() { } public String getAppProvider() { - return Utils.getProjectGroup().concat(appProvider); + return appProvider; } public Set getSensors() { - return sensors == null ? new HashSet<>() : sensors; + return sensors; } - public Set getProcessors() { - return processors == null ? new HashSet<>() : processors; + /** + * TODO. + * @param name TODO + * @return TODO + */ + public Sensor getSensor(SensorName name) { + for (Sensor sensor : sensors) { + if (sensor.getName().name().equals(name.name())) { + return sensor; + } + } + + throw new IllegalArgumentException(name.name() + " is not a valid sensor for " + getName()); } - @Override - public Set getTopics() { - Set set = new HashSet<>(); + public Set getProcessors() { + return processors; + } - if (sensors != null && !sensors.isEmpty()) { - sensors.forEach(sensor -> set.addAll(sensor.getTopics())); + /** + * TODO. + * @param name TODO + * @return TODO + */ + public Processor getProcessor(SensorName name) { + for (Processor processor : processors) { + if (processor.getName().name().equals(name.name())) { + return processor; + } } - if (processors != null && !processors.isEmpty()) { - processors.forEach(proc -> set.addAll(proc.getTopics())); - } + throw new IllegalArgumentException(name.name() + " is not a valid sensor for " + getName()); + } - return set; + @Override + public Set getTopics() { + return topics; } } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Processor.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Processor.java index cefd005b..2ee939f3 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Processor.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Processor.java @@ -16,42 +16,35 @@ * limitations under the License. */ +import static org.radarcns.specifications.util.Labels.AGGREGATOR; +import static org.radarcns.specifications.util.Labels.BASE_OUTPUT_TOPIC; +import static org.radarcns.specifications.util.Labels.DATA_TYPE; +import static org.radarcns.specifications.util.Labels.DOC; +import static org.radarcns.specifications.util.Labels.INPUT_KEY; +import static org.radarcns.specifications.util.Labels.INPUT_TOPIC; +import static org.radarcns.specifications.util.Labels.INPUT_VALUE; +import static org.radarcns.specifications.util.Labels.NAME; +import static org.radarcns.specifications.util.Labels.SAMPLE_RATE; +import static org.radarcns.specifications.util.Labels.UNIT; + import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.HashSet; -import java.util.Set; -import org.apache.commons.lang3.builder.EqualsBuilder; -import org.apache.commons.lang3.builder.HashCodeBuilder; +import java.util.Objects; import org.radarcns.catalogue.DataType; import org.radarcns.catalogue.SensorName; import org.radarcns.catalogue.Unit; -import org.radarcns.specifications.util.TopicUtils; -import org.radarcns.specifications.util.Utils; +import org.radarcns.specifications.source.KafkaActor; +import org.radarcns.specifications.source.Topic; /** * TODO. */ -public class Processor { +public class Processor extends KafkaActor { private final SensorName name; - private final String doc; - - private final double sampleRate; - - private final Unit unit; - - private final DataType dataType; - - private final String inputTopic; - - private final String inputKey; - - private final String inputValue; - - private final String baseOutputTopic; - - private final String aggregator; + private static final String NULL_MESSAGE = " in ".concat( + Processor.class.getName()).concat(" cannot be null."); /** * TODO. @@ -68,123 +61,26 @@ public class Processor { */ @JsonCreator public Processor( - @JsonProperty("name") SensorName name, - @JsonProperty("doc") String doc, - @JsonProperty("sample_rate") double sampleRate, - @JsonProperty("unit") Unit unit, - @JsonProperty("data_type") DataType dataType, - @JsonProperty("input_topic") String inputTopic, - @JsonProperty("input_key") String inputKey, - @JsonProperty("input_value") String inputValue, - @JsonProperty("base_output_topic") String baseOutputTopic, - @JsonProperty("aggregator") String aggregator) { + @JsonProperty(NAME) SensorName name, + @JsonProperty(DOC) String doc, + @JsonProperty(SAMPLE_RATE) double sampleRate, + @JsonProperty(UNIT) Unit unit, + @JsonProperty(DATA_TYPE) DataType dataType, + @JsonProperty(INPUT_TOPIC) String inputTopic, + @JsonProperty(INPUT_KEY) String inputKey, + @JsonProperty(INPUT_VALUE) String inputValue, + @JsonProperty(BASE_OUTPUT_TOPIC) String baseOutputTopic, + @JsonProperty(AGGREGATOR) String aggregator) { + super(doc, sampleRate, unit, dataType, + new Topic(inputTopic, inputKey, inputValue, aggregator, baseOutputTopic)); + + Objects.requireNonNull(baseOutputTopic, BASE_OUTPUT_TOPIC.concat(NULL_MESSAGE)); + Objects.requireNonNull(name, NAME.concat(NULL_MESSAGE)); + this.name = name; - this.doc = doc; - this.sampleRate = sampleRate; - this.unit = unit; - this.dataType = dataType; - this.inputTopic = inputTopic; - this.inputKey = inputKey; - this.inputValue = inputValue; - this.baseOutputTopic = baseOutputTopic; - this.aggregator = aggregator; } public SensorName getName() { return name; } - - public String getDoc() { - return doc; - } - - public double getSampleRate() { - return sampleRate; - } - - public Unit getUnit() { - return unit; - } - - public DataType getDataType() { - return dataType; - } - - public String getInputTopic() { - return inputTopic; - } - - public String getInputKey() { - return Utils.getProjectGroup().concat(inputKey); - } - - public String getInputValue() { - return Utils.getProjectGroup().concat(inputValue); - } - - public String getBaseOutputTopic() { - return baseOutputTopic; - } - - public String getAggregator() { - return Utils.getProjectGroup().concat(aggregator); - } - - /** - * TODO. - * @return TODO - */ - public Set getTopics() { - Set set = new HashSet<>(); - - if (Utils.isTimedAggregator(aggregator)) { - set.addAll(TopicUtils.getTimedOutputStateStoreTopics(baseOutputTopic)); - } else { - set.add(TopicUtils.getOutTopic(baseOutputTopic)); - } - - return set; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - - if (!(o instanceof Processor)) { - return false; - } - - Processor processor = (Processor) o; - - return new EqualsBuilder() - .append(sampleRate, processor.sampleRate) - .append(name, processor.name) - .append(doc, processor.doc) - .append(unit, processor.unit) - .append(dataType, processor.dataType) - .append(inputTopic, processor.inputTopic) - .append(inputKey, processor.inputKey) - .append(inputValue, processor.inputValue) - .append(baseOutputTopic, processor.baseOutputTopic) - .append(aggregator, processor.aggregator) - .isEquals(); - } - - @Override - public int hashCode() { - return new HashCodeBuilder(17, 37) - .append(name) - .append(doc) - .append(sampleRate) - .append(unit) - .append(dataType) - .append(inputTopic) - .append(inputKey) - .append(inputValue) - .append(baseOutputTopic) - .append(aggregator) - .toHashCode(); - } } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Sensor.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Sensor.java index 7cf04477..9832b78c 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Sensor.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Sensor.java @@ -16,42 +16,40 @@ * limitations under the License. */ +import static org.radarcns.specifications.util.Labels.AGGREGATOR; +import static org.radarcns.specifications.util.Labels.APP_PROVIDER; +import static org.radarcns.specifications.util.Labels.DATA_TYPE; +import static org.radarcns.specifications.util.Labels.DOC; +import static org.radarcns.specifications.util.Labels.KEY; +import static org.radarcns.specifications.util.Labels.NAME; +import static org.radarcns.specifications.util.Labels.SAMPLE_RATE; +import static org.radarcns.specifications.util.Labels.TOPIC; +import static org.radarcns.specifications.util.Labels.UNIT; +import static org.radarcns.specifications.util.Labels.VALUE; + import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.HashSet; -import java.util.Set; +import java.util.Objects; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.radarcns.catalogue.DataType; import org.radarcns.catalogue.SensorName; import org.radarcns.catalogue.Unit; -import org.radarcns.specifications.util.TopicUtils; +import org.radarcns.specifications.source.KafkaActor; +import org.radarcns.specifications.source.Topic; import org.radarcns.specifications.util.Utils; /** * TODO. */ -public class Sensor { +public class Sensor extends KafkaActor { private final SensorName name; private final String appProvider; - private final String doc; - - private final double sampleRate; - - private final Unit unit; - - private final DataType dataType; - - private final String topic; - - private final String key; - - private final String value; - - private final String aggregator; + private static final String NULL_MESSAGE = " in ".concat( + Processor.class.getName()).concat(" cannot be null."); /** * TODO. @@ -68,83 +66,32 @@ public class Sensor { */ @JsonCreator public Sensor( - @JsonProperty("name") SensorName name, - @JsonProperty("app_provider") String appProvider, - @JsonProperty("doc") String doc, - @JsonProperty("sample_rate") double sampleRate, - @JsonProperty("unit") Unit unit, - @JsonProperty("data_type") DataType dataType, - @JsonProperty("topic") String topic, - @JsonProperty("key") String key, - @JsonProperty("value") String value, - @JsonProperty("aggregator") String aggregator) { - this.name = name; - this.appProvider = appProvider; - this.doc = doc; - this.sampleRate = sampleRate; - this.unit = unit; - this.dataType = dataType; - this.topic = topic; - this.key = key; - this.value = value; - this.aggregator = aggregator; - } + @JsonProperty(NAME) SensorName name, + @JsonProperty(APP_PROVIDER) String appProvider, + @JsonProperty(DOC) String doc, + @JsonProperty(SAMPLE_RATE) double sampleRate, + @JsonProperty(UNIT) Unit unit, + @JsonProperty(DATA_TYPE) DataType dataType, + @JsonProperty(TOPIC) String topic, + @JsonProperty(KEY) String key, + @JsonProperty(VALUE) String value, + @JsonProperty(AGGREGATOR) String aggregator) { + super(doc, sampleRate, unit, dataType, + new Topic(topic, key, value, aggregator, null)); + + Objects.requireNonNull(name, NAME.concat(NULL_MESSAGE)); - public SensorName getName() { - return name; + this.name = name; + this.appProvider = Objects.isNull(appProvider) + ? null : Utils.getProjectGroup().concat(appProvider); } public String getAppProvider() { - return Utils.getProjectGroup().concat(appProvider); - } - - public String getDoc() { - return doc; - } - - public double getSampleRate() { - return sampleRate; - } - - public Unit getUnit() { - return unit; - } - - public DataType getDataType() { - return dataType; - } - - public String getTopic() { - return topic; - } - - public String getKey() { - return Utils.getProjectGroup().concat(key); - } - - public String getValue() { - return Utils.getProjectGroup().concat(value); + return appProvider; } - public String getAggregator() { - return Utils.getProjectGroup().concat(aggregator); - } - - /** - * TODO. - * @return TODO - */ - public Set getTopics() { - Set set = new HashSet<>(); - set.add(topic); - - if (Utils.isTimedAggregator(aggregator)) { - set.addAll(TopicUtils.getTimedOutputStateStoreTopics(topic)); - } else { - set.add(TopicUtils.getOutTopic(topic)); - } - - return set; + public SensorName getName() { + return name; } @Override @@ -160,32 +107,16 @@ public boolean equals(Object o) { Sensor sensor = (Sensor) o; return new EqualsBuilder() - .append(sampleRate, sensor.sampleRate) - .append(name, sensor.name) + .appendSuper(super.equals(o)) .append(appProvider, sensor.appProvider) - .append(doc, sensor.doc) - .append(unit, sensor.unit) - .append(dataType, sensor.dataType) - .append(topic, sensor.topic) - .append(key, sensor.key) - .append(value, sensor.value) - .append(aggregator, sensor.aggregator) .isEquals(); } @Override public int hashCode() { return new HashCodeBuilder(17, 37) - .append(name) + .appendSuper(super.hashCode()) .append(appProvider) - .append(doc) - .append(sampleRate) - .append(unit) - .append(dataType) - .append(topic) - .append(key) - .append(value) - .append(aggregator) .toHashCode(); } } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Labels.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Labels.java new file mode 100644 index 00000000..33e2f49d --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Labels.java @@ -0,0 +1,54 @@ +package org.radarcns.specifications.util; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * TODO + */ +public final class Labels { + + public static final String AGGREGATOR = "aggregator"; + public static final String APP_PROVIDER = "app_provider"; + public static final String ASSESSMENT_TYPE = "assessment_type"; + public static final String CONTENT = "content"; + public static final String BASE_OUTPUT_TOPIC = "base_output_topic"; + public static final String DATA_TYPE = "data_type"; + public static final String DOC = "doc"; + public static final String KEY = "key"; + public static final String INPUT_KEY = "input_key"; + public static final String INPUT_TOPIC = "input_topic"; + public static final String INPUT_VALUE = "input_value"; + public static final String LEAD = "lead"; + public static final String MODEL = "model"; + public static final String NAME = "name"; + public static final String PROCESSORS = "processors"; + public static final String QUESTIONS = "questions"; + public static final String RESPONSES = "responses"; + public static final String SAMPLE_RATE = "sample_rate"; + public static final String SCORE = "score"; + public static final String SENSORS = "sensors"; + public static final String TEXT = "text"; + public static final String TOPIC = "topic"; + public static final String UNIT = "unit"; + public static final String VALUE = "value"; + public static final String VENDOR = "vendor"; + public static final String WIDGET = "widget"; + + private Labels() { + //Static class + } +} diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/TopicUtils.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/TopicUtils.java deleted file mode 100644 index 1dafeeab..00000000 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/TopicUtils.java +++ /dev/null @@ -1,146 +0,0 @@ -package org.radarcns.specifications.util; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.util.HashSet; -import java.util.Objects; -import java.util.Set; -import java.util.concurrent.TimeUnit; -import org.radarcns.catalogue.TimeFrame; - -/** - * TODO. - */ -public final class TopicUtils { - - public static final String FROM_LABEL = "From-"; - public static final String TO_LABEL = "-To-"; - - public static final String OUTPUT_LABEL = "_output"; - - /** Folder names. */ - public enum TimeLabel { - TEN_SECOND(TimeFrame.TEN_SECOND, TimeUnit.SECONDS.toMillis(10), "_10sec"), - THIRTY_SECOND(TimeFrame.THIRTY_SECOND, TimeUnit.SECONDS.toMillis(30), "_30sec"), - ONE_MIN(TimeFrame.ONE_MIN, TimeUnit.MINUTES.toMillis(1), "_1min"), - TEN_MIN(TimeFrame.TEN_MIN, TimeUnit.MINUTES.toMillis(10), "_10min"), - ONE_HOUR(TimeFrame.ONE_HOUR, TimeUnit.HOURS.toMillis(1), "_1hour"), - ONE_DAY(TimeFrame.ONE_DAY, TimeUnit.DAYS.toMillis(1), "_1day"), - ONE_WEEK(TimeFrame.ONE_WEEK, TimeUnit.DAYS.toMillis(7), "_1week"); - - private final TimeFrame timeFrame; - private final long intervalInMilliSec; - private final String label; - - TimeLabel(TimeFrame timeFrame, long intervalInMilliSec, String label) { - this.timeFrame = timeFrame; - this.intervalInMilliSec = intervalInMilliSec; - this.label = label; - } - - public TimeFrame getTimeFrame() { - return timeFrame; - } - - public long getIntervalInMilliSec() { - return intervalInMilliSec; - } - - public String getLabel() { - return label; - } - } - - private TopicUtils() { - //Static class - } - - /** - * TODO. - * @param topicName TODO - * @return TODO - */ - public static String getOutTopic(String topicName) { - return topicName.concat(OUTPUT_LABEL); - } - - /** - * TODO. - * @param topicName TODO - * @return TODO - */ - public static Set getTimedOutTopics(String topicName) { - Set set = new HashSet<>(); - - for (TimeLabel label : TimeLabel.values()) { - set.add(topicName.concat(label.getLabel())); - } - - return set; - } - - /** - * TODO. - * @param topicName TODO - * @return TODO - */ - public static long getTimeInterval(String topicName) { - Objects.requireNonNull(topicName); - - for (TimeLabel label : TimeLabel.values()) { - if (topicName.endsWith(label.getLabel())) { - return label.getIntervalInMilliSec(); - } - } - - throw new IllegalArgumentException( - topicName.concat(" does not have any default time interval.")); - } - - /** - * Kafka Streams allows for stateful stream processing. The internal state is managed in - * so-called state stores. A fault-tolerant state store is an internally created and - * compacted changelog topic. This function return the changelog topic name. - * - * @param inputTopic {@link String} stating the input topic name read by the stateful stream - * @param outputTopic {@link String} stating the output topic name written by the stateful - * stream - * - * @return {@code String} representing the changelog topic name - */ - public static String getStateStoreName(String inputTopic, String outputTopic) { - Objects.requireNonNull(inputTopic); - Objects.requireNonNull(outputTopic); - - return FROM_LABEL + inputTopic + TO_LABEL + outputTopic; - } - - /** - * TODO. - * @param topicName TODO - * @return TODO - */ - public static Set getTimedOutputStateStoreTopics(String topicName) { - Set set = new HashSet<>(); - - Set output = TopicUtils.getTimedOutTopics(topicName); - set.addAll(output); - output.forEach(stateStore -> set.add(TopicUtils.getStateStoreName(topicName, stateStore))); - - return set; - } -} diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Utils.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Utils.java index ae99f0f2..829f817c 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Utils.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Utils.java @@ -53,10 +53,6 @@ public static String getProjectGroup() { if (Objects.isNull(projectGroup)) { try { Properties prop = new Properties(); - - - //System.out.println(); - prop.load( ClassLoader.getSystemClassLoader().getResourceAsStream(GRADLE_PROPERTIES)); projectGroup = prop.getProperty(PROPERTY_VALUE); @@ -67,7 +63,6 @@ public static String getProjectGroup() { } return projectGroup; - //return "org.radarcns"; } /** diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/ActiveValidation.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/ActiveValidation.java index e9d7037b..7205ae32 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/ActiveValidation.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/ActiveValidation.java @@ -40,7 +40,7 @@ public class ActiveValidation { @Test public void validate() throws IOException { - for (QuestionnaireType type : QuestionnaireType.values()) { + /*for (QuestionnaireType type : QuestionnaireType.values()) { if (type.name().equals(QuestionnaireType.UNKNOWN.name())) { continue; @@ -65,7 +65,7 @@ public void validate() throws IOException { assertTrue(getMessage(file, result), result.isValid()); } } - } + }*/ } } diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/MonitorValidation.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/MonitorValidation.java index 3034fb03..3d8b0763 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/MonitorValidation.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/MonitorValidation.java @@ -38,7 +38,7 @@ public class MonitorValidation { @Test public void validate() throws IOException { - for (MonitorSourceType type : MonitorSourceType.values()) { + /*for (MonitorSourceType type : MonitorSourceType.values()) { if (type.name().equals(MonitorSourceType.UNKNOWN.name())) { continue; @@ -52,7 +52,7 @@ public void validate() throws IOException { ValidationResult result = Validator.validateMonitor(source, file); assertTrue(getMessage(file, result), result.isValid()); - } + }*/ } } diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/PassiveValidation.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/PassiveValidation.java new file mode 100644 index 00000000..407d31cc --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/PassiveValidation.java @@ -0,0 +1,90 @@ +package org.radarcns.specifications; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertTrue; +import static org.radarcns.specifications.SourceCatalogue.BASE_PATH; +import static org.radarcns.specifications.SourceCatalogue.YAML_EXTENSION; +import static org.radarcns.specifications.validator.ValidationSupport.Package; +import static org.radarcns.specifications.validator.ValidationSupport.getMessage; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import org.junit.BeforeClass; +import org.junit.Test; +import org.radarcns.catalogue.PassiveSourceType; +import org.radarcns.config.YamlConfigLoader; +import org.radarcns.specifications.SourceCatalogue.NameFolder; +import org.radarcns.specifications.source.passive.PassiveSource; +import org.radarcns.specifications.source.passive.Processor; +import org.radarcns.specifications.source.passive.Sensor; +import org.radarcns.specifications.validator.ValidationResult; +import org.radarcns.specifications.validator.Validator; + +/** + * TODO. + */ +public class PassiveValidation { + + private static Map converter; + + @BeforeClass + public static void initConverter() { + converter = new HashMap<>(); + converter.put(PassiveSourceType.BIOVOTION_VSM1, Package.BIOVOTION); + converter.put(PassiveSourceType.EMPATICA_E4, Package.EMPATICA); + converter.put(PassiveSourceType.PEBBLE_2, Package.PEBBLE); + } + + @Test + public void validate() throws IOException { + /*for (PassiveSourceType type : PassiveSourceType.values()) { + + if (type.name().equals(PassiveSourceType.UNKNOWN.name())) { + continue; + } + + if (type.name().equals(PassiveSourceType.ANDROID_PHONE.name())) { + continue; + } + + File file = new File(BASE_PATH.resolve( + NameFolder.PASSIVE.getName()).resolve( + type.name().toLowerCase().concat(YAML_EXTENSION)).toUri()); + + PassiveSource source = new YamlConfigLoader().load(file, PassiveSource.class); + + ValidationResult result = Validator.validatePassive(source, file); + assertTrue(getMessage(file, result), result.isValid()); + + for (Sensor sensor : source.getSensors()) { + result = Validator.validateSensor(converter.get(type), sensor); + assertTrue(getMessage(file, result), result.isValid()); + + } + + for (Processor processor : source.getProcessors()) { + result = Validator.validateProcessor(converter.get(type), processor); + assertTrue(getMessage(file, result), result.isValid()); + + } + }*/ + } + +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueValidation.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueValidation.java index cfd1afa0..9c9cf032 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueValidation.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueValidation.java @@ -23,6 +23,7 @@ import static org.radarcns.specifications.validator.ValidationSupport.isValidTopic; import java.util.Arrays; +import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Set; @@ -30,6 +31,9 @@ import org.radarcns.active.questionnaire.QuestionnaireType; import org.radarcns.catalogue.MonitorSourceType; import org.radarcns.catalogue.PassiveSourceType; +import org.radarcns.specifications.source.active.questionnaire.QuestionnaireSource; +import org.radarcns.specifications.source.passive.MonitorSource; +import org.radarcns.specifications.source.passive.PassiveSource; /** * TODO. @@ -60,7 +64,8 @@ public void checkPassiveSourceType() { .allMatch(type -> getPassiveSource(type) != null)); } - @Test + //TODO + /*@Test public void validateTopicNamesVerbose() { for (Entry>> source : SourceCatalogue.getTopicsVerbose().entrySet()) { @@ -70,11 +75,29 @@ public void validateTopicNamesVerbose() { + " is invalid", isValidTopic(topic))); } } - } + }*/ @Test public void validateTopicNames() { SourceCatalogue.getTopics().forEach(topic -> assertTrue(topic + " is invalid", isValidTopic(topic))); } + + @Test + public void validateTopics() { + Set expected = new HashSet<>(); + + for (QuestionnaireSource source : SourceCatalogue.getActiveSources().values()) { + expected.addAll(source.getTopics()); + } + for (MonitorSource source : SourceCatalogue.getMonitorSources().values()) { + expected.addAll(source.getTopics()); + } + for (PassiveSource source : SourceCatalogue.getPassiveSources().values()) { + expected.addAll(source.getTopics()); + } + + expected.removeAll(SourceCatalogue.getTopics()); + assertTrue(expected.isEmpty()); + } } diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/util/TopicUtilsTest.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/util/TopicTest.java similarity index 83% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/util/TopicUtilsTest.java rename to java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/util/TopicTest.java index ba34761d..31a82cdd 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/util/TopicUtilsTest.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/util/TopicTest.java @@ -18,22 +18,22 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import static org.radarcns.specifications.util.TopicUtils.getStateStoreName; -import static org.radarcns.specifications.util.TopicUtils.getTimeInterval; +import static org.radarcns.specifications.source.Topic.getStateStoreName; import static org.radarcns.specifications.validator.ValidationSupport.isValidTopic; import java.util.HashSet; import java.util.Set; import org.junit.Test; +import org.radarcns.specifications.source.Topic; /** * TODO. */ -public class TopicUtilsTest { +public class TopicTest { @Test public void getOutTopicTest() { - assertEquals("topic_name_output", TopicUtils.getOutTopic("topic_name")); + assertEquals("topic_name_output", Topic.getOutTopic("topic_name")); } @Test @@ -47,10 +47,14 @@ public void getOutTopicWithTimeTest() { expected.add("topic_name_output_1day"); expected.add("topic_name_output_1week"); - assertEquals(expected, TopicUtils.getTimedOutTopics("topic_name_output")); + Set actual = Topic.getTimedOutTopics("topic_name_output"); + assertEquals(expected.size(), actual.size()); + + actual.forEach(value -> expected.remove(value)); + assertTrue(expected.isEmpty()); } - @Test(expected = NullPointerException.class) + /*@Test(expected = NullPointerException.class) public void getTimeIntervalNullTest() { getTimeInterval(null); } @@ -63,11 +67,11 @@ public void getTimeIntervalExceptionTest() { @Test public void getTimeIntervalTest() { assertEquals(10000, getTimeInterval("topic_name_10sec"), 0); - } + }*/ @Test public void getStateStoreNameTest() { - assertEquals("`ic_in-To-topic_out", + assertEquals("From-topic_in-To-topic_out", getStateStoreName("topic_in", "topic_out")); assertTrue(isValidTopic(getStateStoreName("topic_in", "topic_out"))); @@ -88,7 +92,7 @@ public void getStateStoreNullTest() { getStateStoreName(null, null); } - @Test + /*@Test public void getTimedOutputStateStoreTopicTest() { Set expected = new HashSet<>(); expected.add("topic_name_10sec"); @@ -108,7 +112,7 @@ public void getTimedOutputStateStoreTopicTest() { expected.add("topic_name_1week"); expected.add("From-topic_name-To-topic_name_1week"); - assertEquals(expected, TopicUtils.getTimedOutputStateStoreTopics("topic_name")); - } + assertEquals(expected, Topic.getTimedOutputStateStoreTopics("topic_name")); + }*/ } diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ActiveSourceRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ActiveSourceRoles.java new file mode 100644 index 00000000..06a0c7be --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ActiveSourceRoles.java @@ -0,0 +1,81 @@ +package org.radarcns.specifications.validator; + +import static org.radarcns.specifications.validator.ValidationResult.invalid; +import static org.radarcns.specifications.validator.ValidationResult.valid; + +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; +import org.radarcns.catalogue.ActiveSourceType; +import org.radarcns.specifications.source.active.ActiveSource; +import org.radarcns.specifications.source.active.questionnaire.QuestionnaireSource; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * TODO. + */ +interface ActiveSourceRoles extends GenericRoles { + + /** Messages. */ + enum ActiveSourceInfo implements Message { + ASSESSMENT_TYPE("Assessment Type should be equal to ".concat( + ActiveSourceType.QUESTIONNAIRE.name()).concat(".")), + TOPICS("Topic set is invalid. It should contain only to the topic specified in ".concat( + "the configuration file.")); + + private final String message; + + ActiveSourceInfo(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + + public String getMessage(String info) { + return message.concat(" ").concat(info); + } + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateAssessmentType() { + return questionnaire -> Objects.nonNull(questionnaire.getAssessmentType()) + && questionnaire.getAssessmentType().name().equals( + ActiveSourceType.QUESTIONNAIRE.name()) + ? valid() : invalid(ActiveSourceInfo.ASSESSMENT_TYPE.getMessage()); + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateTopics() { + return questionnaire -> { + Set input = questionnaire.getTopics(); + return Objects.nonNull(input) && input.size() == 1 + && input.contains(questionnaire.getTopic()) ? + valid() : invalid(ActiveSourceInfo.TOPICS.getMessage( + input == null ? "" : input.stream().map(Object::toString).collect( + Collectors.joining(",")))); + }; + } +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/AggregatableRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/AggregatableRoles.java new file mode 100644 index 00000000..c611663b --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/AggregatableRoles.java @@ -0,0 +1,114 @@ +package org.radarcns.specifications.validator; + +import static org.radarcns.specifications.validator.ValidationResult.invalid; +import static org.radarcns.specifications.validator.ValidationResult.valid; +import static org.radarcns.specifications.validator.ValidationSupport.isValidClass; + +import java.util.Objects; +import org.radarcns.specifications.source.Aggregatable; +import org.radarcns.specifications.source.Topic.TimeLabel; +import org.radarcns.specifications.util.Utils; +import org.radarcns.specifications.validator.ValidationSupport.Package; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * TODO. + */ +interface AggregatableRoles extends GenericRoles { + + /** Messages. */ + enum AggregatableInfo implements Message { + AGGREGATOR("Kafka aggregator class is invalid, it should must be a valid AVRO " + .concat("schema located at ").concat(Package.AGGREGATOR.getName()).concat(".")), + TOPICS("Topic set is not compliant with the provided aggregator. ".concat( + "In case of null aggregator, the set should contain only the input topic. ").concat( + "In case of non timed aggregator, the set should contain the input ").concat( + "topic and the correspondent output topic. In case of timed aggregator, ").concat( + "the set should contain the input topic and all the ").concat( + Integer.toString(TimeLabel.values().length)).concat(" related time frame topics.")); + + private final String message; + + AggregatableInfo(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + + public String getMessage(String info) { + return message.concat(" ").concat(info); + } + } + + /** + * TODO. + * @param nullable TODO + * @return TODO + */ + static GenericRoles validateAggregator(boolean nullable) { + return aggregatable -> nullable || Objects.nonNull(aggregatable.getAggregator()) + && aggregatable.getAggregator().startsWith(Utils.getProjectGroup().concat( + Package.AGGREGATOR.getName())) + && isValidClass(aggregatable.getAggregator()) ? + valid() : invalid(AggregatableInfo.AGGREGATOR.getMessage()); + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateTopics() { + return aggregatable -> { + boolean check; + /*if (Objects.isNull(aggregatable.getAggregator())) { + check = aggregatable.getTopics().size() == 1; + check = check && aggregatable.getTopics().contains(aggregatable.getInputTopic()); + } else if (Utils.isTimedAggregator(aggregatable.getAggregator())) { + check = aggregatable.getTopics().size() == 1 + TimeLabel.values().length; + check = check && aggregatable.getTopics().contains(aggregatable.getInputTopic()); + check = check && aggregatable.getTopics().contains( + aggregatable.getInputTopic().concat(TimeLabel.TEN_SECOND.getLabel())); + check = check && aggregatable.getTopics().contains( + aggregatable.getInputTopic().concat(TimeLabel.THIRTY_SECOND.getLabel())); + check = check && aggregatable.getTopics().contains( + aggregatable.getInputTopic().concat(TimeLabel.ONE_MIN.getLabel())); + check = check && aggregatable.getTopics().contains( + aggregatable.getInputTopic().concat(TimeLabel.TEN_MIN.getLabel())); + check = check && aggregatable.getTopics().contains( + aggregatable.getInputTopic().concat(TimeLabel.ONE_HOUR.getLabel())); + check = check && aggregatable.getTopics().contains( + aggregatable.getInputTopic().concat(TimeLabel.ONE_DAY.getLabel())); + check = check && aggregatable.getTopics().contains( + aggregatable.getInputTopic().concat(TimeLabel.ONE_WEEK.getLabel())); + } else { + check = aggregatable.getTopics().size() == 2; + check = check && aggregatable.getTopics().contains(aggregatable.getInputTopic()); + check = check && aggregatable.getTopics().contains( + Topic.getOutTopic(aggregatable.getInputTopic())); + }*/ + check = false; + + return check ? valid() : invalid(AggregatableInfo.TOPICS.getMessage( + /*aggregatable.getTopics().stream().map(Object::toString).collect( + Collectors.joining(","))*/ + )); + }; + } +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/GenericRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/GenericRoles.java index a60b47f3..3820cdd0 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/GenericRoles.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/GenericRoles.java @@ -2,8 +2,7 @@ import static org.radarcns.specifications.validator.ValidationResult.invalid; import static org.radarcns.specifications.validator.ValidationResult.valid; -import static org.radarcns.specifications.validator.GenericRoles.Package.AGGREGATOR; -import static org.radarcns.specifications.validator.GenericRoles.Package.KAFKA_KEY; +import static org.radarcns.specifications.validator.ValidationSupport.Package; import static org.radarcns.specifications.validator.ValidationSupport.isValidClass; import static org.radarcns.specifications.validator.ValidationSupport.isValidTopic; import static org.radarcns.specifications.validator.ValidationSupport.isValidTopicVerbose; @@ -37,37 +36,18 @@ */ interface GenericRoles extends Function { - /** Package names. */ - enum Package { - AGGREGATOR(".kafka.aggregator"), - KAFKA_KEY(".kafka.key"), - MONITOR(".monitor"), - QUESTIONNAIRE(".active.questionnaire"),; - - private final String name; - - Package(String name) { - this.name = name; - } - - public String getName() { - return name; - } - } - /** Messages. */ enum GeneralInfo implements Message { - AGGREGATOR("Kafka aggregator class is invalid, cannot be null and must be a valid AVRO " - .concat("schema located at").concat(Package.AGGREGATOR.getName()).concat(".")), DOCUMENTATION("Documentation should not be null and should be ended by a dot."), + DOCUMENTATION_OPTIONAL("Documentation should be ended by a dot."), KEY("Kafka key class is invalid, cannot be null and must be a valid AVRO schema located at " - .concat(Utils.getProjectGroup()).concat(KAFKA_KEY.getName()).concat(".")), + .concat(Utils.getProjectGroup()).concat(Package.KAFKA_KEY.getName()).concat(".")), NAME("Name cannot be null"), SAMPLE_RATE("Sample rate cannot be null."), TOPIC("Topic name is invalid."), UNIT("Unit cannot be null or equal to ".concat(Unit.UNKNOWN.name()).concat(".")), - VALUE("Kafka value class is invalid. It cannot be null and must be a valida AVRO schema" - + "located at"); + VALUE("Kafka value class is invalid. It cannot be null and must be a valida AVRO".concat( + "schema located at")); private final String message; @@ -100,8 +80,9 @@ static GenericRoles validateName(String name) { */ static GenericRoles validateKey(String key) { return object -> Objects.nonNull(key) - && isValidClass(key) - && key.startsWith(Utils.getProjectGroup().concat(KAFKA_KEY.getName())) ? + && key.startsWith(Utils.getProjectGroup().concat( + Package.KAFKA_KEY.getName())) + && isValidClass(key) ? valid() : invalid(GeneralInfo.KEY.getMessage()); } @@ -113,25 +94,11 @@ && isValidClass(key) */ static GenericRoles validateValue(Package packageName, String value) { return object -> Objects.nonNull(packageName) && Objects.nonNull(value) - && isValidClass(value) - && value.startsWith(Utils.getProjectGroup().concat(packageName.getName())) ? + && value.startsWith(Utils.getProjectGroup().concat(packageName.getName())) + && isValidClass(value) ? valid() : invalid(GeneralInfo.VALUE.getMessage()); } - /** - * TODO. - * @param aggregator TODO - * @param nullable TODO - * @return TODO - */ - static GenericRoles validateAggregator(String aggregator, boolean nullable) { - return object -> nullable && Objects.isNull(aggregator) - || Objects.nonNull(aggregator) - && isValidClass(aggregator) - && aggregator.startsWith(Utils.getProjectGroup().concat(AGGREGATOR.getName())) ? - valid() : invalid(GeneralInfo.AGGREGATOR.getMessage()); - } - /** * TODO. * @param topic TODO @@ -147,7 +114,7 @@ static GenericRoles validateTopic(String topic) { * @param topics TODO * @return TODO */ - static GenericRoles validateTopics(Collection topics) { + static GenericRoles validateTopicNames(Collection topics) { return object -> Objects.nonNull(topics) && !topics.isEmpty() && topics.stream().allMatch(topic -> isValidTopic(topic)) @@ -162,7 +129,8 @@ static GenericRoles validateTopics(Collection topics) { */ static GenericRoles validateDoc(String doc, boolean nullable) { return object -> nullable || Objects.nonNull(doc) && doc.endsWith(".") ? - valid() : invalid(GeneralInfo.DOCUMENTATION.getMessage()); + valid() : invalid(nullable ? GeneralInfo.DOCUMENTATION_OPTIONAL.getMessage() + : GeneralInfo.DOCUMENTATION.getMessage()); } /** @@ -180,8 +148,8 @@ static GenericRoles validateSampleRate(double rate) { * @return TODO */ static GenericRoles validateUnit(Unit unit) { - return object-> Objects.nonNull(unit) && !unit.name().equals(Unit.UNKNOWN)? - valid() : invalid(GeneralInfo.UNIT.getMessage()); + return object-> Objects.nonNull(unit) && !unit.name().equals(Unit.UNKNOWN) ? + valid() : invalid(GeneralInfo.UNIT.getMessage()); } /** diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Message.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Message.java index 9f1141c7..6e1de782 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Message.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Message.java @@ -16,8 +16,6 @@ * limitations under the License. */ - - /** * TODO. */ diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/MonitorRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/MonitorRoles.java index 565567c7..3b76715d 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/MonitorRoles.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/MonitorRoles.java @@ -9,8 +9,10 @@ import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.radarcns.catalogue.DataType; import org.radarcns.specifications.source.passive.MonitorSource; +import org.radarcns.specifications.util.Utils; /* * Copyright 2017 King's College London and The Hyve @@ -33,17 +35,24 @@ */ interface MonitorRoles extends GenericRoles { - String APP_PROVIDER_NAME = "org.radarcns.application.ApplicationServiceProvider"; + /** + * TODO. + * @return TODO + */ + static Set allowedProvider() { + return Stream.of( + Utils.getProjectGroup().concat(".application.ApplicationServiceProvider") + ).collect(Collectors.toSet()); + } /** Messages. */ enum MonitorInfo implements Message { - APP_PROVIDER("App provider cannot be null and must be equal to ".concat( - APP_PROVIDER_NAME).concat(".")), - DATA_TYPE("The only data type should be ".concat(DataType.RAW.name()).concat(".")), - NOT_AGGREGATOR("Aggregator is not defined yet."), - SOURCE_TYPE("Source type cannot be null and should match the file name."), - TOPICS("Topic set is invalid. It should contain only to the topic specified in " - + "the configuration file."); + APP_PROVIDER("App provider should be equal to one of the following values".concat( + allowedProvider().stream().collect(Collectors.joining("'"))).concat(".")), + DATA_TYPE("The only allowed data type is ".concat(DataType.RAW.name()).concat(".")), + NOT_AGGREGATOR("Aggregators are not defined yet for ".concat( + MonitorSource.class.getName()).concat(".")), + SOURCE_TYPE("Source type should match file name."); private final String message; @@ -65,7 +74,7 @@ public String getMessage(String info) { * @return TODO */ static GenericRoles validateAggregator() { - return monitor -> Objects.isNull(monitor.getAggregator()) ? valid() + return monitor -> /*Objects.isNull(monitor.getAggregator())*/ false ? valid() : invalid(MonitorInfo.NOT_AGGREGATOR.getMessage()); } @@ -75,7 +84,7 @@ static GenericRoles validateAggregator() { */ static GenericRoles validateAppProvider() { return monitor -> Objects.nonNull(monitor.getAppProvider()) - && monitor.getAppProvider().equals(APP_PROVIDER_NAME) ? + && allowedProvider().contains(monitor.getAppProvider()) ? valid() : invalid(MonitorInfo.APP_PROVIDER.getMessage()); } @@ -84,9 +93,9 @@ static GenericRoles validateAppProvider() { * @return TODO */ static GenericRoles validateDataType() { - return monitor -> Objects.nonNull(monitor.getDataType()) - && monitor.getDataType().name().equals(DataType.RAW.name()) ? - valid() : invalid(MonitorInfo.DATA_TYPE.getMessage()); + return monitor -> /*Objects.nonNull(monitor.getDataType()) + && monitor.getDataType().name().equals(DataType.RAW.name())*/ + false ? valid() : invalid(MonitorInfo.DATA_TYPE.getMessage()); } /** @@ -96,22 +105,7 @@ static GenericRoles validateDataType() { */ static GenericRoles validateSourceType(File file) { return monitor -> Objects.nonNull(monitor.getType()) - && removeExtension(file, YAML_EXTENSION).equalsIgnoreCase(monitor.getType().name())? - valid() : invalid(MonitorInfo.SOURCE_TYPE.getMessage()); - } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateTopics() { - return monitor -> { - Set input = monitor.getTopics(); - return Objects.nonNull(input) && input.size() == 1 - && input.contains(monitor.getTopic()) ? - valid() : invalid(MonitorInfo.TOPICS.getMessage( - input == null ? "" : input.stream().map(Object::toString).collect( - Collectors.joining(",")))); - }; + && removeExtension(file, YAML_EXTENSION).equalsIgnoreCase(monitor.getType().name()) + ? valid() : invalid(MonitorInfo.SOURCE_TYPE.getMessage()); } } diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/PassiveSourceRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/PassiveSourceRoles.java index d07acf74..806de568 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/PassiveSourceRoles.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/PassiveSourceRoles.java @@ -6,6 +6,7 @@ import static org.radarcns.specifications.validator.ValidationSupport.removeExtension; import java.io.File; +import java.util.HashSet; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; @@ -52,15 +53,18 @@ static Set allowedProvider() { /** Messages. */ enum PassiveSourceInfo implements Message { - APP_PROVIDER("App provider cannot be null and must be equal to one of the following " - .concat(allowedProvider().stream().map( - Object::toString).collect(Collectors.joining(","))).concat(".")), - TOPICS("There is no correspondence between topics set at source level al the union of all " - + "sensors and processors topic sets."), - TYPE("Passive Source Type cannot be null and should be equal to vendor concatenated to " - + "name in uppercase."), - VENDOR_AND_NAME("Vendor and name values cannot be null. Vendor concatenated to name must " - + "be equal to the source file name."); + APP_PROVIDER("App provider must be equal to one of the following ".concat( + allowedProvider().stream().map(Object::toString).collect(Collectors.joining( + ","))).concat(".")), + SENSORS("Sensor list cannot be null or empty and cannot contain two sensors with".concat( + "the same name")), + TOPICS("Union of sensors and processors topic sets does not match topic set".concat( + "a source level.")), + TYPE("Passive Source Type should be the concatenation of vendor and name values".concat( + "in uppercase separated by underscore.")), + VENDOR_AND_NAME("Vendor and name values cannot be null. The concatenation of ".concat( + "vendor with \"_\" and name should be equal to the source file").concat( + " name in lowercase.")); private final String message; @@ -83,28 +87,37 @@ public String getMessage(String info) { */ static GenericRoles validateAppProvider() { return passive -> Objects.isNull(passive.getAppProvider()) - || allowedProvider().contains(passive.getAppProvider()) ? - valid() : invalid(PassiveSourceInfo.APP_PROVIDER.getMessage()); + || allowedProvider().contains(passive.getAppProvider()) ? + valid() : invalid(PassiveSourceInfo.APP_PROVIDER.getMessage()); } /** * TODO. + * @param file * @return TODO */ - static GenericRoles validateTopics() { + static GenericRoles validateModelAndVendor(File file) { + return passive -> Objects.nonNull(passive.getVendor()) + && Objects.nonNull(passive.getModel()) + && removeExtension(file, YAML_EXTENSION).equalsIgnoreCase( + passive.getType().name().toLowerCase()) ? valid() + : invalid(PassiveSourceInfo.VENDOR_AND_NAME.getMessage()); + } + + /** + * TODO. + * @return TODO + */ + static GenericRoles validateSensors() { return passive -> { - Set topics = passive.getTopics(); - boolean check = Objects.nonNull(topics) - && !topics.isEmpty() - && passive.getSensors().stream().allMatch( - sensor -> topics.containsAll(sensor.getTopics())); - - if (Objects.nonNull(passive.getProcessors())) { - check = check && passive.getProcessors().stream().allMatch( - processor -> topics.containsAll(processor.getTopics())); - } - - return check ? valid() : invalid(PassiveSourceInfo.TOPICS.getMessage()); + boolean check = Objects.nonNull(passive.getSensors()); + check = check && !passive.getSensors().isEmpty(); + + Set temp = new HashSet<>(); + check = check && passive.getSensors().stream().allMatch( + sensor -> !temp.add(sensor.getName().name())); + + return check ? valid() : invalid(PassiveSourceInfo.SENSORS.getMessage()); }; } @@ -114,20 +127,27 @@ static GenericRoles validateTopics() { */ static GenericRoles validateSourceType() { return passive -> Objects.nonNull(passive.getType()) ? - valid() : invalid(PassiveSourceInfo.TYPE.getMessage()); + valid() : invalid(PassiveSourceInfo.TYPE.getMessage()); } /** * TODO. - * @param file * @return TODO */ - static GenericRoles validateModelAndVendor(File file) { - return passive -> Objects.nonNull(passive.getVendor()) - && Objects.nonNull(passive.getModel()) - && removeExtension(file, YAML_EXTENSION).equalsIgnoreCase( - passive.getVendor().toLowerCase().concat( - passive.getModel().toLowerCase())) ? valid() - : invalid(PassiveSourceInfo.VENDOR_AND_NAME.getMessage()); + static GenericRoles validateTopics() { + return passive -> { + /*Set topics = passive.getTopics(); + boolean check = Objects.nonNull(topics) + && !topics.isEmpty() + && passive.getSensors().stream().allMatch(sensor -> + topics.containsAll(sensor.getTopics())); + + check = check && Objects.nonNull(passive.getProcessors()) + && passive.getProcessors().stream().allMatch(processor -> + topics.containsAll(processor.getTopics())); + + return check ? valid() : invalid(PassiveSourceInfo.TOPICS.getMessage());*/ + return false ? valid() : invalid(PassiveSourceInfo.TOPICS.getMessage()); + }; } } diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ProcessorRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ProcessorRoles.java index 320f5f1f..78f79562 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ProcessorRoles.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ProcessorRoles.java @@ -1,20 +1,14 @@ package org.radarcns.specifications.validator; -import static org.radarcns.specifications.validator.PassiveSourceRoles.allowedProvider; import static org.radarcns.specifications.validator.ValidationResult.invalid; import static org.radarcns.specifications.validator.ValidationResult.valid; +import static org.radarcns.specifications.validator.ValidationSupport.isValidTopic; +import static org.radarcns.specifications.validator.ValidationSupport.isValidTopicVerbose; import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; import org.radarcns.catalogue.DataType; import org.radarcns.catalogue.SensorName; import org.radarcns.specifications.source.passive.Processor; -import org.radarcns.specifications.source.passive.Sensor; -import org.radarcns.specifications.util.TopicUtils; -import org.radarcns.specifications.util.TopicUtils.TimeLabel; -import org.radarcns.specifications.util.Utils; -import org.radarcns.specifications.validator.PassiveSourceRoles.PassiveSourceInfo; /* * Copyright 2017 King's College London and The Hyve @@ -41,13 +35,9 @@ interface ProcessorRoles extends GenericRoles { enum ProcessorInfo implements Message { DATA_TYPE("Processor data type should be equal to ".concat( DataType.RADAR.name()).concat(".")), - NAME("Processor name must be not null and different from ".concat( + NAME("Processor name should be not null and different from ".concat( SensorName.UNKNOWN.name()).concat(".")), - OUTPUT("Processor output base topic cannot be null."), - TOPICS("Topic set is not compliant with the provided aggregator. In case of non " - + "timed aggregator, it should contain the input topic and the correspondent " - + "output topic. In case of timed aggregator, then the set should contain the " - + "input topic name and all the 7 related time frame topics."); + OUTPUT("Processor base output topic is invalid."); private final String message; @@ -70,8 +60,8 @@ public String getMessage(String info) { */ static GenericRoles validateDataType() { return processor -> Objects.nonNull(processor.getDataType()) - && processor.getDataType().name().equals(DataType.RADAR.name()) - ? valid() : invalid(ProcessorInfo.DATA_TYPE.getMessage()); + && processor.getDataType().name().equals(DataType.RADAR.name()) + ? valid() : invalid(ProcessorInfo.DATA_TYPE.getMessage()); } /** @@ -89,45 +79,9 @@ static GenericRoles validateName() { * @return TODO */ static GenericRoles validateBaseOutputTopic() { - return processor -> Objects.nonNull(processor.getBaseOutputTopic()) - ? valid() : invalid(ProcessorInfo.OUTPUT.getMessage()); - } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateTopics() { - return processor -> { - boolean check = true; - Set topics = processor.getTopics(); - if (Utils.isTimedAggregator(processor.getAggregator())) { - check = check && topics.size() == 1 + TimeLabel.values().length; - check = check && topics.contains(processor.getInputTopic()); - check = check && topics.contains(processor.getBaseOutputTopic().concat( - TimeLabel.TEN_SECOND.getLabel())); - check = check && topics.contains(processor.getBaseOutputTopic().concat( - TimeLabel.THIRTY_SECOND.getLabel())); - check = check && topics.contains(processor.getBaseOutputTopic().concat( - TimeLabel.ONE_MIN.getLabel())); - check = check && topics.contains(processor.getBaseOutputTopic().concat( - TimeLabel.TEN_MIN.getLabel())); - check = check && topics.contains(processor.getBaseOutputTopic().concat( - TimeLabel.ONE_HOUR.getLabel())); - check = check && topics.contains(processor.getBaseOutputTopic().concat( - TimeLabel.ONE_DAY.getLabel())); - check = check && topics.contains(processor.getBaseOutputTopic().concat( - TimeLabel.ONE_WEEK.getLabel())); - } else { - check = check && topics.size() == 2; - check = check && topics.contains(processor.getInputTopic()); - check = check && topics.contains(TopicUtils.getOutTopic( - processor.getBaseOutputTopic())); - } - - return check ? valid() : invalid(ProcessorInfo.TOPICS.getMessage( - topics.stream().map(Object::toString).collect(Collectors.joining(",")) - )); - }; + return processor -> /*Objects.nonNull(processor.getBaseOutputTopic()) + && isValidTopic(processor.getBaseOutputTopic())*/ + false ? valid() : invalid(ProcessorInfo.OUTPUT.getMessage( + /*isValidTopicVerbose(processor.getBaseOutputTopic())*/)); } } diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/QuestionRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/QuestionRoles.java index a2d4fc8b..f88793b2 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/QuestionRoles.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/QuestionRoles.java @@ -57,8 +57,8 @@ public String getMessage(String info) { */ static GenericRoles validateContent() { return question -> Objects.nonNull(question.getContent()) - && question.getContent().endsWith(".") - ? valid() : invalid(QuestionInfo.CONTENT.getMessage()); + && question.getContent().endsWith(".") + ? valid() : invalid(QuestionInfo.CONTENT.getMessage()); } /** @@ -67,8 +67,8 @@ static GenericRoles validateContent() { */ static GenericRoles validateLead() { return question -> Objects.nonNull(question.getLead()) - && question.getLead().endsWith("?") - ? valid() : invalid(QuestionInfo.LEAD.getMessage()); + && question.getLead().endsWith("?") + ? valid() : invalid(QuestionInfo.LEAD.getMessage()); } /** @@ -85,9 +85,9 @@ static GenericRoles validateWidget() { * TODO. * @return TODO */ - static GenericRoles validateResposnses() { + static GenericRoles validateResponses() { return question -> Objects.nonNull(question.getResponses()) - && !question.getResponses().isEmpty() - ? valid() : invalid(QuestionInfo.RESPONSES.getMessage()); + && !question.getResponses().isEmpty() + ? valid() : invalid(QuestionInfo.RESPONSES.getMessage()); } } diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/QuestionnaireRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/QuestionnaireRoles.java index 6ad44575..cf4ab6f8 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/QuestionnaireRoles.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/QuestionnaireRoles.java @@ -7,9 +7,6 @@ import java.io.File; import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; -import org.radarcns.catalogue.ActiveSourceType; import org.radarcns.specifications.source.active.questionnaire.QuestionnaireSource; /* @@ -27,17 +24,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +/** + * TODO. + */ interface QuestionnaireRoles extends GenericRoles { /** Messages. */ enum QuestionnaireInfo implements Message { - ASSESSMENT_TYPE("Assessment Type should be equal to ".concat( - ActiveSourceType.QUESTIONNAIRE.name()).concat(".")), QUESTIONS("Questions list cannot null or empty."), - QUESTIONNAIRE_TYPE("Questionnaire Type cannot be null and should match with the " - + "configuration file name."), - TOPICS("Topic set is invalid. It should contain only to the topic specified in " - + "the configuration file."); + QUESTIONNAIRE_TYPE("Questionnaire Type cannot be null and should match with the ".concat( + "configuration file name.")); private final String message; @@ -54,17 +51,6 @@ public String getMessage(String info) { } } - /** - * TODO. - * @return TODO - */ - static GenericRoles validateAssessmentType() { - return questionnaire -> Objects.nonNull(questionnaire.getAssessmentType()) - && questionnaire.getAssessmentType().name().equals( - ActiveSourceType.QUESTIONNAIRE.name()) - ? valid() : invalid(QuestionnaireInfo.ASSESSMENT_TYPE.getMessage()); - } - /** * TODO. * @param file @@ -86,19 +72,4 @@ static GenericRoles validateQuestions() { && !questionnaire.getQuestions().isEmpty() ? valid() : invalid(QuestionnaireInfo.QUESTIONS.getMessage()); } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateTopics() { - return questionnaire -> { - Set input = questionnaire.getTopics(); - return Objects.nonNull(input) && input.size() == 1 - && input.contains(questionnaire.getTopic()) ? - valid() : invalid(QuestionnaireInfo.TOPICS.getMessage( - input == null ? "" : input.stream().map(Object::toString).collect( - Collectors.joining(",")))); - }; - } } diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/SensorRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/SensorRoles.java index db31c647..b14be9c6 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/SensorRoles.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/SensorRoles.java @@ -1,21 +1,14 @@ package org.radarcns.specifications.validator; -import static org.radarcns.specifications.validator.PassiveSourceRoles.validateSourceType; +import static org.radarcns.specifications.validator.PassiveSourceRoles.allowedProvider; import static org.radarcns.specifications.validator.ValidationResult.invalid; import static org.radarcns.specifications.validator.ValidationResult.valid; -import static org.radarcns.specifications.validator.PassiveSourceRoles.allowedProvider; import java.util.Objects; -import java.util.Set; -import java.util.function.BooleanSupplier; import java.util.stream.Collectors; import org.radarcns.catalogue.DataType; import org.radarcns.catalogue.SensorName; import org.radarcns.specifications.source.passive.Sensor; -import org.radarcns.specifications.util.TopicUtils; -import org.radarcns.specifications.util.TopicUtils.TimeLabel; -import org.radarcns.specifications.util.Utils; -import org.radarcns.specifications.validator.PassiveSourceRoles.PassiveSourceInfo; /* * Copyright 2017 King's College London and The Hyve @@ -36,19 +29,17 @@ /** * TODO. */ -interface SensorRoles extends GenericRoles { +interface SensorRoles extends TopicRoles { /** Messages. */ enum SensorInfo implements Message { + APP_PROVIDER("App provider must be equal to one of the following ".concat( + allowedProvider().stream().map(Object::toString).collect(Collectors.joining( + ","))).concat(".")), DATA_TYPE("Sensor data type cannot be null and should differ from ".concat( DataType.UNKNOWN.name()).concat(".")), - NAME("Sensor name must be not null and different from ".concat( - SensorName.UNKNOWN.name()).concat(".")), - TOPICS("Topic set is not compliant with the provided aggregator. In case of null " - + "aggregator, the set should contain only the provided topic. In case of non " - + "timed aggregator, it should contain the specified topic and the correspondent " - + "output topic. In case of timed aggregator, then the set should contain the set " - + "topic name and all the 7 related time frame topics."); + NAME("Sensor name cannot be not null and should different from ".concat( + SensorName.UNKNOWN.name()).concat(".")); private final String message; @@ -72,7 +63,7 @@ public String getMessage(String info) { static GenericRoles validateAppProvider() { return passive -> Objects.isNull(passive.getAppProvider()) || allowedProvider().contains(passive.getAppProvider()) ? - valid() : invalid(PassiveSourceInfo.APP_PROVIDER.getMessage()); + valid() : invalid(SensorInfo.APP_PROVIDER.getMessage()); } /** @@ -94,44 +85,4 @@ static GenericRoles validateName() { && !sensor.getName().name().equals(SensorName.UNKNOWN.name()) ? valid() : invalid(SensorInfo.NAME.getMessage()); } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateTopics() { - return sensor -> { - boolean check = true; - Set topics = sensor.getTopics(); - if (Objects.isNull(sensor.getAggregator())) { - check = check && topics.size() == 1; - check = check && topics.contains(sensor.getTopic()); - } else if (Utils.isTimedAggregator(sensor.getAggregator())) { - check = check && topics.size() == 1 + TimeLabel.values().length; - check = check && topics.contains(sensor.getTopic()); - check = check && topics.contains(sensor.getTopic().concat( - TimeLabel.TEN_SECOND.getLabel())); - check = check && topics.contains(sensor.getTopic().concat( - TimeLabel.THIRTY_SECOND.getLabel())); - check = check && topics.contains(sensor.getTopic().concat( - TimeLabel.ONE_MIN.getLabel())); - check = check && topics.contains(sensor.getTopic().concat( - TimeLabel.TEN_MIN.getLabel())); - check = check && topics.contains(sensor.getTopic().concat( - TimeLabel.ONE_HOUR.getLabel())); - check = check && topics.contains(sensor.getTopic().concat( - TimeLabel.ONE_DAY.getLabel())); - check = check && topics.contains(sensor.getTopic().concat( - TimeLabel.ONE_WEEK.getLabel())); - } else { - check = check && topics.size() == 2; - check = check && topics.contains(sensor.getTopic()); - check = check && topics.contains(TopicUtils.getOutTopic(sensor.getTopic())); - } - - return check ? valid() : invalid(SensorInfo.TOPICS.getMessage( - topics.stream().map(Object::toString).collect(Collectors.joining(",")) - )); - }; - } } diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/TopicRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/TopicRoles.java new file mode 100644 index 00000000..1731c9a0 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/TopicRoles.java @@ -0,0 +1,137 @@ +package org.radarcns.specifications.validator; + +import static org.radarcns.specifications.validator.ValidationResult.invalid; +import static org.radarcns.specifications.validator.ValidationResult.valid; +import static org.radarcns.specifications.validator.ValidationSupport.Package; +import static org.radarcns.specifications.validator.ValidationSupport.isValidClass; +import static org.radarcns.specifications.validator.ValidationSupport.isValidTopic; +import static org.radarcns.specifications.validator.ValidationSupport.isValidTopicVerbose; +import static org.radarcns.specifications.validator.ValidationSupport.isValidTopicsVerbose; + +import java.util.Collection; +import java.util.Objects; +import java.util.function.Predicate; +import org.radarcns.specifications.source.Topic; +import org.radarcns.specifications.util.Utils; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * TODO. + */ +interface TopicRoles extends GenericRoles { + + /** Messages. */ + enum TopicInfo implements Message { + KEY("Kafka key class is invalid, cannot be null and must be a valid AVRO schema located at " + .concat(Utils.getProjectGroup()).concat(Package.KAFKA_KEY.getName()).concat(".")), + TOPIC("Topic name is invalid."), + VALUE("Kafka value class is invalid. It cannot be null and must be a valida AVRO".concat( + "schema located at")); + + private final String message; + + TopicInfo(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + + public String getMessage(String info) { + return message.concat(" ").concat(info); + } + } + + //public String getInputTopic() + //public boolean isAggregatable() + //public String getAggregator() + //public Set getOutput() + //public Set getTopicNames() + + /** + * TODO. + * @return TODO + */ + static TopicRoles validateKey() { + return topic -> Objects.nonNull(topic.getInputKey()) + && topic.getInputKey().startsWith(Utils.getProjectGroup().concat( + Package.KAFKA_KEY.getName())) + && isValidClass(topic.getInputKey()) ? + valid() : invalid(TopicInfo.KEY.getMessage()); + } + + /** + * TODO. + * @param packageName + * @return TODO + */ + static TopicRoles validateValue(Package packageName) { + return topic -> Objects.nonNull(packageName) && Objects.nonNull(topic.getInputValue()) + && topic.getInputValue().startsWith(Utils.getProjectGroup().concat( + packageName.getName())) + && isValidClass(topic.getInputValue()) ? + valid() : invalid(TopicInfo.VALUE.getMessage()); + } + + /** + * TODO. + * @param topic TODO + * @return TODO + */ + static TopicRoles validateTopic(String topic) { + return object -> Objects.nonNull(topic) && isValidTopic(topic) ? valid() + : invalid(TopicInfo.TOPIC.getMessage(isValidTopicVerbose(topic))); + } + + /** + * TODO. + * @param topics TODO + * @return TODO + */ + static TopicRoles validateTopicNames(Collection topics) { + return object -> Objects.nonNull(topics) + && !topics.isEmpty() + && topics.stream().allMatch(topic -> isValidTopic(topic)) + ? valid() : invalid(TopicInfo.TOPIC.getMessage(isValidTopicsVerbose(topics))); + } + + /** + * + * TODO. + * @param predicate TODO + * @param message TODO + * @return TODO + */ + static TopicRoles validate(Predicate predicate, Message message) { + return object -> predicate.test(object) ? valid() + : invalid(message.getMessage()); + } + + /** + * TODO. + * @param other TODO + * @return TODO + */ + default TopicRoles and(TopicRoles other) { + return object -> { + final ValidationResult result = this.apply(object); + return result.isValid() ? other.apply(object) : result; + }; + } +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ValidationSupport.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ValidationSupport.java index 577dade2..7252a18d 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ValidationSupport.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ValidationSupport.java @@ -28,6 +28,27 @@ */ public final class ValidationSupport { + /** Package names. */ + public enum Package { + AGGREGATOR(".kafka.aggregator"), + BIOVOTION(".passive.biovotion"), + EMPATICA(".passive.empatica"), + KAFKA_KEY(".kafka.key"), + MONITOR(".monitor"), + PEBBLE(".passive.pebble"), + QUESTIONNAIRE(".active.questionnaire"); + + private final String name; + + Package(String name) { + this.name = name; + } + + public String getName() { + return name; + } + } + static final ValidationResult VALID = new ValidationResult() { public boolean isValid() { return true; diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Validator.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Validator.java index bea43fd2..6f19bc73 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Validator.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Validator.java @@ -16,37 +16,6 @@ * limitations under the License. */ -import static org.radarcns.specifications.validator.MonitorRoles.validateAggregator; -import static org.radarcns.specifications.validator.MonitorRoles.validateDataType; -import static org.radarcns.specifications.validator.PassiveSourceRoles.validateModelAndVendor; -import static org.radarcns.specifications.validator.ProcessorRoles.validateBaseOutputTopic; -import static org.radarcns.specifications.validator.QuestionRoles.validateContent; -import static org.radarcns.specifications.validator.QuestionRoles.validateLead; -import static org.radarcns.specifications.validator.QuestionRoles.validateResposnses; -import static org.radarcns.specifications.validator.QuestionRoles.validateWidget; -import static org.radarcns.specifications.validator.QuestionnaireRoles.validateQuestionnaireType; -import static org.radarcns.specifications.validator.QuestionnaireRoles.validateQuestions; -import static org.radarcns.specifications.validator.ResponseRoles.validateScore; -import static org.radarcns.specifications.validator.ResponseRoles.validateText; -import static org.radarcns.specifications.validator.GenericRoles.validateDoc; -import static org.radarcns.specifications.validator.GenericRoles.validateKey; -import static org.radarcns.specifications.validator.GenericRoles.validateSampleRate; -import static org.radarcns.specifications.validator.GenericRoles.validateTopic; -import static org.radarcns.specifications.validator.GenericRoles.validateUnit; -import static org.radarcns.specifications.validator.GenericRoles.validateValue; - -import java.io.File; -import org.radarcns.specifications.source.active.questionnaire.Question; -import org.radarcns.specifications.source.active.questionnaire.QuestionnaireSource; -import org.radarcns.specifications.source.active.questionnaire.Response; -import org.radarcns.specifications.source.passive.MonitorSource; -import org.radarcns.specifications.source.passive.PassiveSource; -import org.radarcns.specifications.source.passive.Processor; -import org.radarcns.specifications.source.passive.Sensor; -import org.radarcns.specifications.validator.GenericRoles.Package; - -//TODO validate enum to be different from UNKNOWN - /** * TODO */ @@ -62,35 +31,35 @@ private Validator() { * @param file TODO * @return TODO */ - public static ValidationResult validateMonitor(MonitorSource source, File file) { + /* public static ValidationResult validateMonitor(MonitorSource source, File file) { return (ValidationResult) MonitorRoles.validateAppProvider() - .and(validateAggregator()) - .and(validateDataType()) - .and(validateDoc(source.getDoc(), false)) - .and(validateKey(source.getKey())) + .and(MonitorRoles.validateAggregator()) + .and(MonitorRoles.validateDataType()) + .and(GenericRoles.validateDoc(source.getDoc(), false)) + //.and(GenericRoles.validateKey(source.getKey())) .and(GenericRoles.validateName(source.getName())) - .and(validateSampleRate(source.getSampleRate())) + .and(GenericRoles.validateSampleRate(source.getSampleRate())) .and(MonitorRoles.validateSourceType(file)) - .and(validateTopic(source.getTopic())) - .and(MonitorRoles.validateTopics()) - .and(GenericRoles.validateTopics(source.getTopics())) - .and(validateValue(Package.MONITOR, source.getValue())) - .and(validateUnit(source.getUnit())) + //.and(GenericRoles.validateTopic(source.getTopic())) + .and(AggregatableRoles.validateTopics()) + .and(GenericRoles.validateTopicNames(source.getTopics())) + //.and(GenericRoles.validateValue(Package.MONITOR, source.getValue())) + .and(GenericRoles.validateUnit(source.getUnit())) .apply(source); - } + }*/ /** * TODO. * @param question TODO * @return TODO */ - public static ValidationResult validateQuestion(Question question) { - return (ValidationResult) validateContent() - .and(validateLead()) - .and(validateWidget()) - .and(validateResposnses()) + /*public static ValidationResult validateQuestion(Question question) { + return (ValidationResult) QuestionRoles.validateContent() + .and(QuestionRoles.validateLead()) + .and(QuestionRoles.validateWidget()) + .and(QuestionRoles.validateResponses()) .apply(question); - } + }*/ /** * TODO. @@ -98,19 +67,19 @@ public static ValidationResult validateQuestion(Question question) { * @param file TODO * @return TODO */ - public static ValidationResult validateQuestionnaire(QuestionnaireSource source, File file) { - return (ValidationResult) QuestionnaireRoles.validateAssessmentType() - .and(validateDoc(source.getDoc(), false)) - .and(validateKey(source.getKey())) + /*public static ValidationResult validateQuestionnaire(QuestionnaireSource source, File file) { + return (ValidationResult) ActiveSourceRoles.validateAssessmentType() + .and(GenericRoles.validateDoc(source.getDoc(), false)) + .and(GenericRoles.validateKey(source.getKey())) .and(GenericRoles.validateName(source.getName())) - .and(validateQuestions()) - .and(validateQuestionnaireType(file)) - .and(validateTopic(source.getTopic())) - .and(QuestionnaireRoles.validateTopics()) - .and(GenericRoles.validateTopics(source.getTopics())) - .and(validateValue(Package.QUESTIONNAIRE, source.getValue())) + .and(QuestionnaireRoles.validateQuestions()) + .and(QuestionnaireRoles.validateQuestionnaireType(file)) + .and(GenericRoles.validateTopic(source.getTopic())) + .and(ActiveSourceRoles.validateTopics()) + .and(GenericRoles.validateTopicNames(source.getTopics())) + .and(GenericRoles.validateValue(Package.QUESTIONNAIRE, source.getValue())) .apply(source); - } + }*/ /** * TODO. @@ -118,27 +87,28 @@ public static ValidationResult validateQuestionnaire(QuestionnaireSource source, * @param file TODO * @return TODO */ - public static ValidationResult validatePassive(PassiveSource source, File file) { + /*public static ValidationResult validatePassive(PassiveSource source, File file) { return (ValidationResult) PassiveSourceRoles.validateAppProvider() - .and(validateDoc(source.getDoc(), true)) - .and(validateModelAndVendor(file)) - .and(GenericRoles.validateName(source.getName())) - .and(PassiveSourceRoles.validateSourceType()) - .and(PassiveSourceRoles.validateTopics()) - .and(GenericRoles.validateTopics(source.getTopics())) - .apply(source); - } + .and(GenericRoles.validateDoc(source.getDoc(), true)) + .and(PassiveSourceRoles.validateModelAndVendor(file)) + .and(GenericRoles.validateName(source.getName())) + .and(PassiveSourceRoles.validateSensors()) + .and(PassiveSourceRoles.validateSourceType()) + .and(PassiveSourceRoles.validateTopics()) + .and(GenericRoles.validateTopicNames(source.getTopics())) + .apply(source); + }*/ /** * TODO. * @param response TODO * @return TODO */ - public static ValidationResult validateResponse(Response response) { - return (ValidationResult) validateScore() - .and(validateText()) - .apply(response); - } + /*public static ValidationResult validateResponse(Response response) { + return (ValidationResult) ResponseRoles.validateScore() + .and(ResponseRoles.validateText()) + .apply(response); + }*/ /** * TODO. @@ -146,22 +116,22 @@ public static ValidationResult validateResponse(Response response) { * @param packageName TODO * @return TODO */ - public static ValidationResult validateSensor(Package packageName, Sensor sensor) { - return (ValidationResult) - validateAggregator(sensor.getAggregator(), true) - .and(SensorRoles.validateAppProvider()) - .and(SensorRoles.validateDataType()) - .and(validateDoc(sensor.getDoc(), true)) - .and(validateKey(sensor.getKey())) - .and(SensorRoles.validateName()) - .and(validateSampleRate(sensor.getSampleRate())) - .and(validateTopic(sensor.getTopic())) - .and(SensorRoles.validateTopics()) - .and(GenericRoles.validateTopics(sensor.getTopics())) - .and(validateUnit(sensor.getUnit())) - .and(validateValue(packageName, sensor.getValue())) - .apply(sensor); - } + /*public static ValidationResult validateSensor(Package packageName, Sensor sensor) { + return (ValidationResult) SensorRoles.validateAppProvider() + .and(SensorRoles.validateDataType()) + .and(GenericRoles.validateDoc(sensor.getDoc(), true)) + //.and(GenericRoles.validateKey(sensor.getKey())) + .and(SensorRoles.validateName()) + .and(GenericRoles.validateSampleRate(sensor.getSampleRate())) + .and(GenericRoles.validateTopic(sensor.getInputTopic())) + //.and(GenericRoles.validateTopic(sensor.getTopic())) + .and(AggregatableRoles.validateTopics()) + .and(AggregatableRoles.validateAggregator(false)) + .and(GenericRoles.validateTopicNames(sensor.getTopics())) + .and(GenericRoles.validateUnit(sensor.getUnit())) + //.and(GenericRoles.validateValue(packageName, sensor.getValue())) + .apply(sensor); + }*/ /** * TODO. @@ -169,20 +139,19 @@ public static ValidationResult validateSensor(Package packageName, Sensor sensor * @param packageName TODO * @return TODO */ - public static ValidationResult validateProcessor(Package packageName, Processor processor) { - return (ValidationResult) - validateAggregator(processor.getAggregator(), false) - .and(validateBaseOutputTopic()) + /*public static ValidationResult validateProcessor(Package packageName, Processor processor) { + return (ValidationResult) ProcessorRoles.validateBaseOutputTopic() .and(ProcessorRoles.validateDataType()) - .and(validateDoc(processor.getDoc(), true)) - .and(validateKey(processor.getInputKey())) + .and(GenericRoles.validateDoc(processor.getDoc(), true)) + //.and(GenericRoles.validateKey(processor.getInputKey())) .and(ProcessorRoles.validateName()) - .and(validateSampleRate(processor.getSampleRate())) - .and(validateTopic(processor.getInputTopic())) - .and(ProcessorRoles.validateTopics()) - .and(GenericRoles.validateTopics(processor.getTopics())) - .and(validateUnit(processor.getUnit())) - .and(validateValue(packageName, processor.getInputValue())) + .and(GenericRoles.validateSampleRate(processor.getSampleRate())) + .and(GenericRoles.validateTopic(processor.getInputTopic())) + .and(AggregatableRoles.validateTopics()) + .and(AggregatableRoles.validateAggregator(false)) + .and(GenericRoles.validateTopicNames(processor.getTopics())) + .and(GenericRoles.validateUnit(processor.getUnit())) + //.and(GenericRoles.validateValue(packageName, processor.getInputValue())) .apply(processor); - } + }*/ } diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/Utility.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/Utility.java new file mode 100644 index 00000000..94b0b6c8 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/Utility.java @@ -0,0 +1,274 @@ +package org.radarcns.specifications.value; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; +import org.radarcns.catalogue.DataType; +import org.radarcns.catalogue.SensorName; +import org.radarcns.catalogue.TimeFrame; +import org.radarcns.catalogue.Unit; +import org.radarcns.specifications.source.Topic; +import org.radarcns.specifications.source.Topic.TimeLabel; +import org.radarcns.specifications.source.Topic.TopicMetadata; +import org.radarcns.specifications.source.passive.PassiveSource; +import org.radarcns.specifications.source.passive.Processor; +import org.radarcns.specifications.source.passive.Sensor; + +/** + * TODO. + */ +public class Utility { + + /*topic.getTopicNames();; + topic.getOutputTopics();*/ + + private static boolean testGenericTopic(String inputTopic, String key, String value, + String aggregator, Topic topic) { + if (Objects.isNull(aggregator)) { + assertFalse(topic.isAggregatable()); + assertNull(topic.getAggregator()); + } else { + assertTrue(topic.isAggregatable()); + assertEquals(aggregator, topic.getAggregator()); + } + + assertEquals(key, topic.getInputKey()); + assertEquals(inputTopic, topic.getInputTopic()); + assertEquals(value, topic.getInputValue()); + + return true; + } + + /** + * TODO. + * @param inputTopic TODO + * @param key TODO + * @param value TODO + * @param topic TODO + */ + public static void testTopicNonAggregatable(String inputTopic, String key, String value, + Topic topic) { + assertTrue(testGenericTopic(inputTopic, key, value, null, topic)); + + assertTrue(topic.getOutputTopics().isEmpty()); + assertEquals(1, topic.getTopicNames().size(), 0); + + assertTrue("Topics is invalid. ".concat( + topic.getTopicNames().stream().collect(Collectors.joining(","))), + topic.getTopicNames().contains(inputTopic)); + } + + /** + * TODO. + * @param aggregator TODO + * @param inputTopic TODO + * @param key TODO + * @param value TODO + * @param topic TODO + * @param baseOutput TODO + */ + public static void testTopicNonTimedAggregator(String aggregator, String inputTopic, + String key, String value, Topic topic, String baseOutput) { + assertTrue(testGenericTopic(inputTopic, key, value, aggregator, topic)); + + assertFalse(topic.getTopicNames().isEmpty()); + assertEquals(2, topic.getTopicNames().size(), 0); + + assertTrue(topic.getTopicNames().contains(inputTopic)); + assertTrue(topic.getTopicNames().contains(baseOutput.concat("_output"))); + + assertFalse(topic.getOutputTopics().isEmpty()); + assertEquals(1, topic.getOutputTopics().size(), 0); + + TopicMetadata metadata = (TopicMetadata) topic.getOutputTopics().toArray()[0]; + assertEquals(-1, metadata.getIntervalInMilliSec(), 0); + assertEquals(inputTopic, metadata.getInput()); + assertEquals(baseOutput.concat("_output"), metadata.getOutput()); + assertEquals("From-" + inputTopic + "-To-" + baseOutput, metadata.getStateStore()); + assertNull(metadata.getTimeFrame().name()); + } + + /** + * TODO. + * @param aggregator TODO + * @param inputTopic TODO + * @param key TODO + * @param value TODO + * @param topic TODO + * @param baseOutput TODO + */ + public static void testTopicTimedAggregator(String aggregator, String inputTopic, String key, + String value, Topic topic, String baseOutput) { + assertTrue(testGenericTopic(inputTopic, key, value, aggregator, topic)); + + Set topicNames = topic.getTopicNames(); + assertFalse(topicNames.isEmpty()); + assertEquals(15, topicNames.size(), 0); + assertTrue(topicNames.contains(inputTopic)); + + assertFalse(topic.getOutputTopics().isEmpty()); + assertEquals(TimeFrame.values().length - 1, + topic.getOutputTopics().size(), 0); + + + for (TimeLabel label : TimeLabel.values()) { + if (label.getIntervalInMilliSec() != -1) { + testTopicMetadata(topic, inputTopic, baseOutput, label); + } + } + } + + private static void testTopicMetadata(Topic topic, String inputTopic, String baseOutput, + TimeLabel label) { + String output = baseOutput.concat(label.getLabel()); + String stateStore = "From-".concat(inputTopic).concat("-To-").concat(output); + + + + assertTrue(topic.getTopicNames().contains(stateStore)); + assertTrue(topic.getTopicNames().contains(output)); + boolean canary = false; + for (TopicMetadata metadata : topic.getOutputTopics()) { + if (metadata.getTimeFrame().name().equals(label.getTimeFrame().name())) { + assertEquals(label.getIntervalInMilliSec(), metadata.getIntervalInMilliSec(), + 0); + assertEquals(inputTopic, metadata.getInput()); + assertEquals(output, metadata.getOutput()); + assertEquals(stateStore, metadata.getStateStore()); + canary = true; + } + } + assertTrue(canary); + } + + /** + * TODO. + * @param source TODO + * @return TODO + */ + public static boolean testSourceTopics(PassiveSource source) { + Set expectedTopics = new HashSet<>(); + for (Sensor sensor : source.getSensors()) { + expectedTopics.addAll(sensor.getTopic().getTopicNames()); + } + for (Processor processor : source.getProcessors()) { + expectedTopics.addAll(processor.getTopic().getTopicNames()); + } + + expectedTopics.removeAll(source.getTopics()); + + return expectedTopics.isEmpty(); + } + + private static boolean testBasicSensor(Sensor sensor, String appProvider, + String inputTopic, SensorName sensorName, DataType dataType, Unit unit, + double sampleRate) { + assertEquals(appProvider, sensor.getAppProvider()); + assertEquals(dataType.name(), sensor.getDataType().name()); + //sensor.getDoc() + assertEquals(sensorName.name(), sensor.getName().name()); + assertEquals(sampleRate, sensor.getSampleRate(), 0); + assertEquals(unit.name(), sensor.getUnit().name()); + + return true; + } + + /** + * TODO. + * @param sensor TODO + * @param appProvider TODO + * @param inputTopic TODO + * @param key TODO + * @param value TODO + * @param sensorName TODO + * @param dataType TODO + * @param unit TODO + * @param sampleRate TODO + * @return TODO + */ + public static boolean testSensorNonAggregatable(Sensor sensor, String appProvider, + String inputTopic, String key, String value, SensorName sensorName, DataType dataType, + Unit unit, double sampleRate) { + assertNull(sensor.getTopic().getAggregator()); + testTopicNonAggregatable(inputTopic, key, value, sensor.getTopic()); + + return testBasicSensor(sensor, appProvider, inputTopic, sensorName, dataType, unit, + sampleRate); + } + + /** + * TODO. + * @param sensor TODO + * @param aggregator TODO + * @param appProvider TODO + * @param inputTopic TODO + * @param key TODO + * @param value TODO + * @param sensorName TODO + * @param dataType TODO + * @param unit TODO + * @param sampleRate TODO + * @param baseOutput TODO + * @return TODO + */ + public static boolean testSensorNonTimed(Sensor sensor, String aggregator, String appProvider, + String inputTopic, String key, String value, SensorName sensorName, DataType dataType, + Unit unit, double sampleRate, String baseOutput) { + assertEquals(aggregator, sensor.getTopic().getAggregator()); + testTopicNonTimedAggregator(aggregator, inputTopic, key, value, sensor.getTopic(), + baseOutput); + + return testBasicSensor(sensor, appProvider, inputTopic, sensorName, dataType, unit, + sampleRate); + } + + /** + * TODO. + * @param sensor TODO + * @param aggregator TODO + * @param appProvider TODO + * @param inputTopic TODO + * @param key TODO + * @param value TODO + * @param sensorName TODO + * @param dataType TODO + * @param unit TODO + * @param sampleRate TODO + * @param baseOutput TODO + * @return TODO + */ + public static boolean testSensorTimed(Sensor sensor, String aggregator, String appProvider, + String inputTopic, String key, String value, SensorName sensorName, DataType dataType, + Unit unit, double sampleRate, String baseOutput) { + assertEquals(aggregator, sensor.getTopic().getAggregator()); + testTopicTimedAggregator(aggregator, inputTopic, key, value, sensor.getTopic(), + baseOutput); + + return testBasicSensor(sensor, appProvider, inputTopic, sensorName, dataType, unit, + sampleRate); + } + + +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/active/Phq8Test.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/active/Phq8Test.java new file mode 100644 index 00000000..e8801506 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/active/Phq8Test.java @@ -0,0 +1,143 @@ +package org.radarcns.specifications.value.active; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; +import static org.radarcns.specifications.value.Utility.testTopicNonAggregatable; + +import org.junit.BeforeClass; +import org.junit.Test; +import org.radarcns.active.questionnaire.QuestionnaireType; +import org.radarcns.catalogue.ActiveSourceType; +import org.radarcns.catalogue.RadarWidget; +import org.radarcns.specifications.SourceCatalogue; +import org.radarcns.specifications.source.active.questionnaire.QuestionnaireSource; +import org.radarcns.specifications.source.active.questionnaire.Response; + +/** + * TODO. + */ +public class Phq8Test { + + private static QuestionnaireSource phq8; + + @BeforeClass + public static void initSource() { + phq8 = SourceCatalogue.getActiveSource(QuestionnaireType.PHQ8); + } + + @Test + public void validateHeader() { + assertEquals(ActiveSourceType.QUESTIONNAIRE.name(), phq8.getAssessmentType().name()); + assertNotNull(phq8.getDoc()); + assertEquals(QuestionnaireType.PHQ8.name(), phq8.getName()); + assertEquals(QuestionnaireType.PHQ8.name(), phq8.getQuestionnaireType().name()); + + testTopicNonAggregatable("questionnaire_phq8", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.active.questionnaire.Questionnaire", + phq8.getTopic()); + + + } + + @Test + public void validateQuestions() { + assertNotNull(phq8.getQuestions()); + assertFalse(phq8.getQuestions().isEmpty()); + assertEquals(8, phq8.getQuestions().size(), 0); + + assertEquals("Little interest or pleasure in doing things.", + phq8.getQuestions().get(0).getContent()); + assertEquals("Over the past two weeks, how often have you been bothered by any " + + "of the following problems?", phq8.getQuestions().get(0).getLead()); + phq8.getQuestions().get(0).getResponses().forEach(response -> validateResponse(response)); + assertEquals(RadarWidget.RADIO.name(), phq8.getQuestions().get(0).getWidget().name()); + + assertEquals("Feeling down, depressed, or hopeless.", + phq8.getQuestions().get(1).getContent()); + assertEquals("Over the past two weeks, how often have you been bothered by any " + + "of the following problems?", phq8.getQuestions().get(1).getLead()); + phq8.getQuestions().get(1).getResponses().forEach(response -> validateResponse(response)); + assertEquals(RadarWidget.RADIO.name(), phq8.getQuestions().get(1).getWidget().name()); + + assertEquals("Trouble falling or staying asleep, or sleeping too much.", + phq8.getQuestions().get(2).getContent()); + assertEquals("Over the past two weeks, how often have you been bothered by any of" + + " the following problems?", phq8.getQuestions().get(2).getLead()); + phq8.getQuestions().get(2).getResponses().forEach(response -> validateResponse(response)); + assertEquals(RadarWidget.RADIO.name(), phq8.getQuestions().get(2).getWidget().name()); + + assertEquals("Feeling tired or having little energy.", + phq8.getQuestions().get(3).getContent()); + assertEquals("Over the past two weeks, how often have you been bothered by any " + + "of the following problems?", phq8.getQuestions().get(3).getLead()); + phq8.getQuestions().get(3).getResponses().forEach(response -> validateResponse(response)); + assertEquals(RadarWidget.RADIO.name(), phq8.getQuestions().get(3).getWidget().name()); + + assertEquals("Poor appetite or overeating.", + phq8.getQuestions().get(4).getContent()); + assertEquals("Over the past two weeks, how often have you been bothered by any " + + "of the following problems?", phq8.getQuestions().get(4).getLead()); + phq8.getQuestions().get(4).getResponses().forEach(response -> validateResponse(response)); + assertEquals(RadarWidget.RADIO.name(), phq8.getQuestions().get(4).getWidget().name()); + + assertEquals("Feeling bad about yourself, or that you are a failure, or have " + + "let yourself or your family down.", phq8.getQuestions().get(5).getContent()); + assertEquals("Over the past two weeks, how often have you been bothered by any " + + "of the following problems?", phq8.getQuestions().get(5).getLead()); + phq8.getQuestions().get(5).getResponses().forEach(response -> validateResponse(response)); + assertEquals(RadarWidget.RADIO.name(), phq8.getQuestions().get(5).getWidget().name()); + + assertEquals("Trouble concentrating on things, such as reading the newspaper" + + " or watching television.", + phq8.getQuestions().get(6).getContent()); + assertEquals("Over the past two weeks, how often have you been bothered by any " + + "of the following problems?", phq8.getQuestions().get(6).getLead()); + phq8.getQuestions().get(6).getResponses().forEach(response -> validateResponse(response)); + assertEquals(RadarWidget.RADIO.name(), phq8.getQuestions().get(6).getWidget().name()); + + assertEquals("Moving or speaking so slowly that other people could have " + + "noticed. Or the opposite – being so fidgety or restless that you have been " + + "moving around a lot more than usual.", phq8.getQuestions().get(7).getContent()); + assertEquals("Over the past two weeks, how often have you been bothered by any " + + "of the following problems?", phq8.getQuestions().get(7).getLead()); + phq8.getQuestions().get(7).getResponses().forEach(response -> validateResponse(response)); + assertEquals(RadarWidget.RADIO.name(), phq8.getQuestions().get(7).getWidget().name()); + } + + private void validateResponse(Response response) { + switch (response.getScore()) { + case 0: + assertEquals("Not at all", response.getText()); + break; + case 1: + assertEquals("Several days", response.getText()); + break; + case 2: + assertEquals("More than half the days", response.getText()); + break; + case 3: + assertEquals("Nearly every day", response.getText()); + break; + default: fail(response.getScore() + " is invalid."); + } + } +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/ExternalTimeTest.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/ExternalTimeTest.java new file mode 100644 index 00000000..b6a91dd9 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/ExternalTimeTest.java @@ -0,0 +1,60 @@ +package org.radarcns.specifications.value.monitor; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; +import static org.radarcns.specifications.value.Utility.testTopicNonAggregatable; + +import org.junit.BeforeClass; +import org.junit.Test; +import org.radarcns.catalogue.DataType; +import org.radarcns.catalogue.MonitorSourceType; +import org.radarcns.catalogue.Unit; +import org.radarcns.specifications.SourceCatalogue; +import org.radarcns.specifications.source.KafkaActor; +import org.radarcns.specifications.source.passive.MonitorSource; + +/** + * TODO. + */ +public class ExternalTimeTest { + + private static MonitorSource externalTime; + + @BeforeClass + public static void initSource() { + externalTime = SourceCatalogue.getMonitorSource(MonitorSourceType.EXTERNAL_TIME); + } + + @Test + public void validate() { + assertEquals("org.radarcns.application.ApplicationServiceProvider", + externalTime.getAppProvider()); + + KafkaActor actor = externalTime.getKafkaActor(); + + assertEquals(DataType.RAW.name(), actor.getDataType().name()); + assertEquals(0.08, actor.getSampleRate(), 0.0); + assertEquals(MonitorSourceType.EXTERNAL_TIME.name(), externalTime.getType().name()); + assertEquals(Unit.NON_DIMENSIONAL, actor.getUnit()); + + testTopicNonAggregatable("application_external_time", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.monitor.application.ApplicationExternalTime", + actor.getTopic()); + } +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/RecordCountsTest.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/RecordCountsTest.java new file mode 100644 index 00000000..8ec874e7 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/RecordCountsTest.java @@ -0,0 +1,60 @@ +package org.radarcns.specifications.value.monitor; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; +import static org.radarcns.specifications.value.Utility.testTopicNonAggregatable; + +import org.junit.BeforeClass; +import org.junit.Test; +import org.radarcns.catalogue.DataType; +import org.radarcns.catalogue.MonitorSourceType; +import org.radarcns.catalogue.Unit; +import org.radarcns.specifications.SourceCatalogue; +import org.radarcns.specifications.source.KafkaActor; +import org.radarcns.specifications.source.passive.MonitorSource; + +/** + * TODO. + */ +public class RecordCountsTest { + + private static MonitorSource recordCounts; + + @BeforeClass + public static void initSource() { + recordCounts = SourceCatalogue.getMonitorSource(MonitorSourceType.RECORD_COUNTS); + } + + @Test + public void validate() { + assertEquals("org.radarcns.application.ApplicationServiceProvider", + recordCounts.getAppProvider()); + + KafkaActor actor = recordCounts.getKafkaActor(); + + assertEquals(DataType.RAW.name(), actor.getDataType().name()); + assertEquals(0.08, actor.getSampleRate(), 0.0); + assertEquals(MonitorSourceType.RECORD_COUNTS.name(), recordCounts.getType().name()); + assertEquals(Unit.NON_DIMENSIONAL, actor.getUnit()); + + testTopicNonAggregatable("application_record_counts", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.monitor.application.ApplicationRecordCounts", + actor.getTopic()); + } +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/ServerStatusTest.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/ServerStatusTest.java new file mode 100644 index 00000000..226ff2ec --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/ServerStatusTest.java @@ -0,0 +1,60 @@ +package org.radarcns.specifications.value.monitor; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; +import static org.radarcns.specifications.value.Utility.testTopicNonAggregatable; + +import org.junit.BeforeClass; +import org.junit.Test; +import org.radarcns.catalogue.DataType; +import org.radarcns.catalogue.MonitorSourceType; +import org.radarcns.catalogue.Unit; +import org.radarcns.specifications.SourceCatalogue; +import org.radarcns.specifications.source.KafkaActor; +import org.radarcns.specifications.source.passive.MonitorSource; + +/** + * TODO. + */ +public class ServerStatusTest { + + private static MonitorSource serverStatus; + + @BeforeClass + public static void initSource() { + serverStatus = SourceCatalogue.getMonitorSource(MonitorSourceType.SERVER_STATUS); + } + + @Test + public void validate() { + assertEquals("org.radarcns.application.ApplicationServiceProvider", + serverStatus.getAppProvider()); + + KafkaActor actor = serverStatus.getKafkaActor(); + + assertEquals(DataType.RAW.name(), actor.getDataType().name()); + assertEquals(0.08, actor.getSampleRate(), 0.0); + assertEquals(MonitorSourceType.SERVER_STATUS.name(), serverStatus.getType().name()); + assertEquals(Unit.NON_DIMENSIONAL, actor.getUnit()); + + testTopicNonAggregatable("application_server_status", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.monitor.application.ApplicationServerStatus", + actor.getTopic()); + } +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/UptimeTest.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/UptimeTest.java new file mode 100644 index 00000000..4320958a --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/UptimeTest.java @@ -0,0 +1,60 @@ +package org.radarcns.specifications.value.monitor; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; +import static org.radarcns.specifications.value.Utility.testTopicNonAggregatable; + +import org.junit.BeforeClass; +import org.junit.Test; +import org.radarcns.catalogue.DataType; +import org.radarcns.catalogue.MonitorSourceType; +import org.radarcns.catalogue.Unit; +import org.radarcns.specifications.SourceCatalogue; +import org.radarcns.specifications.source.KafkaActor; +import org.radarcns.specifications.source.passive.MonitorSource; + +/** + * TODO. + */ +public class UptimeTest { + + private static MonitorSource uptime; + + @BeforeClass + public static void initSource() { + uptime = SourceCatalogue.getMonitorSource(MonitorSourceType.UPTIME); + } + + @Test + public void validate() { + assertEquals("org.radarcns.application.ApplicationServiceProvider", + uptime.getAppProvider()); + + KafkaActor actor = uptime.getKafkaActor(); + + assertEquals(DataType.RAW.name(), actor.getDataType().name()); + assertEquals(0.08, actor.getSampleRate(), 0.0); + assertEquals(MonitorSourceType.UPTIME.name(), uptime.getType().name()); + assertEquals(Unit.NON_DIMENSIONAL, actor.getUnit()); + + testTopicNonAggregatable("application_uptime", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.monitor.application.ApplicationUptime", + actor.getTopic()); + } +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/AndroidPhoneTest.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/AndroidPhoneTest.java new file mode 100644 index 00000000..78a3d178 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/AndroidPhoneTest.java @@ -0,0 +1,224 @@ +package org.radarcns.specifications.value.passive; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.radarcns.catalogue.SensorName.ACCELEROMETER; +import static org.radarcns.catalogue.SensorName.BATTERY; +import static org.radarcns.catalogue.SensorName.GYROSCOPE; +import static org.radarcns.catalogue.SensorName.LIGHT; +import static org.radarcns.catalogue.SensorName.MAGNETIC_FIELD; +import static org.radarcns.catalogue.SensorName.PHONE_CALL; +import static org.radarcns.catalogue.SensorName.PHONE_SMS; +import static org.radarcns.catalogue.SensorName.PHONE_SMS_UNREAD; +import static org.radarcns.catalogue.SensorName.RELATIVE_LOCATION; +import static org.radarcns.catalogue.SensorName.STEP_COUNT; +import static org.radarcns.catalogue.SensorName.USAGE_EVENT; +import static org.radarcns.catalogue.SensorName.USER_INTERACTION; +import static org.radarcns.specifications.value.Utility.testSensorNonAggregatable; +import static org.radarcns.specifications.value.Utility.testSensorTimed; +import static org.radarcns.specifications.value.Utility.testSourceTopics; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.radarcns.catalogue.DataType; +import org.radarcns.catalogue.PassiveSourceType; +import org.radarcns.catalogue.Unit; +import org.radarcns.specifications.SourceCatalogue; +import org.radarcns.specifications.source.passive.PassiveSource; + +/** + * TODO. + */ +public class AndroidPhoneTest { + + private static PassiveSource androidPhone; + private static int countSensors; + + @BeforeClass + public static void initSource() { + androidPhone = SourceCatalogue.getPassiveSource(PassiveSourceType.ANDROID_PHONE); + countSensors = 0; + } + + @Test + public void validateHeader() { + assertEquals("ANDROID", androidPhone.getVendor()); + assertEquals("PHONE", androidPhone.getModel()); + assertEquals(PassiveSourceType.ANDROID_PHONE.name(), androidPhone.getType().name()); + assertEquals(PassiveSourceType.ANDROID_PHONE.name(), androidPhone.getName()); + + assertNull(androidPhone.getAppProvider()); + } + + @Test + public void validatePhoneSensors() { + String expectedAppProvider = "org.radarcns.phone.PhoneSensorProvider"; + + countSensors++; + assertTrue(testSensorTimed(androidPhone.getSensor(ACCELEROMETER), + "org.radarcns.kafka.aggregator.AggregatorDoubleArray", + expectedAppProvider, + "android_phone_acceleration", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.phone.PhoneAcceleration", + ACCELEROMETER, DataType.RAW, Unit.G, -1d, + "android_phone_acceleration" + )); + + countSensors++; + assertTrue(testSensorTimed(androidPhone.getSensor(BATTERY), + "org.radarcns.kafka.aggregator.AggregatorDouble", + expectedAppProvider, + "android_phone_battery_level", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.phone.PhoneBatteryLevel", + BATTERY, DataType.RAW, Unit.PERCENTAGE, -1d, + "android_phone_battery_level" + )); + + countSensors++; + assertTrue(testSensorTimed(androidPhone.getSensor(GYROSCOPE), + "org.radarcns.kafka.aggregator.AggregatorDoubleArray", + expectedAppProvider, + "android_phone_gyroscope", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.phone.PhoneGyroscope", + GYROSCOPE, DataType.RAW, Unit.RADAIAN_PER_SEC, -1d, + "android_phone_gyroscope" + )); + + countSensors++; + assertTrue(testSensorTimed(androidPhone.getSensor(LIGHT), + "org.radarcns.kafka.aggregator.AggregatorDouble", + expectedAppProvider, + "android_phone_light", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.phone.PhoneLight", + LIGHT, DataType.RAW, Unit.LUX, -1d, + "android_phone_light" + )); + + countSensors++; + assertTrue(testSensorTimed(androidPhone.getSensor(MAGNETIC_FIELD), + "org.radarcns.kafka.aggregator.AggregatorDoubleArray", + expectedAppProvider, + "android_phone_magnetic_field", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.phone.PhoneMagneticField", + MAGNETIC_FIELD, DataType.RAW, Unit.MICRO_TESLA, -1d, + "android_phone_magnetic_field" + )); + + countSensors++; + assertTrue(testSensorTimed(androidPhone.getSensor(STEP_COUNT), + "org.radarcns.kafka.aggregator.AggregatorDouble", + expectedAppProvider, + "android_phone_step_count", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.phone.PhoneStepCount", + STEP_COUNT, DataType.VENDOR, Unit.NON_DIMENSIONAL, -1d, + "android_phone_step_count" + )); + } + + @Test + public void validatePhoneLocation() { + String expectedAppProvider = "org.radarcns.phone.PhoneLocationProvider"; + + countSensors++; + assertTrue(testSensorNonAggregatable(androidPhone.getSensor(RELATIVE_LOCATION), + expectedAppProvider, + "android_phone_relative_location", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.phone.PhoneRelativeLocation", + RELATIVE_LOCATION, DataType.RAW, Unit.DEGREE, -1d + )); + } + + @Test + public void validatePhoneLogs() { + String expectedAppProvider = "org.radarcns.phone.PhoneLogProvider"; + + countSensors++; + assertTrue(testSensorNonAggregatable(androidPhone.getSensor(PHONE_CALL), + expectedAppProvider, + "android_phone_call", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.phone.PhoneCall", + PHONE_CALL, DataType.RAW, Unit.NON_DIMENSIONAL, -1d + )); + + countSensors++; + assertTrue(testSensorNonAggregatable(androidPhone.getSensor(PHONE_SMS), + expectedAppProvider, + "android_phone_sms", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.phone.PhoneSms", + PHONE_SMS, DataType.RAW, Unit.NON_DIMENSIONAL, -1d + )); + + countSensors++; + assertTrue(testSensorNonAggregatable(androidPhone.getSensor(PHONE_SMS_UNREAD), + expectedAppProvider, + "android_phone_sms_unread", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.phone.PhoneSmsUnread", + PHONE_SMS_UNREAD, DataType.RAW, Unit.NON_DIMENSIONAL, -1d + )); + } + + @Test + public void validatePhoneUsage() { + String expectedAppProvider = "org.radarcns.phone.PhoneUsageProvider"; + + countSensors++; + assertTrue(testSensorNonAggregatable(androidPhone.getSensor(USAGE_EVENT), + expectedAppProvider, + "android_phone_usage_event", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.phone.PhoneUsageEvent", + USAGE_EVENT, DataType.RAW, Unit.NON_DIMENSIONAL, -1d + )); + + countSensors++; + assertTrue(testSensorNonAggregatable(androidPhone.getSensor(USER_INTERACTION), + expectedAppProvider, + "android_phone_user_interaction", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.phone.PhoneUserInteraction", + USER_INTERACTION, DataType.RAW, Unit.NON_DIMENSIONAL, -1d + )); + } + + @Test + public void validateTopics() { + assertTrue(testSourceTopics(androidPhone)); + } + + /*@AfterClass + public static void countSensorTest() { + if (androidPhone.getSensors().size() != countSensors) { + throw new IllegalStateException("The amount of tested sensors do not match the " + + "specified sensors."); + } + }*/ + +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/BiovotionTest.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/BiovotionTest.java new file mode 100644 index 00000000..6c614ce6 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/BiovotionTest.java @@ -0,0 +1,256 @@ +package org.radarcns.specifications.value.passive; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.radarcns.catalogue.SensorName.ACCELEROMETER; +import static org.radarcns.catalogue.SensorName.BATTERY; +import static org.radarcns.catalogue.SensorName.BLOOD_PULSE_WAVE; +import static org.radarcns.catalogue.SensorName.ENERGY; +import static org.radarcns.catalogue.SensorName.GALVANIC_SKIN_RESPONSE; +import static org.radarcns.catalogue.SensorName.HEART_RATE; +import static org.radarcns.catalogue.SensorName.HEART_RATE_VARIABILITY; +import static org.radarcns.catalogue.SensorName.LED; +import static org.radarcns.catalogue.SensorName.OXYGEN_SATURATION; +import static org.radarcns.catalogue.SensorName.PHOTOPLETHYSMOGRAPHY; +import static org.radarcns.catalogue.SensorName.RESPIRATION_RATE; +import static org.radarcns.catalogue.SensorName.THERMOMETER; +import static org.radarcns.specifications.value.Utility.testSensorTimed; +import static org.radarcns.specifications.value.Utility.testSourceTopics; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.radarcns.catalogue.DataType; +import org.radarcns.catalogue.PassiveSourceType; +import org.radarcns.catalogue.Unit; +import org.radarcns.specifications.SourceCatalogue; +import org.radarcns.specifications.source.passive.PassiveSource; + +/** + * TODO. + */ +public class BiovotionTest { + + private static PassiveSource biovotion; + private static int countSensors; + + @BeforeClass + public static void initSource() { + biovotion = SourceCatalogue.getPassiveSource(PassiveSourceType.BIOVOTION_VSM1); + countSensors = 0; + } + + @Test + public void validateHeader() { + assertEquals("BIOVOTION", biovotion.getVendor()); + assertEquals("VSM1", biovotion.getModel()); + assertEquals(PassiveSourceType.BIOVOTION_VSM1.name(), biovotion.getType().name()); + assertEquals(PassiveSourceType.BIOVOTION_VSM1.name(), biovotion.getName()); + + assertEquals("org.radarcns.biovotion.BiovotionServiceProvider", + biovotion.getAppProvider()); + } + + @Test + public void validateAcceleration() { + countSensors++; + assertTrue(testSensorTimed(biovotion.getSensor(ACCELEROMETER), + "org.radarcns.kafka.aggregator.AggregatorDoubleArray", + null, + "android_biovotion_vsm1_acceleration", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.biovotion.BiovotionVsm1Acceleration", + ACCELEROMETER, DataType.RAW, Unit.G, 51.2, + "android_biovotion_vsm1_acceleration" + )); + } + + @Test + public void validateBatteryLevel() { + countSensors++; + assertTrue(testSensorTimed(biovotion.getSensor(BATTERY), + "org.radarcns.kafka.aggregator.AggregatorDouble", + null, + "android_biovotion_vsm1_battery_level", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.biovotion.BiovotionVsm1BatteryLevel", + BATTERY, DataType.RAW, Unit.PERCENTAGE, 1d, + "android_biovotion_vsm1_battery_level" + )); + } + + @Test + public void validateBloodPulseWave() { + countSensors++; + assertTrue(testSensorTimed(biovotion.getSensor(BLOOD_PULSE_WAVE), + "org.radarcns.kafka.aggregator.AggregatorDouble", + null, + "android_biovotion_vsm1_blood_volume_pulse", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.biovotion.BiovotionVsm1BloodPulseWave", + BLOOD_PULSE_WAVE, DataType.VENDOR, Unit.NON_DIMENSIONAL, 1d, + "android_biovotion_vsm1_blood_volume_pulse" + )); + } + + @Test + public void validateEnergy() { + countSensors++; + assertTrue(testSensorTimed(biovotion.getSensor(ENERGY), + "org.radarcns.kafka.aggregator.AggregatorDouble", + null, + "android_biovotion_vsm1_energy", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.biovotion.BiovotionVsm1Energy", + ENERGY, DataType.VENDOR, Unit.CALORIES_PER_SEC, 1d, + "android_biovotion_vsm1_energy" + )); + } + + @Test + public void validateGalvanicSkinResponse() { + countSensors++; + assertTrue(testSensorTimed(biovotion.getSensor(GALVANIC_SKIN_RESPONSE), + "org.radarcns.kafka.aggregator.AggregatorDoubleArray", + null, + "android_biovotion_vsm1_galvanic_skin_response", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.biovotion.BiovotionVsm1GalvanicSkinResponse", + GALVANIC_SKIN_RESPONSE, DataType.VENDOR, Unit.KILO_OHM, 1d, + "android_biovotion_vsm1_galvanic_skin_response" + )); + } + + @Test + public void validateHeartRate() { + countSensors++; + assertTrue(testSensorTimed(biovotion.getSensor(HEART_RATE), + "org.radarcns.kafka.aggregator.AggregatorDouble", + null, + "android_biovotion_vsm1_heartrate", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.biovotion.BiovotionVsm1HeartRate", + HEART_RATE, DataType.VENDOR, Unit.BEATS_PER_MIN, 1d, + "android_biovotion_vsm1_heartrate" + )); + } + + @Test + public void validateHeartRateVariability() { + countSensors++; + assertTrue(testSensorTimed(biovotion.getSensor(HEART_RATE_VARIABILITY), + "org.radarcns.kafka.aggregator.AggregatorDouble", + null, + "android_biovotion_vsm1_heartrate_variability", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.biovotion.BiovotionVsm1HeartRateVariability", + HEART_RATE_VARIABILITY, DataType.VENDOR, Unit.RMSSD_IN_MILLI_SEC, 1d, + "android_biovotion_vsm1_heartrate_variability" + )); + } + + @Test + public void validateLedCurrent() { + countSensors++; + assertTrue(testSensorTimed(biovotion.getSensor(LED), + "org.radarcns.kafka.aggregator.AggregatorDoubleArray", + null, + "android_biovotion_vsm1_led_current", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.biovotion.BiovotionVsm1LedCurrent", + LED, DataType.VENDOR, Unit.MILLI_AMPERE, 1d, + "android_biovotion_vsm1_led_current" + )); + } + + @Test + public void validatePpgRaw() { + countSensors++; + assertTrue(testSensorTimed(biovotion.getSensor(PHOTOPLETHYSMOGRAPHY), + "org.radarcns.kafka.aggregator.AggregatorDoubleArray", + null, + "android_biovotion_vsm1_ppg_raw", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.biovotion.BiovotionVsm1PpgRaw", + PHOTOPLETHYSMOGRAPHY, DataType.RAW, Unit.NON_DIMENSIONAL, 51.2, + "android_biovotion_vsm1_ppg_raw" + )); + } + + @Test + public void validateRespirationRate() { + countSensors++; + assertTrue(testSensorTimed(biovotion.getSensor(RESPIRATION_RATE), + "org.radarcns.kafka.aggregator.AggregatorDouble", + null, + "android_biovotion_vsm1_respiration_rate", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.biovotion.BiovotionVsm1RespirationRate", + RESPIRATION_RATE, DataType.VENDOR, Unit.BEATS_PER_MIN, 1d, + "android_biovotion_vsm1_respiration_rate" + )); + } + + @Test + public void validateOxygenSaturation() { + countSensors++; + assertTrue(testSensorTimed(biovotion.getSensor(OXYGEN_SATURATION), + "org.radarcns.kafka.aggregator.AggregatorDouble", + null, + "android_biovotion_vsm1_oxygen_saturation", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.biovotion.BiovotionVsm1OxygenSaturation", + OXYGEN_SATURATION, DataType.VENDOR, Unit.PERCENTAGE, 1d, + "android_biovotion_vsm1_oxygen_saturation" + )); + } + + @Test + public void validateTemperature() { + countSensors++; + assertTrue(testSensorTimed(biovotion.getSensor(THERMOMETER), + "org.radarcns.kafka.aggregator.AggregatorDouble", + null, + "android_biovotion_vsm1_temperature", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.biovotion.BiovotionVsm1Temperature", + THERMOMETER, DataType.RAW, Unit.CELSIUS, 1d, + "android_biovotion_vsm1_temperature" + )); + } + + @Test + public void validateProcessors() { + assertTrue(biovotion.getProcessors().isEmpty()); + } + + @Test + public void validateTopics() { + assertTrue(testSourceTopics(biovotion)); + } + + @AfterClass + public static void countSensorTest() { + if (biovotion.getSensors().size() != countSensors) { + throw new IllegalStateException("The amount of tested sensors do not match the " + + "specified sensors."); + } + } + +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/EmpaticaE4Test.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/EmpaticaE4Test.java new file mode 100644 index 00000000..55229dff --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/EmpaticaE4Test.java @@ -0,0 +1,185 @@ +package org.radarcns.specifications.value.passive; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.radarcns.catalogue.SensorName.ACCELEROMETER; +import static org.radarcns.catalogue.SensorName.BATTERY; +import static org.radarcns.catalogue.SensorName.BLOOD_VOLUME_PULSE; +import static org.radarcns.catalogue.SensorName.ELECTRODERMAL_ACTIVITY; +import static org.radarcns.catalogue.SensorName.HEART_RATE; +import static org.radarcns.catalogue.SensorName.INTER_BEAT_INTERVAL; +import static org.radarcns.catalogue.SensorName.THERMOMETER; +import static org.radarcns.specifications.value.Utility.testSensorTimed; +import static org.radarcns.specifications.value.Utility.testSourceTopics; +import static org.radarcns.specifications.value.Utility.testTopicTimedAggregator; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.radarcns.catalogue.DataType; +import org.radarcns.catalogue.PassiveSourceType; +import org.radarcns.catalogue.Unit; +import org.radarcns.specifications.SourceCatalogue; +import org.radarcns.specifications.source.passive.PassiveSource; +import org.radarcns.specifications.source.passive.Processor; + +/** + * TODO. + */ +public class EmpaticaE4Test { + + private static PassiveSource empaticaE4; + private static int countSensors; + + @BeforeClass + public static void initSource() { + empaticaE4 = SourceCatalogue.getPassiveSource(PassiveSourceType.EMPATICA_E4); + countSensors = 0; + } + + @Test + public void validateHeader() { + assertEquals("EMPATICA", empaticaE4.getVendor()); + assertEquals("E4", empaticaE4.getModel()); + assertEquals(PassiveSourceType.EMPATICA_E4.name(), empaticaE4.getType().name()); + assertEquals(PassiveSourceType.EMPATICA_E4.name(), empaticaE4.getName()); + + assertEquals("org.radarcns.empatica.E4ServiceProvider", + empaticaE4.getAppProvider()); + } + + @Test + public void validateAccelerometer() { + countSensors++; + assertTrue(testSensorTimed(empaticaE4.getSensor(ACCELEROMETER), + "org.radarcns.kafka.aggregator.AggregatorDoubleArray", + null, + "android_empatica_e4_acceleration", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.empatica.EmpaticaE4Acceleration", + ACCELEROMETER, DataType.RAW, Unit.G, 32d, + "android_empatica_e4_acceleration" + )); + } + + @Test + public void validateBattery() { + countSensors++; + assertTrue(testSensorTimed(empaticaE4.getSensor(BATTERY), + "org.radarcns.kafka.aggregator.AggregatorDouble", + null, + "android_empatica_e4_battery_level", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.empatica.EmpaticaE4BatteryLevel", + BATTERY, DataType.RAW, Unit.PERCENTAGE, 1d, + "android_empatica_e4_battery_level" + )); + } + + @Test + public void validateBloodVolumePulse() { + countSensors++; + assertTrue(testSensorTimed(empaticaE4.getSensor(BLOOD_VOLUME_PULSE), + "org.radarcns.kafka.aggregator.AggregatorDouble", + null, + "android_empatica_e4_blood_volume_pulse", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.empatica.EmpaticaE4BloodVolumePulse", + BLOOD_VOLUME_PULSE, DataType.RAW, Unit.NANO_WATT, 64d, + "android_empatica_e4_blood_volume_pulse" + )); + } + + @Test + public void validateElectroDermalActivity() { + countSensors++; + assertTrue(testSensorTimed(empaticaE4.getSensor(ELECTRODERMAL_ACTIVITY), + "org.radarcns.kafka.aggregator.AggregatorDouble", + null, + "android_empatica_e4_electrodermal_activity", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.empatica.EmpaticaE4ElectroDermalActivity", + ELECTRODERMAL_ACTIVITY, DataType.RAW, Unit.MICRO_SIEMENS, 4d, + "android_empatica_e4_electrodermal_activity" + )); + } + + @Test + public void validateInterBeatInterval() { + countSensors++; + assertTrue(testSensorTimed(empaticaE4.getSensor(INTER_BEAT_INTERVAL), + "org.radarcns.kafka.aggregator.AggregatorDouble", + null, + "android_empatica_e4_inter_beat_interval", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.empatica.EmpaticaE4InterBeatInterval", + INTER_BEAT_INTERVAL, DataType.VENDOR, Unit.BEATS_PER_MIN, 1d, + "android_empatica_e4_inter_beat_interval" + )); + } + + @Test + public void validateTemperature() { + countSensors++; + assertTrue(testSensorTimed(empaticaE4.getSensor(THERMOMETER), + "org.radarcns.kafka.aggregator.AggregatorDouble", + null, + "android_empatica_e4_temperature", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.empatica.EmpaticaE4Temperature", + THERMOMETER, DataType.RAW, Unit.CELSIUS, 4d, + "android_empatica_e4_temperature" + )); + } + + @Test + public void validateProcessors() { + assertEquals(1, empaticaE4.getProcessors().size(), 0); + Processor processor = empaticaE4.getProcessor(HEART_RATE); + assertEquals("org.radarcns.kafka.aggregator.AggregatorDouble", + processor.getTopic().getAggregator()); + assertEquals(DataType.RADAR.name(), processor.getDataType().name()); + //processor.getDoc(); + assertEquals(HEART_RATE.name(), processor.getName().name()); + assertEquals(1.0, processor.getSampleRate(), 0.0); + assertEquals(Unit.BEATS_PER_MIN.name(), processor.getUnit().name()); + testTopicTimedAggregator( + "org.radarcns.kafka.aggregator.AggregatorDouble", + "android_empatica_e4_inter_beat_interval", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.empatica.EmpaticaE4InterBeatInterval", + processor.getTopic(), + "android_empatica_e4_heartrate"); + } + + @Test + public void validateTopics() { + assertTrue(testSourceTopics(empaticaE4)); + } + + @AfterClass + public static void countSensorTest() { + if (empaticaE4.getSensors().size() != countSensors) { + throw new IllegalStateException("The amount of tested sensors do not match the " + + "specified sensors."); + } + } + +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/Pebble2Test.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/Pebble2Test.java new file mode 100644 index 00000000..9ce1e227 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/Pebble2Test.java @@ -0,0 +1,136 @@ +package org.radarcns.specifications.value.passive; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.radarcns.catalogue.SensorName.ACCELEROMETER; +import static org.radarcns.catalogue.SensorName.BATTERY; +import static org.radarcns.catalogue.SensorName.HEART_RATE; +import static org.radarcns.catalogue.SensorName.HEART_RATE_FILTERED; +import static org.radarcns.specifications.value.Utility.testSensorTimed; +import static org.radarcns.specifications.value.Utility.testSourceTopics; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.radarcns.catalogue.DataType; +import org.radarcns.catalogue.PassiveSourceType; +import org.radarcns.catalogue.Unit; +import org.radarcns.specifications.SourceCatalogue; +import org.radarcns.specifications.source.passive.PassiveSource; + +/** + * TODO. + */ +public class Pebble2Test { + + private static PassiveSource pebble2; + private static int countSensors; + + @BeforeClass + public static void initSource() { + pebble2 = SourceCatalogue.getPassiveSource(PassiveSourceType.PEBBLE_2); + countSensors = 0; + } + + @Test + public void validateHeader() { + assertEquals("PEBBLE", pebble2.getVendor()); + assertEquals("2", pebble2.getModel()); + assertEquals(PassiveSourceType.PEBBLE_2.name(), pebble2.getType().name()); + assertEquals(PassiveSourceType.PEBBLE_2.name(), pebble2.getName()); + + assertEquals("org.radarcns.pebble.PebbleServiceProvider", + pebble2.getAppProvider()); + } + + @Test + public void validateAccelerometer() { + countSensors++; + assertTrue(testSensorTimed(pebble2.getSensor(ACCELEROMETER), + "org.radarcns.kafka.aggregator.AggregatorDoubleArray", + null, + "android_pebble_2_acceleration", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.pebble.Pebble2Acceleration", + ACCELEROMETER, DataType.RAW, Unit.G, 10d, + "android_pebble_2_acceleration" + )); + } + + @Test + public void validateBattery() { + countSensors++; + assertTrue(testSensorTimed(pebble2.getSensor(BATTERY), + "org.radarcns.kafka.aggregator.AggregatorDouble", + null, + "android_pebble_2_battery_level", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.pebble.Pebble2BatteryLevel", + BATTERY, DataType.RAW, Unit.PERCENTAGE, 1d, + "android_pebble_2_battery_level" + )); + } + + @Test + public void validateHeartRate() { + countSensors++; + assertTrue(testSensorTimed(pebble2.getSensor(HEART_RATE), + "org.radarcns.kafka.aggregator.AggregatorDouble", + null, + "android_pebble_2_heartrate", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.pebble.Pebble2HeartRate", + HEART_RATE, DataType.VENDOR, Unit.BEATS_PER_MIN, 1d, + "android_pebble_2_heartrate" + )); + } + + @Test + public void validateHeartRateFiltered() { + countSensors++; + assertTrue(testSensorTimed(pebble2.getSensor(HEART_RATE_FILTERED), + "org.radarcns.kafka.aggregator.AggregatorDouble", + null, + "android_pebble_2_heartrate_filtered", + "org.radarcns.kafka.key.KeyMeasurement", + "org.radarcns.passive.pebble.Pebble2HeartRateFiltered", + HEART_RATE_FILTERED, DataType.VENDOR, Unit.BEATS_PER_MIN, 1d, + "android_pebble_2_heartrate_filtered" + )); + } + + @Test + public void validateProcessors() { + assertTrue(pebble2.getProcessors().isEmpty()); + } + + @Test + public void validateTopics() { + assertTrue(testSourceTopics(pebble2)); + } + + @AfterClass + public static void countSensorTest() { + if (pebble2.getSensors().size() != countSensors) { + throw new IllegalStateException("The amount of tested sensors do not match the " + + "specified sensors."); + } + } + +} diff --git a/java-sdk/radar-schemas-validator/build.gradle b/java-sdk/radar-schemas-validator/build.gradle index 7821e884..0c2e04f5 100644 --- a/java-sdk/radar-schemas-validator/build.gradle +++ b/java-sdk/radar-schemas-validator/build.gradle @@ -41,10 +41,11 @@ dependencies { ext.exchnageConfigPath = 'src/test/resources/gradle.properties' task exchangeConfig() { doLast { - if (file(exchnageConfigPath).createNewFile()) { + if (file(exchnageConfigPath).delete()) { + file(exchnageConfigPath).createNewFile() file(exchnageConfigPath).write("project.group=${project.group}") } else { - throw new GradleException("File for exchanginf configuration between Gradle and Java cannot be created. Error while managing file at ${exchnageConfigPath}") + throw new GradleException("Error while creating file at ${exchnageConfigPath}") } } } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaCatalogValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaCatalogValidator.java index 62230e8d..69f35216 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaCatalogValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaCatalogValidator.java @@ -186,8 +186,8 @@ public void restApi() { @Test /** - * Checks only the folder structure, the validation is left the to the - * {@code radar-schemas-specifications} module. + * Checks only the folder structure and if they contain only {@code YAML} files. The semantic + * validation is left the to the {@code radar-schemas-specifications} module. */ public void specifications() { assertEquals(true, RootFolder.SPECIFICATIONS.getFolder().isDirectory()); @@ -196,6 +196,6 @@ public void specifications() { assertEquals(true, folder.getFolder().isDirectory()); } - //TODO verify that there are only YML files + SpecificationsValidator.validateAll(); } } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SpecificationsValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SpecificationsValidator.java new file mode 100644 index 00000000..d25bd11c --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SpecificationsValidator.java @@ -0,0 +1,96 @@ +package org.radarcns.validator; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import static org.junit.Assert.assertTrue; +import static org.radarcns.validator.util.AvroValidator.getExtension; + +import java.io.File; +import java.io.IOException; +import org.radarcns.validator.SchemaCatalogValidator.SpecificationFolder; +import org.radarcns.validator.config.SkipConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * TODO. + */ +public final class SpecificationsValidator { + + private static final Logger LOGGER = LoggerFactory.getLogger(SpecificationsValidator.class); + + public static final String YML_FORMAT = "yml"; + + private SpecificationsValidator() { + //Static class + } + + /** + * TODO. + * @throws IOException TODO + */ + public static void validateAll() { + active(); + monitor(); + passive(); + } + + /** + * TODO. + * @throws IOException TODO + */ + public static void active() { + analiseFiles(SpecificationFolder.ACTIVE.getFolder()); + } + + /** + * TODO. + * @throws IOException TODO + */ + public static void monitor() { + analiseFiles(SpecificationFolder.MONITOR.getFolder()); + } + + /** + * TODO. + * @throws IOException TODO + */ + public static void passive() { + analiseFiles(SpecificationFolder.PASSIVE.getFolder()); + } + + private static void analiseFiles(File file) { + if (file.isDirectory()) { + for (File son : file.listFiles()) { + analiseFiles(son); + } + } else if (SkipConfig.skipFile(file)) { + LOGGER.debug("Skipping {}", file.getAbsolutePath()); + } else { + assertTrue(isYmlFile(file)); + } + } + + /** + * TODO. + * @param file TODO + * @return TODO + */ + public static boolean isYmlFile(File file) { + return YML_FORMAT.equals(getExtension(file)); + } +} diff --git a/specifications/monitor/server_status.yml b/specifications/monitor/server_status.yml index 32078159..e5c1de67 100644 --- a/specifications/monitor/server_status.yml +++ b/specifications/monitor/server_status.yml @@ -5,6 +5,6 @@ doc: Monitor used by the Android pRMT to report the server connection status bet sample_rate: 0.08 unit: NON_DIMENSIONAL data_type: RAW -topic: application_uptime +topic: application_server_status key: .kafka.key.KeyMeasurement value: .monitor.application.ApplicationServerStatus diff --git a/specifications/passive/android_phone.yml b/specifications/passive/android_phone.yml index 1d87084b..c0ca22fb 100644 --- a/specifications/passive/android_phone.yml +++ b/specifications/passive/android_phone.yml @@ -5,7 +5,7 @@ sensors: #Phone sensors - name: ACCELEROMETER app_provider: .phone.PhoneSensorProvider - sample_rate: #TODO + sample_rate: -1 #TODO unit: G data_type: RAW topic: android_phone_acceleration @@ -14,7 +14,7 @@ sensors: aggregator: .kafka.aggregator.AggregatorDoubleArray - name: BATTERY app_provider: .phone.PhoneSensorProvider - sample_rate: #TODO + sample_rate: -1 #TODO unit: PERCENTAGE data_type: RAW topic: android_phone_battery_level @@ -23,7 +23,7 @@ sensors: aggregator: .kafka.aggregator.AggregatorDouble - name: GYROSCOPE app_provider: .phone.PhoneSensorProvider - sample_rate: #TODO + sample_rate: -1 #TODO unit: RADAIAN_PER_SEC data_type: RAW topic: android_phone_gyroscope @@ -32,16 +32,16 @@ sensors: aggregator: .kafka.aggregator.AggregatorDoubleArray - name: LIGHT app_provider: .phone.PhoneSensorProvider - sample_rate: #TODO + sample_rate: -1 #TODO unit: LUX data_type: RAW - topic: android_phone_ligth + topic: android_phone_light key: .kafka.key.KeyMeasurement value: .passive.phone.PhoneLight aggregator: .kafka.aggregator.AggregatorDouble - name: MAGNETIC_FIELD app_provider: .phone.PhoneSensorProvider - sample_rate: #TODO + sample_rate: -1 #TODO unit: MICRO_TESLA data_type: RAW topic: android_phone_magnetic_field @@ -50,7 +50,7 @@ sensors: aggregator: .kafka.aggregator.AggregatorDoubleArray - name: STEP_COUNT app_provider: .phone.PhoneSensorProvider - sample_rate: #TODO + sample_rate: -1 #TODO unit: NON_DIMENSIONAL data_type: VENDOR topic: android_phone_step_count @@ -60,7 +60,7 @@ sensors: # Location - name: RELATIVE_LOCATION app_provider: .phone.PhoneLocationProvider - sample_rate: #TODO + sample_rate: -1 #TODO unit: DEGREE data_type: RAW topic: android_phone_relative_location @@ -69,7 +69,7 @@ sensors: # Log - name: PHONE_CALL app_provider: .phone.PhoneLogProvider - sample_rate: #TODO + sample_rate: -1 #TODO unit: NON_DIMENSIONAL data_type: RAW topic: android_phone_call @@ -77,7 +77,7 @@ sensors: value: .passive.phone.PhoneCall - name: PHONE_SMS app_provider: .phone.PhoneLogProvider - sample_rate: #TODO + sample_rate: -1 #TODO unit: NON_DIMENSIONAL data_type: RAW topic: android_phone_sms @@ -85,7 +85,7 @@ sensors: value: .passive.phone.PhoneSms - name: PHONE_SMS_UNREAD app_provider: .phone.PhoneLogProvider - sample_rate: #TODO + sample_rate: -1 #TODO unit: NON_DIMENSIONAL data_type: RAW topic: android_phone_sms_unread @@ -94,15 +94,15 @@ sensors: # Usage - name: USAGE_EVENT app_provider: .phone.PhoneUsageProvider - sample_rate: #TODO + sample_rate: -1 #TODO unit: NON_DIMENSIONAL data_type: RAW - topic: android_phone_user_event + topic: android_phone_usage_event key: .kafka.key.KeyMeasurement value: .passive.phone.PhoneUsageEvent - name: USER_INTERACTION app_provider: .phone.PhoneUsageProvider - sample_rate: #TODO + sample_rate: -1 #TODO unit: NON_DIMENSIONAL data_type: RAW topic: android_phone_user_interaction diff --git a/specifications/passive/biovotion_vsm1.yml b/specifications/passive/biovotion_vsm1.yml index fef32857..6419cd5c 100644 --- a/specifications/passive/biovotion_vsm1.yml +++ b/specifications/passive/biovotion_vsm1.yml @@ -15,15 +15,15 @@ sensors: sample_rate: 1.0 unit: PERCENTAGE data_type: RAW - topic: android_biovotion_vsm1_battery_state + topic: android_biovotion_vsm1_battery_level key: .kafka.key.KeyMeasurement - value: .passive.biovotion.BiovotionVsm1BatteryState + value: .passive.biovotion.BiovotionVsm1BatteryLevel aggregator: .kafka.aggregator.AggregatorDouble - name: BLOOD_PULSE_WAVE sample_rate: 1.0 unit: NON_DIMENSIONAL data_type: VENDOR - topic: android_biovotion_vsm1_acceleration + topic: android_biovotion_vsm1_blood_volume_pulse key: .kafka.key.KeyMeasurement value: .passive.biovotion.BiovotionVsm1BloodPulseWave aggregator: .kafka.aggregator.AggregatorDouble @@ -47,7 +47,7 @@ sensors: sample_rate: 1.0 unit: BEATS_PER_MIN data_type: VENDOR - topic: android_biovotion_vsm1_heart_rate + topic: android_biovotion_vsm1_heartrate key: .kafka.key.KeyMeasurement value: .passive.biovotion.BiovotionVsm1HeartRate aggregator: .kafka.aggregator.AggregatorDouble @@ -55,7 +55,7 @@ sensors: sample_rate: 1.0 unit: RMSSD_IN_MILLI_SEC data_type: VENDOR - topic: android_biovotion_vsm1_heart_rate_variability + topic: android_biovotion_vsm1_heartrate_variability key: .kafka.key.KeyMeasurement value: .passive.biovotion.BiovotionVsm1HeartRateVariability aggregator: .kafka.aggregator.AggregatorDouble @@ -70,8 +70,8 @@ sensors: - name: PHOTOPLETHYSMOGRAPHY sample_rate: 51.2 unit: NON_DIMENSIONAL - data_type: VENDOR - topic: android_biovotion_vsm1_ppg_current + data_type: RAW + topic: android_biovotion_vsm1_ppg_raw key: .kafka.key.KeyMeasurement value: .passive.biovotion.BiovotionVsm1PpgRaw aggregator: .kafka.aggregator.AggregatorDoubleArray @@ -86,7 +86,7 @@ sensors: - name: OXYGEN_SATURATION sample_rate: 1.0 unit: PERCENTAGE - data_type: RAW + data_type: VENDOR topic: android_biovotion_vsm1_oxygen_saturation key: .kafka.key.KeyMeasurement value: .passive.biovotion.BiovotionVsm1OxygenSaturation diff --git a/specifications/passive/empatica_e4.yml b/specifications/passive/empatica_e4.yml index 03bd3a82..d284513c 100644 --- a/specifications/passive/empatica_e4.yml +++ b/specifications/passive/empatica_e4.yml @@ -49,7 +49,7 @@ sensors: data_type: RAW topic: android_empatica_e4_temperature key: .kafka.key.KeyMeasurement - value: .passive.empatica.EmpaticaE4BatteryLevel + value: .passive.empatica.EmpaticaE4Temperature aggregator: .kafka.aggregator.AggregatorDouble processors: - name: HEART_RATE diff --git a/specifications/passive/pebble_2.yml b/specifications/passive/pebble_2.yml index be4d35b6..5c39003c 100644 --- a/specifications/passive/pebble_2.yml +++ b/specifications/passive/pebble_2.yml @@ -22,8 +22,8 @@ sensors: - name: HEART_RATE sample_rate: 1.0 unit: BEATS_PER_MIN - data_type: RAW - topic: android_pebble_2_heart_rate + data_type: VENDOR + topic: android_pebble_2_heartrate key: .kafka.key.KeyMeasurement value: .passive.pebble.Pebble2HeartRate aggregator: .kafka.aggregator.AggregatorDouble @@ -31,7 +31,7 @@ sensors: sample_rate: 1.0 unit: BEATS_PER_MIN data_type: VENDOR - topic: android_pebble_2_heart_rate_filtered + topic: android_pebble_2_heartrate_filtered key: .kafka.key.KeyMeasurement value: .passive.pebble.Pebble2HeartRateFiltered aggregator: .kafka.aggregator.AggregatorDouble From 0951754ef9d68a12ff0893d896a8d67580cb23c1 Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Wed, 9 Aug 2017 17:48:24 +0100 Subject: [PATCH 047/112] Skeleton command line app --- .../specifications/CommandLineApp.java | 191 ++++++++++++++++++ .../specifications/SourceCatalogue.java | 34 ---- .../radarcns/specifications/source/Topic.java | 25 +++ .../specifications/ActiveValidation.java | 14 -- .../specifications/MonitorValidation.java | 12 -- .../specifications/PassiveValidation.java | 12 -- .../SourceCatalogueValidation.java | 16 +- .../validator/ProcessorRoles.java | 2 - .../value/passive/AndroidPhoneTest.java | 1 - 9 files changed, 220 insertions(+), 87 deletions(-) create mode 100644 java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/CommandLineApp.java diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/CommandLineApp.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/CommandLineApp.java new file mode 100644 index 00000000..2470ac3f --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/CommandLineApp.java @@ -0,0 +1,191 @@ +package org.radarcns.specifications; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import org.radarcns.catalogue.ActiveSourceType; +import org.radarcns.specifications.SourceCatalogue.NameFolder; +import org.radarcns.specifications.source.KafkaActor; +import org.radarcns.specifications.source.Topic; +import org.radarcns.specifications.source.Topic.TopicMetadata; +import org.radarcns.specifications.source.active.questionnaire.QuestionnaireSource; +import org.radarcns.specifications.source.passive.MonitorSource; +import org.radarcns.specifications.source.passive.PassiveSource; +import org.radarcns.specifications.source.passive.Processor; +import org.radarcns.specifications.source.passive.Sensor; + +/** + * TODO. + */ +public class CommandLineApp { + + /** + * TODO. + * @return TODO + */ + public static Set getTopicsToCreate() { + Set set = new HashSet<>(); + + for (Topic topic : getAllTopics()) { + set.add(topic.getInputTopic()); + if (topic.isAggregatable()) { + topic.getOutputTopics().stream() + .map(TopicMetadata::getOutput) + .forEach(output -> set.add(output)); + } else { + set.add(topic.getInputTopic()); + } + } + + return set; + } + + /** + * TODO. + * @return TODO + */ + public static Set getRawTopics() { + Set set = new HashSet<>(); + + for (Topic topic : getAllTopics()) { + set.add(topic.getInputTopic()); + } + + return set; + } + + /** + * TODO. + * @return TODO + */ + public static Set getResultsCacheTopics() { + Set set = new HashSet<>(); + + for (Topic topic : getAllTopics()) { + if (topic.isAggregatable()) { + topic.getOutputTopics().stream() + .map(TopicMetadata::getOutput) + .forEach(output -> set.add(output)); + } else { + set.add(topic.getInputTopic()); + } + } + + return set; + } + + private static Set getAllTopics() { + Set set = new HashSet<>(); + + SourceCatalogue.getActiveSources().values().stream() + .map(QuestionnaireSource::getTopic) + .forEach(topic -> set.add(topic)); + + SourceCatalogue.getMonitorSources().values().stream() + .map(MonitorSource::getKafkaActor) + .map(KafkaActor::getTopic) + .forEach(topic -> set.add(topic)); + + SourceCatalogue.getPassiveSources().values().stream() + .map(PassiveSource::getSensors) + .flatMap(Set::stream) + .map(Sensor::getTopic) + .forEach(topic -> set.add(topic)); + + SourceCatalogue.getPassiveSources().values().stream() + .map(PassiveSource::getProcessors) + .flatMap(Set::stream) + .map(Processor::getTopic) + .forEach(topic -> set.add(topic)); + + return set; + } + + /** + * TODO. + * @param reduced TODO + * @return TODO + */ + public static String getTopicsVerbose(boolean reduced, String source) { + String result = ""; + + Map> map = getTopicsInfoVerbose(reduced); + + List rootKeys = new ArrayList<>(map.keySet()); + Collections.sort(rootKeys); + + for (String key : rootKeys) { + if (Objects.isNull(source) || key.equalsIgnoreCase(source)) { + result = result.concat(key).concat("\n"); + + List firstLevelKeys = new ArrayList<>(map.get(key).keySet()); + Collections.sort(firstLevelKeys); + + for (String details : firstLevelKeys) { + result = result.concat("\t").concat(details).concat("\n"); + result = result.concat("\t\t").concat(map.get(key).get(details)); + } + result = result.concat("\n"); + } + } + + return result; + } + + /** + * TODO. + * @param reduced TODO + * @return TODO + */ + private static Map> getTopicsInfoVerbose(boolean reduced) { + Map> map = new HashMap<>(); + + Map details = new HashMap<>(); + for (QuestionnaireSource source : SourceCatalogue.getActiveSources().values()) { + details.put(source.getQuestionnaireType().name(), source.getTopic().toString(reduced)); + } + map.put(ActiveSourceType.QUESTIONNAIRE.name(), details); + + details = new HashMap<>(); + for (MonitorSource source : SourceCatalogue.getMonitorSources().values()) { + details.put(source.getType().name(), + source.getKafkaActor().getTopic().toString(reduced)); + } + map.put(NameFolder.MONITOR.getName().toUpperCase(), details); + + for (PassiveSource source : SourceCatalogue.getPassiveSources().values()) { + details = new HashMap<>(); + for (Sensor sensor : source.getSensors()) { + details.put(sensor.getName().name(), sensor.getTopic().toString(reduced)); + } + for (Processor proc : source.getProcessors()) { + details.put(proc.getName().name(), proc.getTopic().toString(reduced)); + } + map.put(source.getType().name(), details); + } + + return map; + } + +} diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/SourceCatalogue.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/SourceCatalogue.java index 2fb1d367..0f329f89 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/SourceCatalogue.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/SourceCatalogue.java @@ -201,38 +201,4 @@ public static Set getTopics() { SOURCES.forEach(source -> set.addAll(source.getTopics())); return set; } - - /** - * TODO. - * @return TODO - */ - public static Map>> getTopicsVerbose() { - return null; - /*Map>> map = new HashMap<>(); - - for (QuestionnaireSource source : ACTIVE_SOURCES.values()) { - Map> details = new HashMap<>(); - details.put(source.getQuestionnaireType().name(), singleton(source.getTopic())); - map.put(ActiveSourceType.QUESTIONNAIRE.name(), details); - } - - for (MonitorSource source : MONITOR_SOURCES.values()) { - Map> details = new HashMap<>(); - details.put(source.getType().name(), source.getTopics()); - map.put(NameFolder.MONITOR.getName().toUpperCase(), details); - } - - for (PassiveSource source : PASSIVE_SOURCES.values()) { - Map> details = new HashMap<>(); - for (Sensor sensor : source.getSensors()) { - details.put(sensor.getName().name(), sensor.getTopics()); - } - for (Processor proc : source.getProcessors()) { - details.put(proc.getName().name(), proc.getTopics()); - } - map.put(source.getType().name(), details); - } - - return map;*/ - } } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Topic.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Topic.java index 520aa31c..ae52915f 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Topic.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Topic.java @@ -20,6 +20,7 @@ import java.util.Objects; import java.util.Set; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.radarcns.catalogue.TimeFrame; @@ -245,6 +246,30 @@ public int hashCode() { .toHashCode(); } + + public String toString(boolean reduced) { + String result = "inputTopic: " + inputTopic + '\n' + + "inputKey: " + inputKey + '\n' + + "inputValue: " + inputValue + '\n' + + "aggregator: " + aggregator + '\n'; + + if (output.isEmpty()) { + result = result + "output: empty"; + } else { + result = result + "output:\n\t- "; + } + if (reduced) { + result = result + output.stream().map( + TopicMetadata::getOutput).collect(Collectors.joining("\n\t- ")); + } else { + result = result + output.stream().map(metadata -> metadata.getInput().concat( + "\t").concat(metadata.getStateStore()).concat("\t").concat( + metadata.getOutput())).collect(Collectors.joining("\n\t- ")); + } + + return result.concat("\n"); + } + /** * TODO. * @param topicName TODO diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/ActiveValidation.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/ActiveValidation.java index 7205ae32..476daaa9 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/ActiveValidation.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/ActiveValidation.java @@ -16,22 +16,8 @@ * limitations under the License. */ -import static org.junit.Assert.assertTrue; -import static org.radarcns.specifications.SourceCatalogue.BASE_PATH; -import static org.radarcns.specifications.SourceCatalogue.YAML_EXTENSION; -import static org.radarcns.specifications.validator.ValidationSupport.getMessage; - -import java.io.File; import java.io.IOException; import org.junit.Test; -import org.radarcns.active.questionnaire.QuestionnaireType; -import org.radarcns.config.YamlConfigLoader; -import org.radarcns.specifications.SourceCatalogue.NameFolder; -import org.radarcns.specifications.source.active.questionnaire.Question; -import org.radarcns.specifications.source.active.questionnaire.QuestionnaireSource; -import org.radarcns.specifications.source.active.questionnaire.Response; -import org.radarcns.specifications.validator.ValidationResult; -import org.radarcns.specifications.validator.Validator; /** * TODO. diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/MonitorValidation.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/MonitorValidation.java index 3d8b0763..fb32ca7f 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/MonitorValidation.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/MonitorValidation.java @@ -16,20 +16,8 @@ * limitations under the License. */ -import static org.junit.Assert.assertTrue; -import static org.radarcns.specifications.SourceCatalogue.BASE_PATH; -import static org.radarcns.specifications.SourceCatalogue.YAML_EXTENSION; -import static org.radarcns.specifications.validator.ValidationSupport.getMessage; - -import java.io.File; import java.io.IOException; import org.junit.Test; -import org.radarcns.catalogue.MonitorSourceType; -import org.radarcns.config.YamlConfigLoader; -import org.radarcns.specifications.SourceCatalogue.NameFolder; -import org.radarcns.specifications.source.passive.MonitorSource; -import org.radarcns.specifications.validator.ValidationResult; -import org.radarcns.specifications.validator.Validator; /** * TODO. diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/PassiveValidation.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/PassiveValidation.java index 407d31cc..76294db6 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/PassiveValidation.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/PassiveValidation.java @@ -16,26 +16,14 @@ * limitations under the License. */ -import static org.junit.Assert.assertTrue; -import static org.radarcns.specifications.SourceCatalogue.BASE_PATH; -import static org.radarcns.specifications.SourceCatalogue.YAML_EXTENSION; import static org.radarcns.specifications.validator.ValidationSupport.Package; -import static org.radarcns.specifications.validator.ValidationSupport.getMessage; -import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.junit.BeforeClass; import org.junit.Test; import org.radarcns.catalogue.PassiveSourceType; -import org.radarcns.config.YamlConfigLoader; -import org.radarcns.specifications.SourceCatalogue.NameFolder; -import org.radarcns.specifications.source.passive.PassiveSource; -import org.radarcns.specifications.source.passive.Processor; -import org.radarcns.specifications.source.passive.Sensor; -import org.radarcns.specifications.validator.ValidationResult; -import org.radarcns.specifications.validator.Validator; /** * TODO. diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueValidation.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueValidation.java index 9c9cf032..11f34f84 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueValidation.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueValidation.java @@ -24,8 +24,6 @@ import java.util.Arrays; import java.util.HashSet; -import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import org.junit.Test; import org.radarcns.active.questionnaire.QuestionnaireType; @@ -65,17 +63,11 @@ public void checkPassiveSourceType() { } //TODO - /*@Test + @Test public void validateTopicNamesVerbose() { - for (Entry>> source - : SourceCatalogue.getTopicsVerbose().entrySet()) { - for (Entry> details : source.getValue().entrySet()) { - details.getValue().forEach(topic -> assertTrue( - topic + " in " + source.getKey() + "-" + details.getKey() - + " is invalid", isValidTopic(topic))); - } - } - }*/ + //SourceCatalogue.getTopicsVerbose(); + System.out.println(CommandLineApp.getTopicsVerbose(true, null)); + } @Test public void validateTopicNames() { diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ProcessorRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ProcessorRoles.java index 78f79562..1c83258f 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ProcessorRoles.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ProcessorRoles.java @@ -2,8 +2,6 @@ import static org.radarcns.specifications.validator.ValidationResult.invalid; import static org.radarcns.specifications.validator.ValidationResult.valid; -import static org.radarcns.specifications.validator.ValidationSupport.isValidTopic; -import static org.radarcns.specifications.validator.ValidationSupport.isValidTopicVerbose; import java.util.Objects; import org.radarcns.catalogue.DataType; diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/AndroidPhoneTest.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/AndroidPhoneTest.java index 78a3d178..41e3f5fe 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/AndroidPhoneTest.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/AndroidPhoneTest.java @@ -35,7 +35,6 @@ import static org.radarcns.specifications.value.Utility.testSensorTimed; import static org.radarcns.specifications.value.Utility.testSourceTopics; -import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.radarcns.catalogue.DataType; From 19c1f2a3f55e05842ddf4aff13a1316c268bf812 Mon Sep 17 00:00:00 2001 From: Francesco Nobilia Date: Wed, 9 Aug 2017 17:49:52 +0100 Subject: [PATCH 048/112] Removed useless test --- .../radarcns/specifications/SourceCatalogueValidation.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueValidation.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueValidation.java index 11f34f84..b1b10a0a 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueValidation.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueValidation.java @@ -62,13 +62,6 @@ public void checkPassiveSourceType() { .allMatch(type -> getPassiveSource(type) != null)); } - //TODO - @Test - public void validateTopicNamesVerbose() { - //SourceCatalogue.getTopicsVerbose(); - System.out.println(CommandLineApp.getTopicsVerbose(true, null)); - } - @Test public void validateTopicNames() { SourceCatalogue.getTopics().forEach(topic -> From 8e049cf0ef3e2d2b1461accde09b541d21355ee3 Mon Sep 17 00:00:00 2001 From: Pavel Mikhailovskii Date: Thu, 31 Aug 2017 15:23:35 +0200 Subject: [PATCH 049/112] Added a scheme for contacts added/removed from the list of contacts --- commons/phone/phone_contacts_list.avsc | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 commons/phone/phone_contacts_list.avsc diff --git a/commons/phone/phone_contacts_list.avsc b/commons/phone/phone_contacts_list.avsc new file mode 100644 index 00000000..0a1be2aa --- /dev/null +++ b/commons/phone/phone_contacts_list.avsc @@ -0,0 +1,13 @@ +{ + "namespace": "org.radarcns.phone", + "type": "record", + "name": "PhoneContactsList", + "doc": "Number of new contacts added/removed from the list of contacts between this and the previous record.", + "fields": [ + {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, + {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, + {"name": "contactsAdded", "type": "int", "doc": "Number of new contacts added to the list of contacts."}, + {"name": "contactsRemoved", "type": "int", "doc": "Number of new contacts removed from the list of contacts."}, + {"name": "contactsNumber", "type": "int", "doc": "Current number of contacts in the list of contacts."} + ] +} From 06e6069ad2ce4abe40c40fcd5517910639458799 Mon Sep 17 00:00:00 2001 From: Pavel Mikhailovskii Date: Fri, 1 Sep 2017 16:53:20 +0200 Subject: [PATCH 050/112] Added a scheme for phone Bluetooth devices info --- commons/phone/phone_bluetooth_devices.avsc | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 commons/phone/phone_bluetooth_devices.avsc diff --git a/commons/phone/phone_bluetooth_devices.avsc b/commons/phone/phone_bluetooth_devices.avsc new file mode 100644 index 00000000..ef89233d --- /dev/null +++ b/commons/phone/phone_bluetooth_devices.avsc @@ -0,0 +1,13 @@ +{ + "namespace": "org.radarcns.phone", + "type": "record", + "name": "PhoneBluetoothDevices", + "doc": "Phone Bluetooth devices info.", + "fields": [ + {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, + {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, + {"name": "pairedDevices", "type": "int", "doc": "Number of paired devices"}, + {"name": "nearbyDevices", "type": "int", "doc": "Number of nearby devices"}, + {"name": "enabled", "type": "boolean", "doc": "whether Bluetooth is enabled"} + ] +} From 3dc8f90ee94b792ee5545fe002f472d8821283b1 Mon Sep 17 00:00:00 2001 From: Maxim Moinat Date: Thu, 7 Sep 2017 11:09:46 +0200 Subject: [PATCH 051/112] current weather schema --- commons/weather/weather_current.avsc | 32 ++++++++++++++++++++++++++++ java-sdk/build.gradle | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 commons/weather/weather_current.avsc diff --git a/commons/weather/weather_current.avsc b/commons/weather/weather_current.avsc new file mode 100644 index 00000000..77b243e7 --- /dev/null +++ b/commons/weather/weather_current.avsc @@ -0,0 +1,32 @@ +{ + "namespace": "org.radarcns.weather", + "type": "record", + "name": "WeatherCurrent", + "doc": "Weather information at the time reported.", + "fields": [ + {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, + {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, + {"name": "sunrise", "type": "double", "doc": "sunrise time in hours after midnight (h). The difference with sunset is the hours of daylight."}, + {"name": "sunset", "type": "double", "doc": "sunset time in hours after midnight (h). The difference with sunrise is the hours of daylight."}, + {"name": "temperature", "type": ["null","float"], "doc": "current ambient temperature (C)"}, + {"name": "pressure", "type": ["null","float"], "doc": "current atmospheric pressure on sea level (hPa)"}, + {"name": "humidity", "type": ["null","float"], "doc": "current humidity (%)"}, + {"name": "cloudiness", "type": ["null","float"], "doc": "current cloudiness (%)"}, + {"name": "precipitation3h", "type": ["null","float"], "doc": "rain or snow volume for the last 3 hours (mm)"}, + {"name": "condition", "type": { + "name": "WeatherCondition", + "type": "enum", + "doc": "types of weather condition", + "symbols": ["CLEAR", "CLOUDY", "DRIZZLE", "RAINY", "SNOWY", "ICY", "FOGGY", "STORM", "THUNDER", "OTHER"] + }, + "doc": "current weather condition"}, + {"name": "source", "type": "string", "doc": "from which source/API the weather data was retrieved"}, + {"name": "locationSource", "type": { + "name": "LocationType", + "type": "enum", + "doc": "how the location was determined", + "symbols": ["GPS","NETWORK","CITY_NAME","OTHER"] + }, + "doc": "the source of the location used to get the weather details"} + ] +} diff --git a/java-sdk/build.gradle b/java-sdk/build.gradle index 6b7479ef..69744193 100644 --- a/java-sdk/build.gradle +++ b/java-sdk/build.gradle @@ -15,7 +15,7 @@ subprojects { apply plugin: 'maven-publish' // Configuration - version = '0.2-alpha.2-SNAPSHOT' + version = '0.2-alpha.3-SNAPSHOT' group = 'org.radarcns' ext.githubRepoName = 'RADAR-CNS/RADAR-Schemas' From 8ac0c0e132f2743931b6c4d435ea35caf5f4f74c Mon Sep 17 00:00:00 2001 From: Maxim Moinat Date: Fri, 8 Sep 2017 11:19:33 +0200 Subject: [PATCH 052/112] added precipitation period, unknown weather condition and sunset/sunrise in minutes --- commons/weather/weather_current.avsc | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/commons/weather/weather_current.avsc b/commons/weather/weather_current.avsc index 77b243e7..4e7b7f2f 100644 --- a/commons/weather/weather_current.avsc +++ b/commons/weather/weather_current.avsc @@ -2,22 +2,24 @@ "namespace": "org.radarcns.weather", "type": "record", "name": "WeatherCurrent", - "doc": "Weather information at the time reported.", + "doc": "Current weather information at the location of the user.", "fields": [ {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "sunrise", "type": "double", "doc": "sunrise time in hours after midnight (h). The difference with sunset is the hours of daylight."}, - {"name": "sunset", "type": "double", "doc": "sunset time in hours after midnight (h). The difference with sunrise is the hours of daylight."}, - {"name": "temperature", "type": ["null","float"], "doc": "current ambient temperature (C)"}, - {"name": "pressure", "type": ["null","float"], "doc": "current atmospheric pressure on sea level (hPa)"}, - {"name": "humidity", "type": ["null","float"], "doc": "current humidity (%)"}, - {"name": "cloudiness", "type": ["null","float"], "doc": "current cloudiness (%)"}, - {"name": "precipitation3h", "type": ["null","float"], "doc": "rain or snow volume for the last 3 hours (mm)"}, + {"name": "sunrise", "type": ["null","int"], "doc": "sunrise time of day in minutes after midnight. The difference with sunset is the minutes of daylight.", "default": null}, + {"name": "sunset", "type": ["null","int"], "doc": "sunset time of day in minutes after midnight. The difference with sunrise is the minutes of daylight.", "default": null}, + {"name": "temperature", "type": ["null","float"], "doc": "current ambient temperature (C)", "default": null}, + {"name": "pressure", "type": ["null","float"], "doc": "current atmospheric pressure on sea level (hPa)", "default": null}, + {"name": "humidity", "type": ["null","float"], "doc": "current humidity (%)", "default": null}, + {"name": "cloudiness", "type": ["null","float"], "doc": "current cloudiness (%)", "default": null}, + {"name": "precipitation", "type": ["null","float"], "doc": "rain or snow volume over last hours reported in 'percipitationPeriod' (mm)", "default": null}, + {"name": "precipitationPeriod", "type": ["null","int"], "doc": "period over which the precipitation was determined (h)", "default": null}, {"name": "condition", "type": { "name": "WeatherCondition", "type": "enum", "doc": "types of weather condition", - "symbols": ["CLEAR", "CLOUDY", "DRIZZLE", "RAINY", "SNOWY", "ICY", "FOGGY", "STORM", "THUNDER", "OTHER"] + "symbols": ["CLEAR", "CLOUDY", "DRIZZLE", "RAINY", "SNOWY", "ICY", "FOGGY", "STORM", "THUNDER", "OTHER", "UNKNOWN"], + "default": "UNKNOWN" }, "doc": "current weather condition"}, {"name": "source", "type": "string", "doc": "from which source/API the weather data was retrieved"}, @@ -25,7 +27,8 @@ "name": "LocationType", "type": "enum", "doc": "how the location was determined", - "symbols": ["GPS","NETWORK","CITY_NAME","OTHER"] + "symbols": ["GPS","NETWORK","CITY_NAME","OTHER", "UNKNOWN"], + "default": "UNKNOWN" }, "doc": "the source of the location used to get the weather details"} ] From f9427e362e3447ec6c0ba7f17563752e6d3b1b5a Mon Sep 17 00:00:00 2001 From: Maxim Moinat Date: Fri, 8 Sep 2017 14:39:59 +0200 Subject: [PATCH 053/112] default weather condition and source fix --- commons/weather/weather_current.avsc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/commons/weather/weather_current.avsc b/commons/weather/weather_current.avsc index 4e7b7f2f..0cc27454 100644 --- a/commons/weather/weather_current.avsc +++ b/commons/weather/weather_current.avsc @@ -18,18 +18,18 @@ "name": "WeatherCondition", "type": "enum", "doc": "types of weather condition", - "symbols": ["CLEAR", "CLOUDY", "DRIZZLE", "RAINY", "SNOWY", "ICY", "FOGGY", "STORM", "THUNDER", "OTHER", "UNKNOWN"], - "default": "UNKNOWN" + "symbols": ["CLEAR", "CLOUDY", "DRIZZLE", "RAINY", "SNOWY", "ICY", "FOGGY", "STORM", "THUNDER", "OTHER", "UNKNOWN"] }, - "doc": "current weather condition"}, + "default": "UNKNOWN", + "doc": "current weather condition"}, {"name": "source", "type": "string", "doc": "from which source/API the weather data was retrieved"}, {"name": "locationSource", "type": { "name": "LocationType", "type": "enum", "doc": "how the location was determined", - "symbols": ["GPS","NETWORK","CITY_NAME","OTHER", "UNKNOWN"], - "default": "UNKNOWN" + "symbols": ["GPS","NETWORK","CITY_NAME","OTHER", "UNKNOWN"] }, + "default": "UNKNOWN", "doc": "the source of the location used to get the weather details"} ] } From a38b17b8c9343606eb2570fe7c730c83ea5f2d5f Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Fri, 8 Sep 2017 14:44:26 +0200 Subject: [PATCH 054/112] Only include subdependencies that are used in our SDK --- java-sdk/build.gradle | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/java-sdk/build.gradle b/java-sdk/build.gradle index 6b7479ef..af361d87 100644 --- a/java-sdk/build.gradle +++ b/java-sdk/build.gradle @@ -34,7 +34,12 @@ subprojects { } dependencies { - api group: 'org.apache.avro', name: 'avro', version: avroVersion + api (group: 'org.apache.avro', name: 'avro', version: avroVersion) { + exclude group: 'org.xerial.snappy', module: 'snappy-java' + exclude group: 'com.thoughtworks.paranamer', module: 'paranamer' + exclude group: 'org.apache.commons', module: 'commons-compress' + exclude group: 'org.tukaani', module: 'xz' + } } // publishing From 98ce459d2cdca663648802ac4b02f84edb1fdad4 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Tue, 12 Sep 2017 11:20:56 +0200 Subject: [PATCH 055/112] Refactored schema checker --- README.md | 4 +- .../radar-schemas-specifications/build.gradle | 4 +- .../specifications/CommandLineApp.java | 22 +- .../specifications/source/Aggregatable.java | 2 +- .../specifications/source/KafkaActor.java | 58 ++-- .../specifications/source/Source.java | 22 +- .../radarcns/specifications/source/Topic.java | 40 +-- .../source/passive/MonitorSource.java | 18 +- .../source/passive/PassiveSource.java | 2 +- .../source/passive/Processor.java | 18 +- .../specifications/source/passive/Sensor.java | 47 ++- .../radarcns/specifications/util/Labels.java | 2 +- .../specifications/validator/Invalid.java | 12 +- .../validator/MonitorRoles.java | 8 +- .../validator/ProcessorRoles.java | 6 +- .../specifications/validator/SensorRoles.java | 4 +- .../specifications/validator/TopicRoles.java | 2 +- .../specifications/value/Utility.java | 8 +- .../value/monitor/ExternalTimeTest.java | 6 +- .../value/monitor/RecordCountsTest.java | 6 +- .../value/monitor/ServerStatusTest.java | 6 +- .../value/monitor/UptimeTest.java | 4 +- .../value/passive/EmpaticaE4Test.java | 6 +- java-sdk/radar-schemas-validator/build.gradle | 8 +- .../java/org/radarcns/validator}/Invalid.java | 12 +- .../radarcns/validator/SchemaRepository.java | 55 ++++ .../validator}/SchemaValidationRoles.java | 195 ++++++------- .../radarcns/validator/SchemaValidator.java | 106 +++++++ .../java/org/radarcns/validator/Scope.java | 40 +++ .../validator/SpecificationsValidator.java | 48 ++++ .../radarcns/validator}/ValidationResult.java | 2 +- .../validator}/ValidationSupport.java | 77 +++-- .../validator/config/ConfigItem.java} | 27 +- .../validator/config/ExcludeConfig.java | 214 ++++++++++++++ .../org/radarcns/validator/AvroValidator.java | 88 ++++++ .../radarcns/validator/CommonsValidator.java | 86 ------ .../radarcns/validator/ExcludeConfigTest.java | 84 ++++++ .../validator/SchemaCatalogValidator.java | 201 ------------- .../{util => }/SchemaValidationRolesTest.java | 119 ++++---- .../validator/SchemaValidatorTest.java | 76 +++++ .../validator/SpecificationsValidator.java | 96 ------- .../SpecificationsValidatorTest.java | 33 +++ .../radarcns/validator/config/SkipConfig.java | 268 ------------------ .../validator/config/SkipConfigTest.java | 108 ------- .../validator/util/AvroValidator.java | 140 --------- .../validator/util/SchemaValidator.java | 205 -------------- .../validator/util/SchemaValidatorTest.java | 124 -------- .../src/test/resources/skip.yml | 81 ------ 48 files changed, 1101 insertions(+), 1699 deletions(-) rename java-sdk/radar-schemas-validator/src/{test/java/org/radarcns/validator/util => main/java/org/radarcns/validator}/Invalid.java (78%) create mode 100644 java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/SchemaRepository.java rename java-sdk/radar-schemas-validator/src/{test/java/org/radarcns/validator/util => main/java/org/radarcns/validator}/SchemaValidationRoles.java (69%) create mode 100644 java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/SchemaValidator.java create mode 100644 java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/Scope.java create mode 100644 java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/SpecificationsValidator.java rename java-sdk/radar-schemas-validator/src/{test/java/org/radarcns/validator/util => main/java/org/radarcns/validator}/ValidationResult.java (96%) rename java-sdk/radar-schemas-validator/src/{test/java/org/radarcns/validator/util => main/java/org/radarcns/validator}/ValidationSupport.java (71%) rename java-sdk/radar-schemas-validator/src/{test/java/org/radarcns/validator/config/SkipConfigItem.java => main/java/org/radarcns/validator/config/ConfigItem.java} (76%) create mode 100644 java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/config/ExcludeConfig.java create mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/AvroValidator.java delete mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java create mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/ExcludeConfigTest.java delete mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaCatalogValidator.java rename java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/{util => }/SchemaValidationRolesTest.java (88%) create mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaValidatorTest.java delete mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SpecificationsValidator.java create mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SpecificationsValidatorTest.java delete mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfig.java delete mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfigTest.java delete mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java delete mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java delete mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java diff --git a/README.md b/README.md index d5316ad4..596cc3e9 100644 --- a/README.md +++ b/README.md @@ -19,11 +19,9 @@ In addition, schemas in the `commons` directory should follow the following guid - Prefer a categorical specification (an Avro enum) over a free string. This disambiguates the possible values for analysis. - Prefer a flat record over a hierarchical record. This simplifies the organization of the data downstream, for example, when mapping to CSV. - Prefer written out fields to arrays. This simplifies the organization of the data downstream, for example, when mapping to CSV. -- Give each schema a proper namespace, preferably `org.radarcns.deviceproducer` fully in lowercase, without any numbers, uppercase letters or symbols (except `.`). For the Empatica E4, the producer is Empatica, so the namespace is `org.radarcns.empatica`. For generic types, like a phone, Android Wear device or Android application, the namespace could just be `org.radarcns.phone`, `org.radarcns.wear`, or `org.radarcns.application`. +- Give each schema a proper namespace, preferably `org.radarcns.` fully in lowercase, without any numbers, uppercase letters or symbols (except `.`). For the Empatica E4, the vendor is Empatica, so the namespace is `org.radarcns.empatica`. For generic types, like a phone, Android Wear device or Android application, the namespace could just be `org.radarcns.phone`, `org.radarcns.wear`, or `org.radarcns.application`. - In the schema name, use upper camel case and name the device explicitly (for example, `EmpaticaE4Temperature`). ### Validation phase Avro schemas are automatically validated against RADAR-CNS guide lines while building. Record Name and field name validations can be suppressed configuring [skip.yml](java-sdk/radar-schemas-validator/src/test/resources/skip.yml). For more details, check [catalog validator](java-sdk/radar-schemas-validator). - - diff --git a/java-sdk/radar-schemas-specifications/build.gradle b/java-sdk/radar-schemas-specifications/build.gradle index e3e3869b..cc9c1a90 100644 --- a/java-sdk/radar-schemas-specifications/build.gradle +++ b/java-sdk/radar-schemas-specifications/build.gradle @@ -16,7 +16,6 @@ idea { } } -ext.apacheCommonsVersion = '3.6' ext.kafkaVersion = '0.10.2.1' ext.jacksonModuleParameterNamesVersion = '2.9.0' ext.junitVersion = '4.12' @@ -27,7 +26,6 @@ dependencies { implementation project(':radar-schemas-commons') implementation group: 'org.radarcns', name: 'radar-commons', version: radarCommonsVersion - implementation group: 'org.apache.commons', name: 'commons-lang3', version: apacheCommonsVersion testCompile group: 'junit', name: 'junit', version: junitVersion testCompile group: 'org.slf4j', name: 'slf4j-simple', version: slf4jVersion @@ -50,7 +48,7 @@ dependencies { ext.exchnageConfigMainPath = 'src/main/resources/exchange.properties' task exchangeConfig() { doLast { - if (file(exchnageConfigMainPath).delete()) { + if (!file(exchnageConfigMainPath).exists() || file(exchnageConfigMainPath).delete()) { file(exchnageConfigMainPath).createNewFile() file(exchnageConfigMainPath).write("project.group=${project.group}") } else { diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/CommandLineApp.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/CommandLineApp.java index 2470ac3f..b8f56fee 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/CommandLineApp.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/CommandLineApp.java @@ -49,12 +49,10 @@ public static Set getTopicsToCreate() { for (Topic topic : getAllTopics()) { set.add(topic.getInputTopic()); - if (topic.isAggregatable()) { + if (topic.hasAggregator()) { topic.getOutputTopics().stream() .map(TopicMetadata::getOutput) - .forEach(output -> set.add(output)); - } else { - set.add(topic.getInputTopic()); + .forEach(set::add); } } @@ -83,10 +81,10 @@ public static Set getResultsCacheTopics() { Set set = new HashSet<>(); for (Topic topic : getAllTopics()) { - if (topic.isAggregatable()) { + if (topic.hasAggregator()) { topic.getOutputTopics().stream() .map(TopicMetadata::getOutput) - .forEach(output -> set.add(output)); + .forEach(set::add); } else { set.add(topic.getInputTopic()); } @@ -100,24 +98,24 @@ private static Set getAllTopics() { SourceCatalogue.getActiveSources().values().stream() .map(QuestionnaireSource::getTopic) - .forEach(topic -> set.add(topic)); + .forEach(set::add); SourceCatalogue.getMonitorSources().values().stream() .map(MonitorSource::getKafkaActor) .map(KafkaActor::getTopic) - .forEach(topic -> set.add(topic)); + .forEach(set::add); SourceCatalogue.getPassiveSources().values().stream() .map(PassiveSource::getSensors) .flatMap(Set::stream) .map(Sensor::getTopic) - .forEach(topic -> set.add(topic)); + .forEach(set::add); SourceCatalogue.getPassiveSources().values().stream() .map(PassiveSource::getProcessors) .flatMap(Set::stream) .map(Processor::getTopic) - .forEach(topic -> set.add(topic)); + .forEach(set::add); return set; } @@ -169,7 +167,7 @@ private static Map> getTopicsInfoVerbose(boolean red details = new HashMap<>(); for (MonitorSource source : SourceCatalogue.getMonitorSources().values()) { - details.put(source.getType().name(), + details.put(source.getType(), source.getKafkaActor().getTopic().toString(reduced)); } map.put(NameFolder.MONITOR.getName().toUpperCase(), details); @@ -180,7 +178,7 @@ private static Map> getTopicsInfoVerbose(boolean red details.put(sensor.getName().name(), sensor.getTopic().toString(reduced)); } for (Processor proc : source.getProcessors()) { - details.put(proc.getName().name(), proc.getTopic().toString(reduced)); + details.put(proc.getName(), proc.getTopic().toString(reduced)); } map.put(source.getType().name(), details); } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Aggregatable.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Aggregatable.java index b8e7be91..016f5f3d 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Aggregatable.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Aggregatable.java @@ -24,7 +24,7 @@ */ public interface Aggregatable { - boolean isAggregatable(); + boolean hasAggregator(); String getAggregator(); diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/KafkaActor.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/KafkaActor.java index bd4ac526..c5f8eb60 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/KafkaActor.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/KafkaActor.java @@ -16,25 +16,22 @@ * limitations under the License. */ -import static org.radarcns.specifications.util.Labels.DATA_TYPE; -import static org.radarcns.specifications.util.Labels.SAMPLE_RATE; -import static org.radarcns.specifications.util.Labels.TOPIC; -import static org.radarcns.specifications.util.Labels.UNIT; - -import java.util.Objects; -import org.apache.commons.lang3.builder.EqualsBuilder; -import org.apache.commons.lang3.builder.HashCodeBuilder; import org.radarcns.catalogue.DataType; -import org.radarcns.catalogue.Unit; import org.radarcns.specifications.source.passive.Sensor; +import java.util.Objects; + +import static org.radarcns.specifications.util.Labels.PROCESSING_STATE; +import static org.radarcns.specifications.util.Labels.TOPIC; +import static org.radarcns.specifications.util.Labels.UNIT; + public class KafkaActor { private final String doc; private final double sampleRate; - private final Unit unit; + private final String unit; private final DataType dataType; @@ -43,10 +40,8 @@ public class KafkaActor { private static final String NULL_MESSAGE = " in ".concat( Sensor.class.getName()).concat(" cannot be null."); - public KafkaActor(String doc, double sampleRate, Unit unit, DataType dataType, Topic topic) { - - Objects.requireNonNull(dataType, DATA_TYPE.concat(NULL_MESSAGE)); - Objects.requireNonNull(sampleRate, SAMPLE_RATE.concat(NULL_MESSAGE)); + public KafkaActor(String doc, double sampleRate, String unit, DataType dataType, Topic topic) { + Objects.requireNonNull(dataType, PROCESSING_STATE.concat(NULL_MESSAGE)); Objects.requireNonNull(topic, TOPIC.concat(NULL_MESSAGE)); Objects.requireNonNull(unit, UNIT.concat(NULL_MESSAGE)); @@ -65,11 +60,11 @@ public double getSampleRate() { return sampleRate; } - public Unit getUnit() { + public String getUnit() { return unit; } - public DataType getDataType() { + public DataType getProcessingState() { return dataType; } @@ -79,33 +74,18 @@ public Topic getTopic() { @Override public boolean equals(Object o) { - if (this == o) { - return true; - } - - if (!(o instanceof KafkaActor)) { - return false; - } - + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; KafkaActor that = (KafkaActor) o; - - return new EqualsBuilder() - .append(sampleRate, that.sampleRate) - .append(doc, that.doc) - .append(unit, that.unit) - .append(dataType, that.dataType) - .append(topic, that.topic) - .isEquals(); + return Double.compare(that.sampleRate, sampleRate) == 0 && + Objects.equals(doc, that.doc) && + Objects.equals(unit, that.unit) && + dataType == that.dataType && + Objects.equals(topic, that.topic); } @Override public int hashCode() { - return new HashCodeBuilder(17, 37) - .append(doc) - .append(sampleRate) - .append(unit) - .append(dataType) - .append(topic) - .toHashCode(); + return Objects.hash(doc, sampleRate, unit, dataType, topic); } } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Source.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Source.java index 3cad56ea..821d057f 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Source.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Source.java @@ -16,20 +16,16 @@ * limitations under the License. */ -import static org.radarcns.specifications.util.Labels.NAME; - import java.util.Objects; import java.util.Set; -import org.apache.commons.lang3.builder.EqualsBuilder; -import org.apache.commons.lang3.builder.HashCodeBuilder; + +import static org.radarcns.specifications.util.Labels.NAME; /** * TODO. */ public abstract class Source { - private final String name; - private final String doc; /** @@ -63,22 +59,16 @@ public boolean equals(Object o) { if (this == o) { return true; } - - if (!(o instanceof Source)) { + if (o == null || getClass() != o.getClass()) { return false; } - Source source = (Source) o; - - return new EqualsBuilder() - .append(name, source.name) - .isEquals(); + return Objects.equals(name, source.name) && + Objects.equals(doc, source.doc); } @Override public int hashCode() { - return new HashCodeBuilder(17, 37) - .append(name) - .toHashCode(); + return Objects.hash(name, doc); } } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Topic.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Topic.java index ae52915f..8f7b3154 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Topic.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Topic.java @@ -16,15 +16,14 @@ * limitations under the License. */ +import org.radarcns.catalogue.TimeFrame; +import org.radarcns.specifications.util.Utils; + import java.util.HashSet; import java.util.Objects; import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -import org.apache.commons.lang3.builder.EqualsBuilder; -import org.apache.commons.lang3.builder.HashCodeBuilder; -import org.radarcns.catalogue.TimeFrame; -import org.radarcns.specifications.util.Utils; /** * TODO. @@ -169,7 +168,7 @@ public Set getOutputTopics() { } @Override - public boolean isAggregatable() { + public boolean hasAggregator() { return Objects.nonNull(aggregator); } @@ -202,7 +201,7 @@ public Set getTopicNames() { Set names = new HashSet<>(); names.add(inputTopic); - if (isAggregatable()) { + if (hasAggregator()) { for (TopicMetadata metadata : output) { names.add(metadata.getStateStore()); names.add(metadata.getOutput()); @@ -217,36 +216,23 @@ public boolean equals(Object o) { if (this == o) { return true; } - - if (!(o instanceof Topic)) { + if (o == null || getClass() != o.getClass()) { return false; } - Topic topic = (Topic) o; - - return new EqualsBuilder() - .append(inputTopic, topic.inputTopic) - .append(inputKey, topic.inputKey) - .append(inputValue, topic.inputValue) - .append(aggregator, topic.aggregator) - .append(baseOutput, topic.baseOutput) - .append(output, topic.output) - .isEquals(); + return Objects.equals(inputTopic, topic.inputTopic) && + Objects.equals(inputKey, topic.inputKey) && + Objects.equals(inputValue, topic.inputValue) && + Objects.equals(aggregator, topic.aggregator) && + Objects.equals(baseOutput, topic.baseOutput) && + Objects.equals(output, topic.output); } @Override public int hashCode() { - return new HashCodeBuilder(17, 37) - .append(inputTopic) - .append(inputKey) - .append(inputValue) - .append(aggregator) - .append(baseOutput) - .append(output) - .toHashCode(); + return Objects.hash(inputTopic, inputKey, inputValue, aggregator, baseOutput, output); } - public String toString(boolean reduced) { String result = "inputTopic: " + inputTopic + '\n' + "inputKey: " + inputKey + '\n' diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/MonitorSource.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/MonitorSource.java index 1613613b..f455495f 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/MonitorSource.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/MonitorSource.java @@ -18,7 +18,7 @@ import static org.radarcns.specifications.util.Labels.AGGREGATOR; import static org.radarcns.specifications.util.Labels.APP_PROVIDER; -import static org.radarcns.specifications.util.Labels.DATA_TYPE; +import static org.radarcns.specifications.util.Labels.PROCESSING_STATE; import static org.radarcns.specifications.util.Labels.DOC; import static org.radarcns.specifications.util.Labels.KEY; import static org.radarcns.specifications.util.Labels.NAME; @@ -32,8 +32,6 @@ import java.util.Objects; import java.util.Set; import org.radarcns.catalogue.DataType; -import org.radarcns.catalogue.MonitorSourceType; -import org.radarcns.catalogue.Unit; import org.radarcns.specifications.source.KafkaActor; import org.radarcns.specifications.source.Source; import org.radarcns.specifications.source.Topic; @@ -44,10 +42,8 @@ */ public class MonitorSource extends Source { - private final MonitorSourceType type; - + private final String type; private final String appProvider; - private final KafkaActor kafkaActor; private static final String NULL_MESSAGE = " in ".concat( @@ -69,17 +65,17 @@ public class MonitorSource extends Source { */ @JsonCreator public MonitorSource( - @JsonProperty(NAME) MonitorSourceType name, + @JsonProperty(NAME) String name, @JsonProperty(APP_PROVIDER) String appProvider, @JsonProperty(DOC) String doc, @JsonProperty(SAMPLE_RATE) double sampleRate, - @JsonProperty(UNIT) Unit unit, - @JsonProperty(DATA_TYPE) DataType dataType, + @JsonProperty(UNIT) String unit, + @JsonProperty(PROCESSING_STATE) DataType dataType, @JsonProperty(TOPIC) String topic, @JsonProperty(KEY) String key, @JsonProperty(VALUE) String value, @JsonProperty(AGGREGATOR) String aggregator) { - super(name.name(), doc); + super(name, doc); Objects.requireNonNull(appProvider, APP_PROVIDER.concat(NULL_MESSAGE)); @@ -90,7 +86,7 @@ public MonitorSource( new Topic(topic, key, value, aggregator, null)); } - public MonitorSourceType getType() { + public String getType() { return type; } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/PassiveSource.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/PassiveSource.java index c9b58c7c..326c89e4 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/PassiveSource.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/PassiveSource.java @@ -151,7 +151,7 @@ public Set getProcessors() { */ public Processor getProcessor(SensorName name) { for (Processor processor : processors) { - if (processor.getName().name().equals(name.name())) { + if (processor.getName().equals(name.name())) { return processor; } } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Processor.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Processor.java index 2ee939f3..f7de9de6 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Processor.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Processor.java @@ -18,7 +18,7 @@ import static org.radarcns.specifications.util.Labels.AGGREGATOR; import static org.radarcns.specifications.util.Labels.BASE_OUTPUT_TOPIC; -import static org.radarcns.specifications.util.Labels.DATA_TYPE; +import static org.radarcns.specifications.util.Labels.PROCESSING_STATE; import static org.radarcns.specifications.util.Labels.DOC; import static org.radarcns.specifications.util.Labels.INPUT_KEY; import static org.radarcns.specifications.util.Labels.INPUT_TOPIC; @@ -41,10 +41,10 @@ */ public class Processor extends KafkaActor { - private final SensorName name; + private final String name; - private static final String NULL_MESSAGE = " in ".concat( - Processor.class.getName()).concat(" cannot be null."); + private static final String NULL_MESSAGE = " in " + + Processor.class.getName() + " cannot be null."; /** * TODO. @@ -61,11 +61,11 @@ public class Processor extends KafkaActor { */ @JsonCreator public Processor( - @JsonProperty(NAME) SensorName name, + @JsonProperty(NAME) String name, @JsonProperty(DOC) String doc, @JsonProperty(SAMPLE_RATE) double sampleRate, - @JsonProperty(UNIT) Unit unit, - @JsonProperty(DATA_TYPE) DataType dataType, + @JsonProperty(UNIT) String unit, + @JsonProperty(PROCESSING_STATE) DataType dataType, @JsonProperty(INPUT_TOPIC) String inputTopic, @JsonProperty(INPUT_KEY) String inputKey, @JsonProperty(INPUT_VALUE) String inputValue, @@ -75,12 +75,12 @@ public Processor( new Topic(inputTopic, inputKey, inputValue, aggregator, baseOutputTopic)); Objects.requireNonNull(baseOutputTopic, BASE_OUTPUT_TOPIC.concat(NULL_MESSAGE)); - Objects.requireNonNull(name, NAME.concat(NULL_MESSAGE)); + Objects.requireNonNull(name, NAME + NULL_MESSAGE); this.name = name; } - public SensorName getName() { + public String getName() { return name; } } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Sensor.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Sensor.java index 9832b78c..bf8d8113 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Sensor.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Sensor.java @@ -16,9 +16,20 @@ * limitations under the License. */ +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.radarcns.catalogue.DataType; +import org.radarcns.catalogue.SensorName; +import org.radarcns.catalogue.Unit; +import org.radarcns.specifications.source.KafkaActor; +import org.radarcns.specifications.source.Topic; +import org.radarcns.specifications.util.Utils; + +import java.util.Objects; + import static org.radarcns.specifications.util.Labels.AGGREGATOR; import static org.radarcns.specifications.util.Labels.APP_PROVIDER; -import static org.radarcns.specifications.util.Labels.DATA_TYPE; +import static org.radarcns.specifications.util.Labels.PROCESSING_STATE; import static org.radarcns.specifications.util.Labels.DOC; import static org.radarcns.specifications.util.Labels.KEY; import static org.radarcns.specifications.util.Labels.NAME; @@ -27,25 +38,12 @@ import static org.radarcns.specifications.util.Labels.UNIT; import static org.radarcns.specifications.util.Labels.VALUE; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.Objects; -import org.apache.commons.lang3.builder.EqualsBuilder; -import org.apache.commons.lang3.builder.HashCodeBuilder; -import org.radarcns.catalogue.DataType; -import org.radarcns.catalogue.SensorName; -import org.radarcns.catalogue.Unit; -import org.radarcns.specifications.source.KafkaActor; -import org.radarcns.specifications.source.Topic; -import org.radarcns.specifications.util.Utils; - /** * TODO. */ public class Sensor extends KafkaActor { private final SensorName name; - private final String appProvider; private static final String NULL_MESSAGE = " in ".concat( @@ -70,8 +68,8 @@ public Sensor( @JsonProperty(APP_PROVIDER) String appProvider, @JsonProperty(DOC) String doc, @JsonProperty(SAMPLE_RATE) double sampleRate, - @JsonProperty(UNIT) Unit unit, - @JsonProperty(DATA_TYPE) DataType dataType, + @JsonProperty(UNIT) String unit, + @JsonProperty(PROCESSING_STATE) DataType dataType, @JsonProperty(TOPIC) String topic, @JsonProperty(KEY) String key, @JsonProperty(VALUE) String value, @@ -99,24 +97,17 @@ public boolean equals(Object o) { if (this == o) { return true; } - - if (!(o instanceof Sensor)) { + if (o == null || getClass() != o.getClass()) { return false; } - + if (!super.equals(o)) return false; Sensor sensor = (Sensor) o; - - return new EqualsBuilder() - .appendSuper(super.equals(o)) - .append(appProvider, sensor.appProvider) - .isEquals(); + return name == sensor.name && + Objects.equals(appProvider, sensor.appProvider); } @Override public int hashCode() { - return new HashCodeBuilder(17, 37) - .appendSuper(super.hashCode()) - .append(appProvider) - .toHashCode(); + return Objects.hash(super.hashCode(), name, appProvider); } } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Labels.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Labels.java index 33e2f49d..e3eface4 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Labels.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Labels.java @@ -26,7 +26,7 @@ public final class Labels { public static final String ASSESSMENT_TYPE = "assessment_type"; public static final String CONTENT = "content"; public static final String BASE_OUTPUT_TOPIC = "base_output_topic"; - public static final String DATA_TYPE = "data_type"; + public static final String PROCESSING_STATE = "processing_state"; public static final String DOC = "doc"; public static final String KEY = "key"; public static final String INPUT_KEY = "input_key"; diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Invalid.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Invalid.java index eb3213c7..5e306ecc 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Invalid.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Invalid.java @@ -16,6 +16,7 @@ * limitations under the License. */ +import java.util.Objects; import java.util.Optional; /** @@ -42,20 +43,15 @@ public boolean equals(Object o) { if (this == o) { return true; } - - if (!(o instanceof Invalid)) { + if (o == null || getClass() != o.getClass()) { return false; } - Invalid invalid = (Invalid) o; - - return new org.apache.commons.lang3.builder.EqualsBuilder().append( - reason, invalid.reason).isEquals(); + return Objects.equals(reason, invalid.reason); } @Override public int hashCode() { - return new org.apache.commons.lang3.builder.HashCodeBuilder( - 17, 37).append(reason).toHashCode(); + return Objects.hash(reason); } } diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/MonitorRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/MonitorRoles.java index 3b76715d..2707e965 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/MonitorRoles.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/MonitorRoles.java @@ -93,9 +93,9 @@ && allowedProvider().contains(monitor.getAppProvider()) ? * @return TODO */ static GenericRoles validateDataType() { - return monitor -> /*Objects.nonNull(monitor.getDataType()) - && monitor.getDataType().name().equals(DataType.RAW.name())*/ - false ? valid() : invalid(MonitorInfo.DATA_TYPE.getMessage()); + return monitor -> /*Objects.nonNull(monitor.getProcessingState()) + && monitor.getProcessingState().name().equals(DataType.RAW.name())*/ + invalid(MonitorInfo.DATA_TYPE.getMessage()); } /** @@ -105,7 +105,7 @@ static GenericRoles validateDataType() { */ static GenericRoles validateSourceType(File file) { return monitor -> Objects.nonNull(monitor.getType()) - && removeExtension(file, YAML_EXTENSION).equalsIgnoreCase(monitor.getType().name()) + && removeExtension(file, YAML_EXTENSION).equalsIgnoreCase(monitor.getType()) ? valid() : invalid(MonitorInfo.SOURCE_TYPE.getMessage()); } } diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ProcessorRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ProcessorRoles.java index 1c83258f..a06ad25c 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ProcessorRoles.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ProcessorRoles.java @@ -57,8 +57,8 @@ public String getMessage(String info) { * @return TODO */ static GenericRoles validateDataType() { - return processor -> Objects.nonNull(processor.getDataType()) - && processor.getDataType().name().equals(DataType.RADAR.name()) + return processor -> Objects.nonNull(processor.getProcessingState()) + && processor.getProcessingState().name().equals(DataType.RADAR.name()) ? valid() : invalid(ProcessorInfo.DATA_TYPE.getMessage()); } @@ -68,7 +68,7 @@ static GenericRoles validateDataType() { */ static GenericRoles validateName() { return processor -> Objects.nonNull(processor.getName()) - && !processor.getName().name().equals(SensorName.UNKNOWN.name()) + && !processor.getName().equals(SensorName.UNKNOWN.name()) ? valid() : invalid(ProcessorInfo.NAME.getMessage()); } diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/SensorRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/SensorRoles.java index b14be9c6..6f5909f7 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/SensorRoles.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/SensorRoles.java @@ -71,8 +71,8 @@ static GenericRoles validateAppProvider() { * @return TODO */ static GenericRoles validateDataType() { - return sensor -> Objects.nonNull(sensor.getDataType()) - && !sensor.getDataType().name().equals(DataType.UNKNOWN.name()) + return sensor -> Objects.nonNull(sensor.getProcessingState()) + && !sensor.getProcessingState().name().equals(DataType.UNKNOWN.name()) ? valid() : invalid(SensorInfo.DATA_TYPE.getMessage()); } diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/TopicRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/TopicRoles.java index 1731c9a0..faff9d34 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/TopicRoles.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/TopicRoles.java @@ -59,7 +59,7 @@ public String getMessage(String info) { } //public String getInputTopic() - //public boolean isAggregatable() + //public boolean hasAggregator() //public String getAggregator() //public Set getOutput() //public Set getTopicNames() diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/Utility.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/Utility.java index 94b0b6c8..15f08544 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/Utility.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/Utility.java @@ -47,10 +47,10 @@ public class Utility { private static boolean testGenericTopic(String inputTopic, String key, String value, String aggregator, Topic topic) { if (Objects.isNull(aggregator)) { - assertFalse(topic.isAggregatable()); + assertFalse(topic.hasAggregator()); assertNull(topic.getAggregator()); } else { - assertTrue(topic.isAggregatable()); + assertTrue(topic.hasAggregator()); assertEquals(aggregator, topic.getAggregator()); } @@ -186,11 +186,11 @@ private static boolean testBasicSensor(Sensor sensor, String appProvider, String inputTopic, SensorName sensorName, DataType dataType, Unit unit, double sampleRate) { assertEquals(appProvider, sensor.getAppProvider()); - assertEquals(dataType.name(), sensor.getDataType().name()); + assertEquals(dataType.name(), sensor.getProcessingState().name()); //sensor.getDoc() assertEquals(sensorName.name(), sensor.getName().name()); assertEquals(sampleRate, sensor.getSampleRate(), 0); - assertEquals(unit.name(), sensor.getUnit().name()); + assertEquals(unit.name(), sensor.getUnit()); return true; } diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/ExternalTimeTest.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/ExternalTimeTest.java index b6a91dd9..a14cf82d 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/ExternalTimeTest.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/ExternalTimeTest.java @@ -47,10 +47,10 @@ public void validate() { KafkaActor actor = externalTime.getKafkaActor(); - assertEquals(DataType.RAW.name(), actor.getDataType().name()); + assertEquals(DataType.RAW.name(), actor.getProcessingState().name()); assertEquals(0.08, actor.getSampleRate(), 0.0); - assertEquals(MonitorSourceType.EXTERNAL_TIME.name(), externalTime.getType().name()); - assertEquals(Unit.NON_DIMENSIONAL, actor.getUnit()); + assertEquals(MonitorSourceType.EXTERNAL_TIME.name(), externalTime.getType()); + assertEquals(Unit.NON_DIMENSIONAL.name(), actor.getUnit()); testTopicNonAggregatable("application_external_time", "org.radarcns.kafka.key.KeyMeasurement", diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/RecordCountsTest.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/RecordCountsTest.java index 8ec874e7..52e56fba 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/RecordCountsTest.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/RecordCountsTest.java @@ -47,10 +47,10 @@ public void validate() { KafkaActor actor = recordCounts.getKafkaActor(); - assertEquals(DataType.RAW.name(), actor.getDataType().name()); + assertEquals(DataType.RAW.name(), actor.getProcessingState().name()); assertEquals(0.08, actor.getSampleRate(), 0.0); - assertEquals(MonitorSourceType.RECORD_COUNTS.name(), recordCounts.getType().name()); - assertEquals(Unit.NON_DIMENSIONAL, actor.getUnit()); + assertEquals(MonitorSourceType.RECORD_COUNTS.name(), recordCounts.getType()); + assertEquals(Unit.NON_DIMENSIONAL.name(), actor.getUnit()); testTopicNonAggregatable("application_record_counts", "org.radarcns.kafka.key.KeyMeasurement", diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/ServerStatusTest.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/ServerStatusTest.java index 226ff2ec..a4f2484c 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/ServerStatusTest.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/ServerStatusTest.java @@ -47,10 +47,10 @@ public void validate() { KafkaActor actor = serverStatus.getKafkaActor(); - assertEquals(DataType.RAW.name(), actor.getDataType().name()); + assertEquals(DataType.RAW.name(), actor.getProcessingState().name()); assertEquals(0.08, actor.getSampleRate(), 0.0); - assertEquals(MonitorSourceType.SERVER_STATUS.name(), serverStatus.getType().name()); - assertEquals(Unit.NON_DIMENSIONAL, actor.getUnit()); + assertEquals(MonitorSourceType.SERVER_STATUS.name(), serverStatus.getType()); + assertEquals(Unit.NON_DIMENSIONAL.name(), actor.getUnit()); testTopicNonAggregatable("application_server_status", "org.radarcns.kafka.key.KeyMeasurement", diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/UptimeTest.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/UptimeTest.java index 4320958a..f168e986 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/UptimeTest.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/UptimeTest.java @@ -47,9 +47,9 @@ public void validate() { KafkaActor actor = uptime.getKafkaActor(); - assertEquals(DataType.RAW.name(), actor.getDataType().name()); + assertEquals(DataType.RAW.name(), actor.getProcessingState().name()); assertEquals(0.08, actor.getSampleRate(), 0.0); - assertEquals(MonitorSourceType.UPTIME.name(), uptime.getType().name()); + assertEquals(MonitorSourceType.UPTIME.name(), uptime.getType()); assertEquals(Unit.NON_DIMENSIONAL, actor.getUnit()); testTopicNonAggregatable("application_uptime", diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/EmpaticaE4Test.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/EmpaticaE4Test.java index 55229dff..7b6fc43a 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/EmpaticaE4Test.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/EmpaticaE4Test.java @@ -155,11 +155,11 @@ public void validateProcessors() { Processor processor = empaticaE4.getProcessor(HEART_RATE); assertEquals("org.radarcns.kafka.aggregator.AggregatorDouble", processor.getTopic().getAggregator()); - assertEquals(DataType.RADAR.name(), processor.getDataType().name()); + assertEquals(DataType.RADAR.name(), processor.getProcessingState().name()); //processor.getDoc(); - assertEquals(HEART_RATE.name(), processor.getName().name()); + assertEquals(HEART_RATE.name(), processor.getName()); assertEquals(1.0, processor.getSampleRate(), 0.0); - assertEquals(Unit.BEATS_PER_MIN.name(), processor.getUnit().name()); + assertEquals(Unit.BEATS_PER_MIN.name(), processor.getUnit()); testTopicTimedAggregator( "org.radarcns.kafka.aggregator.AggregatorDouble", "android_empatica_e4_inter_beat_interval", diff --git a/java-sdk/radar-schemas-validator/build.gradle b/java-sdk/radar-schemas-validator/build.gradle index 0c2e04f5..8a0a24f5 100644 --- a/java-sdk/radar-schemas-validator/build.gradle +++ b/java-sdk/radar-schemas-validator/build.gradle @@ -23,16 +23,14 @@ sourceSets { } } -ext.apacheCommonsVersion = '3.6' ext.junitVersion = '4.12' -ext.radarCommonsVersion = '0.4.2' ext.slf4jVersion = '1.7.25' dependencies { + compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.8.10' + compile group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.8.10' testCompile group: 'junit', name: 'junit', version: junitVersion testCompile group: 'org.slf4j', name: 'slf4j-simple', version: slf4jVersion - testCompile group: 'org.apache.commons', name: 'commons-lang3', version: apacheCommonsVersion - testCompile group: 'org.radarcns', name: 'radar-commons', version: radarCommonsVersion } //---------------------------------------------------------------------------// @@ -41,7 +39,7 @@ dependencies { ext.exchnageConfigPath = 'src/test/resources/gradle.properties' task exchangeConfig() { doLast { - if (file(exchnageConfigPath).delete()) { + if (!file(exchnageConfigPath).exists() || file(exchnageConfigPath).delete()) { file(exchnageConfigPath).createNewFile() file(exchnageConfigPath).write("project.group=${project.group}") } else { diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/Invalid.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/Invalid.java similarity index 78% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/Invalid.java rename to java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/Invalid.java index 818e104b..47013367 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/Invalid.java +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/Invalid.java @@ -1,4 +1,4 @@ -package org.radarcns.validator.util; +package org.radarcns.validator; /* * Copyright 2017 King's College London and The Hyve @@ -16,6 +16,7 @@ * limitations under the License. */ +import java.util.Objects; import java.util.Optional; /** @@ -42,20 +43,17 @@ public boolean equals(Object o) { if (this == o) { return true; } - - if (!(o instanceof Invalid)) { + if (o == null || !getClass().equals(o.getClass())) { return false; } Invalid invalid = (Invalid) o; - return new org.apache.commons.lang3.builder.EqualsBuilder().append( - reason, invalid.reason).isEquals(); + return Objects.equals(reason, invalid.reason); } @Override public int hashCode() { - return new org.apache.commons.lang3.builder.HashCodeBuilder( - 17, 37).append(reason).toHashCode(); + return reason != null ? reason.hashCode() : 0; } } diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/SchemaRepository.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/SchemaRepository.java new file mode 100644 index 00000000..b6ccaca0 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/SchemaRepository.java @@ -0,0 +1,55 @@ +package org.radarcns.validator; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.nio.file.Path; +import java.nio.file.Paths; + +/** + * Checks the schema catalog. + * Checks that the tree folder structure respects the following structure: + *
      + *
    • commons + *
        + *
      • active
      • + *
      • kafka
      • + *
      • monitor
      • + *
      • passive
      • + *
      + *
    • + *
    • rest
    • + *
    • specifications + *
        + *
      • active
      • + *
      • monitor
      • + *
      • passive
      • + *
      + *
    • + *
    + * At moment, the {@code restApi} does not have a well defined structure. + */ +public final class SchemaRepository { + + public static final Path PROJECT_ROOT = Paths.get("../..").toAbsolutePath(); + public static final Path COMMONS_PATH = PROJECT_ROOT.resolve("commons"); + public static final Path REST_API_PATH = PROJECT_ROOT.resolve("restapi"); + public static final Path SPECIFICATIONS_PATH = PROJECT_ROOT.resolve("specifications"); + + private SchemaRepository() { + // utility class + } +} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidationRoles.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/SchemaValidationRoles.java similarity index 69% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidationRoles.java rename to java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/SchemaValidationRoles.java index e73111ef..6f74b76c 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidationRoles.java +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/SchemaValidationRoles.java @@ -1,35 +1,34 @@ -package org.radarcns.validator.util; - -import static org.radarcns.validator.util.SchemaValidationRoles.Message.DEFAULT_VALUE; -import static org.radarcns.validator.util.SchemaValidationRoles.Message.DOC; -import static org.radarcns.validator.util.SchemaValidationRoles.Message.ENUMERATION_SYMBOL; -import static org.radarcns.validator.util.SchemaValidationRoles.Message.ENUMERATION_UNKNOWN_SYMBOL; -import static org.radarcns.validator.util.SchemaValidationRoles.Message.FIELDS; -import static org.radarcns.validator.util.SchemaValidationRoles.Message.FILED_NAME; -import static org.radarcns.validator.util.SchemaValidationRoles.Message.NOT_TIME_COMPLETED_FIELD; -import static org.radarcns.validator.util.SchemaValidationRoles.Message.NOT_TIME_RECEIVED_FIELD; -import static org.radarcns.validator.util.SchemaValidationRoles.Message.RECORD_NAME; -import static org.radarcns.validator.util.SchemaValidationRoles.Message.SYMBOLS; -import static org.radarcns.validator.util.SchemaValidationRoles.Message.TIME_COMPLETED_FIELD; -import static org.radarcns.validator.util.SchemaValidationRoles.Message.TIME_FIELD; -import static org.radarcns.validator.util.SchemaValidationRoles.Message.TIME_RECEIVED_FIELD; -import static org.radarcns.validator.util.ValidationResult.invalid; -import static org.radarcns.validator.util.ValidationResult.valid; -import static org.radarcns.validator.util.ValidationSupport.extractEnumerationFields; -import static org.radarcns.validator.util.ValidationSupport.getNamespace; -import static org.radarcns.validator.util.ValidationSupport.getRecordName; +package org.radarcns.validator; + +import static org.radarcns.validator.SchemaValidationRoles.Message.DEFAULT_VALUE; +import static org.radarcns.validator.SchemaValidationRoles.Message.DOC; +import static org.radarcns.validator.SchemaValidationRoles.Message.ENUMERATION_SYMBOL; +import static org.radarcns.validator.SchemaValidationRoles.Message.ENUMERATION_UNKNOWN_SYMBOL; +import static org.radarcns.validator.SchemaValidationRoles.Message.FIELDS; +import static org.radarcns.validator.SchemaValidationRoles.Message.FILED_NAME; +import static org.radarcns.validator.SchemaValidationRoles.Message.NOT_TIME_COMPLETED_FIELD; +import static org.radarcns.validator.SchemaValidationRoles.Message.NOT_TIME_RECEIVED_FIELD; +import static org.radarcns.validator.SchemaValidationRoles.Message.RECORD_NAME; +import static org.radarcns.validator.SchemaValidationRoles.Message.SYMBOLS; +import static org.radarcns.validator.SchemaValidationRoles.Message.TIME_COMPLETED_FIELD; +import static org.radarcns.validator.SchemaValidationRoles.Message.TIME_FIELD; +import static org.radarcns.validator.SchemaValidationRoles.Message.TIME_RECEIVED_FIELD; +import static org.radarcns.validator.ValidationResult.invalid; +import static org.radarcns.validator.ValidationResult.valid; +import static org.radarcns.validator.ValidationSupport.extractEnumerationFields; +import static org.radarcns.validator.ValidationSupport.getNamespace; +import static org.radarcns.validator.ValidationSupport.getRecordName; import java.nio.file.Path; -import java.util.Locale; import java.util.Objects; import java.util.Set; import java.util.function.Function; import java.util.function.Predicate; +import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; import org.apache.avro.Schema; import org.apache.avro.Schema.Type; -import org.radarcns.validator.SchemaCatalogValidator.NameFolder; /* @@ -61,14 +60,14 @@ interface SchemaValidationRoles extends Function { String UNKNOWN = "UNKNOWN"; - String NAMESPACE_REGEX = "^[a-z][a-z.]*$"; + Pattern NAMESPACE_PATTERN = Pattern.compile("^[a-z][a-z.]*$"); - String RECORD_NAME_REGEX = "(^[A-Z][a-z]+)|(^[A-Z][a-z0-9]+[A-Z]$)" - + "|(^[A-Z][a-z0-9]+([A-Z][a-z0-9]+)+$)|(^[A-Z][a-z0-9]+([A-Z][a-z0-9]+)+[A-Z]$)"; + Pattern RECORD_NAME_PATTERN = Pattern.compile("(^[A-Z][a-z]+)|(^[A-Z][a-z0-9]+[A-Z]$)" + + "|(^[A-Z][a-z0-9]+([A-Z][a-z0-9]+)+$)|(^[A-Z][a-z0-9]+([A-Z][a-z0-9]+)+[A-Z]$)"); - String FIELD_NAME_REGEX = "^[a-z][a-zA-Z]*$"; + Pattern FIELD_NAME_PATTERN = Pattern.compile("^[a-z][a-zA-Z]*$"); - String ENUMERATION_SYMBOL_REGEX = "^[A-Z0-8_]+$"; + Pattern ENUM_SYMBOL_PATTERN = Pattern.compile("^[A-Z][A-Z0-9_]*$"); /** Field names cannot contain the following values. */ enum FieldNameNotAllowed { @@ -91,19 +90,21 @@ public String getName() { /** Messages. */ enum Message { NAME_SPACE("Namespace cannot be null and must fully lowercase dot separated without " - + "numeric. In this case the expected value is \""), + + "numeric. In this case the expected value is \""), RECORD_NAME("Record name must be the conversion of the .avsc file name in UpperCamelCase " - + "and must explicitly contain the device name. The expected value is "), + + "and must explicitly contain the device name. The expected value is "), TIME_FIELD("Any schema representing collected data must have a \"" + TIME - + "\" field formatted in " + Type.DOUBLE.getName().toUpperCase(Locale.ENGLISH) + "."), - TIME_COMPLETED_FIELD("Any " + NameFolder.ACTIVE + " schema must have a \"" + TIME_COMPLETED - + "\" field formatted in " + Type.DOUBLE.getName().toUpperCase(Locale.ENGLISH) + "."), - NOT_TIME_COMPLETED_FIELD("\"" + TIME_COMPLETED + "\" is allow only in " + NameFolder.ACTIVE - + " schemas."), - TIME_RECEIVED_FIELD("Any " + NameFolder.PASSIVE + " schema must have a \"" + TIME_RECEIVED - + "\" field formatted in " + Type.DOUBLE.getName().toUpperCase(Locale.ENGLISH) + "."), - NOT_TIME_RECEIVED_FIELD("\"" + TIME_RECEIVED + "\" is allow only in " + NameFolder.PASSIVE - + " schemas."), + + "\" field formatted in " + Type.DOUBLE + "."), + TIME_COMPLETED_FIELD("Any " + Scope.ACTIVE + " schema must have a \"" + + TIME_COMPLETED + "\" field formatted in " + + Type.DOUBLE + "."), + NOT_TIME_COMPLETED_FIELD("\"" + TIME_COMPLETED + "\" is allow only in " + + Scope.ACTIVE + " schemas."), + TIME_RECEIVED_FIELD("Any " + Scope.PASSIVE + + " schema must have a \"" + TIME_RECEIVED + "\" field formatted in " + + Type.DOUBLE + "."), + NOT_TIME_RECEIVED_FIELD("\"" + TIME_RECEIVED + "\" is allow only in " + + Scope.PASSIVE + " schemas."), FIELDS("Avro Record must have field list."), FILED_NAME("Field name does not respect lowerCamelCase name convention. It cannot contain" + " any of the following values [" @@ -143,15 +144,14 @@ public String getMessage() { /** * TODO. - * @param rootFolder TODO - * @param subFolder TODO + * @param scope TODO * @return TODO */ - static SchemaValidationRoles validateNameSpace(NameFolder rootFolder, String subFolder) { - String expected = getNamespace(rootFolder, subFolder); + static SchemaValidationRoles validateNameSpace(Path schemaPath, Scope scope) { + String expected = getNamespace(schemaPath, scope); return schema -> Objects.nonNull(schema.getNamespace()) - && schema.getNamespace() .matches(NAMESPACE_REGEX) + && NAMESPACE_PATTERN.matcher(schema.getNamespace()).matches() && schema.getNamespace().equalsIgnoreCase(expected) ? valid() : invalid(Message.NAME_SPACE.getMessage().concat(expected).concat( "\". ").concat(schema.getFullName()).concat(" is invalid.")); @@ -176,7 +176,7 @@ static SchemaValidationRoles validateRecordName(Path path, boolean skip) { String expected = getRecordName(path); return schema -> - skip || schema.getName().matches(RECORD_NAME_REGEX) + skip || matches(schema.getName(), RECORD_NAME_PATTERN) && schema.getName().equalsIgnoreCase(expected) ? valid() : invalid(RECORD_NAME.getMessage().concat(expected).concat("\". ").concat( schema.getFullName()).concat(" is invalid.")); @@ -212,15 +212,25 @@ static SchemaValidationRoles validateFieldName() { * @return TODO */ static SchemaValidationRoles validateFieldName(Set skip) { - return validate(schema -> + return validate(schema -> { + Stream stream = schema.getFields() + .stream() + .map(Schema.Field::name); + if (skip != null && !skip.isEmpty()) { + stream = stream.filter(name -> !skip::contains(name)); + } + } schema.getFields() .stream() - .map(field -> field.name()) + .map(Schema.Field::name); + + + + .filter(name -> skip == null || !skip.contains(name)) .allMatch(name -> - name.matches(FIELD_NAME_REGEX) + matches(name, FIELD_NAME_PATTERN) && Stream.of(FieldNameNotAllowed.values()) - .noneMatch(notAllowed -> name.contains(notAllowed.getName())) - || Objects.nonNull(skip) && skip.contains(name)), + .noneMatch(notAllowed -> name.contains(notAllowed.getName()))), FILED_NAME); } @@ -252,8 +262,7 @@ static SchemaValidationRoles validateSymbols() { static SchemaValidationRoles validateEnumerationSymbols() { return validate(schema -> extractEnumerationFields(schema).stream() - .allMatch(symbol -> symbol.matches( - ENUMERATION_SYMBOL_REGEX)), + .allMatch(matches(ENUM_SYMBOL_PATTERN)), ENUMERATION_SYMBOL); } @@ -262,7 +271,7 @@ static SchemaValidationRoles validateEnumerationSymbols() { * @return TODO */ static SchemaValidationRoles validateDefault() { - return validate(schema -> ValidationSupport.validateDefault(schema), DEFAULT_VALUE); + return validate(ValidationSupport::validateDefault, DEFAULT_VALUE); } /** @@ -333,13 +342,13 @@ static SchemaValidationRoles validate(Predicate predicate, Message messa /** * TODO. - * @param other TODO + * @param also TODO * @return TODO */ - default SchemaValidationRoles and(SchemaValidationRoles other) { + default SchemaValidationRoles and(SchemaValidationRoles also) { return schema -> { - final ValidationResult result = this.apply(schema); - return result.isValid() ? other.apply(schema) : result; + ValidationResult result = this.apply(schema); + return result.isValid() ? also.apply(schema) : result; }; } @@ -347,12 +356,11 @@ default SchemaValidationRoles and(SchemaValidationRoles other) { * TODO. * @param pathToSchema TODO * @param root TODO - * @param subfolder TODO * @return TODO */ - static SchemaValidationRoles getGeneralRecordValidator(Path pathToSchema, NameFolder root, - String subfolder) { - return validateNameSpace(root, subfolder) + static SchemaValidationRoles getGeneralRecordValidator(Path pathToSchema, + Scope root) { + return validateNameSpace(pathToSchema, root) .and(validateRecordName(pathToSchema)) .and(validateSchemaDocumentation()) .and(validateFields()) @@ -365,14 +373,14 @@ static SchemaValidationRoles getGeneralRecordValidator(Path pathToSchema, NameFo * TODO. * @param pathToSchema TODO * @param root TODO - * @param subfolder TODO * @param skipRecordName TODO * @param skipFieldName TODO * @return TODO */ - static SchemaValidationRoles getGeneralRecordValidator(Path pathToSchema, NameFolder root, - String subfolder, boolean skipRecordName, Set skipFieldName) { - return validateNameSpace(root, subfolder) + static SchemaValidationRoles getGeneralRecordValidator(Path pathToSchema, + Scope root, boolean skipRecordName, + Set skipFieldName) { + return validateNameSpace(pathToSchema, root) .and(validateRecordName(pathToSchema, skipRecordName)) .and(validateSchemaDocumentation()) .and(validateFields()) @@ -385,12 +393,10 @@ static SchemaValidationRoles getGeneralRecordValidator(Path pathToSchema, NameFo * TODO. * @param pathToSchema TODO * @param root TODO - * @param subfolder TODO * @return TODO */ - static SchemaValidationRoles getActiveValidator(Path pathToSchema, NameFolder root, - String subfolder) { - return getGeneralRecordValidator(pathToSchema, root, subfolder) + static SchemaValidationRoles getActiveValidator(Path pathToSchema, Scope root) { + return getGeneralRecordValidator(pathToSchema, root) .and(validateTime()) .and(validateTimeCompleted()) .and(validateNotTimeReceived()); @@ -400,14 +406,13 @@ static SchemaValidationRoles getActiveValidator(Path pathToSchema, NameFolder ro * TODO. * @param pathToSchema TODO * @param root TODO - * @param subfolder TODO * @param skipRecordName TODO * @param skipFieldName TODO * @return TODO */ - static SchemaValidationRoles getActiveValidator(Path pathToSchema, NameFolder root, - String subfolder, boolean skipRecordName, Set skipFieldName) { - return getGeneralRecordValidator(pathToSchema, root, subfolder, skipRecordName, + static SchemaValidationRoles getActiveValidator(Path pathToSchema, Scope root, + boolean skipRecordName, Set skipFieldName) { + return getGeneralRecordValidator(pathToSchema, root, skipRecordName, skipFieldName) .and(validateTime()) .and(validateTimeCompleted()) @@ -418,12 +423,10 @@ static SchemaValidationRoles getActiveValidator(Path pathToSchema, NameFolder ro * TODO. * @param pathToSchema TODO * @param root TODO - * @param subfolder TODO * @return TODO */ - static SchemaValidationRoles getMonitorValidator(Path pathToSchema, NameFolder root, - String subfolder) { - return getGeneralRecordValidator(pathToSchema, root, subfolder) + static SchemaValidationRoles getMonitorValidator(Path pathToSchema, Scope root) { + return getGeneralRecordValidator(pathToSchema, root) .and(validateTime()); } @@ -431,14 +434,13 @@ static SchemaValidationRoles getMonitorValidator(Path pathToSchema, NameFolder r * TODO. * @param pathToSchema TODO * @param root TODO - * @param subfolder TODO * @param skipRecordName TODO * @param skipFieldName TODO * @return TODO */ - static SchemaValidationRoles getMonitorValidator(Path pathToSchema, NameFolder root, - String subfolder, boolean skipRecordName, Set skipFieldName) { - return getGeneralRecordValidator(pathToSchema, root, subfolder, skipRecordName, + static SchemaValidationRoles getMonitorValidator(Path pathToSchema, Scope root, + boolean skipRecordName, Set skipFieldName) { + return getGeneralRecordValidator(pathToSchema, root, skipRecordName, skipFieldName) .and(validateTime()); } @@ -447,12 +449,10 @@ static SchemaValidationRoles getMonitorValidator(Path pathToSchema, NameFolder r * TODO. * @param pathToSchema TODO * @param root TODO - * @param subfolder TODO * @return TODO */ - static SchemaValidationRoles getPassiveValidator(Path pathToSchema, NameFolder root, - String subfolder) { - return getGeneralRecordValidator(pathToSchema, root, subfolder) + static SchemaValidationRoles getPassiveValidator(Path pathToSchema, Scope root) { + return getGeneralRecordValidator(pathToSchema, root) .and(validateTime()) .and(validateTimeReceived()) .and(validateNotTimeCompleted()); @@ -462,14 +462,13 @@ static SchemaValidationRoles getPassiveValidator(Path pathToSchema, NameFolder r * TODO. * @param pathToSchema TODO * @param root TODO - * @param subfolder TODO * @param skipRecordName TODO * @param skipFieldName TODO * @return TODO */ - static SchemaValidationRoles getPassiveValidator(Path pathToSchema, NameFolder root, - String subfolder, boolean skipRecordName, Set skipFieldName) { - return getGeneralRecordValidator(pathToSchema, root, subfolder, skipRecordName, + static SchemaValidationRoles getPassiveValidator(Path pathToSchema, Scope root, + boolean skipRecordName, Set skipFieldName) { + return getGeneralRecordValidator(pathToSchema, root, skipRecordName, skipFieldName) .and(validateTime()) .and(validateTimeReceived()) @@ -480,12 +479,10 @@ static SchemaValidationRoles getPassiveValidator(Path pathToSchema, NameFolder r * TODO. * @param pathToSchema TODO * @param root TODO - * @param subfolder TODO * @return TODO */ - static SchemaValidationRoles getGeneralEnumValidator(Path pathToSchema, NameFolder root, - String subfolder) { - return validateNameSpace(root, subfolder) + static SchemaValidationRoles getGeneralEnumValidator(Path pathToSchema, Scope root) { + return validateNameSpace(pathToSchema, root) .and(validateRecordName(pathToSchema)) .and(validateSchemaDocumentation()) .and(validateSymbols()) @@ -497,13 +494,12 @@ static SchemaValidationRoles getGeneralEnumValidator(Path pathToSchema, NameFold * TODO. * @param pathToSchema TODO * @param root TODO - * @param subfolder TODO * @param skipRecordName TODO * @return TODO */ - static SchemaValidationRoles getGeneralEnumValidator(Path pathToSchema, NameFolder root, - String subfolder, boolean skipRecordName) { - return validateNameSpace(root, subfolder) + static SchemaValidationRoles getGeneralEnumValidator(Path pathToSchema, Scope root, + boolean skipRecordName) { + return validateNameSpace(pathToSchema, root) .and(validateRecordName(pathToSchema, skipRecordName)) .and(validateSchemaDocumentation()) .and(validateSymbols()) @@ -512,4 +508,11 @@ static SchemaValidationRoles getGeneralEnumValidator(Path pathToSchema, NameFold } + static boolean matches(String str, Pattern pattern) { + return pattern.matcher(str).matches(); + } + + static Predicate matches(Pattern pattern) { + return str -> pattern.matcher(str).matches(); + } } diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/SchemaValidator.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/SchemaValidator.java new file mode 100644 index 00000000..19ca4d3f --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/SchemaValidator.java @@ -0,0 +1,106 @@ +package org.radarcns.validator; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import org.apache.avro.Schema; +import org.apache.avro.Schema.Type; +import org.radarcns.validator.config.ExcludeConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +import static org.radarcns.validator.SchemaValidationRoles.getActiveValidator; +import static org.radarcns.validator.SchemaValidationRoles.getGeneralEnumValidator; +import static org.radarcns.validator.SchemaValidationRoles.getGeneralRecordValidator; +import static org.radarcns.validator.SchemaValidationRoles.getMonitorValidator; +import static org.radarcns.validator.SchemaValidationRoles.getPassiveValidator; + +final class SchemaValidator { + + private static final Logger LOGGER = LoggerFactory.getLogger(SchemaValidator.class); + + private static final Map CACHE = new HashMap<>(); + + private SchemaValidator() { + //Static class + } + + public static ValidationResult validate(Schema schema, Path pathToSchema, Scope root) { + return validate(schema, pathToSchema, root, + false, null); + } + + public static ValidationResult validate(Schema schema, Path pathToSchema, Scope root, + boolean skipRecordName, Set skipFieldName) { + Objects.requireNonNull(schema); + Objects.requireNonNull(pathToSchema); + Objects.requireNonNull(root); + + CACHE.put(schema.getFullName(), schema); + + ValidationResult result; + + if (schema.getType().equals(Type.ENUM)) { + result = getGeneralEnumValidator(pathToSchema, root, + skipRecordName).apply(schema); + } else { + switch (root) { + case ACTIVE: + result = getActiveValidator(pathToSchema, root, skipRecordName, + skipFieldName).apply(schema); + break; + case CATALOGUE: + result = getGeneralRecordValidator(pathToSchema, root, + skipRecordName, skipFieldName).apply(schema); + break; + case KAFKA: + result = getGeneralRecordValidator(pathToSchema, root, + skipRecordName, skipFieldName).apply(schema); + break; + case MONITOR: + result = getMonitorValidator(pathToSchema, root, skipRecordName, + skipFieldName).apply(schema); + break; + case PASSIVE: + result = getPassiveValidator(pathToSchema, root, skipRecordName, + skipFieldName).apply(schema); + break; + default: + LOGGER.warn("Applying general validation to {}", getPath(pathToSchema)); + result = getGeneralRecordValidator(pathToSchema, root, skipRecordName, + skipFieldName).apply(schema); + break; + } + } + + return result; + } + + /** + * TODO. + * @param path TODO + * @return TODO + */ + public static String getPath(Path path) { + return path.toString().substring(path.toString().indexOf(ExcludeConfig.REPOSITORY_NAME)); + } +} diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/Scope.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/Scope.java new file mode 100644 index 00000000..fb45a727 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/Scope.java @@ -0,0 +1,40 @@ +package org.radarcns.validator; + +import java.nio.file.Files; +import java.nio.file.Path; + +public enum Scope { + ACTIVE("active"), + KAFKA("kafka"), + CATALOGUE("catalogue"), + MONITOR("monitor"), + PASSIVE("passive"); + + private final Path specificationsPath; + private final Path commonsPath; + private final String name; + + Scope(String name) { + this.name = name; + Path newSpecificationsPath = SchemaRepository.SPECIFICATIONS_PATH.resolve(name); + if (Files.exists(newSpecificationsPath)) { + specificationsPath = newSpecificationsPath; + } else { + specificationsPath = null; + } + commonsPath = SchemaRepository.COMMONS_PATH.resolve(name); + + } + + public Path getSpecificationsPath() { + return specificationsPath; + } + + public Path getCommonsPath() { + return commonsPath; + } + + public String getName() { + return name; + } +} diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/SpecificationsValidator.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/SpecificationsValidator.java new file mode 100644 index 00000000..84cc077e --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/SpecificationsValidator.java @@ -0,0 +1,48 @@ +package org.radarcns.validator; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import org.radarcns.validator.config.ExcludeConfig; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import static org.radarcns.validator.ValidationSupport.matchesExtension; + +/** + * TODO. + */ +public class SpecificationsValidator { + public static final String YML_EXTENSION = "yml"; + private final ExcludeConfig config; + + public SpecificationsValidator(ExcludeConfig config) { + this.config = config; + } + + public boolean specificationsAreYmlFiles(Scope scope) throws IOException { + return Files.walk(scope.getSpecificationsPath()) + .filter(Files::isRegularFile) + .filter(p -> !config.skipFile(p)) + .allMatch(SpecificationsValidator::isYmlFile); + } + + private static boolean isYmlFile(Path path) { + return matchesExtension(path, YML_EXTENSION); + } +} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationResult.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/ValidationResult.java similarity index 96% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationResult.java rename to java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/ValidationResult.java index 336558ef..377c0b91 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationResult.java +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/ValidationResult.java @@ -1,4 +1,4 @@ -package org.radarcns.validator.util; +package org.radarcns.validator; /* * Copyright 2017 King's College London and The Hyve diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/ValidationSupport.java similarity index 71% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java rename to java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/ValidationSupport.java index 07382dcc..ad0a39e1 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/ValidationSupport.java +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/ValidationSupport.java @@ -1,4 +1,4 @@ -package org.radarcns.validator.util; +package org.radarcns.validator; /* * Copyright 2017 King's College London and The Hyve @@ -16,12 +16,13 @@ * limitations under the License. */ -import static org.radarcns.validator.util.SchemaValidationRoles.UNKNOWN; +import static org.radarcns.validator.SchemaValidationRoles.UNKNOWN; import java.io.IOException; import java.nio.file.Path; import java.util.LinkedList; import java.util.List; +import java.util.Locale; import java.util.Objects; import java.util.Optional; import java.util.Properties; @@ -29,12 +30,11 @@ import org.apache.avro.Schema; import org.apache.avro.Schema.Field; import org.apache.avro.Schema.Type; -import org.radarcns.validator.SchemaCatalogValidator.NameFolder; /** * TODO. */ -final class ValidationSupport { +public final class ValidationSupport { private static final String GRADLE_PROPERTIES = "gradle.properties"; private static final String PROPERTY_VALUE = "project.group"; @@ -81,15 +81,17 @@ public static String getProjectGroup() { /** * TODO. - * @param rootFolder TODO - * @param subFolder TODO + * @param scope TODO * @return TODO */ - public static String getNamespace(NameFolder rootFolder, String subFolder) { - String expected = getProjectGroup().concat(".").concat(rootFolder.getName()); - - if (!Objects.isNull(subFolder)) { - expected = expected.concat(".").concat(subFolder); + public static String getNamespace(Path schemaPath, Scope scope) { + String expected = getProjectGroup() + '.' + scope.getName(); + + // add subfolder of root to namespace + Path rootPath = scope.getCommonsPath(); + Path relativePath = rootPath.relativize(schemaPath); + if (relativePath.getNameCount() > 1) { + expected = expected + '.' + relativePath.getName(0); } return expected; @@ -103,26 +105,30 @@ public static String getNamespace(NameFolder rootFolder, String subFolder) { public static String getRecordName(Path path) { Objects.requireNonNull(path); - String recordName = ""; + char[] fileName = path.getFileName().toString().toCharArray(); - String fileName = path.getFileName().toString(); + StringBuilder recordName = new StringBuilder(fileName.length); - boolean start = true; - for (int i = 0; i < fileName.length(); i++) { - switch (fileName.charAt(i)) { - case '_' : - start = true; + boolean nextIsUpperCase = true; + for (char c : fileName) { + switch (c) { + case '_': + nextIsUpperCase = true; break; - case '.' : return recordName; + case '.': + return recordName.toString(); default: - recordName += start ? Character.toUpperCase(fileName.charAt(i)) - : fileName.charAt(i); - start = false; + if (nextIsUpperCase) { + recordName.append(String.valueOf(c).toUpperCase(Locale.ENGLISH)); + nextIsUpperCase = false; + } else { + recordName.append(c); + } break; } } - return recordName; + return recordName.toString(); } /** @@ -138,7 +144,7 @@ public static List extractEnumerationFields(Schema root) { final List symbols = new LinkedList<>(); root.getFields().stream() .filter(field -> field.schema().getType().equals(Type.ENUM)) - .map(field -> field.schema()) + .map(Field::schema) .forEach(schema -> symbols.addAll(schema.getEnumSymbols())); return symbols; @@ -156,29 +162,28 @@ public static boolean validateDefault(Schema input) { throw new IllegalArgumentException("Function can be applied only to avro RECORD."); } - boolean flag = true; - for (Field field : input.getFields()) { + boolean flag = true; switch (field.schema().getType()) { case RECORD: - flag = flag && validateDefault(field.schema()); + flag = validateDefault(field.schema()); break; case UNION: - flag = flag && field.defaultVal().equals(JsonProperties.NULL_VALUE); + flag = field.defaultVal().equals(JsonProperties.NULL_VALUE); break; case ENUM: - flag = flag && field.schema().getEnumSymbols().contains(UNKNOWN) + flag = field.schema().getEnumSymbols().contains(UNKNOWN) && field.defaultVal().equals(UNKNOWN); break; default: break; } if (!flag) { - return flag; + return false; } } - return flag; + return true; } /** @@ -208,4 +213,14 @@ public static boolean validateDefault(Schema input) { } }*/ + + /** + * TODO. + * @param file TODO. + * @return TODO. + */ + public static boolean matchesExtension(Path file, String extension) { + return file.toString().toLowerCase(Locale.ENGLISH) + .endsWith("." + extension.toLowerCase(Locale.ENGLISH)); + } } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfigItem.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/config/ConfigItem.java similarity index 76% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfigItem.java rename to java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/config/ConfigItem.java index e4c350ca..a4f7695f 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfigItem.java +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/config/ConfigItem.java @@ -1,6 +1,9 @@ package org.radarcns.validator.config; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; + +import java.util.Collection; import java.util.HashSet; import java.util.Locale; import java.util.Set; @@ -24,7 +27,7 @@ /** * TODO. */ -class SkipConfigItem { +class ConfigItem { /** Possible check status. */ private enum CheckStatus { @@ -45,10 +48,9 @@ public String getName() { @SuppressWarnings("PMD.ImmutableField") private CheckStatus nameRecordCheck = CheckStatus.ENABLE; - @SuppressWarnings("PMD.ImmutableField") - private Set fields = new HashSet<>(); + private final Set fields = new HashSet<>(); - public SkipConfigItem() { + public ConfigItem() { // POJO initializer } @@ -66,13 +68,26 @@ boolean isNameRecordDisable() { * * @return TODO */ - Set getFields() { + @JsonSetter("fields") + public void setFields(Collection fields) { + if (!this.fields.isEmpty()) { + this.fields.clear(); + } + this.fields.addAll(fields); + } + + /** + * TODO. + * + * @return TODO + */ + public Set getFields() { return fields; } @Override public String toString() { - return "SkipConfigItem{" + return "ConfigItem{" + "nameRecordCheck=" + nameRecordCheck + ", fields=" + fields + '}'; diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/config/ExcludeConfig.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/config/ExcludeConfig.java new file mode 100644 index 00000000..09bbee83 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/config/ExcludeConfig.java @@ -0,0 +1,214 @@ +package org.radarcns.validator.config; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import org.apache.avro.Schema; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; +import java.nio.file.Path; +import java.nio.file.PathMatcher; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * TODO. + */ +public class ExcludeConfig { + + private static final Logger logger = LoggerFactory.getLogger(ExcludeConfig.class); + + /** Repository name. */ + public static final String REPOSITORY_NAME = "/RADAR-Schemas/"; + + /** File path location. */ + private static final String FILE_NAME = "skip.yml"; + + /** Wild card to suppress check for entire package. */ + public static final String WILD_CARD_PACKAGE = ".*"; + + /** Regex for validating the yml file. */ + public static final String VALID_INPUT_REGEX = "^[a-z][a-zA-Z0-9.*]*$"; + + @JsonIgnore + private final Collection matchers = new ArrayList<>(); + private final Set files = new HashSet<>(); + private final Map validation = new HashMap<>(); + private Path root; + + public ExcludeConfig() { + // POJO initializer + } + + /** Load the ExcludeConfig from file. */ + public static ExcludeConfig load() { + try { + YAMLFactory factory = new YAMLFactory(); + return new ObjectMapper(factory) + .readerFor(ExcludeConfig.class) + .readValue(ExcludeConfig.class.getClassLoader().getResourceAsStream(FILE_NAME)); + } catch (IOException exc) { + throw new ExceptionInInitializerError(exc); + } + } + + /** + * TODO. + * @param stream TODO + * @return TODO + */ + private static boolean validateClass(Stream stream) { + return stream.allMatch(value -> value.matches(VALID_INPUT_REGEX)); + } + + /** + * TODO. + * @param schema TODO + * @return TODO + */ + public boolean contains(Schema schema) { + return validation.containsKey(schema.getNamespace().concat(WILD_CARD_PACKAGE)) + || validation.containsKey(schema.getFullName()); + } + + /** + * TODO. + * @param schema TODO + * @return TODO + */ + public boolean isNameRecordEnable(Schema schema) { + ConfigItem item = validation.get(schema.getFullName()) == null + ? validation.get(schema.getNamespace().concat(WILD_CARD_PACKAGE)) + : validation.get(schema.getFullName()); + + return item == null || item.isNameRecordDisable(); + } + + /** + * TODO. + * @param schema TODO + * @return TODO + */ + public Set skippedNameFieldCheck(Schema schema) { + ConfigItem item = validation.get(schema.getFullName()) == null + ? validation.get(schema.getNamespace().concat(WILD_CARD_PACKAGE)) + : validation.get(schema.getFullName()); + + return item == null ? new HashSet<>() : item.getFields(); + } + + /** + * TODO. + * @param checkPath TODO + * @return TODO + */ + public boolean skipFile(Path checkPath) { + Path relativePath; + if (checkPath.isAbsolute() && root != null) { + relativePath = root.relativize(checkPath.normalize()); + } else { + relativePath = checkPath; + } + return matchers.stream() + .anyMatch(p -> p.matches(relativePath) + || p.matches(checkPath.getFileName())); + } + + public void setFiles(String... files) { + setFiles(Arrays.asList(files)); + } + + @JsonSetter("files") + public void setFiles(Collection files) { + FileSystem fs = FileSystems.getDefault(); + List pathMatchers = files.stream() + .map(p -> { + try { + return fs.getPathMatcher("glob:" + p); + } catch (IllegalArgumentException ex) { + logger.error("Exclude pattern {} is invalid. Please use the " + + "glob syntax" + + "described in " + + "https://docs.oracle.com/javase/7/docs/api/java/nio/file/FileSystem.html" + + "#getPathMatcher(java.lang.String)", p, ex); + return null; + } + }).collect(Collectors.toList()); + + if (pathMatchers.stream().anyMatch(Objects::isNull)) { + throw new IllegalArgumentException("Invalid exclude config."); + } + if (!files.isEmpty()) { + this.files.clear(); + this.matchers.clear(); + } + this.files.addAll(files); + this.matchers.addAll(pathMatchers); + } + + public Set getFiles() { + return Collections.unmodifiableSet(files); + } + + @JsonSetter("validation") + public void setValidation(Map validation) { + //Validate validation key map + if (!validateClass(validation.keySet().stream())) { + throw new IllegalArgumentException("Validation map keys are invalid"); + } + + if (!validateClass(validation.values().stream() + .map(ConfigItem::getFields) + .flatMap(Set::stream))) { + throw new IllegalArgumentException("Validation map values are not valid."); + } + + if (!this.validation.isEmpty()) { + this.validation.clear(); + } + this.validation.putAll(validation); + } + + public Map getValidation() { + return Collections.unmodifiableMap(validation); + } + + public Path getRoot() { + return root; + } + + public void setRoot(Path root) { + this.root = root.normalize(); + } +} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/AvroValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/AvroValidator.java new file mode 100644 index 00000000..cb5eb4a0 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/AvroValidator.java @@ -0,0 +1,88 @@ +package org.radarcns.validator; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import org.apache.avro.Schema; +import org.apache.avro.Schema.Parser; +import org.junit.Assert; +import org.radarcns.validator.config.ExcludeConfig; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import static org.radarcns.validator.ValidationSupport.matchesExtension; + +public final class AvroValidator { + public static final String AVRO_EXTENSION = "avsc"; + private final ExcludeConfig config; + + public AvroValidator(ExcludeConfig config) { + this.config = config; + } + + /** + * TODO. + * @param scope TODO. + * @throws IOException TODO. + */ + public void analyseFiles(Scope scope) + throws IOException { + Files.walk(scope.getCommonsPath()) + .filter(Files::isRegularFile) + .filter(p -> !config.skipFile(p)) + .forEach(p -> { + Assert.assertTrue(scope.getName() + " should contain only " + + AVRO_EXTENSION + " files. " + p.toAbsolutePath() + + " is invalid.", + isAvscFile(p)); + + try { + Schema schema = new Parser().parse(p.toFile()); + + ValidationResult result; + + if (config.contains(schema)) { + result = SchemaValidator.validate(schema, p, scope, + config.isNameRecordEnable(schema), + config.skippedNameFieldCheck(schema)); + } else { + result = SchemaValidator.validate(schema, p, scope); + } + + Assert.assertTrue(getMessage(result), result.isValid()); + } catch (IOException e) { + throw new AssertionError("Cannot parse file", e); + } + + //TODO add file layout validation + }); + } + + private static String getMessage(ValidationResult result) { + return result.getReason().orElse(""); + } + + /** + * TODO. + * @param file TODO + * @return TODO + */ + public static boolean isAvscFile(Path file) { + return matchesExtension(file, AVRO_EXTENSION); + } +} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java deleted file mode 100644 index 89030934..00000000 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/CommonsValidator.java +++ /dev/null @@ -1,86 +0,0 @@ -package org.radarcns.validator; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.io.IOException; -import org.radarcns.validator.SchemaCatalogValidator.CommonsFolder; -import org.radarcns.validator.SchemaCatalogValidator.NameFolder; -import org.radarcns.validator.util.AvroValidator; - -/** - * TODO. - */ -public final class CommonsValidator { - - private CommonsValidator() { - //Static class - } - - /** - * TODO. - * @throws IOException TODO - */ - public static void validateAll() throws IOException { - active(); - catalogue(); - kafka(); - monitor(); - passive(); - - AvroValidator.analyseNamingCollision(true); - } - - /** - * TODO. - * @throws IOException TODO - */ - public static void active() throws IOException { - AvroValidator.analiseFiles(CommonsFolder.ACTIVE.getFolder(), NameFolder.ACTIVE); - } - - /** - * TODO. - * @throws IOException TODO - */ - public static void catalogue() throws IOException { - AvroValidator.analiseFiles(CommonsFolder.CATALOGUE.getFolder(), NameFolder.CATALOGUE); - } - - /** - * TODO. - * @throws IOException TODO - */ - public static void kafka() throws IOException { - AvroValidator.analiseFiles(CommonsFolder.KAFKA.getFolder(), NameFolder.KAFKA); - } - - /** - * TODO. - * @throws IOException TODO - */ - public static void monitor() throws IOException { - AvroValidator.analiseFiles(CommonsFolder.MONITOR.getFolder(), NameFolder.MONITOR); - } - - /** - * TODO. - * @throws IOException TODO - */ - public static void passive() throws IOException { - AvroValidator.analiseFiles(CommonsFolder.PASSIVE.getFolder(), NameFolder.PASSIVE); - } -} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/ExcludeConfigTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/ExcludeConfigTest.java new file mode 100644 index 00000000..a1c73abf --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/ExcludeConfigTest.java @@ -0,0 +1,84 @@ +package org.radarcns.validator; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import org.junit.Test; +import org.radarcns.validator.config.ExcludeConfig; + +import java.nio.file.Paths; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.radarcns.validator.config.ExcludeConfig.VALID_INPUT_REGEX; + +/** + * TODO. + */ +public class ExcludeConfigTest { + @Test + public void testSkipFile() { + ExcludeConfig config = new ExcludeConfig(); + String root = "/Users/developer/Repositories/RADAR-Schemas/"; + + config.setRoot(Paths.get(root)); + config.setFiles(".DS_Store"); + + assertTrue(config.skipFile(Paths.get(root, "commons/passive/.DS_Store"))); + assertTrue(config.skipFile(Paths.get(root, ".DS_Store"))); + + config.setFiles("*.md"); + + assertTrue(config.skipFile(Paths.get(root, "commons/passive/empatica/README.md"))); + assertFalse(config.skipFile(Paths.get("specification/passive/schema.avsc"))); + + config.setFiles("commons/**/*.md"); + + assertTrue(config.skipFile(Paths.get(root, "commons/passive/empatica/README.md"))); + assertFalse(config.skipFile(Paths.get(root, "specification/passive/README.md"))); + + config.setFiles("commons/**/README.md"); + + assertTrue(config.skipFile(Paths.get(root, "commons/passive/empatica/README.md"))); + assertFalse(config.skipFile(Paths.get(root, "specification/passive/README.md"))); + + config.setFiles( + "commons/monitor/application/application_external_time.avsc"); + assertTrue(config.skipFile(Paths.get(root, "commons/monitor/application/" + + "application_external_time.avsc"))); + assertFalse(config.skipFile(Paths.get(root, "commons/passive/application/" + + "application_external_time.avsc"))); + assertFalse(config.skipFile(Paths.get(root, "commons/monitor/application/" + + "application_record_counts.avsc"))); + + config.setFiles( + "commons/monitor/application/application_external_time.avsc", + "commons/**/*.avsc"); + assertTrue(config.skipFile(Paths.get(root, "commons/monitor/application/" + + "application_external_time.avsc"))); + assertFalse(config.skipFile(Paths.get(root, "restApi/data/acceleration.avsc"))); + } + + @Test + public void testGeneralRegex() { + assertTrue("avg".matches(VALID_INPUT_REGEX)); + assertTrue("x".matches(VALID_INPUT_REGEX)); + assertTrue("org.radarcns.passive.phone.PhoneCall".matches(VALID_INPUT_REGEX)); + assertTrue("org.radarcns.active.*".matches(VALID_INPUT_REGEX)); + assertFalse("org.radarcns.passive.phone.PhoneCall as ENUM".matches(VALID_INPUT_REGEX)); + assertFalse("*".matches(VALID_INPUT_REGEX)); + } +} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaCatalogValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaCatalogValidator.java deleted file mode 100644 index 69f35216..00000000 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaCatalogValidator.java +++ /dev/null @@ -1,201 +0,0 @@ -package org.radarcns.validator; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Path; -import java.nio.file.Paths; -import org.junit.Before; -import org.junit.Test; -import org.radarcns.validator.config.SkipConfig; - -/** - * Checks that the tree folder structure respects the following structure - *
      - *
    • commons
    • - *
        - *
      • active
      • - *
      • kafka
      • - *
      • monitor
      • - *
      • passive
      • - *
      - *
    • rest
    • - *
    • specification
    • - *
        - *
      • active
      • - *
      • monitor
      • - *
      • passive
      • - *
      - *
    - * At moment, the {@code restApi} does not have a well defined structure. - * TODO. - */ -public class SchemaCatalogValidator { - - /** Folder names. */ - public enum NameFolder { - ACTIVE("active"), - CATALOGUE("catalogue"), - COMMONS("commons"), - KAFKA("kafka"), - MONITOR("monitor"), - PASSIVE("passive"), - REST_API("restApi"), - SPECIFICATIONS("specifications"); - - private final String name; - - NameFolder(String name) { - this.name = name; - } - - public String getName() { - return name; - } - } - - /** Root paths. */ - public enum RootPath { - COMMONS(Paths.get( - new File(".").toURI()).getParent().getParent().getParent().resolve( - NameFolder.COMMONS.getName())), - REST_API(Paths.get( - new File(".").toURI()).getParent().getParent().getParent().resolve( - NameFolder.REST_API.getName())), - SPECIFICATIONS(Paths.get( - new File(".").toURI()).getParent().getParent().getParent().resolve( - NameFolder.SPECIFICATIONS.getName())); - - private final Path path; - - RootPath(Path path) { - this.path = path; - } - - public Path getPath() { - return path; - } - } - - /** Root folders. */ - public enum RootFolder { - COMMONS(new File(RootPath.COMMONS.getPath().toUri())), - REST_API(new File(RootPath.REST_API.getPath().toUri())), - SPECIFICATIONS(new File(RootPath.SPECIFICATIONS.getPath().toUri())); - - private final File folder; - - RootFolder(File folder) { - this.folder = folder; - } - - public File getFolder() { - return folder; - } - } - - /** Commons folders. */ - public enum CommonsFolder { - ACTIVE(new File(RootPath.COMMONS.getPath().resolve(NameFolder.ACTIVE.getName()).toUri())), - CATALOGUE(new File(RootPath.COMMONS.getPath().resolve( - NameFolder.CATALOGUE.getName()).toUri())), - KAFKA(new File(RootPath.COMMONS.getPath().resolve(NameFolder.KAFKA.getName()).toUri())), - MONITOR(new File(RootPath.COMMONS.getPath().resolve(NameFolder.MONITOR.getName()).toUri())), - PASSIVE(new File(RootPath.COMMONS.getPath().resolve(NameFolder.PASSIVE.getName()).toUri())); - - private final File folder; - - CommonsFolder(File folder) { - this.folder = folder; - } - - public File getFolder() { - return folder; - } - } - - /** Commons folders. */ - public enum SpecificationFolder { - ACTIVE(new File(RootPath.SPECIFICATIONS.getPath().resolve( - NameFolder.ACTIVE.getName()).toUri())), - MONITOR(new File(RootPath.SPECIFICATIONS.getPath().resolve( - NameFolder.MONITOR.getName()).toUri())), - PASSIVE(new File(RootPath.SPECIFICATIONS.getPath().resolve( - NameFolder.PASSIVE.getName()).toUri())); - - private final File folder; - - SpecificationFolder(File folder) { - this.folder = folder; - } - - public File getFolder() { - return folder; - } - } - - @Before - /** - * Verifies that {@link SkipConfig} is valid. Without this configuration, the validation cannot - * take place. - */ - public void validateSkipConfig() { - assertTrue(SkipConfig.validate()); - } - - @Test - /** - * Validates the {@code RADAR-Schemas/commons} folder applying specific tests to each subfolder. - * @see CommonsValidator - */ - public void commons() throws IOException { - assertEquals(true, RootFolder.COMMONS.getFolder().isDirectory()); - - for (CommonsFolder folder : CommonsFolder.values()) { - assertEquals(true, folder.getFolder().isDirectory()); - } - - CommonsValidator.validateAll(); - } - - @Test - //TODO - public void restApi() { - assertEquals(true, RootFolder.REST_API.getFolder().isDirectory()); - - //TODO check whether it is possible to define a structure - } - - @Test - /** - * Checks only the folder structure and if they contain only {@code YAML} files. The semantic - * validation is left the to the {@code radar-schemas-specifications} module. - */ - public void specifications() { - assertEquals(true, RootFolder.SPECIFICATIONS.getFolder().isDirectory()); - - for (SpecificationFolder folder : SpecificationFolder.values()) { - assertEquals(true, folder.getFolder().isDirectory()); - } - - SpecificationsValidator.validateAll(); - } -} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidationRolesTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaValidationRolesTest.java similarity index 88% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidationRolesTest.java rename to java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaValidationRolesTest.java index e30f640d..dfddc0a3 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidationRolesTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaValidationRolesTest.java @@ -1,4 +1,4 @@ -package org.radarcns.validator.util; +package org.radarcns.validator; /* * Copyright 2017 King's College London and The Hyve @@ -16,24 +16,26 @@ * limitations under the License. */ -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.radarcns.validator.SchemaCatalogValidator.NameFolder.ACTIVE; -import static org.radarcns.validator.SchemaCatalogValidator.NameFolder.MONITOR; -import static org.radarcns.validator.util.SchemaValidationRoles.ENUMERATION_SYMBOL_REGEX; -import static org.radarcns.validator.util.SchemaValidationRoles.FIELD_NAME_REGEX; -import static org.radarcns.validator.util.SchemaValidationRoles.NAMESPACE_REGEX; -import static org.radarcns.validator.util.SchemaValidationRoles.RECORD_NAME_REGEX; +import org.apache.avro.Schema; +import org.apache.avro.Schema.Parser; +import org.apache.avro.SchemaBuilder; +import org.junit.Test; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Collections; import java.util.Optional; -import org.apache.avro.Schema; -import org.apache.avro.Schema.Parser; -import org.apache.avro.SchemaBuilder; -import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.radarcns.validator.Scope.ACTIVE; +import static org.radarcns.validator.Scope.MONITOR; +import static org.radarcns.validator.SchemaValidationRoles.ENUM_SYMBOL_PATTERN; +import static org.radarcns.validator.SchemaValidationRoles.FIELD_NAME_PATTERN; +import static org.radarcns.validator.SchemaValidationRoles.NAMESPACE_PATTERN; +import static org.radarcns.validator.SchemaValidationRoles.RECORD_NAME_PATTERN; +import static org.radarcns.validator.SchemaValidationRoles.matches; /** * TODO. @@ -61,62 +63,63 @@ public void fileNameTest() { @Test public void nameSpaceRegex() { - assertTrue("org.radarcns".matches(NAMESPACE_REGEX)); - assertFalse("Org.radarcns".matches(NAMESPACE_REGEX)); - assertFalse("org.radarCns".matches(NAMESPACE_REGEX)); - assertFalse(".org.radarcns".matches(NAMESPACE_REGEX)); - assertFalse("org.radar-cns".matches(NAMESPACE_REGEX)); - assertFalse("org.radarcns.empaticaE4".matches(NAMESPACE_REGEX)); + assertTrue(matches("org.radarcns", NAMESPACE_PATTERN)); + assertFalse(matches("Org.radarcns", NAMESPACE_PATTERN)); + assertFalse(matches("org.radarCns", NAMESPACE_PATTERN)); + assertFalse(matches(".org.radarcns", NAMESPACE_PATTERN)); + assertFalse(matches("org.radar-cns", NAMESPACE_PATTERN)); + assertFalse(matches("org.radarcns.empaticaE4", NAMESPACE_PATTERN)); } @Test public void recordNameRegex() { - assertTrue("Questionnaire".matches(RECORD_NAME_REGEX)); - assertTrue("EmpaticaE4Acceleration".matches(RECORD_NAME_REGEX)); - assertTrue("Heart4Me".matches(RECORD_NAME_REGEX)); - assertTrue("Heart4M".matches(RECORD_NAME_REGEX)); - - assertFalse("Heart4".matches(RECORD_NAME_REGEX)); - assertFalse("Heart4me".matches(RECORD_NAME_REGEX)); - assertFalse("Heart4ME".matches(RECORD_NAME_REGEX)); - assertFalse("4Me".matches(RECORD_NAME_REGEX)); - assertFalse("TTest".matches(RECORD_NAME_REGEX)); - assertFalse("questionnaire".matches(RECORD_NAME_REGEX)); - assertFalse("questionnaire4".matches(RECORD_NAME_REGEX)); - assertFalse("questionnaire4Me".matches(RECORD_NAME_REGEX)); - assertFalse("questionnaire4me".matches(RECORD_NAME_REGEX)); - assertFalse("A4MM".matches(RECORD_NAME_REGEX)); - assertFalse("Aaaa4MMaa".matches(RECORD_NAME_REGEX)); + assertTrue(matches("Questionnaire", RECORD_NAME_PATTERN)); + assertTrue(matches("EmpaticaE4Acceleration", RECORD_NAME_PATTERN)); + assertTrue(matches("Heart4Me", RECORD_NAME_PATTERN)); + assertTrue(matches("Heart4M", RECORD_NAME_PATTERN)); + + assertFalse(matches("Heart4", RECORD_NAME_PATTERN)); + assertFalse(matches("Heart4me", RECORD_NAME_PATTERN)); + assertFalse(matches("Heart4ME", RECORD_NAME_PATTERN)); + assertFalse(matches("4Me", RECORD_NAME_PATTERN)); + assertFalse(matches("TTest", RECORD_NAME_PATTERN)); + assertFalse(matches("questionnaire", RECORD_NAME_PATTERN)); + assertFalse(matches("questionnaire4", RECORD_NAME_PATTERN)); + assertFalse(matches("questionnaire4Me", RECORD_NAME_PATTERN)); + assertFalse(matches("questionnaire4me", RECORD_NAME_PATTERN)); + assertFalse(matches("A4MM", RECORD_NAME_PATTERN)); + assertFalse(matches("Aaaa4MMaa", RECORD_NAME_PATTERN)); } @Test public void fieldNameRegex() { - assertTrue("interBeatInterval".matches(FIELD_NAME_REGEX)); - assertTrue("x".matches(FIELD_NAME_REGEX)); - assertTrue(SchemaValidationRoles.TIME.matches(FIELD_NAME_REGEX)); - assertTrue("subjectId".matches(FIELD_NAME_REGEX)); - assertTrue("listOfSeveralThings".matches(FIELD_NAME_REGEX)); - assertFalse("Time".matches(FIELD_NAME_REGEX)); - assertFalse("E4Heart".matches(FIELD_NAME_REGEX)); + assertTrue(matches("interBeatInterval", FIELD_NAME_PATTERN)); + assertTrue(matches("x", FIELD_NAME_PATTERN)); + assertTrue(matches(SchemaValidationRoles.TIME, FIELD_NAME_PATTERN)); + assertTrue(matches("subjectId", FIELD_NAME_PATTERN)); + assertTrue(matches("listOfSeveralThings", FIELD_NAME_PATTERN)); + assertFalse(matches("Time", FIELD_NAME_PATTERN)); + assertFalse(matches("E4Heart", FIELD_NAME_PATTERN)); } @Test public void enumerationRegex() { - assertTrue("PHQ8".matches(ENUMERATION_SYMBOL_REGEX)); - assertTrue("HELLO".matches(ENUMERATION_SYMBOL_REGEX)); - assertTrue("HELLOTHERE".matches(ENUMERATION_SYMBOL_REGEX)); - assertTrue("HELLO_THERE".matches(ENUMERATION_SYMBOL_REGEX)); - assertFalse("Hello".matches(ENUMERATION_SYMBOL_REGEX)); - assertFalse("hello".matches(ENUMERATION_SYMBOL_REGEX)); - assertFalse("HelloThere".matches(ENUMERATION_SYMBOL_REGEX)); - assertFalse("Hello_There".matches(ENUMERATION_SYMBOL_REGEX)); - assertFalse("HELLO.THERE".matches(ENUMERATION_SYMBOL_REGEX)); + assertTrue(matches("PHQ8", ENUM_SYMBOL_PATTERN)); + assertTrue(matches("HELLO", ENUM_SYMBOL_PATTERN)); + assertTrue(matches("HELLOTHERE", ENUM_SYMBOL_PATTERN)); + assertTrue(matches("HELLO_THERE", ENUM_SYMBOL_PATTERN)); + assertFalse(matches("Hello", ENUM_SYMBOL_PATTERN)); + assertFalse(matches("hello", ENUM_SYMBOL_PATTERN)); + assertFalse(matches("HelloThere", ENUM_SYMBOL_PATTERN)); + assertFalse(matches("Hello_There", ENUM_SYMBOL_PATTERN)); + assertFalse(matches("HELLO.THERE", ENUM_SYMBOL_PATTERN)); } @Test public void nameSpaceTest() { Schema schema; ValidationResult result; + Path path; schema = SchemaBuilder .builder("org.radarcns.active.questionnaire") @@ -124,8 +127,9 @@ public void nameSpaceTest() { .fields() .endRecord(); - result = SchemaValidationRoles.validateNameSpace(ACTIVE, - "questionnaire").apply(schema); + path = ACTIVE.getCommonsPath().resolve("questionnaire/questionnaire.avsc"); + + result = SchemaValidationRoles.validateNameSpace(path, ACTIVE).apply(schema); assertTrue(result.isValid()); @@ -135,7 +139,8 @@ public void nameSpaceTest() { .fields() .endRecord(); - result = SchemaValidationRoles.validateNameSpace(MONITOR, "test").apply(schema); + path = MONITOR.getCommonsPath().resolve("test/record_name.avsc"); + result = SchemaValidationRoles.validateNameSpace(path, MONITOR).apply(schema); assertFalse(result.isValid()); @@ -151,7 +156,7 @@ public void nameSpaceTest() { .fields() .endRecord(); - result = SchemaValidationRoles.validateNameSpace(MONITOR, "test").apply(schema); + result = SchemaValidationRoles.validateNameSpace(path, MONITOR).apply(schema); assertFalse(result.isValid()); @@ -167,7 +172,7 @@ public void nameSpaceTest() { .fields() .endRecord(); - result = SchemaValidationRoles.validateNameSpace(MONITOR, "test").apply(schema); + result = SchemaValidationRoles.validateNameSpace(path, MONITOR).apply(schema); assertFalse(result.isValid()); diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaValidatorTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaValidatorTest.java new file mode 100644 index 00000000..1306a613 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaValidatorTest.java @@ -0,0 +1,76 @@ +package org.radarcns.validator; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import org.apache.avro.Schema; +import org.apache.avro.SchemaBuilder; +import org.junit.Test; + +import java.nio.file.Path; +import java.nio.file.Paths; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.radarcns.validator.Scope.MONITOR; +import static org.radarcns.validator.SchemaValidator.getPath; +import static org.radarcns.validator.SchemaValidator.validate; + +/** + * TODO. + */ +public class SchemaValidatorTest { + + @Test + public void testGetPath() { + Path path = Paths.get("/Users/developer/Repositories/RADAR-Schemas/commons/" + + "monitor/application/application_external_time.avsc"); + + String expected = "/RADAR-Schemas/commons/monitor/application/" + + "application_external_time.avsc"; + + assertEquals(expected, getPath(path)); + } + + @Test + public void testEnumerator() { + Path schemaPath = SchemaRepository.PROJECT_ROOT.resolve( + "commons/monitor/application/server_status.avsc"); + + String name = "org.radarcns.monitor.application.ServerStatus"; + String documentation = "Mock documentation."; + + Schema schema = SchemaBuilder + .enumeration(name) + .doc(documentation) + .symbols("CONNECTED", "DISCONNECTED", "UNKNOWN"); + + ValidationResult result = validate(schema, schemaPath, MONITOR); + + assertTrue(result.isValid()); + + schema = SchemaBuilder + .enumeration(name) + .doc(documentation) + .symbols("CONNECTED", "DISCONNECTED", "un_known"); + + result = validate(schema, schemaPath, MONITOR); + + assertFalse(result.isValid()); + } + +} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SpecificationsValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SpecificationsValidator.java deleted file mode 100644 index d25bd11c..00000000 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SpecificationsValidator.java +++ /dev/null @@ -1,96 +0,0 @@ -package org.radarcns.validator; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertTrue; -import static org.radarcns.validator.util.AvroValidator.getExtension; - -import java.io.File; -import java.io.IOException; -import org.radarcns.validator.SchemaCatalogValidator.SpecificationFolder; -import org.radarcns.validator.config.SkipConfig; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * TODO. - */ -public final class SpecificationsValidator { - - private static final Logger LOGGER = LoggerFactory.getLogger(SpecificationsValidator.class); - - public static final String YML_FORMAT = "yml"; - - private SpecificationsValidator() { - //Static class - } - - /** - * TODO. - * @throws IOException TODO - */ - public static void validateAll() { - active(); - monitor(); - passive(); - } - - /** - * TODO. - * @throws IOException TODO - */ - public static void active() { - analiseFiles(SpecificationFolder.ACTIVE.getFolder()); - } - - /** - * TODO. - * @throws IOException TODO - */ - public static void monitor() { - analiseFiles(SpecificationFolder.MONITOR.getFolder()); - } - - /** - * TODO. - * @throws IOException TODO - */ - public static void passive() { - analiseFiles(SpecificationFolder.PASSIVE.getFolder()); - } - - private static void analiseFiles(File file) { - if (file.isDirectory()) { - for (File son : file.listFiles()) { - analiseFiles(son); - } - } else if (SkipConfig.skipFile(file)) { - LOGGER.debug("Skipping {}", file.getAbsolutePath()); - } else { - assertTrue(isYmlFile(file)); - } - } - - /** - * TODO. - * @param file TODO - * @return TODO - */ - public static boolean isYmlFile(File file) { - return YML_FORMAT.equals(getExtension(file)); - } -} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SpecificationsValidatorTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SpecificationsValidatorTest.java new file mode 100644 index 00000000..3d09be68 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SpecificationsValidatorTest.java @@ -0,0 +1,33 @@ +package org.radarcns.validator; + +import org.junit.Before; +import org.junit.Test; +import org.radarcns.validator.config.ExcludeConfig; + +import java.io.IOException; + +import static org.junit.Assert.assertTrue; + +public class SpecificationsValidatorTest { + private SpecificationsValidator validator; + + @Before + public void setUp() { + this.validator = new SpecificationsValidator(ExcludeConfig.load()); + } + + @Test + public void activeIsYml() throws IOException { + assertTrue(validator.specificationsAreYmlFiles(Scope.ACTIVE)); + } + + @Test + public void monitorIsYml() throws IOException { + assertTrue(validator.specificationsAreYmlFiles(Scope.MONITOR)); + } + + @Test + public void passiveIsYml() throws IOException { + assertTrue(validator.specificationsAreYmlFiles(Scope.PASSIVE)); + } +} \ No newline at end of file diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfig.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfig.java deleted file mode 100644 index 1570dac4..00000000 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfig.java +++ /dev/null @@ -1,268 +0,0 @@ -package org.radarcns.validator.config; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.radarcns.validator.util.AvroValidator.getExtension; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Path; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.stream.Stream; -import org.apache.avro.Schema; -import org.apache.avro.Schema.Field; -import org.radarcns.config.YamlConfigLoader; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * TODO. - */ -public class SkipConfig { - - private static final Logger LOGGER = LoggerFactory.getLogger(SkipConfig.class); - - /** Repository name. */ - public static final String REPOSITORY_NAME = "/RADAR-Schemas/"; - - /** File path location. */ - private static final String FILE_NAME = "skip.yml"; - - /** Wild card to suppress check for entire package. */ - public static final String WILD_CARD_PACKAGE = ".*"; - - /** Wild card to suppress check for all file extension. */ - public static final String WILD_CARD_FILE_NAME = "*."; - - /** Wild card to suppress check for folder and subfolders. */ - public static final String WILD_CARD_FOLDER = "**"; - - /** Wild card to suppress check all schemas. */ - public static final String WILD_CARD_COLLISION = "*"; - - /** Regex for validating the yml file. */ - protected static final String VALID_INPUT_REGEX = "^[a-z][a-zA-Z0-9.*]*$"; - protected static final String VALID_FILE_REGEX = "^[a-zA-Z0-9.*][a-zA-Z0-9._*\\/\\\\]+"; - - private final Set files = new HashSet<>(); - private final Map validation = new HashMap<>(); - private final Map> collision = new HashMap<>(); - - private static final SkipConfig CONFIG; - - public SkipConfig() { - // POJO initializer - } - - static { - try { - CONFIG = new YamlConfigLoader().load(new File( - SkipConfig.class.getClassLoader().getResource(FILE_NAME).getFile()), - SkipConfig.class); - } catch (IOException exc) { - throw new ExceptionInInitializerError(exc); - } - } - - /** - * TODO. - * @return TODO - */ - public static boolean validate() { - boolean valid = validateClass(CONFIG.files.stream().map(Path::toString), - "Skipped file list is not valid.", true); - - //Validate validation key map - valid = valid && validateClass(CONFIG.validation.keySet().stream(), - "Validation map keys are not valid.", false); - - //Validate validation value map - valid = valid && validateClass(CONFIG.validation.values().stream() - .map(skipConfigItem -> skipConfigItem.getFields()) - .flatMap(Set::stream), - "Validation map values are not valid.", false); - - //Validate collision key map - valid = valid && validateClass(CONFIG.collision.keySet().stream(), - "Collision map keys are not valid.", false); - - //Validate collision value map - return valid && validateClass(CONFIG.collision.values().stream().flatMap(Set::stream), - "Collision map values are not valid.", false); - } - - /** - * TODO. - * @param stream TODO - * @param message TODO - * @param file TODO - * @return TODO - */ - private static boolean validateClass(Stream stream, String message, boolean file) { - return stream.allMatch(value -> { - if (file && !value.matches(VALID_FILE_REGEX) - || !file && !value.matches(VALID_INPUT_REGEX)) { - LOGGER.error("{} Setting \"{}\" is invalid.", message, value); - return false; - } - return true; - }); - } - - /** - * TODO. - * @param schema TODO - * @return TODO - */ - public static boolean contains(Schema schema) { - return CONFIG.validation.containsKey(schema.getNamespace().concat(WILD_CARD_PACKAGE)) - || CONFIG.validation.containsKey(schema.getFullName()); - } - - /** - * TODO. - * @param schema TODO - * @return TODO - */ - public static boolean isNameRecordEnable(Schema schema) { - SkipConfigItem item = CONFIG.validation.get(schema.getFullName()) == null - ? CONFIG.validation.get(schema.getNamespace().concat(WILD_CARD_PACKAGE)) - : CONFIG.validation.get(schema.getFullName()); - - return item == null || item.isNameRecordDisable(); - } - - /** - * TODO. - * @param schema TODO - * @return TODO - */ - public static Set skippedNameFieldCheck(Schema schema) { - SkipConfigItem item = CONFIG.validation.get(schema.getFullName()) == null - ? CONFIG.validation.get(schema.getNamespace().concat(WILD_CARD_PACKAGE)) - : CONFIG.validation.get(schema.getFullName()); - - return item == null ? new HashSet<>() : item.getFields(); - } - - /** - * TODO. - * @param schema TODO - * @param field TODO - * @return TODO - */ - public static boolean skipCollision(Schema schema, Field field) { - Set info = CONFIG.collision.getOrDefault(field.name(), new HashSet<>()); - if (info.contains(schema.getFullName()) || info.contains(WILD_CARD_COLLISION)) { - return true; - } - - for (String value : info) { - if (value.contains(WILD_CARD_PACKAGE) && schema.getNamespace().startsWith( - value.substring(0, value.length() - 2))) { - return true; - } - } - - return false; - } - - /** - * TODO. - * @param schema TODO - * @param field TODO - * @return TODO - */ - public static Set getCollision(Schema schema, Field field) { - Set set = CONFIG.collision.getOrDefault(field.name(), new HashSet<>()); - set.add(schema.getFullName()); - return set; - } - - /** - * TODO. - * @param file TODO - * @return TODO - */ - public static boolean skipFile(File file) { - return skipFile(file, CONFIG.files); - } - - /** - * TODO. - * @param file TODO - * @param pathToSkip TODO - * @return TODO - */ - @SuppressWarnings({"PMD.ModifiedCyclomaticComplexity", "PMD.StdCyclomaticComplexity"}) - //TODO simplify function - protected static boolean skipFile(File file, Set pathToSkip) { - boolean flag = false; - - String pathString = file.toPath().toString().substring(file.toPath().toString().indexOf( - REPOSITORY_NAME)); - pathString = pathString.substring(REPOSITORY_NAME.length()); - String[] components = pathString.split(File.separator); - - for (Path path : pathToSkip) { - if (path.getFileName().equals(path)) { - if (path.toString().startsWith(WILD_CARD_FILE_NAME)) { - //Case extension - flag = flag || getExtension(file).equals(path.toString().substring(2)); - } else { - //Case file name - flag = flag || file.getName().equals(path.getFileName().toString()); - } - } else { - if (pathString.equals(path.toString())) { - //Exact match - flag = true; - } else { - //Search sub-path - String[] configComp = path.toString().split(File.separator); - - for (int i = 0; i < Math.min(configComp.length, components.length); i++) { - if (!components[i].equals(configComp[i])) { - if (configComp[i].equals(WILD_CARD_FOLDER)) { - if (i == configComp.length - 1) { - //Case folder and subfolder file independent - flag = true; - } else { - if (configComp[i + 1].startsWith(WILD_CARD_FILE_NAME)) { - //Case extension - flag = flag || getExtension(file).equals( - configComp[i + 1].substring(2)); - } else { - //Case name - flag = flag || file.getName().equals(configComp[i + 1]); - } - } - } - - break; - } - } - } - } - } - - return flag; - } -} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfigTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfigTest.java deleted file mode 100644 index d8f2b4ce..00000000 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/config/SkipConfigTest.java +++ /dev/null @@ -1,108 +0,0 @@ -package org.radarcns.validator.config; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.radarcns.validator.config.SkipConfig.VALID_FILE_REGEX; -import static org.radarcns.validator.config.SkipConfig.VALID_INPUT_REGEX; -import static org.radarcns.validator.config.SkipConfig.skipFile; - -import java.io.File; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.HashSet; -import java.util.Set; -import org.junit.Test; - -/** - * TODO. - */ -public class SkipConfigTest { - - @Test - public void testSkipFile() { - String root = "/Users/developer/Repositories/RADAR-Schemas/"; - - Set skipPaths = new HashSet<>(); - - skipPaths.add(Paths.get(".DS_Store")); - - assertTrue(skipFile(new File(root.concat("commons/passive/.DS_Store")), skipPaths)); - assertTrue(skipFile(new File(root.concat(".DS_Store")), skipPaths)); - - skipPaths.clear(); - skipPaths.add(Paths.get("*.md")); - - assertTrue(skipFile(new File(root.concat("commons/passive/empatica/README.md")), - skipPaths)); - assertFalse(skipFile(new File(root.concat("specification/passive/schema.avsc")), - skipPaths)); - - skipPaths.clear(); - skipPaths.add(Paths.get("commons/**")); - - assertTrue(skipFile(new File(root.concat("commons/passive/empatica/README.md")), - skipPaths)); - assertFalse(skipFile(new File(root.concat("specification/passive/README.md")), - skipPaths)); - - skipPaths.clear(); - skipPaths.add(Paths.get("commons/**/README.md")); - - assertTrue(skipFile(new File(root.concat("commons/passive/empatica/README.md")), - skipPaths)); - assertFalse(skipFile(new File(root.concat("specification/passive/README.md")), - skipPaths)); - - skipPaths.add(Paths.get("commons/monitor/application/application_external_time.avsc")); - assertTrue(skipFile(new File(root.concat("commons/monitor/application/" - + "application_external_time.avsc")), skipPaths)); - assertFalse(skipFile(new File(root.concat("commons/passive/application/" - + "application_external_time.avsc")), skipPaths)); - assertFalse(skipFile(new File(root.concat("commons/monitor/application/" - + "application_record_counts.avsc")), skipPaths)); - - skipPaths.add(Paths.get("commons/**/*.avsc")); - assertTrue(skipFile(new File(root.concat("commons/monitor/application/" - + "application_external_time.avsc")), skipPaths)); - assertFalse(skipFile(new File(root.concat("restApi/data/acceleration.avsc")), skipPaths)); - } - - @Test - public void testFileRegex() { - assertTrue(".DS_Store".matches(VALID_FILE_REGEX)); - assertTrue("*.md".matches(VALID_FILE_REGEX)); - assertTrue("commons\\**".matches(VALID_FILE_REGEX)); - assertTrue("commons/**".matches(VALID_FILE_REGEX)); - assertTrue("commons/**/README.md".matches(VALID_FILE_REGEX)); - assertTrue("commons/monitor//application_external_time.avsc".matches(VALID_FILE_REGEX)); - assertTrue("commons/**/*.avsc".matches(VALID_FILE_REGEX)); - assertFalse("test-test.java".matches(VALID_FILE_REGEX)); - assertFalse("/commons/**/*.avsc".matches(VALID_FILE_REGEX)); - } - - @Test - public void testGeneralRegex() { - assertTrue("avg".matches(VALID_INPUT_REGEX)); - assertTrue("x".matches(VALID_INPUT_REGEX)); - assertTrue("org.radarcns.passive.phone.PhoneCall".matches(VALID_INPUT_REGEX)); - assertTrue("org.radarcns.active.*".matches(VALID_INPUT_REGEX)); - assertFalse("org.radarcns.passive.phone.PhoneCall as ENUM".matches(VALID_INPUT_REGEX)); - assertFalse("*".matches(VALID_INPUT_REGEX)); - } -} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java deleted file mode 100644 index 3fb77c24..00000000 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/AvroValidator.java +++ /dev/null @@ -1,140 +0,0 @@ -package org.radarcns.validator.util; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertTrue; - -import java.io.File; -import java.io.IOException; -import org.apache.avro.Schema; -import org.apache.avro.Schema.Parser; -import org.radarcns.validator.SchemaCatalogValidator.NameFolder; -import org.radarcns.validator.SchemaCatalogValidator.RootPath; -import org.radarcns.validator.config.SkipConfig; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public final class AvroValidator { - - private static final Logger LOGGER = LoggerFactory.getLogger(AvroValidator.class); - - public static final String AVRO_FORMAT = "avsc"; - - private AvroValidator() { - //Static class - } - - /** - * TODO. - * @param file TODO. - * @param packageName TODO. - * @throws IOException TODO. - */ - public static void analiseFiles(File file, NameFolder packageName) throws IOException { - analiseFiles(file, packageName, null); - } - - private static void analiseFiles(File file, NameFolder packageName, String parentName) - throws IOException { - if (file.isDirectory()) { - for (File son : file.listFiles()) { - analiseFiles(son, packageName, file.getName()); - } - } else if (SkipConfig.skipFile(file)) { - LOGGER.debug("Skipping {}", file.getAbsolutePath()); - } else { - assertTrue(packageName.getName().concat(" should contain only ") - .concat(AVRO_FORMAT).concat(" files. ") - .concat(file.getAbsolutePath()).concat(" is invalid."), - isAvscFile(file)); - - Schema schema = new Parser().parse(file); - - ValidationResult result; - - if (SkipConfig.contains(schema)) { - result = SchemaValidator.validate(schema, file.toPath(), packageName, - isFirstLevel(file) ? null : parentName, - SkipConfig.isNameRecordEnable(schema), - SkipConfig.skippedNameFieldCheck(schema)); - } else { - result = SchemaValidator.validate(schema, file.toPath(), packageName, - isFirstLevel(file) ? null : parentName); - } - - assertTrue(getMessage(result), result.isValid()); - - //TODO add file layout validation - } - } - - private static boolean isFirstLevel(File file) { - for (RootPath root : RootPath.values()) { - if (root.getPath().equals(file.getParentFile().getParentFile().toPath())) { - return true; - } - } - - return false; - } - - private static String getMessage(ValidationResult result) { - StringBuilder messageBuilder = new StringBuilder(200); - result.getReason().ifPresent(s -> messageBuilder.append(s)); - return messageBuilder.toString(); - } - - /** - * TODO. - * @param file TODO - * @return TODO - */ - public static boolean isAvscFile(File file) { - return AVRO_FORMAT.equals(getExtension(file)); - } - - /** - * TODO. - * @param file TODO. - * @return TODO. - */ - public static String getExtension(File file) { - String extension = ""; - int index = file.getName().lastIndexOf('.'); - if (index > 0) { - extension = file.getName().substring(index + 1); - } - - return extension; - } - - /** - * TODO. - * @param reset TODO - */ - public static void analyseNamingCollision(boolean reset) { - String message = SchemaValidator.analyseCollision().toString(); - if (!"".equalsIgnoreCase(message)) { - LOGGER.warn("Different schemas have fields with same names:\n{}", message); - } - - if (reset) { - SchemaValidator.resetCollision(); - } - } - -} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java deleted file mode 100644 index 6abf41f4..00000000 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidator.java +++ /dev/null @@ -1,205 +0,0 @@ -package org.radarcns.validator.util; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.radarcns.validator.util.SchemaValidationRoles.getActiveValidator; -import static org.radarcns.validator.util.SchemaValidationRoles.getGeneralEnumValidator; -import static org.radarcns.validator.util.SchemaValidationRoles.getGeneralRecordValidator; -import static org.radarcns.validator.util.SchemaValidationRoles.getMonitorValidator; -import static org.radarcns.validator.util.SchemaValidationRoles.getPassiveValidator; - -import java.io.IOException; -import java.nio.file.Path; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Objects; -import java.util.Set; -import org.apache.avro.Schema; -import org.apache.avro.Schema.Field; -import org.apache.avro.Schema.Type; -import org.radarcns.validator.SchemaCatalogValidator.NameFolder; -import org.radarcns.validator.config.SkipConfig; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * TODO. - */ -final class SchemaValidator { - - private static final Logger LOGGER = LoggerFactory.getLogger(SchemaValidator.class); - - private static final Map> COLLISIONS = new HashMap<>(); - - private static final Map CACHE = new HashMap<>(); - - private SchemaValidator() { - //Static class - } - - /** - * TODO. - * @param schema TODO - * @param pathToSchema TODO - * @param root TODO - * @param subfolder TODO - * @return TODO - * @throws IOException TODO - */ - public static ValidationResult validate(Schema schema, Path pathToSchema, NameFolder root, - String subfolder) { - return validate(schema, pathToSchema, root, subfolder, - false, null); - } - - /** - * TODO. - * @param schema TODO - * @param pathToSchema TODO - * @param root TODO - * @param subfolder TODO - * @param skipRecordName TODO - * @param skipFieldName TODO - * @return TODO - * @throws IOException TODO - */ - public static ValidationResult validate(Schema schema, Path pathToSchema, NameFolder root, - String subfolder, boolean skipRecordName, Set skipFieldName) { - Objects.requireNonNull(schema); - Objects.requireNonNull(pathToSchema); - Objects.requireNonNull(root); - - CACHE.put(schema.getFullName(), schema); - - ValidationResult result; - - if (schema.getType().equals(Type.ENUM)) { - result = getGeneralEnumValidator(pathToSchema, root, subfolder, - skipRecordName).apply(schema); - } else { - switch (root) { - case ACTIVE: - result = getActiveValidator(pathToSchema, root, subfolder, skipRecordName, - skipFieldName).apply(schema); - break; - case CATALOGUE: - result = getGeneralRecordValidator(pathToSchema, root, subfolder, - skipRecordName, skipFieldName).apply(schema); - break; - case KAFKA: - result = getGeneralRecordValidator(pathToSchema, root, subfolder, - skipRecordName, skipFieldName).apply(schema); - break; - case MONITOR: - result = getMonitorValidator(pathToSchema, root, subfolder, skipRecordName, - skipFieldName).apply(schema); - break; - case PASSIVE: - result = getPassiveValidator(pathToSchema, root, subfolder, skipRecordName, - skipFieldName).apply(schema); - break; - default: - LOGGER.warn("Applying general validation to {}", getPath(pathToSchema)); - result = getGeneralRecordValidator(pathToSchema, root, subfolder, - skipRecordName, skipFieldName).apply(schema); - break; - } - } - - computeCollision(schema); - - return result; - } - - /** - * TODO. - * @param path TODO - * @return TODO - */ - public static String getPath(Path path) { - return path.toString().substring(path.toString().indexOf(SkipConfig.REPOSITORY_NAME)); - } - - /** - * TODO. - * @param schema TODO. - */ - private static void computeCollision(Schema schema) { - if (!schema.getType().equals(Type.RECORD)) { - return; - } - - for (Field field : schema.getFields()) { - if (SkipConfig.skipCollision(schema, field)) { - continue; - } - - Set collision = SkipConfig.getCollision(schema, field); - collision.addAll(COLLISIONS.getOrDefault(field.name(), new HashSet<>())); - - COLLISIONS.put(field.name(), collision); - computeCollision(field.schema()); - } - } - - /** - * TODO. - * @return TODO - */ - public static StringBuilder analyseCollision() { - int capacity = 100 * COLLISIONS.values().stream().mapToInt(Set::size).sum() - + COLLISIONS.size() * 120 + 100; - - StringBuilder messageBuilder = new StringBuilder(capacity); - COLLISIONS.entrySet().stream() - .filter(entry -> entry.getValue().size() > 1) - .sorted(Comparator.comparing(Entry::getKey)) - .forEach(entry -> { - messageBuilder.append('\"').append(entry.getKey().concat("\" appears in:\n")); - entry.getValue().stream().forEach( - schemaName -> addFieldDetails(entry, schemaName, messageBuilder) - ); - - messageBuilder.append("In case they have different use-cases, please modify " - + "the name field accordingly.\n"); - }); - - return messageBuilder; - } - - private static void addFieldDetails(Entry> entry, String schemaName, - StringBuilder messageBuilder) { - if (schemaName.contains(SkipConfig.WILD_CARD_COLLISION) - || schemaName.contains(SkipConfig.WILD_CARD_PACKAGE)) { - messageBuilder.append("\t - ".concat(schemaName).concat("\n")); - } else { - messageBuilder.append("\t - ".concat(schemaName).concat(" as ").concat( - CACHE.get(schemaName).getField( - entry.getKey()).schema().getType().getName().toUpperCase()).concat("\n")); - } - } - - /** - * TODO. - */ - public static void resetCollision() { - COLLISIONS.clear(); - } -} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java deleted file mode 100644 index 3e2febfd..00000000 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/util/SchemaValidatorTest.java +++ /dev/null @@ -1,124 +0,0 @@ -package org.radarcns.validator.util; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.radarcns.validator.SchemaCatalogValidator.NameFolder.KAFKA; -import static org.radarcns.validator.SchemaCatalogValidator.NameFolder.MONITOR; -import static org.radarcns.validator.util.SchemaValidator.analyseCollision; -import static org.radarcns.validator.util.SchemaValidator.getPath; -import static org.radarcns.validator.util.SchemaValidator.resetCollision; -import static org.radarcns.validator.util.SchemaValidator.validate; - -import java.io.IOException; -import java.nio.file.Path; -import java.nio.file.Paths; -import org.apache.avro.Schema; -import org.apache.avro.Schema.Parser; -import org.apache.avro.SchemaBuilder; -import org.junit.Test; - -/** - * TODO. - */ -public class SchemaValidatorTest { - - @Test - public void testGetPath() { - Path path = Paths.get("/Users/developer/Repositories/RADAR-Schemas/commons/" - + "monitor/application/application_external_time.avsc"); - - String expected = "/RADAR-Schemas/commons/monitor/application/" - + "application_external_time.avsc"; - - assertEquals(expected, getPath(path)); - } - - @Test - public void testCollision() throws IOException { - resetCollision(); - - Parser parser = new Parser(); - - String folder = "key"; - String windowed = "key_windowed_test.avsc"; - String measurement = "key_measurement_test.avsc"; - - ValidationResult result = validate( - parser.parse(getClass().getClassLoader().getResourceAsStream(windowed)), - Paths.get("/Users/developer/Repositories/RADAR-Schemas/commons/kafka/key/" - + windowed), KAFKA, folder); - - assertTrue(result.isValid()); - - result = validate( - parser.parse(getClass().getClassLoader().getResourceAsStream(measurement)), - Paths.get("/Users/developer/Repositories/RADAR-Schemas/commons/kafka/key/" - + measurement), KAFKA, folder); - - assertTrue(result.isValid()); - - String expected = "\"sourceTestId\" appears in:\n" - + "\t - org.radarcns.kafka.key.KeyMeasurementTest as STRING\n" - + "\t - org.radarcns.kafka.key.KeyWindowedTest as STRING\n" - + "In case they have different use-cases, " - + "please modify the name field accordingly.\n" - + "\"userTestId\" appears in:\n" - + "\t - org.radarcns.kafka.key.KeyMeasurementTest as STRING\n" - + "\t - org.radarcns.kafka.key.KeyWindowedTest as STRING\n" - + "In case they have different use-cases, " - + "please modify the name field accordingly.\n"; - - String actual = analyseCollision().toString(); - - resetCollision(); - - assertEquals(expected, actual); - } - - @Test - public void testEnumerator() { - Path schemaPath = Paths.get("/Users/developer/Repositories/RADAR-Schemas/" - + "commons/monitor/application/server_status.avsc"); - - String subfolder = "application"; - - String name = "org.radarcns.monitor.application.ServerStatus"; - String documentation = "Mock documentation."; - - Schema schema = SchemaBuilder - .enumeration(name) - .doc(documentation) - .symbols("CONNECTED", "DISCONNECTED", "UNKNOWN"); - - ValidationResult result = validate(schema, schemaPath, MONITOR, subfolder); - - assertTrue(result.isValid()); - - schema = SchemaBuilder - .enumeration(name) - .doc(documentation) - .symbols("CONNECTED", "DISCONNECTED", "un_known"); - - result = validate(schema, schemaPath, MONITOR, subfolder); - - assertFalse(result.isValid()); - } - -} diff --git a/java-sdk/radar-schemas-validator/src/test/resources/skip.yml b/java-sdk/radar-schemas-validator/src/test/resources/skip.yml index b3e09102..c56f343d 100644 --- a/java-sdk/radar-schemas-validator/src/test/resources/skip.yml +++ b/java-sdk/radar-schemas-validator/src/test/resources/skip.yml @@ -12,84 +12,3 @@ validation: org.radarcns.passive.empatica.EmpaticaE4InterBeatInterval: fields: - interBeatInterval - - -#=================== SKIP COLLISION CONFIGURATION ====================# -collision: - avg: - - org.radarcns.kafka.aggregator.AggregatorDouble - - org.radarcns.kafka.aggregator.AggregatorDoubleArray - batteryLevel: - - org.radarcns.passive.biovotion.BiovotionVsm1BatteryState - - org.radarcns.passive.empatica.EmpaticaE4BatteryLevel - - org.radarcns.passive.pebble.Pebble2BatteryLevel - - org.radarcns.passive.phone.PhoneBatteryLevel - count: - - org.radarcns.kafka.aggregator.AggregatorDouble - - org.radarcns.kafka.aggregator.AggregatorDoubleArray - heartRate: - - org.radarcns.passive.biovotion.BiovotionVsm1HeartRate - - org.radarcns.passive.pebble.Pebble2HeartRate - - org.radarcns.passive.pebble.Pebble2HeartRateFiltered - iqr: - - org.radarcns.kafka.aggregator.AggregatorDouble - - org.radarcns.kafka.aggregator.AggregatorDoubleArray - max: - - org.radarcns.kafka.aggregator.AggregatorDouble - - org.radarcns.kafka.aggregator.AggregatorDoubleArray - min: - - org.radarcns.kafka.aggregator.AggregatorDouble - - org.radarcns.kafka.aggregator.AggregatorDoubleArray - quartile: - - org.radarcns.kafka.aggregator.AggregatorDouble - - org.radarcns.kafka.aggregator.AggregatorDoubleArray - sourceId: - - org.radarcns.kafka.key.KeyMeasurement - - org.radarcns.kafka.key.KeyWindowed - sum: - - org.radarcns.kafka.aggregator.AggregatorDouble - - org.radarcns.kafka.aggregator.AggregatorDoubleArray - target: - - org.radarcns.passive.phone.PhoneCall - - org.radarcns.passive.phone.PhoneSms - targetIsContact: - - org.radarcns.passive.phone.PhoneCall - - org.radarcns.passive.phone.PhoneSms - temperature: - - org.radarcns.passive.biovotion.BiovotionVsm1Temperature - - org.radarcns.passive.empatica.EmpaticaE4Temperature - type: - - org.radarcns.passive.phone.PhoneCall - - org.radarcns.passive.phone.PhoneSms - time: - - org.radarcns.active.* - - org.radarcns.monitor.* - - org.radarcns.passive.* - timeReceived: - - org.radarcns.passive.* - timeCompleted: - - org.radarcns.active.* - userId: - - org.radarcns.kafka.key.KeyMeasurement - - org.radarcns.kafka.key.KeyWindowed - x: - - org.radarcns.passive.biovotion.BiovotionVsm1Acceleration - - org.radarcns.passive.empatica.EmpaticaE4Acceleration - - org.radarcns.passive.pebble.Pebble2Acceleration - - org.radarcns.passive.phone.PhoneAcceleration - - org.radarcns.passive.phone.PhoneGyroscope - - org.radarcns.passive.phone.PhoneMagneticField - y: - - org.radarcns.passive.biovotion.BiovotionVsm1Acceleration - - org.radarcns.passive.empatica.EmpaticaE4Acceleration - - org.radarcns.passive.pebble.Pebble2Acceleration - - org.radarcns.passive.phone.PhoneAcceleration - - org.radarcns.passive.phone.PhoneGyroscope - - org.radarcns.passive.phone.PhoneMagneticField - z: - - org.radarcns.passive.biovotion.BiovotionVsm1Acceleration - - org.radarcns.passive.empatica.EmpaticaE4Acceleration - - org.radarcns.passive.pebble.Pebble2Acceleration - - org.radarcns.passive.phone.PhoneAcceleration - - org.radarcns.passive.phone.PhoneGyroscope - - org.radarcns.passive.phone.PhoneMagneticField From 5dd837c2ef2a067e8cbde03101287609b0e9c9b5 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Tue, 12 Sep 2017 17:08:58 +0200 Subject: [PATCH 056/112] Working specifications commandline app --- .../active/questionnaire/questionnaire.avsc | 2 +- commons/catalogue/active_source_type.avsc | 10 - commons/catalogue/monitor_source_type.avsc | 13 - commons/catalogue/passive_source_type.avsc | 7 - .../{data_type.avsc => processing_state.avsc} | 2 +- java-sdk/build.gradle | 13 +- java-sdk/radar-schemas-commons/build.gradle | 6 + .../questionnaire/Questionnaire$Builder.class | Bin 7112 -> 6823 bytes .../active/questionnaire/Questionnaire.class | Bin 7514 -> 7188 bytes .../questionnaire/QuestionnaireType.class | Bin 1676 -> 0 bytes java-sdk/radar-schemas-restapi/build.gradle | 6 + .../radar-schemas-specifications/build.gradle | 6 - .../specification}/CommandLineApp.java | 88 ++++-- .../schema/specification/SourceCatalogue.java | 170 +++++++++++ .../specification}/source/Aggregatable.java | 5 +- .../specification}/source/KafkaActor.java | 23 +- .../specification/source}/MonitorSource.java | 46 ++- .../specification}/source/Source.java | 4 +- .../specification}/source/Topic.java | 4 +- .../source/active/ActiveSource.java | 32 +- .../source/active/questionnaire/Question.java | 26 +- .../questionnaire/QuestionnaireSource.java | 36 +-- .../source/active/questionnaire/Response.java | 6 +- .../source/passive/PassiveSource.java | 55 ++-- .../source/passive/Processor.java | 75 +++++ .../specification}/source/passive/Sensor.java | 45 ++- .../specification}/util/Labels.java | 2 +- .../specification}/util/Utils.java | 30 +- .../specifications/SourceCatalogue.java | 204 ------------- .../source/passive/Processor.java | 86 ------ .../specification}/ActiveValidation.java | 2 +- .../specification}/MonitorValidation.java | 2 +- .../specification}/PassiveValidation.java | 20 +- .../SourceCatalogueValidation.java | 96 ++++++ .../specification}/util/TopicTest.java | 23 +- .../specification}/util/UtilsTest.java | 2 +- .../validator/ActiveSourceRoles.java | 24 +- .../validator/AggregatableRoles.java | 26 +- .../validator/GenericRoles.java | 48 ++- .../specification}/validator/Invalid.java | 2 +- .../specification}/validator/Message.java | 2 +- .../validator/MonitorRoles.java | 28 +- .../validator/PassiveSourceRoles.java | 27 +- .../validator/ProcessorRoles.java | 17 +- .../validator/QuestionRoles.java | 8 +- .../validator/QuestionnaireRoles.java | 18 +- .../validator/ResponseRoles.java | 12 +- .../specification}/validator/SensorRoles.java | 23 +- .../specification}/validator/TopicRoles.java | 41 ++- .../validator/ValidationResult.java | 2 +- .../validator/ValidationSupport.java | 2 +- .../specification}/validator/Validator.java | 2 +- .../SourceCatalogueValidation.java | 88 ------ .../specifications/value/Utility.java | 274 ------------------ .../specifications/value/active/Phq8Test.java | 143 --------- .../value/monitor/ExternalTimeTest.java | 60 ---- .../value/monitor/RecordCountsTest.java | 60 ---- .../value/monitor/ServerStatusTest.java | 60 ---- .../value/monitor/UptimeTest.java | 60 ---- .../value/passive/AndroidPhoneTest.java | 223 -------------- .../value/passive/BiovotionTest.java | 256 ---------------- .../value/passive/EmpaticaE4Test.java | 185 ------------ .../value/passive/Pebble2Test.java | 136 --------- java-sdk/radar-schemas-validator/build.gradle | 15 +- .../validation}/Invalid.java | 2 +- .../validation}/SchemaRepository.java | 2 +- .../validation}/SchemaValidationRoles.java | 75 ++--- .../validation}/SchemaValidator.java | 15 +- .../validation}/SpecificationsValidator.java | 11 +- .../validation}/ValidationResult.java | 2 +- .../validation}/ValidationSupport.java | 39 +-- .../validation}/config/ConfigItem.java | 2 +- .../validation}/config/ExcludeConfig.java | 2 +- .../java/org/radarcns/validator/Scope.java | 40 --- .../validation}/AvroValidator.java | 13 +- .../validation}/ExcludeConfigTest.java | 6 +- .../SchemaValidationRolesTest.java | 99 ++++--- .../validation}/SchemaValidatorTest.java | 14 +- .../SpecificationsValidatorTest.java | 5 +- restapi/header/header.avsc | 4 +- restapi/source/source.avsc | 2 +- restapi/spec/sensor_specification.avsc | 2 +- restapi/spec/source_specification.avsc | 2 +- specifications/monitor/external_time.yml | 2 +- specifications/monitor/record_counts.yml | 2 +- specifications/monitor/server_status.yml | 2 +- specifications/monitor/uptime.yml | 2 +- specifications/passive/android_phone.yml | 36 +-- specifications/passive/biovotion_vsm1.yml | 24 +- specifications/passive/empatica_e4.yml | 14 +- specifications/passive/pebble_2.yml | 8 +- 91 files changed, 907 insertions(+), 2509 deletions(-) delete mode 100644 commons/catalogue/active_source_type.avsc delete mode 100644 commons/catalogue/monitor_source_type.avsc delete mode 100644 commons/catalogue/passive_source_type.avsc rename commons/catalogue/{data_type.avsc => processing_state.avsc} (91%) delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/QuestionnaireType.class rename java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/{specifications => schema/specification}/CommandLineApp.java (60%) create mode 100644 java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java rename java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/{specifications => schema/specification}/source/Aggregatable.java (83%) rename java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/{specifications => schema/specification}/source/KafkaActor.java (75%) rename java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/{specifications/source/passive => schema/specification/source}/MonitorSource.java (57%) rename java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/{specifications => schema/specification}/source/Source.java (93%) rename java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/{specifications => schema/specification}/source/Topic.java (98%) rename java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/{specifications => schema/specification}/source/active/ActiveSource.java (73%) rename java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/{specifications => schema/specification}/source/active/questionnaire/Question.java (67%) rename java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/{specifications => schema/specification}/source/active/questionnaire/QuestionnaireSource.java (64%) rename java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/{specifications => schema/specification}/source/active/questionnaire/Response.java (88%) rename java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/{specifications => schema/specification}/source/passive/PassiveSource.java (64%) create mode 100644 java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/Processor.java rename java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/{specifications => schema/specification}/source/passive/Sensor.java (60%) rename java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/{specifications => schema/specification}/util/Labels.java (97%) rename java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/{specifications => schema/specification}/util/Utils.java (71%) delete mode 100644 java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/SourceCatalogue.java delete mode 100644 java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Processor.java rename java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/{specifications => schema/specification}/ActiveValidation.java (97%) rename java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/{specifications => schema/specification}/MonitorValidation.java (97%) rename java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/{specifications => schema/specification}/PassiveValidation.java (77%) create mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/SourceCatalogueValidation.java rename java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/{specifications => schema/specification}/util/TopicTest.java (83%) rename java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/{specifications => schema/specification}/util/UtilsTest.java (96%) rename java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/{specifications => schema/specification}/validator/ActiveSourceRoles.java (69%) rename java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/{specifications => schema/specification}/validator/AggregatableRoles.java (81%) rename java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/{specifications => schema/specification}/validator/GenericRoles.java (67%) rename java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/{specifications => schema/specification}/validator/Invalid.java (96%) rename java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/{specifications => schema/specification}/validator/Message.java (94%) rename java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/{specifications => schema/specification}/validator/MonitorRoles.java (73%) rename java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/{specifications => schema/specification}/validator/PassiveSourceRoles.java (82%) rename java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/{specifications => schema/specification}/validator/ProcessorRoles.java (85%) rename java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/{specifications => schema/specification}/validator/QuestionRoles.java (90%) rename java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/{specifications => schema/specification}/validator/QuestionnaireRoles.java (71%) rename java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/{specifications => schema/specification}/validator/ResponseRoles.java (78%) rename java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/{specifications => schema/specification}/validator/SensorRoles.java (75%) rename java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/{specifications => schema/specification}/validator/TopicRoles.java (65%) rename java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/{specifications => schema/specification}/validator/ValidationResult.java (94%) rename java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/{specifications => schema/specification}/validator/ValidationSupport.java (98%) rename java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/{specifications => schema/specification}/validator/Validator.java (99%) delete mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueValidation.java delete mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/Utility.java delete mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/active/Phq8Test.java delete mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/ExternalTimeTest.java delete mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/RecordCountsTest.java delete mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/ServerStatusTest.java delete mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/UptimeTest.java delete mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/AndroidPhoneTest.java delete mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/BiovotionTest.java delete mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/EmpaticaE4Test.java delete mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/Pebble2Test.java rename java-sdk/radar-schemas-validator/src/main/java/org/radarcns/{validator => schema/validation}/Invalid.java (97%) rename java-sdk/radar-schemas-validator/src/main/java/org/radarcns/{validator => schema/validation}/SchemaRepository.java (97%) rename java-sdk/radar-schemas-validator/src/main/java/org/radarcns/{validator => schema/validation}/SchemaValidationRoles.java (85%) rename java-sdk/radar-schemas-validator/src/main/java/org/radarcns/{validator => schema/validation}/SchemaValidator.java (85%) rename java-sdk/radar-schemas-validator/src/main/java/org/radarcns/{validator => schema/validation}/SpecificationsValidator.java (78%) rename java-sdk/radar-schemas-validator/src/main/java/org/radarcns/{validator => schema/validation}/ValidationResult.java (95%) rename java-sdk/radar-schemas-validator/src/main/java/org/radarcns/{validator => schema/validation}/ValidationSupport.java (84%) rename java-sdk/radar-schemas-validator/src/main/java/org/radarcns/{validator => schema/validation}/config/ConfigItem.java (97%) rename java-sdk/radar-schemas-validator/src/main/java/org/radarcns/{validator => schema/validation}/config/ExcludeConfig.java (99%) delete mode 100644 java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/Scope.java rename java-sdk/radar-schemas-validator/src/test/java/org/radarcns/{validator => schema/validation}/AvroValidator.java (86%) rename java-sdk/radar-schemas-validator/src/test/java/org/radarcns/{validator => schema/validation}/ExcludeConfigTest.java (94%) rename java-sdk/radar-schemas-validator/src/test/java/org/radarcns/{validator => schema/validation}/SchemaValidationRolesTest.java (84%) rename java-sdk/radar-schemas-validator/src/test/java/org/radarcns/{validator => schema/validation}/SchemaValidatorTest.java (82%) rename java-sdk/radar-schemas-validator/src/test/java/org/radarcns/{validator => schema/validation}/SpecificationsValidatorTest.java (84%) diff --git a/commons/active/questionnaire/questionnaire.avsc b/commons/active/questionnaire/questionnaire.avsc index 8671ecac..a507ee64 100644 --- a/commons/active/questionnaire/questionnaire.avsc +++ b/commons/active/questionnaire/questionnaire.avsc @@ -6,7 +6,7 @@ "fields": [ { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the questionnaire is submitted to the subject." }, { "name": "timeCompleted", "type": "double", "doc": "timestamp in UTC (s) when subject marks the questionnaire as." }, - { "name": "name", "type": {"name": "QuestionnaireType", "type": "enum", "symbols": ["PHQ8", "UNKNOWN"]}, "doc": "Questionnaire names.", "default": "UNKNOWN" }, + { "name": "name", "type": "string", "doc": "Questionnaire names.", "default": "UNKNOWN" }, { "name": "version", "type": "string", "doc": "It reports the questionnaire version stated in the JSON specification." }, { "name": "answers", "type": { diff --git a/commons/catalogue/active_source_type.avsc b/commons/catalogue/active_source_type.avsc deleted file mode 100644 index 6153a5b8..00000000 --- a/commons/catalogue/active_source_type.avsc +++ /dev/null @@ -1,10 +0,0 @@ -{ - "namespace": "org.radarcns.catalogue", - "type": "enum", - "name": "ActiveSourceType", - "doc": "List of integrated active sources.", - "symbols": [ - "QUESTIONNAIRE", - "UNKNOWN" - ] -} diff --git a/commons/catalogue/monitor_source_type.avsc b/commons/catalogue/monitor_source_type.avsc deleted file mode 100644 index 1bce95d1..00000000 --- a/commons/catalogue/monitor_source_type.avsc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "namespace": "org.radarcns.catalogue", - "type": "enum", - "name": "MonitorSourceType", - "doc": "List of integrated active sources.", - "symbols": [ - "EXTERNAL_TIME", - "RECORD_COUNTS", - "SERVER_STATUS", - "UPTIME", - "UNKNOWN" - ] -} diff --git a/commons/catalogue/passive_source_type.avsc b/commons/catalogue/passive_source_type.avsc deleted file mode 100644 index 8195a073..00000000 --- a/commons/catalogue/passive_source_type.avsc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "namespace": "org.radarcns.catalogue", - "type": "enum", - "name": "PassiveSourceType", - "doc": "Integrated passive sources", - "symbols": [ "ANDROID_PHONE" , "EMPATICA_E4", "PEBBLE_2", "BIOVOTION_VSM1", "UNKNOWN" ] -} diff --git a/commons/catalogue/data_type.avsc b/commons/catalogue/processing_state.avsc similarity index 91% rename from commons/catalogue/data_type.avsc rename to commons/catalogue/processing_state.avsc index 690001ae..8a25c435 100644 --- a/commons/catalogue/data_type.avsc +++ b/commons/catalogue/processing_state.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.catalogue", "type": "enum", - "name": "DataType", + "name": "ProcessingState", "doc": "Data directly collected form an hardware senor or that has not been pre-processed is defined RAW. Any value different from RAW states who computes the value.", "symbols": [ "RAW" , diff --git a/java-sdk/build.gradle b/java-sdk/build.gradle index 692eae25..361893dc 100644 --- a/java-sdk/build.gradle +++ b/java-sdk/build.gradle @@ -13,6 +13,7 @@ subprojects { apply plugin: 'com.jfrog.bintray' apply plugin: 'com.commercehub.gradle.plugin.avro-base' apply plugin: 'maven-publish' + apply plugin: 'idea' // Configuration version = '0.2-alpha.2' @@ -106,10 +107,16 @@ subprojects { } // Generated avro files - ext.avroOutputDir = file('src/main/java') + ext.avroOutputDir = file('src/generated/java') + + idea { + module { + downloadSources = true + } + } } task wrapper(type: Wrapper) { - gradleVersion = '3.4.1' - distributionUrl distributionUrl.replace("bin", "all") + gradleVersion = '4.1' + distributionType 'all' } diff --git a/java-sdk/radar-schemas-commons/build.gradle b/java-sdk/radar-schemas-commons/build.gradle index 973cce24..19603786 100644 --- a/java-sdk/radar-schemas-commons/build.gradle +++ b/java-sdk/radar-schemas-commons/build.gradle @@ -1,6 +1,12 @@ ext.artifactName = 'radar-schemas-commons' ext.description = 'RADAR Schemas Commons SDK' +sourceSets { + main { + java.srcDir avroOutputDir + } +} + //---------------------------------------------------------------------------// // Clean settings // //---------------------------------------------------------------------------// diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Questionnaire$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Questionnaire$Builder.class index 5e32feeffdcf5eb6d95f4944c8768b639e7f526c..da3c6fc2e1b0f7d46ebaaf46706f503b33cdacd2 100644 GIT binary patch literal 6823 zcmbtZdvH`&8ULMRcW<&>LdXM10F^d{kkl?oYO#byAOTt%9%WM$sE^C;CAnqU4ZE8F z#abVINv+lTq^;Jfm8w;sC85)f#Xo$^_>calVtur>we2|LI6g)lEq>oQXYW1xh_En| zIrrXkzVCOw^ZOp>+sRMgeD-+&eVB@(19=`Mc$lomVjPI#3LNC&5YOFKPs8CT8t@_h zyq$*+M{x%}62(XHF$*8(wL5wGE*8C;hkGpC%g;~naKyrW41AaeT3(EMc%Ze#IKq0L zv~YivJ|_9&Qx+bu@aZU);4}RFpoPy`_?(5$3xx9CK36~t3C!l#!OXt#l$&>xw3K#u zscHCDXVQtKob+fcp3i#e(S8AI(#__)Oq$-DbnXCs2sA3eiM*GJ4STsfiPguw(X^AF z$P&)#lI7LIne1pR>m;3QBAtsliM%)I#`aIRxjX@<9WU#~)=KRD0fLIG_R?N{K%lmB z`F1jHFq0(EIm2Gs-8`{xx0@YtcBiDdnS_(t?qogw){~+9m`4^`>n6NZ(#;CkH>A^U zb};4SaxN`gdjYoGWLnmtk;t&sofoal2MK5LV{Fmvc-~3u-Q;{&Z*>!STK|H;HC0!TjviSo=|K5Li$aY;lV2 zeGcXGLX}u1KYERGZ)N%F`Hv(^Ok|Jerjm3Og*Whvz>?18yJj$>LyB+@B3p+od#EaM z4-&Z3?^0|px7|s3NgBAv=qtBRS+5}t2wgb26A3ZH0?TyqHqSolQsYRezEM4gNRVpn zDS<_$UNZNglAe=<3ba=M)r1OMUJ6oSJAt~S>y8g*#t#V$%yho~3MVU{5}1{g{hg+Z z8nGejMWt)vZhk|`86^*e$TP%B9g*)5GZ#lI1&f_@_c#-&yxy#LCfl`dO#f=JQlchH-y2w5{2uq=MY?TX zqRZrEd>^ln0ClA`n=_2|MaSh0564Y8V=@wW%^&p$cs6B(`=LAOTyOu|-oJqbE}y?xM0897|D^G?c?WRau*Ka5T7!S)k&1-11m{zPJzyvYgxx#?VRZ9o z!u)a-04lq!zLmbwSV#X{`UW0B{r><4pB_R0 literal 7112 zcmbtZdvH`&8ULMRcW<&>LfC{9Lcl@;gru@fXhBG%kOXLLc$B0lP#>4wOR})+hTTno zVr|vFY)f0~leSu`R(!MqEeQx?@edy}{-gh?SRbuzZ9C35j*n4Ci{E$7*}EsZH^Rb9 z=G=SF`CjMuJ$Lfcch0;7U@6Xqu>c2oxr3KO)tHNqhOrQL^71j>yQ`X(yTho#$NBRU zynHf@dvI?U_u+mE5AfNic>6&neTbKbEga_OBNiUz=VKN=&9d+2g(&9YVO}2Lq7PGlS8L6L&JPR5t3wa*0tlx^KkI<`U^t%1LD0=&k10z`n(wk+OCm+DE!N$9k`M9SSbvUjJO8E|$cX(!T`jycJ#PA0+MdNYt4 zN|1$C_edfccQXR^&8d`|=}9`-tV;(gF2R-w*feWNWLQ_rWi#_dg6Z54TQs#l=fw7G zaE7JH^zW=~`R!xjoV6UUrAcY>#F`ixC!@+^k_@5u!q>3(@{!HD%d+B_=W0 z-fb1w-e+(p*F}M)<%c&{=8PLlXNX-;PR}qxWbJ{NJIu|63d~{Zc+~8ug9%KGwM{#B zyRjURJSDKK?A&N>mo=~Az;$GP*%hOm%ukoEGhh5KLmwCDiUaKegJrAjyi9d3Nj_)T zi4D0?XEc+JW{2HaVpk#-?bk0`qzCo2x}B_hDPcLGAySVnQ4@D^PIQ9k%MmLO?oW?o zV(z+x?C%rQF5!v9ripDeFI~J`Z{th&GQT~|%U5hXgRj|W!D1U<$FnxRfulCQiEml> zj*aK=yoK-DIELdi!4&2j)%9$gzza5B#7P^iET9e7Qk<39n7Dr1csG_z(4Y#ajVLH| zYounc_}Cc3xInZ_MK(_1v_M_q8eR$tG_x=>3f534Y#B-MwCIsBV&AjjVwb@3GPURX zuRuq!s*4Al!2DvS((s|#rd*pS)2#lUo7Qev(=0HvBt-iuC-yp21!k*sH1W}AoUzMG zPcMEYS(rk*5^ge1JuJA6Uj*j0EZ#AR8O@S}CoMT3Z6Y7c;7P0CPHz^o6WOg!G7+bR zC#j{S_9^SNNJE4!w>)nJ7-4}$y6T&EA9QIvrUJ2EJ$s3eD)bqFreZIddZ-szK@T?Hkj-+Bp=d=BPC=lu7UBUo$eI8j8VF zuwowlB3uY^CxWQpa!0>pE4XUOClxOFq$(tzRCS29UA}jqi72UZ(#{REvy8q3J*!$@ zK;RUDCnVJ}TElb#{0tU;j^*@bD>}Rfosx!1u#zF3mR3MSTH8(`)H)8UvZL)Js!pT& zG{Q&F)=GO*)c!bZeKd}#KS0emrj3#Eanx1@2ACwktkX+b109N$j||r7%oLtgFG1N0hNO4%q(NM%;X^sZTan%?an8OMT zFq)NwF|ZEPY5fHu^-Ijeudo8=u^KO@lV`_e_<5=#+~>N4&%QxTD*f}lt1T$zLoF>x;C;A7vo9wznY~)FR}Qomtdf;TTn9_E8$zl* zA$`7RaiJ*4P-v|*_^Ukr4U?c1FwycNw;)rY)k|otCA8KNTI(-@)<%D{0wri|HViGG zwaFi?fDc;R39TK5kOEqpajS+rN>7G7*h*!ya4iK@++YrRP;H@tr2=ak`HRXBX34;! z(mReht!+kmEeKRNr7%ULQ7eXVmDp$CG)oI7Q503zN}C4!aSE2;bcbPO0jJwMoL1|o zs%aH@(;u^53mA1C4Vc$m z3IY{iM+mSd2(Tv!u%{*kY>5PHyFXx|62P7{tSkVw!yhnZnh#*d2(aS>*a<^g0kGTg zK?)6?E=<503infhoiUj6fT-`B97QT`^1rEuHS-F3a@`HKon2eA(s9u-JTR*UH+KAsCgJhNB$%VCs>!jlssIXq|bUXCPINQonU5~(uy uS>`8^M=rw{PRCsQw>OB9A2i diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Questionnaire.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Questionnaire.class index 8da76cf73a66c4626e6c56bf514fbf38ca301485..76d415c10164eaad6b15f89c46f19064be7b395d 100644 GIT binary patch delta 2296 zcmah~>sM4&6#t!>VeZW3GBY6z!+^vq9z%$V_<*870;BMOsS!nuN(7Bifb`U{hgnf7 zUX|WzFUYKr0Rgd=^|3zotxx?4twp%{P_6d9_jb8Vkh9j^=j^lh{_Wr1XWu)&RG!`# z{qgUs-vKDcw{GO(u#7xJWhCJUt1q#5nZ+wCUS)BVt*=Qq=ECbTWV|8aO$mb%-jeXP z3?GiOIKkp1`wz)D1vL?;afa2itPUsQ9lR^yeYprhL|yn$ru8EU=VWBzyo3ufvU&Yj z!Y2|wmGIfn#TwVI-qBMd^Su>AbA#%2;g<&5d;21ciY{&lBo~wFnrLi*(yRfGe6|3KiRH?7Me{1+ayISweO4+Sv z5|HWCP-1P)VVn3|z2Ul0Qi@dy>Tr*O5sWG*!)gWVSX5xWf(_FFU_%MgLDkS+a2a&6hW5Z(dYp7tPOISBma$O5%UGxj3zq02IO+}TMxsix*if}7 zVUYVk=Rq!=RzK0c8#P3vmb6S-`R5pi7^78SGf5^38bZPMLXthpXywy{(CR7JF4N9t z@y$U!ohZ5o8nA^lj=qd%X^S2f`S1%?;z%Fw7q7Ep5Q z#XGbe*P4L)Xs>4~pvkDB6TR;H38TrZY!zwD_utAiw)sYBboPCTGRkEXRMo=Hd}2!w9G4zKDB_zA8c zP*}}y*;-W*6E0%F0TJxNZc4_$Zb4gi|(`>21W!BJwhcw@x z0>LQz${PDtV*0S=uUF$X)4S2CHD8cj%R(`0DTZ6;3QZtk8g3p8>t*j-GV>#PX7a6} z66q4v{pmgnhX`>va1#z~c$C=_#=^Kwz!^`V-$Ee4Ed4Qrjo@lZ&r{?KMN1~(To_ip z8;59Q4qKQw&2BiU8|w)~VDFMlq6Z!ZaxZ*RP zT_Uso9z0I;JMe@7vK?wdMzV#&IpT1BSq_^hc;N-(epJzk4%|s&*@Y)bXLdQ-Ak(PM z!q+0Ea0@fEem_Pu_lV|B->h}?67y8a>>r|lXW+LZZa~EEND}jw7J1A8@t_xdM5mvqaXAO+8Nf3J zdV_)P9Y-3Y2WF6N#~y;`{O0Q@{)9*TWx@BF_+C7V=N93+@VxmAZZujRnnkc>3K_|n zSFkb$F^jAg`hZX2))-P|k*zB^F{E*2d?yWnM+^4CD}FG82+57Crx4*ORfm3Ba zRfN9%_u6#;#rVdKY&@?Z2S*h+@B*vHSiH#MB^EEUc!f`2m2h0fYYG&+F5!fPehF_# z7?5yM!9r*(PO*5CLryDr3uhMKZM?(kyR5#q0Po|hdhbaJPyQ7OPRJq73CKDp0B7A}(p)$t9_^XctJFX|SfNuPs2Rin%W{ zfzn)dUui8yIO}B=qbjO!uY|CQF^o&NqGAG9Rjfs|ib-6PFs0&4d?n$!cG2z?HCnYJ zHT=81&{X9Q_I0`o+(GKwUEyx(^Y`=;!$Dt1x1Zamqn?AEZC!yLcSWnaaYIuXS++N9 zYS_G^!M*E{=5x5hJJky&+YQ_lDA3M3v$PdXhpiT08*13+%(R5EY32m(gdJ(fhlloF znn)80kP705_JWBa%SzhwtO7Q&t)f*hTl1U{h4Y*cuQMm1S?P#vn2kdB(1{6aW))0h zHp!mG1k&mv*!SUn0#ZX-2Ce*K8HE_3RbU-S1`8yTq?;zmo`tls)#@plfax;rOfkM$ z*gzIF;(-USku;9pL|!%8rQ}kvPWv@EyPdtNC_j*Ec=4_Xb$VnjkyA$zY-2La`i`5o z=sWJ!ih9~dD&^9wtszUK?*_`TIntT7KP6@POee)L=qyomjcB5X8f`dbH=$Eq*~N^` zrPr^IqN~RiY$d;KbSA@=BS{vEh4k%c)}z~8t=Z0TNJCiSDY%KmamYh(OhIW$S}+0i z1~X;GI_($N@(}0G)Vm5q^9PLlKma@NAXVo|c1Sr6hoUHUD$;_7xD=UJ(lK9x>=}dQ zD(rk^vDdIArcpWCXe)N=@iaKqRGs;?d%Ra*9*1S-A{G6hm73hCXNeGDj{>!0mwrtG zyXVAXodeIFS$IOzbMdeN=yp8Tcsv2Z)A>Jm9)Zu`XJ$ypV2dZGHzNj(HOfvK_HeW| zxMXpNM<&96#+s#n3N(yUSlA*akQ8FTu}{#D?!V9QUq#OVPrt(c9tv0# z-{440g9`Seo4mPV&wLq@XJz1*buunRFQ?x$I?JUMi8B39m5n^Qg>;<5dD#C0lnz<+ diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/QuestionnaireType.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/QuestionnaireType.class deleted file mode 100644 index 59ec1e10a302c93aabc4c1dc70e54268ee4511b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1676 zcmbVMZBx@g5PpuPq>TZgA_9Uh5wX13h=?Kuq*mU>%8OMThVjD@&KjppFiCM7$N!`- zBaV&^pZ!sedug@B@~P=Gcf0%C?%uPz`SttTPXH5Gj6;E`;TFbK^r*P4p%WAGbw^qz zV@PPUhQi$#x}@@+iu)ScFcZV9T<26gU{KbVH>MaSbFNn~J-*95%kfQa1@^u$-uDw{LT|T?K@FX+H&=dONd)#_0Oup~AW}bE>F5!cl zncVY*Jj31XCL^})^CBg}FqIr`)`yaHcLl@Qob8C!a%o3+&-hM}G-~L4?G?jHGWUk> zbF;{uf|(CI+bN`nn@l;8b1h!nxFw+jvr${u-&B&DIfAcAa>`+kLUhQ4Ga?NjR!o3V=3P)l`*EI8%TOjDPgqatg0 zx9nMB(Uy#MH*`%(^2*TrwCn_SNo?A_O{`=b#|^k_Ho8`_p@aNAVcD;2%gj(eEeS_> zJP^BS9T#N#_vn~MhGC+KCe|^4hdK;g({Uc%IubaiqYLL$WElpe$42S~*SY5lk1F+d zqpvuWRLH#WrMn@9cOQ&^#>AL51QBYC8M5RgHBeGD`7|=pPBBw|M=@0y#ng#WB)tE= zwBr_iV|v?=6HJ=wBpNS2>Ue|&YK2+@%YrgQt)lBtO}eNhYPPkVH^K_2Zj<%R7TzRX z2m3bzwUg2-o$EfGBZ{{tSz;Kgcl^)K>8H~3Epl}6OLpyZ}p=88yMCb>oBcuICX#E_TYvJOk9ak|JUg3I(8KOjPAX!bMKMX(@ zK7jgv$~s~g#!waclBki->~|P+@)wu(_f>LZJ5F|;(q|iFr;Px diff --git a/java-sdk/radar-schemas-restapi/build.gradle b/java-sdk/radar-schemas-restapi/build.gradle index 6e3474e4..761cee02 100644 --- a/java-sdk/radar-schemas-restapi/build.gradle +++ b/java-sdk/radar-schemas-restapi/build.gradle @@ -1,6 +1,12 @@ ext.artifactName = 'radar-schemas-restapi' ext.description = 'RADAR Schemas REST API SDK' +sourceSets { + main { + java.srcDir avroOutputDir + } +} + //---------------------------------------------------------------------------// // Clean settings // //---------------------------------------------------------------------------// diff --git a/java-sdk/radar-schemas-specifications/build.gradle b/java-sdk/radar-schemas-specifications/build.gradle index cc9c1a90..1e33d523 100644 --- a/java-sdk/radar-schemas-specifications/build.gradle +++ b/java-sdk/radar-schemas-specifications/build.gradle @@ -65,12 +65,6 @@ task cleanExchangeConfig() { throw new GradleException("File at ${exchnageConfigMainPath} cannot be delated.") } } - - if (file(exchnageConfigTestPath).exists()) { - if (!file(exchnageConfigTestPath).delete()) { - throw new GradleException("File at ${exchnageConfigTestPath} cannot be delated.") - } - } } } clean.dependsOn cleanExchangeConfig diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/CommandLineApp.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/CommandLineApp.java similarity index 60% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/CommandLineApp.java rename to java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/CommandLineApp.java index b8f56fee..0c93df76 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/CommandLineApp.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/CommandLineApp.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications; +package org.radarcns.schema.specification; /* * Copyright 2017 King's College London and The Hyve @@ -16,6 +16,9 @@ * limitations under the License. */ +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -24,34 +27,43 @@ import java.util.Map; import java.util.Objects; import java.util.Set; -import org.radarcns.catalogue.ActiveSourceType; -import org.radarcns.specifications.SourceCatalogue.NameFolder; -import org.radarcns.specifications.source.KafkaActor; -import org.radarcns.specifications.source.Topic; -import org.radarcns.specifications.source.Topic.TopicMetadata; -import org.radarcns.specifications.source.active.questionnaire.QuestionnaireSource; -import org.radarcns.specifications.source.passive.MonitorSource; -import org.radarcns.specifications.source.passive.PassiveSource; -import org.radarcns.specifications.source.passive.Processor; -import org.radarcns.specifications.source.passive.Sensor; + +import org.radarcns.schema.Scope; +import org.radarcns.schema.specification.source.KafkaActor; +import org.radarcns.schema.specification.source.Topic; +import org.radarcns.schema.specification.source.active.ActiveSource; +import org.radarcns.schema.specification.source.active.questionnaire.QuestionnaireSource; +import org.radarcns.schema.specification.source.passive.Processor; +import org.radarcns.schema.specification.source.passive.Sensor; +import org.radarcns.schema.specification.source.MonitorSource; +import org.radarcns.schema.specification.source.passive.PassiveSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * TODO. */ public class CommandLineApp { + private static final Logger logger = LoggerFactory.getLogger(CommandLineApp.class); + + private final SourceCatalogue catalogue; + + public CommandLineApp(Path root) throws IOException { + this.catalogue = SourceCatalogue.load(root); + } /** * TODO. * @return TODO */ - public static Set getTopicsToCreate() { + public Set getTopicsToCreate() { Set set = new HashSet<>(); for (Topic topic : getAllTopics()) { set.add(topic.getInputTopic()); if (topic.hasAggregator()) { topic.getOutputTopics().stream() - .map(TopicMetadata::getOutput) + .map(Topic.TopicMetadata::getOutput) .forEach(set::add); } } @@ -63,7 +75,7 @@ public static Set getTopicsToCreate() { * TODO. * @return TODO */ - public static Set getRawTopics() { + public Set getRawTopics() { Set set = new HashSet<>(); for (Topic topic : getAllTopics()) { @@ -77,13 +89,13 @@ public static Set getRawTopics() { * TODO. * @return TODO */ - public static Set getResultsCacheTopics() { + public Set getResultsCacheTopics() { Set set = new HashSet<>(); for (Topic topic : getAllTopics()) { if (topic.hasAggregator()) { topic.getOutputTopics().stream() - .map(TopicMetadata::getOutput) + .map(Topic.TopicMetadata::getOutput) .forEach(set::add); } else { set.add(topic.getInputTopic()); @@ -93,25 +105,25 @@ public static Set getResultsCacheTopics() { return set; } - private static Set getAllTopics() { + private Set getAllTopics() { Set set = new HashSet<>(); - SourceCatalogue.getActiveSources().values().stream() + catalogue.getActiveSources().values().stream() .map(QuestionnaireSource::getTopic) .forEach(set::add); - SourceCatalogue.getMonitorSources().values().stream() + catalogue.getMonitorSources().values().stream() .map(MonitorSource::getKafkaActor) .map(KafkaActor::getTopic) .forEach(set::add); - SourceCatalogue.getPassiveSources().values().stream() + catalogue.getPassiveSources().values().stream() .map(PassiveSource::getSensors) .flatMap(Set::stream) .map(Sensor::getTopic) .forEach(set::add); - SourceCatalogue.getPassiveSources().values().stream() + catalogue.getPassiveSources().values().stream() .map(PassiveSource::getProcessors) .flatMap(Set::stream) .map(Processor::getTopic) @@ -125,7 +137,7 @@ private static Set getAllTopics() { * @param reduced TODO * @return TODO */ - public static String getTopicsVerbose(boolean reduced, String source) { + public String getTopicsVerbose(boolean reduced, String source) { String result = ""; Map> map = getTopicsInfoVerbose(reduced); @@ -156,23 +168,23 @@ public static String getTopicsVerbose(boolean reduced, String source) { * @param reduced TODO * @return TODO */ - private static Map> getTopicsInfoVerbose(boolean reduced) { + private Map> getTopicsInfoVerbose(boolean reduced) { Map> map = new HashMap<>(); Map details = new HashMap<>(); - for (QuestionnaireSource source : SourceCatalogue.getActiveSources().values()) { - details.put(source.getQuestionnaireType().name(), source.getTopic().toString(reduced)); + for (QuestionnaireSource source : catalogue.getActiveSources().values()) { + details.put(source.getQuestionnaireType(), source.getTopic().toString(reduced)); } - map.put(ActiveSourceType.QUESTIONNAIRE.name(), details); + map.put(ActiveSource.RadarSourceTypes.QUESTIONNAIRE.name(), details); details = new HashMap<>(); - for (MonitorSource source : SourceCatalogue.getMonitorSources().values()) { + for (MonitorSource source : catalogue.getMonitorSources().values()) { details.put(source.getType(), source.getKafkaActor().getTopic().toString(reduced)); } - map.put(NameFolder.MONITOR.getName().toUpperCase(), details); + map.put(Scope.MONITOR.name(), details); - for (PassiveSource source : SourceCatalogue.getPassiveSources().values()) { + for (PassiveSource source : catalogue.getPassiveSources().values()) { details = new HashMap<>(); for (Sensor sensor : source.getSensors()) { details.put(sensor.getName().name(), sensor.getTopic().toString(reduced)); @@ -180,10 +192,26 @@ private static Map> getTopicsInfoVerbose(boolean red for (Processor proc : source.getProcessors()) { details.put(proc.getName(), proc.getTopic().toString(reduced)); } - map.put(source.getType().name(), details); + map.put(source.getType(), details); } return map; } + + public static void main(String... args) { + if (args.length < 1) { + System.err.println("Usage: app ROOT_DIRECTORY"); + System.exit(1); + } + CommandLineApp app = null; + try { + app = new CommandLineApp(Paths.get(args[0])); + } catch (IOException e) { + logger.error("Failed to load catalog from first argument."); + System.exit(1); + } + System.out.println(app.getTopicsToCreate()); + } + } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java new file mode 100644 index 00000000..13066ff1 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java @@ -0,0 +1,170 @@ +package org.radarcns.schema.specification; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import org.radarcns.config.YamlConfigLoader; +import org.radarcns.schema.Scope; +import org.radarcns.schema.specification.source.Source; +import org.radarcns.schema.specification.source.active.questionnaire.QuestionnaireSource; +import org.radarcns.schema.specification.source.MonitorSource; +import org.radarcns.schema.specification.source.passive.PassiveSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.AbstractMap; +import java.util.Collections; +import java.util.HashSet; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * TODO. + */ +public class SourceCatalogue { + private static final Logger logger = LoggerFactory.getLogger(SourceCatalogue.class); + + /** Folder names. */ + public static final String YAML_EXTENSION = ".yml"; + + public static final Path BASE_PATH = Paths.get("../.."); + + private final Map activeSources; + private final Map monitorSources; + private final Map passiveSources; + + private final Set sources; + + // package private for testing + SourceCatalogue(Map activeSources, + Map monitorSources, + Map passiveSources) { + this.activeSources = activeSources; + this.monitorSources = monitorSources; + this.passiveSources = passiveSources; + + sources = new HashSet<>(); + + sources.addAll(activeSources.values()); + sources.addAll(monitorSources.values()); + sources.addAll(passiveSources.values()); + } + + public static SourceCatalogue load(Path root) throws IOException { + Path specRoot = root.resolve("specifications"); + return new SourceCatalogue( + initSources(specRoot, Scope.ACTIVE, QuestionnaireSource.class), + initSources(specRoot, Scope.MONITOR, MonitorSource.class), + initSources(specRoot, Scope.PASSIVE, PassiveSource.class) + ); + } + + private static Map initSources(Path root, Scope scope, Class sourceClass) + throws IOException { + Path baseFolder = scope.getPath(root); + if (baseFolder == null) { + logger.info(scope + " sources folder not present"); + return Collections.emptyMap(); + } + + YamlConfigLoader configLoader = new YamlConfigLoader(); + + return Files.walk(baseFolder) + .filter(Files::isRegularFile) + .map(f -> { + try { + return new AbstractMap.SimpleImmutableEntry<>( + f.getFileName().toString() + .split("\\.")[0] + .toUpperCase(Locale.ENGLISH), + configLoader.load(f.toFile(), sourceClass)); + } catch (IOException e) { + logger.error("Failed to load configuration", e); + return null; + } + }) + .filter(Objects::nonNull) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } + + /** + * TODO. + * @return TODO + */ + public Map getActiveSources() { + return activeSources; + } + + /** + * TODO. + * @param type TODO + * @return TODO + */ + public QuestionnaireSource getActiveSource(String type) { + return activeSources.get(type); + } + + /** + * TODO. + * @return TODO + */ + public Map getMonitorSources() { + return monitorSources; + } + + /** + * TODO. + * @param type TODO + * @return TODO + */ + public MonitorSource getMonitorSource(String type) { + return monitorSources.get(type); + } + + /** + * TODO. + * @return TODO + */ + public Map getPassiveSources() { + return passiveSources; + } + + /** + * TODO. + * @param type TODO + * @return TODO + */ + public PassiveSource getPassiveSource(String type) { + return passiveSources.get(type); + } + + /** + * TODO. + * @return TODO + */ + public Set getTopics() { + Set set = new HashSet<>(); + sources.forEach(source -> set.addAll(source.getTopics())); + return set; + } +} diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Aggregatable.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/Aggregatable.java similarity index 83% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Aggregatable.java rename to java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/Aggregatable.java index 016f5f3d..d5f4b49c 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Aggregatable.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/Aggregatable.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications.source; +package org.radarcns.schema.specification.source; /* * Copyright 2017 King's College London and The Hyve @@ -17,7 +17,6 @@ */ import java.util.Set; -import org.radarcns.specifications.source.Topic.TopicMetadata; /** * TODO @@ -30,6 +29,6 @@ public interface Aggregatable { String getInputTopic(); - Set getOutputTopics(); + Set getOutputTopics(); } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/KafkaActor.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/KafkaActor.java similarity index 75% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/KafkaActor.java rename to java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/KafkaActor.java index c5f8eb60..7e465d58 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/KafkaActor.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/KafkaActor.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications.source; +package org.radarcns.schema.specification.source; /* * Copyright 2017 King's College London and The Hyve @@ -16,15 +16,12 @@ * limitations under the License. */ -import org.radarcns.catalogue.DataType; -import org.radarcns.specifications.source.passive.Sensor; +import org.radarcns.catalogue.ProcessingState; +import org.radarcns.schema.specification.util.Labels; +import org.radarcns.schema.specification.source.passive.Sensor; import java.util.Objects; -import static org.radarcns.specifications.util.Labels.PROCESSING_STATE; -import static org.radarcns.specifications.util.Labels.TOPIC; -import static org.radarcns.specifications.util.Labels.UNIT; - public class KafkaActor { private final String doc; @@ -33,17 +30,17 @@ public class KafkaActor { private final String unit; - private final DataType dataType; + private final ProcessingState dataType; private final Topic topic; private static final String NULL_MESSAGE = " in ".concat( Sensor.class.getName()).concat(" cannot be null."); - public KafkaActor(String doc, double sampleRate, String unit, DataType dataType, Topic topic) { - Objects.requireNonNull(dataType, PROCESSING_STATE.concat(NULL_MESSAGE)); - Objects.requireNonNull(topic, TOPIC.concat(NULL_MESSAGE)); - Objects.requireNonNull(unit, UNIT.concat(NULL_MESSAGE)); + public KafkaActor(String doc, double sampleRate, String unit, ProcessingState dataType, Topic topic) { + Objects.requireNonNull(dataType, Labels.PROCESSING_STATE.concat(NULL_MESSAGE)); + Objects.requireNonNull(topic, Labels.TOPIC.concat(NULL_MESSAGE)); + Objects.requireNonNull(unit, Labels.UNIT.concat(NULL_MESSAGE)); this.doc = doc; this.sampleRate = sampleRate; @@ -64,7 +61,7 @@ public String getUnit() { return unit; } - public DataType getProcessingState() { + public ProcessingState getProcessingState() { return dataType; } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/MonitorSource.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/MonitorSource.java similarity index 57% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/MonitorSource.java rename to java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/MonitorSource.java index f455495f..82d93a86 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/MonitorSource.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/MonitorSource.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications.source.passive; +package org.radarcns.schema.specification.source; /* * Copyright 2017 King's College London and The Hyve @@ -16,31 +16,21 @@ * limitations under the License. */ -import static org.radarcns.specifications.util.Labels.AGGREGATOR; -import static org.radarcns.specifications.util.Labels.APP_PROVIDER; -import static org.radarcns.specifications.util.Labels.PROCESSING_STATE; -import static org.radarcns.specifications.util.Labels.DOC; -import static org.radarcns.specifications.util.Labels.KEY; -import static org.radarcns.specifications.util.Labels.NAME; -import static org.radarcns.specifications.util.Labels.SAMPLE_RATE; -import static org.radarcns.specifications.util.Labels.TOPIC; -import static org.radarcns.specifications.util.Labels.UNIT; -import static org.radarcns.specifications.util.Labels.VALUE; - import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.Objects; import java.util.Set; -import org.radarcns.catalogue.DataType; -import org.radarcns.specifications.source.KafkaActor; -import org.radarcns.specifications.source.Source; -import org.radarcns.specifications.source.Topic; -import org.radarcns.specifications.util.Utils; +import org.radarcns.catalogue.ProcessingState; +import org.radarcns.schema.specification.util.Labels; +import org.radarcns.schema.specification.util.Utils; /** * TODO. */ public class MonitorSource extends Source { + public enum RadarSourceTypes { + EXTERNAL_TIME, RECORD_COUNTS, SERVER_STATUS, UPTIME + } private final String type; private final String appProvider; @@ -65,19 +55,19 @@ public class MonitorSource extends Source { */ @JsonCreator public MonitorSource( - @JsonProperty(NAME) String name, - @JsonProperty(APP_PROVIDER) String appProvider, - @JsonProperty(DOC) String doc, - @JsonProperty(SAMPLE_RATE) double sampleRate, - @JsonProperty(UNIT) String unit, - @JsonProperty(PROCESSING_STATE) DataType dataType, - @JsonProperty(TOPIC) String topic, - @JsonProperty(KEY) String key, - @JsonProperty(VALUE) String value, - @JsonProperty(AGGREGATOR) String aggregator) { + @JsonProperty(Labels.NAME) String name, + @JsonProperty(Labels.APP_PROVIDER) String appProvider, + @JsonProperty(Labels.DOC) String doc, + @JsonProperty(Labels.SAMPLE_RATE) double sampleRate, + @JsonProperty(Labels.UNIT) String unit, + @JsonProperty(Labels.PROCESSING_STATE) ProcessingState dataType, + @JsonProperty(Labels.TOPIC) String topic, + @JsonProperty(Labels.KEY) String key, + @JsonProperty(Labels.VALUE) String value, + @JsonProperty(Labels.AGGREGATOR) String aggregator) { super(name, doc); - Objects.requireNonNull(appProvider, APP_PROVIDER.concat(NULL_MESSAGE)); + Objects.requireNonNull(appProvider, Labels.APP_PROVIDER.concat(NULL_MESSAGE)); this.type = name; this.appProvider = Utils.getProjectGroup().concat(appProvider); diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Source.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/Source.java similarity index 93% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Source.java rename to java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/Source.java index 821d057f..6f1d4612 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Source.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/Source.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications.source; +package org.radarcns.schema.specification.source; /* * Copyright 2017 King's College London and The Hyve @@ -19,7 +19,7 @@ import java.util.Objects; import java.util.Set; -import static org.radarcns.specifications.util.Labels.NAME; +import static org.radarcns.schema.specification.util.Labels.NAME; /** * TODO. diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Topic.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/Topic.java similarity index 98% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Topic.java rename to java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/Topic.java index 8f7b3154..0b38a04d 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/Topic.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/Topic.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications.source; +package org.radarcns.schema.specification.source; /* * Copyright 2017 King's College London and The Hyve @@ -17,7 +17,7 @@ */ import org.radarcns.catalogue.TimeFrame; -import org.radarcns.specifications.util.Utils; +import org.radarcns.schema.specification.util.Utils; import java.util.HashSet; import java.util.Objects; diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/ActiveSource.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/ActiveSource.java similarity index 73% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/ActiveSource.java rename to java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/ActiveSource.java index 66e24c82..60ee4e2d 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/ActiveSource.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/ActiveSource.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications.source.active; +package org.radarcns.schema.specification.source.active; /* * Copyright 2017 King's College London and The Hyve @@ -16,27 +16,29 @@ * limitations under the License. */ -import static org.radarcns.specifications.util.Labels.ASSESSMENT_TYPE; -import static org.radarcns.specifications.util.Labels.DOC; -import static org.radarcns.specifications.util.Labels.KEY; -import static org.radarcns.specifications.util.Labels.NAME; -import static org.radarcns.specifications.util.Labels.TOPIC; -import static org.radarcns.specifications.util.Labels.VALUE; - import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import org.radarcns.schema.specification.source.Source; +import org.radarcns.schema.specification.source.Topic; + import java.util.Objects; import java.util.Set; -import org.radarcns.catalogue.ActiveSourceType; -import org.radarcns.specifications.source.Source; -import org.radarcns.specifications.source.Topic; + +import static org.radarcns.schema.specification.util.Labels.ASSESSMENT_TYPE; +import static org.radarcns.schema.specification.util.Labels.DOC; +import static org.radarcns.schema.specification.util.Labels.KEY; +import static org.radarcns.schema.specification.util.Labels.NAME; +import static org.radarcns.schema.specification.util.Labels.TOPIC; +import static org.radarcns.schema.specification.util.Labels.VALUE; /** * TODO. */ public abstract class ActiveSource extends Source { - - private ActiveSourceType assessmentType; + public enum RadarSourceTypes { + QUESTIONNAIRE + } + private String assessmentType; private final Topic topic; @@ -55,7 +57,7 @@ public abstract class ActiveSource extends Source { */ @JsonCreator public ActiveSource( - @JsonProperty(ASSESSMENT_TYPE) ActiveSourceType assessmentType, + @JsonProperty(ASSESSMENT_TYPE) String assessmentType, @JsonProperty(NAME) String name, @JsonProperty(TOPIC) String topic, @JsonProperty(KEY) String key, @@ -75,7 +77,7 @@ public ActiveSource( this.topics = this.topic.getTopicNames(); } - public ActiveSourceType getAssessmentType() { + public String getAssessmentType() { return assessmentType; } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/Question.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/Question.java similarity index 67% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/Question.java rename to java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/Question.java index 4d89d070..d27464f7 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/Question.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/Question.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications.source.active.questionnaire; +package org.radarcns.schema.specification.source.active.questionnaire; /* * Copyright 2017 King's College London and The Hyve @@ -16,16 +16,12 @@ * limitations under the License. */ -import static org.radarcns.specifications.util.Labels.CONTENT; -import static org.radarcns.specifications.util.Labels.LEAD; -import static org.radarcns.specifications.util.Labels.RESPONSES; -import static org.radarcns.specifications.util.Labels.WIDGET; - import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; import java.util.Objects; import org.radarcns.catalogue.RadarWidget; +import org.radarcns.schema.specification.util.Labels; /** * TODO. @@ -52,15 +48,15 @@ public class Question { */ @JsonCreator public Question( - @JsonProperty(LEAD) String lead, - @JsonProperty(CONTENT) String content, - @JsonProperty(WIDGET) RadarWidget widget, - @JsonProperty(RESPONSES) List responses) { - - Objects.requireNonNull(lead, LEAD.concat(NULL_MESSAGE)); - Objects.requireNonNull(content, CONTENT.concat(NULL_MESSAGE)); - Objects.requireNonNull(widget, WIDGET.concat(NULL_MESSAGE)); - Objects.requireNonNull(responses, RESPONSES.concat(NULL_MESSAGE)); + @JsonProperty(Labels.LEAD) String lead, + @JsonProperty(Labels.CONTENT) String content, + @JsonProperty(Labels.WIDGET) RadarWidget widget, + @JsonProperty(Labels.RESPONSES) List responses) { + + Objects.requireNonNull(lead, Labels.LEAD.concat(NULL_MESSAGE)); + Objects.requireNonNull(content, Labels.CONTENT.concat(NULL_MESSAGE)); + Objects.requireNonNull(widget, Labels.WIDGET.concat(NULL_MESSAGE)); + Objects.requireNonNull(responses, Labels.RESPONSES.concat(NULL_MESSAGE)); this.lead = lead; this.content = content; diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/QuestionnaireSource.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/QuestionnaireSource.java similarity index 64% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/QuestionnaireSource.java rename to java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/QuestionnaireSource.java index 09c5aa79..3ac10b26 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/QuestionnaireSource.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/QuestionnaireSource.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications.source.active.questionnaire; +package org.radarcns.schema.specification.source.active.questionnaire; /* * Copyright 2017 King's College London and The Hyve @@ -16,28 +16,30 @@ * limitations under the License. */ -import static org.radarcns.specifications.util.Labels.ASSESSMENT_TYPE; -import static org.radarcns.specifications.util.Labels.DOC; -import static org.radarcns.specifications.util.Labels.KEY; -import static org.radarcns.specifications.util.Labels.NAME; -import static org.radarcns.specifications.util.Labels.QUESTIONS; -import static org.radarcns.specifications.util.Labels.TOPIC; -import static org.radarcns.specifications.util.Labels.VALUE; - import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import org.radarcns.schema.specification.source.active.ActiveSource; + import java.util.List; import java.util.Objects; -import org.radarcns.active.questionnaire.QuestionnaireType; -import org.radarcns.catalogue.ActiveSourceType; -import org.radarcns.specifications.source.active.ActiveSource; + +import static org.radarcns.schema.specification.util.Labels.ASSESSMENT_TYPE; +import static org.radarcns.schema.specification.util.Labels.DOC; +import static org.radarcns.schema.specification.util.Labels.KEY; +import static org.radarcns.schema.specification.util.Labels.NAME; +import static org.radarcns.schema.specification.util.Labels.QUESTIONS; +import static org.radarcns.schema.specification.util.Labels.TOPIC; +import static org.radarcns.schema.specification.util.Labels.VALUE; /** * TODO. */ public class QuestionnaireSource extends ActiveSource { + public enum RadarSourceTypes { + PHQ8 + } - private QuestionnaireType type; + private String type; private List questions; @@ -53,14 +55,14 @@ public class QuestionnaireSource extends ActiveSource { */ @JsonCreator public QuestionnaireSource( - @JsonProperty(ASSESSMENT_TYPE) ActiveSourceType assessmentType, - @JsonProperty(NAME) QuestionnaireType name, + @JsonProperty(ASSESSMENT_TYPE) String assessmentType, + @JsonProperty(NAME) String name, @JsonProperty(DOC) String doc, @JsonProperty(TOPIC) String topic, @JsonProperty(KEY) String key, @JsonProperty(VALUE) String value, @JsonProperty(QUESTIONS) List questions) { - super(assessmentType, name.name(), topic, key, value, doc); + super(assessmentType, name, topic, key, value, doc); this.type = name; Objects.requireNonNull(questions, QUESTIONS.concat(" in ").concat( @@ -68,7 +70,7 @@ public QuestionnaireSource( this.questions = questions; } - public QuestionnaireType getQuestionnaireType() { + public String getQuestionnaireType() { return type; } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/Response.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/Response.java similarity index 88% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/Response.java rename to java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/Response.java index 58833c15..b8dd9dc9 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/active/questionnaire/Response.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/Response.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications.source.active.questionnaire; +package org.radarcns.schema.specification.source.active.questionnaire; /* * Copyright 2017 King's College London and The Hyve @@ -16,8 +16,8 @@ * limitations under the License. */ -import static org.radarcns.specifications.util.Labels.SCORE; -import static org.radarcns.specifications.util.Labels.TEXT; +import static org.radarcns.schema.specification.util.Labels.SCORE; +import static org.radarcns.schema.specification.util.Labels.TEXT; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/PassiveSource.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/PassiveSource.java similarity index 64% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/PassiveSource.java rename to java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/PassiveSource.java index 326c89e4..88c3ca1d 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/PassiveSource.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/PassiveSource.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications.source.passive; +package org.radarcns.schema.specification.source.passive; /* * Copyright 2017 King's College London and The Hyve @@ -16,31 +16,26 @@ * limitations under the License. */ -import static org.radarcns.specifications.util.Labels.APP_PROVIDER; -import static org.radarcns.specifications.util.Labels.DOC; -import static org.radarcns.specifications.util.Labels.MODEL; -import static org.radarcns.specifications.util.Labels.PROCESSORS; -import static org.radarcns.specifications.util.Labels.SENSORS; -import static org.radarcns.specifications.util.Labels.VENDOR; - import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.Arrays; +import org.radarcns.catalogue.SensorName; +import org.radarcns.schema.specification.source.Source; +import org.radarcns.schema.specification.util.Labels; +import org.radarcns.schema.specification.util.Utils; + import java.util.HashSet; import java.util.Objects; import java.util.Set; -import java.util.stream.Collectors; -import org.radarcns.catalogue.PassiveSourceType; -import org.radarcns.catalogue.SensorName; -import org.radarcns.specifications.source.Source; -import org.radarcns.specifications.util.Utils; /** * TODO. */ public class PassiveSource extends Source { + public enum RadarSourceTypes { + EMPATICA_E4, PEBBLE_2, ANDROID_PHONE, BIOVOTION_VSM1 + } - private final PassiveSourceType type; + private final String type; private final String vendor; @@ -64,29 +59,17 @@ public class PassiveSource extends Source { */ @JsonCreator public PassiveSource( - @JsonProperty(VENDOR) String vendor, - @JsonProperty(MODEL) String model, - @JsonProperty(DOC) String description, - @JsonProperty(APP_PROVIDER) String appProvider, - @JsonProperty(SENSORS) Set sensors, - @JsonProperty(PROCESSORS) Set processors) { + @JsonProperty(Labels.VENDOR) String vendor, + @JsonProperty(Labels.MODEL) String model, + @JsonProperty(Labels.DOC) String description, + @JsonProperty(Labels.APP_PROVIDER) String appProvider, + @JsonProperty(Labels.SENSORS) Set sensors, + @JsonProperty(Labels.PROCESSORS) Set processors) { super(vendor.concat("_").concat(model), description); - Objects.requireNonNull(sensors, SENSORS.concat(" in ").concat( + Objects.requireNonNull(sensors, Labels.SENSORS.concat(" in ").concat( PassiveSource.class.getName()).concat(" cannot be null.")); - - try { - this.type = PassiveSourceType.valueOf(vendor.concat("_").concat(model)); - } catch (IllegalArgumentException exc) { - throw new IllegalArgumentException(PassiveSourceType.getClassSchema().getName() + " in " - + PassiveSource.class.getName() + " cannot be null. The concatenation of " - + "\"vendor\" and \"model\" separated by underscore must be equal to one of " - + "the following values: " - + Arrays.stream(PassiveSourceType.values()) - .map(PassiveSourceType::name) - .collect(Collectors.joining(",")), exc); - } - + this.type = vendor + '_' + model; this.vendor = vendor; this.model = model; this.appProvider = Objects.isNull(appProvider) @@ -105,7 +88,7 @@ public PassiveSource( } } - public PassiveSourceType getType() { + public String getType() { return type; } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/Processor.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/Processor.java new file mode 100644 index 00000000..e4e5c390 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/Processor.java @@ -0,0 +1,75 @@ +package org.radarcns.schema.specification.source.passive; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.radarcns.catalogue.ProcessingState; +import org.radarcns.schema.specification.source.KafkaActor; +import org.radarcns.schema.specification.source.Topic; +import org.radarcns.schema.specification.util.Labels; + +import java.util.Objects; + +/** + * TODO. + */ +public class Processor extends KafkaActor { + + private final String name; + + private static final String NULL_MESSAGE = " in " + + Processor.class.getName() + " cannot be null."; + + /** + * TODO. + * @param name TODO + * @param doc TODO + * @param sampleRate TODO + * @param unit TODO + * @param dataType TODO + * @param inputTopic TODO + * @param inputKey TODO + * @param inputValue TODO + * @param baseOutputTopic TODO + * @param aggregator TODO + */ + @JsonCreator + public Processor( + @JsonProperty(Labels.NAME) String name, + @JsonProperty(Labels.DOC) String doc, + @JsonProperty(Labels.SAMPLE_RATE) double sampleRate, + @JsonProperty(Labels.UNIT) String unit, + @JsonProperty(Labels.PROCESSING_STATE) ProcessingState dataType, + @JsonProperty(Labels.INPUT_TOPIC) String inputTopic, + @JsonProperty(Labels.INPUT_KEY) String inputKey, + @JsonProperty(Labels.INPUT_VALUE) String inputValue, + @JsonProperty(Labels.BASE_OUTPUT_TOPIC) String baseOutputTopic, + @JsonProperty(Labels.AGGREGATOR) String aggregator) { + super(doc, sampleRate, unit, dataType, + new Topic(inputTopic, inputKey, inputValue, aggregator, baseOutputTopic)); + + Objects.requireNonNull(baseOutputTopic, Labels.BASE_OUTPUT_TOPIC.concat(NULL_MESSAGE)); + Objects.requireNonNull(name, Labels.NAME + NULL_MESSAGE); + + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Sensor.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/Sensor.java similarity index 60% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Sensor.java rename to java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/Sensor.java index bf8d8113..7780b9c7 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Sensor.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/Sensor.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications.source.passive; +package org.radarcns.schema.specification.source.passive; /* * Copyright 2017 King's College London and The Hyve @@ -18,26 +18,15 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import org.radarcns.catalogue.DataType; +import org.radarcns.catalogue.ProcessingState; import org.radarcns.catalogue.SensorName; -import org.radarcns.catalogue.Unit; -import org.radarcns.specifications.source.KafkaActor; -import org.radarcns.specifications.source.Topic; -import org.radarcns.specifications.util.Utils; +import org.radarcns.schema.specification.source.KafkaActor; +import org.radarcns.schema.specification.source.Topic; +import org.radarcns.schema.specification.util.Labels; +import org.radarcns.schema.specification.util.Utils; import java.util.Objects; -import static org.radarcns.specifications.util.Labels.AGGREGATOR; -import static org.radarcns.specifications.util.Labels.APP_PROVIDER; -import static org.radarcns.specifications.util.Labels.PROCESSING_STATE; -import static org.radarcns.specifications.util.Labels.DOC; -import static org.radarcns.specifications.util.Labels.KEY; -import static org.radarcns.specifications.util.Labels.NAME; -import static org.radarcns.specifications.util.Labels.SAMPLE_RATE; -import static org.radarcns.specifications.util.Labels.TOPIC; -import static org.radarcns.specifications.util.Labels.UNIT; -import static org.radarcns.specifications.util.Labels.VALUE; - /** * TODO. */ @@ -64,20 +53,20 @@ public class Sensor extends KafkaActor { */ @JsonCreator public Sensor( - @JsonProperty(NAME) SensorName name, - @JsonProperty(APP_PROVIDER) String appProvider, - @JsonProperty(DOC) String doc, - @JsonProperty(SAMPLE_RATE) double sampleRate, - @JsonProperty(UNIT) String unit, - @JsonProperty(PROCESSING_STATE) DataType dataType, - @JsonProperty(TOPIC) String topic, - @JsonProperty(KEY) String key, - @JsonProperty(VALUE) String value, - @JsonProperty(AGGREGATOR) String aggregator) { + @JsonProperty(Labels.NAME) SensorName name, + @JsonProperty(Labels.APP_PROVIDER) String appProvider, + @JsonProperty(Labels.DOC) String doc, + @JsonProperty(Labels.SAMPLE_RATE) double sampleRate, + @JsonProperty(Labels.UNIT) String unit, + @JsonProperty(Labels.PROCESSING_STATE) ProcessingState dataType, + @JsonProperty(Labels.TOPIC) String topic, + @JsonProperty(Labels.KEY) String key, + @JsonProperty(Labels.VALUE) String value, + @JsonProperty(Labels.AGGREGATOR) String aggregator) { super(doc, sampleRate, unit, dataType, new Topic(topic, key, value, aggregator, null)); - Objects.requireNonNull(name, NAME.concat(NULL_MESSAGE)); + Objects.requireNonNull(name, Labels.NAME.concat(NULL_MESSAGE)); this.name = name; this.appProvider = Objects.isNull(appProvider) diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Labels.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/util/Labels.java similarity index 97% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Labels.java rename to java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/util/Labels.java index e3eface4..b07c7b46 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Labels.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/util/Labels.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications.util; +package org.radarcns.schema.specification.util; /* * Copyright 2017 King's College London and The Hyve diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Utils.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/util/Utils.java similarity index 71% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Utils.java rename to java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/util/Utils.java index 829f817c..07b6e12f 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/util/Utils.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/util/Utils.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications.util; +package org.radarcns.schema.specification.util; /* * Copyright 2017 King's College London and The Hyve @@ -18,6 +18,7 @@ import java.io.IOException; import java.util.HashSet; +import java.util.Locale; import java.util.Objects; import java.util.Properties; import java.util.Set; @@ -74,4 +75,31 @@ public static boolean isTimedAggregator(String aggregator) { return TIMED_AGGREGATOR.contains(aggregator); } + public static String toSnakeCase(String value) { + char[] fileName = value.toCharArray(); + + StringBuilder builder = new StringBuilder(fileName.length); + + boolean nextIsUpperCase = true; + for (char c : fileName) { + switch (c) { + case '_': + nextIsUpperCase = true; + break; + case '.': + return builder.toString(); + default: + if (nextIsUpperCase) { + builder.append(String.valueOf(c).toUpperCase(Locale.ENGLISH)); + nextIsUpperCase = false; + } else { + builder.append(c); + } + break; + } + } + + return builder.toString(); + } + } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/SourceCatalogue.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/SourceCatalogue.java deleted file mode 100644 index 0f329f89..00000000 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/SourceCatalogue.java +++ /dev/null @@ -1,204 +0,0 @@ -package org.radarcns.specifications; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.io.File; -import java.io.IOException; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import org.radarcns.active.questionnaire.QuestionnaireType; -import org.radarcns.catalogue.MonitorSourceType; -import org.radarcns.catalogue.PassiveSourceType; -import org.radarcns.config.YamlConfigLoader; -import org.radarcns.specifications.source.Source; -import org.radarcns.specifications.source.active.questionnaire.QuestionnaireSource; -import org.radarcns.specifications.source.passive.MonitorSource; -import org.radarcns.specifications.source.passive.PassiveSource; - -/** - * TODO. - */ -public class SourceCatalogue { - - /** Folder names. */ - public enum NameFolder { - ACTIVE("active"), - MONITOR("monitor"), - PASSIVE("passive"); - - private final String name; - - NameFolder(String name) { - this.name = name; - } - - public String getName() { - return name; - } - } - - public static final String BASE_FOLDER_NAME = "specifications"; - - public static final String YAML_EXTENSION = ".yml"; - - public static final Path BASE_PATH = Paths.get(new File(".").toURI()) - .getParent().getParent().getParent().resolve(BASE_FOLDER_NAME); - - private static final Map ACTIVE_SOURCES; - private static final Map MONITOR_SOURCES; - private static final Map PASSIVE_SOURCES; - - private static final Set SOURCES; - - static { - try { - ACTIVE_SOURCES = initActiveSources(); - MONITOR_SOURCES = initMonitorSources(); - PASSIVE_SOURCES = initPassiveSources(); - - int initCapacity = (int) Math.ceil((ACTIVE_SOURCES.size() - + MONITOR_SOURCES.size() + PASSIVE_SOURCES.size()) * 100d / 75d); - SOURCES = new HashSet<>(initCapacity); - - SOURCES.addAll(ACTIVE_SOURCES.values()); - SOURCES.addAll(MONITOR_SOURCES.values()); - SOURCES.addAll(PASSIVE_SOURCES.values()); - } catch (IOException exc) { - throw new ExceptionInInitializerError(exc); - } - } - - private static Map initActiveSources() - throws IOException { - Map map = new HashMap<>(); - - Path baseFolder = BASE_PATH.resolve(NameFolder.ACTIVE.getName()); - - for (QuestionnaireType questionnaire : QuestionnaireType.values()) { - if (questionnaire.name().equals(QuestionnaireType.UNKNOWN.name())) { - continue; - } - - map.put(questionnaire, new YamlConfigLoader().load(new File( - baseFolder.resolve(questionnaire.name().toLowerCase().concat( - YAML_EXTENSION)).toUri()), QuestionnaireSource.class)); - } - - return map; - } - - private static Map initMonitorSources() throws IOException { - Map map = new HashMap<>(); - - Path baseFolder = BASE_PATH.resolve(NameFolder.MONITOR.getName()); - - for (MonitorSourceType source : MonitorSourceType.values()) { - if (source.name().equals(MonitorSourceType.UNKNOWN.name())) { - continue; - } - - map.put(source, new YamlConfigLoader().load(new File( - baseFolder.resolve(source.name().toLowerCase().concat(YAML_EXTENSION)).toUri()), - MonitorSource.class)); - } - - return map; - } - - private static Map initPassiveSources() throws IOException { - Map map = new HashMap<>(); - - Path baseFolder = BASE_PATH.resolve(NameFolder.PASSIVE.getName()); - - for (PassiveSourceType source : PassiveSourceType.values()) { - if (source.name().equals(PassiveSourceType.UNKNOWN.name())) { - continue; - } - - map.put(source, new YamlConfigLoader().load(new File( - baseFolder.resolve(source.name().toLowerCase().concat(YAML_EXTENSION)).toUri()), - PassiveSource.class)); - } - - return map; - } - - /** - * TODO. - * @return TODO - */ - public static Map getActiveSources() { - return ACTIVE_SOURCES; - } - - /** - * TODO. - * @param type TODO - * @return TODO - */ - public static QuestionnaireSource getActiveSource(QuestionnaireType type) { - return ACTIVE_SOURCES.get(type); - } - - /** - * TODO. - * @return TODO - */ - public static Map getMonitorSources() { - return MONITOR_SOURCES; - } - - /** - * TODO. - * @param type TODO - * @return TODO - */ - public static MonitorSource getMonitorSource(MonitorSourceType type) { - return MONITOR_SOURCES.get(type); - } - - /** - * TODO. - * @return TODO - */ - public static Map getPassiveSources() { - return PASSIVE_SOURCES; - } - - /** - * TODO. - * @param type TODO - * @return TODO - */ - public static PassiveSource getPassiveSource(PassiveSourceType type) { - return PASSIVE_SOURCES.get(type); - } - - /** - * TODO. - * @return TODO - */ - public static Set getTopics() { - Set set = new HashSet<>(); - SOURCES.forEach(source -> set.addAll(source.getTopics())); - return set; - } -} diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Processor.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Processor.java deleted file mode 100644 index f7de9de6..00000000 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/specifications/source/passive/Processor.java +++ /dev/null @@ -1,86 +0,0 @@ -package org.radarcns.specifications.source.passive; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.radarcns.specifications.util.Labels.AGGREGATOR; -import static org.radarcns.specifications.util.Labels.BASE_OUTPUT_TOPIC; -import static org.radarcns.specifications.util.Labels.PROCESSING_STATE; -import static org.radarcns.specifications.util.Labels.DOC; -import static org.radarcns.specifications.util.Labels.INPUT_KEY; -import static org.radarcns.specifications.util.Labels.INPUT_TOPIC; -import static org.radarcns.specifications.util.Labels.INPUT_VALUE; -import static org.radarcns.specifications.util.Labels.NAME; -import static org.radarcns.specifications.util.Labels.SAMPLE_RATE; -import static org.radarcns.specifications.util.Labels.UNIT; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.Objects; -import org.radarcns.catalogue.DataType; -import org.radarcns.catalogue.SensorName; -import org.radarcns.catalogue.Unit; -import org.radarcns.specifications.source.KafkaActor; -import org.radarcns.specifications.source.Topic; - -/** - * TODO. - */ -public class Processor extends KafkaActor { - - private final String name; - - private static final String NULL_MESSAGE = " in " - + Processor.class.getName() + " cannot be null."; - - /** - * TODO. - * @param name TODO - * @param doc TODO - * @param sampleRate TODO - * @param unit TODO - * @param dataType TODO - * @param inputTopic TODO - * @param inputKey TODO - * @param inputValue TODO - * @param baseOutputTopic TODO - * @param aggregator TODO - */ - @JsonCreator - public Processor( - @JsonProperty(NAME) String name, - @JsonProperty(DOC) String doc, - @JsonProperty(SAMPLE_RATE) double sampleRate, - @JsonProperty(UNIT) String unit, - @JsonProperty(PROCESSING_STATE) DataType dataType, - @JsonProperty(INPUT_TOPIC) String inputTopic, - @JsonProperty(INPUT_KEY) String inputKey, - @JsonProperty(INPUT_VALUE) String inputValue, - @JsonProperty(BASE_OUTPUT_TOPIC) String baseOutputTopic, - @JsonProperty(AGGREGATOR) String aggregator) { - super(doc, sampleRate, unit, dataType, - new Topic(inputTopic, inputKey, inputValue, aggregator, baseOutputTopic)); - - Objects.requireNonNull(baseOutputTopic, BASE_OUTPUT_TOPIC.concat(NULL_MESSAGE)); - Objects.requireNonNull(name, NAME + NULL_MESSAGE); - - this.name = name; - } - - public String getName() { - return name; - } -} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/ActiveValidation.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/ActiveValidation.java similarity index 97% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/ActiveValidation.java rename to java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/ActiveValidation.java index 476daaa9..e8a83a69 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/ActiveValidation.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/ActiveValidation.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications; +package org.radarcns.schema.specification; /* * Copyright 2017 King's College London and The Hyve diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/MonitorValidation.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/MonitorValidation.java similarity index 97% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/MonitorValidation.java rename to java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/MonitorValidation.java index fb32ca7f..33356507 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/MonitorValidation.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/MonitorValidation.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications; +package org.radarcns.schema.specification; /* * Copyright 2017 King's College London and The Hyve diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/PassiveValidation.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/PassiveValidation.java similarity index 77% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/PassiveValidation.java rename to java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/PassiveValidation.java index 76294db6..07bacf91 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/PassiveValidation.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/PassiveValidation.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications; +package org.radarcns.schema.specification; /* * Copyright 2017 King's College London and The Hyve @@ -16,28 +16,30 @@ * limitations under the License. */ -import static org.radarcns.specifications.validator.ValidationSupport.Package; +import org.junit.BeforeClass; +import org.junit.Test; +import org.radarcns.schema.specification.source.passive.PassiveSource; +import org.radarcns.schema.specification.validator.ValidationSupport; import java.io.IOException; import java.util.HashMap; import java.util.Map; -import org.junit.BeforeClass; -import org.junit.Test; -import org.radarcns.catalogue.PassiveSourceType; /** * TODO. */ public class PassiveValidation { - private static Map converter; + private static Map converter; @BeforeClass public static void initConverter() { converter = new HashMap<>(); - converter.put(PassiveSourceType.BIOVOTION_VSM1, Package.BIOVOTION); - converter.put(PassiveSourceType.EMPATICA_E4, Package.EMPATICA); - converter.put(PassiveSourceType.PEBBLE_2, Package.PEBBLE); + converter.put(PassiveSource.RadarSourceTypes.BIOVOTION_VSM1, + ValidationSupport.Package.BIOVOTION); + converter.put(PassiveSource.RadarSourceTypes.EMPATICA_E4, + ValidationSupport.Package.EMPATICA); + converter.put(PassiveSource.RadarSourceTypes.PEBBLE_2, ValidationSupport.Package.PEBBLE); } @Test diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/SourceCatalogueValidation.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/SourceCatalogueValidation.java new file mode 100644 index 00000000..cd5cde09 --- /dev/null +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/SourceCatalogueValidation.java @@ -0,0 +1,96 @@ +package org.radarcns.schema.specification; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import org.junit.BeforeClass; +import org.junit.Test; +import org.radarcns.schema.specification.source.MonitorSource; +import org.radarcns.schema.specification.source.active.questionnaire.QuestionnaireSource; +import org.radarcns.schema.specification.source.passive.PassiveSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.radarcns.schema.specification.SourceCatalogue.BASE_PATH; +import static org.radarcns.schema.specification.validator.ValidationSupport.isValidTopic; + +/** + * TODO. + */ +public class SourceCatalogueValidation { + private static final Logger logger = LoggerFactory.getLogger(SourceCatalogueValidation.class); + private static SourceCatalogue catalogue; + + @BeforeClass + public static void setUp() throws IOException { + catalogue = SourceCatalogue.load(BASE_PATH); + } + + @Test + public void checkActiveSourceType() { + assertTrue("Not all " + QuestionnaireSource.RadarSourceTypes.class.getName() + + " have a specification", + Arrays.stream(QuestionnaireSource.RadarSourceTypes.values()) + .allMatch(type -> catalogue.getActiveSource(type.name()) != null)); + } + + @Test + public void checkMonitorSourceType() { + assertTrue("Not all " + MonitorSource.RadarSourceTypes.class.getName() + " have a specification", + Arrays.stream(MonitorSource.RadarSourceTypes.values()) + .allMatch(type -> catalogue.getMonitorSource(type.name()) != null)); + } + + @Test + public void checkPassiveSourceType() { + assertEquals("Not all " + PassiveSource.RadarSourceTypes.class.getName() + " have a specification", 0, + Arrays.stream(PassiveSource.RadarSourceTypes.values()) + .filter(type -> catalogue.getPassiveSource(type.name()) == null) + .peek(t -> logger.error("Passive source {} unknown", t)) + .count()); + } + + @Test + public void validateTopicNames() { + catalogue.getTopics().forEach(topic -> + assertTrue(topic + " is invalid", isValidTopic(topic))); + } + + @Test + public void validateTopics() { + Set expected = new HashSet<>(); + + for (QuestionnaireSource source : catalogue.getActiveSources().values()) { + expected.addAll(source.getTopics()); + } + for (MonitorSource source : catalogue.getMonitorSources().values()) { + expected.addAll(source.getTopics()); + } + for (PassiveSource source : catalogue.getPassiveSources().values()) { + expected.addAll(source.getTopics()); + } + + expected.removeAll(catalogue.getTopics()); + assertTrue(expected.isEmpty()); + } +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/util/TopicTest.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/util/TopicTest.java similarity index 83% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/util/TopicTest.java rename to java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/util/TopicTest.java index 31a82cdd..9481dbab 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/util/TopicTest.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/util/TopicTest.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications.util; +package org.radarcns.schema.specification.util; /* * Copyright 2017 King's College London and The Hyve @@ -18,13 +18,14 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import static org.radarcns.specifications.source.Topic.getStateStoreName; -import static org.radarcns.specifications.validator.ValidationSupport.isValidTopic; import java.util.HashSet; import java.util.Set; + +import org.junit.Assert; import org.junit.Test; -import org.radarcns.specifications.source.Topic; +import org.radarcns.schema.specification.source.Topic; +import org.radarcns.schema.specification.validator.ValidationSupport; /** * TODO. @@ -33,7 +34,7 @@ public class TopicTest { @Test public void getOutTopicTest() { - assertEquals("topic_name_output", Topic.getOutTopic("topic_name")); + Assert.assertEquals("topic_name_output", Topic.getOutTopic("topic_name")); } @Test @@ -71,25 +72,25 @@ public void getTimeIntervalTest() { @Test public void getStateStoreNameTest() { - assertEquals("From-topic_in-To-topic_out", - getStateStoreName("topic_in", "topic_out")); + Assert.assertEquals("From-topic_in-To-topic_out", + Topic.getStateStoreName("topic_in", "topic_out")); - assertTrue(isValidTopic(getStateStoreName("topic_in", "topic_out"))); + assertTrue(ValidationSupport.isValidTopic(Topic.getStateStoreName("topic_in", "topic_out"))); } @Test(expected = NullPointerException.class) public void getStateStoreNullInputTest() { - getStateStoreName(null, "topic_out"); + Topic.getStateStoreName(null, "topic_out"); } @Test(expected = NullPointerException.class) public void getStateStoreNullOutputTest() { - getStateStoreName("topic_in", null); + Topic.getStateStoreName("topic_in", null); } @Test(expected = NullPointerException.class) public void getStateStoreNullTest() { - getStateStoreName(null, null); + Topic.getStateStoreName(null, null); } /*@Test diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/util/UtilsTest.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/util/UtilsTest.java similarity index 96% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/util/UtilsTest.java rename to java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/util/UtilsTest.java index 9bc917e8..393bd0ba 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/util/UtilsTest.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/util/UtilsTest.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications.util; +package org.radarcns.schema.specification.util; /* * Copyright 2017 King's College London and The Hyve diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ActiveSourceRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ActiveSourceRoles.java similarity index 69% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ActiveSourceRoles.java rename to java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ActiveSourceRoles.java index 06a0c7be..bffd7f15 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ActiveSourceRoles.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ActiveSourceRoles.java @@ -1,14 +1,11 @@ -package org.radarcns.specifications.validator; - -import static org.radarcns.specifications.validator.ValidationResult.invalid; -import static org.radarcns.specifications.validator.ValidationResult.valid; +package org.radarcns.schema.specification.validator; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; -import org.radarcns.catalogue.ActiveSourceType; -import org.radarcns.specifications.source.active.ActiveSource; -import org.radarcns.specifications.source.active.questionnaire.QuestionnaireSource; + +import org.radarcns.schema.specification.source.active.ActiveSource; +import org.radarcns.schema.specification.source.active.questionnaire.QuestionnaireSource; /* * Copyright 2017 King's College London and The Hyve @@ -34,7 +31,7 @@ interface ActiveSourceRoles extends GenericRoles { /** Messages. */ enum ActiveSourceInfo implements Message { ASSESSMENT_TYPE("Assessment Type should be equal to ".concat( - ActiveSourceType.QUESTIONNAIRE.name()).concat(".")), + ActiveSource.RadarSourceTypes.QUESTIONNAIRE.name()).concat(".")), TOPICS("Topic set is invalid. It should contain only to the topic specified in ".concat( "the configuration file.")); @@ -59,9 +56,9 @@ public String getMessage(String info) { */ static GenericRoles validateAssessmentType() { return questionnaire -> Objects.nonNull(questionnaire.getAssessmentType()) - && questionnaire.getAssessmentType().name().equals( - ActiveSourceType.QUESTIONNAIRE.name()) - ? valid() : invalid(ActiveSourceInfo.ASSESSMENT_TYPE.getMessage()); + && questionnaire.getAssessmentType().equals( + ActiveSource.RadarSourceTypes.QUESTIONNAIRE.name()) + ? ValidationResult.valid() : ValidationResult.invalid(ActiveSourceInfo.ASSESSMENT_TYPE.getMessage()); } /** @@ -71,9 +68,8 @@ static GenericRoles validateAssessmentType() { static GenericRoles validateTopics() { return questionnaire -> { Set input = questionnaire.getTopics(); - return Objects.nonNull(input) && input.size() == 1 - && input.contains(questionnaire.getTopic()) ? - valid() : invalid(ActiveSourceInfo.TOPICS.getMessage( + return Objects.nonNull(input) && input.size() == 1 ? + ValidationResult.valid() : ValidationResult.invalid(ActiveSourceInfo.TOPICS.getMessage( input == null ? "" : input.stream().map(Object::toString).collect( Collectors.joining(",")))); }; diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/AggregatableRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/AggregatableRoles.java similarity index 81% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/AggregatableRoles.java rename to java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/AggregatableRoles.java index c611663b..ec2dbb94 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/AggregatableRoles.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/AggregatableRoles.java @@ -1,14 +1,10 @@ -package org.radarcns.specifications.validator; - -import static org.radarcns.specifications.validator.ValidationResult.invalid; -import static org.radarcns.specifications.validator.ValidationResult.valid; -import static org.radarcns.specifications.validator.ValidationSupport.isValidClass; +package org.radarcns.schema.specification.validator; import java.util.Objects; -import org.radarcns.specifications.source.Aggregatable; -import org.radarcns.specifications.source.Topic.TimeLabel; -import org.radarcns.specifications.util.Utils; -import org.radarcns.specifications.validator.ValidationSupport.Package; + +import org.radarcns.schema.specification.source.Topic; +import org.radarcns.schema.specification.util.Utils; +import org.radarcns.schema.specification.source.Aggregatable; /* * Copyright 2017 King's College London and The Hyve @@ -34,13 +30,13 @@ interface AggregatableRoles extends GenericRoles { /** Messages. */ enum AggregatableInfo implements Message { AGGREGATOR("Kafka aggregator class is invalid, it should must be a valid AVRO " - .concat("schema located at ").concat(Package.AGGREGATOR.getName()).concat(".")), + .concat("schema located at ").concat(ValidationSupport.Package.AGGREGATOR.getName()).concat(".")), TOPICS("Topic set is not compliant with the provided aggregator. ".concat( "In case of null aggregator, the set should contain only the input topic. ").concat( "In case of non timed aggregator, the set should contain the input ").concat( "topic and the correspondent output topic. In case of timed aggregator, ").concat( "the set should contain the input topic and all the ").concat( - Integer.toString(TimeLabel.values().length)).concat(" related time frame topics.")); + Integer.toString(Topic.TimeLabel.values().length)).concat(" related time frame topics.")); private final String message; @@ -65,9 +61,9 @@ public String getMessage(String info) { static GenericRoles validateAggregator(boolean nullable) { return aggregatable -> nullable || Objects.nonNull(aggregatable.getAggregator()) && aggregatable.getAggregator().startsWith(Utils.getProjectGroup().concat( - Package.AGGREGATOR.getName())) - && isValidClass(aggregatable.getAggregator()) ? - valid() : invalid(AggregatableInfo.AGGREGATOR.getMessage()); + ValidationSupport.Package.AGGREGATOR.getName())) + && ValidationSupport.isValidClass(aggregatable.getAggregator()) ? + ValidationResult.valid() : ValidationResult.invalid(AggregatableInfo.AGGREGATOR.getMessage()); } /** @@ -105,7 +101,7 @@ static GenericRoles validateTopics() { }*/ check = false; - return check ? valid() : invalid(AggregatableInfo.TOPICS.getMessage( + return check ? ValidationResult.valid() : ValidationResult.invalid(AggregatableInfo.TOPICS.getMessage( /*aggregatable.getTopics().stream().map(Object::toString).collect( Collectors.joining(","))*/ )); diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/GenericRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/GenericRoles.java similarity index 67% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/GenericRoles.java rename to java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/GenericRoles.java index 3820cdd0..f5835717 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/GenericRoles.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/GenericRoles.java @@ -1,19 +1,11 @@ -package org.radarcns.specifications.validator; - -import static org.radarcns.specifications.validator.ValidationResult.invalid; -import static org.radarcns.specifications.validator.ValidationResult.valid; -import static org.radarcns.specifications.validator.ValidationSupport.Package; -import static org.radarcns.specifications.validator.ValidationSupport.isValidClass; -import static org.radarcns.specifications.validator.ValidationSupport.isValidTopic; -import static org.radarcns.specifications.validator.ValidationSupport.isValidTopicVerbose; -import static org.radarcns.specifications.validator.ValidationSupport.isValidTopicsVerbose; +package org.radarcns.schema.specification.validator; import java.util.Collection; import java.util.Objects; import java.util.function.Function; import java.util.function.Predicate; import org.radarcns.catalogue.Unit; -import org.radarcns.specifications.util.Utils; +import org.radarcns.schema.specification.util.Utils; /* * Copyright 2017 King's College London and The Hyve @@ -41,7 +33,7 @@ enum GeneralInfo implements Message { DOCUMENTATION("Documentation should not be null and should be ended by a dot."), DOCUMENTATION_OPTIONAL("Documentation should be ended by a dot."), KEY("Kafka key class is invalid, cannot be null and must be a valid AVRO schema located at " - .concat(Utils.getProjectGroup()).concat(Package.KAFKA_KEY.getName()).concat(".")), + .concat(Utils.getProjectGroup()).concat(ValidationSupport.Package.KAFKA_KEY.getName()).concat(".")), NAME("Name cannot be null"), SAMPLE_RATE("Sample rate cannot be null."), TOPIC("Topic name is invalid."), @@ -70,7 +62,7 @@ public String getMessage(String info) { * @return TODO */ static GenericRoles validateName(String name) { - return object -> Objects.nonNull(name) ? valid() : invalid(GeneralInfo.NAME.getMessage()); + return object -> Objects.nonNull(name) ? ValidationResult.valid() : ValidationResult.invalid(GeneralInfo.NAME.getMessage()); } /** @@ -81,9 +73,9 @@ static GenericRoles validateName(String name) { static GenericRoles validateKey(String key) { return object -> Objects.nonNull(key) && key.startsWith(Utils.getProjectGroup().concat( - Package.KAFKA_KEY.getName())) - && isValidClass(key) ? - valid() : invalid(GeneralInfo.KEY.getMessage()); + ValidationSupport.Package.KAFKA_KEY.getName())) + && ValidationSupport.isValidClass(key) ? + ValidationResult.valid() : ValidationResult.invalid(GeneralInfo.KEY.getMessage()); } /** @@ -92,11 +84,11 @@ && isValidClass(key) ? * @param value * @return TODO */ - static GenericRoles validateValue(Package packageName, String value) { + static GenericRoles validateValue(ValidationSupport.Package packageName, String value) { return object -> Objects.nonNull(packageName) && Objects.nonNull(value) && value.startsWith(Utils.getProjectGroup().concat(packageName.getName())) - && isValidClass(value) ? - valid() : invalid(GeneralInfo.VALUE.getMessage()); + && ValidationSupport.isValidClass(value) ? + ValidationResult.valid() : ValidationResult.invalid(GeneralInfo.VALUE.getMessage()); } /** @@ -105,8 +97,8 @@ && isValidClass(value) ? * @return TODO */ static GenericRoles validateTopic(String topic) { - return object -> Objects.nonNull(topic) && isValidTopic(topic) ? valid() - : invalid(GeneralInfo.TOPIC.getMessage(isValidTopicVerbose(topic))); + return object -> Objects.nonNull(topic) && ValidationSupport.isValidTopic(topic) ? ValidationResult.valid() + : ValidationResult.invalid(GeneralInfo.TOPIC.getMessage(ValidationSupport.isValidTopicVerbose(topic))); } /** @@ -117,8 +109,8 @@ static GenericRoles validateTopic(String topic) { static GenericRoles validateTopicNames(Collection topics) { return object -> Objects.nonNull(topics) && !topics.isEmpty() - && topics.stream().allMatch(topic -> isValidTopic(topic)) - ? valid() : invalid(GeneralInfo.TOPIC.getMessage(isValidTopicsVerbose(topics))); + && topics.stream().allMatch(topic -> ValidationSupport.isValidTopic(topic)) + ? ValidationResult.valid() : ValidationResult.invalid(GeneralInfo.TOPIC.getMessage(ValidationSupport.isValidTopicsVerbose(topics))); } /** @@ -129,7 +121,7 @@ static GenericRoles validateTopicNames(Collection topics) { */ static GenericRoles validateDoc(String doc, boolean nullable) { return object -> nullable || Objects.nonNull(doc) && doc.endsWith(".") ? - valid() : invalid(nullable ? GeneralInfo.DOCUMENTATION_OPTIONAL.getMessage() + ValidationResult.valid() : ValidationResult.invalid(nullable ? GeneralInfo.DOCUMENTATION_OPTIONAL.getMessage() : GeneralInfo.DOCUMENTATION.getMessage()); } @@ -139,8 +131,8 @@ static GenericRoles validateDoc(String doc, boolean nullable) { * @return TODO */ static GenericRoles validateSampleRate(double rate) { - return object -> Objects.nonNull(rate) ? valid() - : invalid(GeneralInfo.SAMPLE_RATE.getMessage()); + return object -> Objects.nonNull(rate) ? ValidationResult.valid() + : ValidationResult.invalid(GeneralInfo.SAMPLE_RATE.getMessage()); } /** @@ -149,7 +141,7 @@ static GenericRoles validateSampleRate(double rate) { */ static GenericRoles validateUnit(Unit unit) { return object-> Objects.nonNull(unit) && !unit.name().equals(Unit.UNKNOWN) ? - valid() : invalid(GeneralInfo.UNIT.getMessage()); + ValidationResult.valid() : ValidationResult.invalid(GeneralInfo.UNIT.getMessage()); } /** @@ -160,8 +152,8 @@ static GenericRoles validateUnit(Unit unit) { * @return TODO */ static GenericRoles validate(Predicate predicate, Message message) { - return object -> predicate.test(object) ? valid() - : invalid(message.getMessage()); + return object -> predicate.test(object) ? ValidationResult.valid() + : ValidationResult.invalid(message.getMessage()); } /** diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Invalid.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/Invalid.java similarity index 96% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Invalid.java rename to java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/Invalid.java index 5e306ecc..e557e9b2 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Invalid.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/Invalid.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications.validator; +package org.radarcns.schema.specification.validator; /* * Copyright 2017 King's College London and The Hyve diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Message.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/Message.java similarity index 94% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Message.java rename to java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/Message.java index 6e1de782..f80f686e 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Message.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/Message.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications.validator; +package org.radarcns.schema.specification.validator; /* * Copyright 2017 King's College London and The Hyve diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/MonitorRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/MonitorRoles.java similarity index 73% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/MonitorRoles.java rename to java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/MonitorRoles.java index 2707e965..1c3fc48e 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/MonitorRoles.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/MonitorRoles.java @@ -1,18 +1,16 @@ -package org.radarcns.specifications.validator; +package org.radarcns.schema.specification.validator; -import static org.radarcns.specifications.SourceCatalogue.YAML_EXTENSION; -import static org.radarcns.specifications.validator.ValidationResult.invalid; -import static org.radarcns.specifications.validator.ValidationResult.valid; -import static org.radarcns.specifications.validator.ValidationSupport.removeExtension; +import org.radarcns.catalogue.ProcessingState; +import org.radarcns.schema.specification.source.MonitorSource; +import org.radarcns.schema.specification.util.Utils; import java.io.File; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; -import org.radarcns.catalogue.DataType; -import org.radarcns.specifications.source.passive.MonitorSource; -import org.radarcns.specifications.util.Utils; + +import static org.radarcns.schema.specification.SourceCatalogue.YAML_EXTENSION; /* * Copyright 2017 King's College London and The Hyve @@ -49,7 +47,7 @@ static Set allowedProvider() { enum MonitorInfo implements Message { APP_PROVIDER("App provider should be equal to one of the following values".concat( allowedProvider().stream().collect(Collectors.joining("'"))).concat(".")), - DATA_TYPE("The only allowed data type is ".concat(DataType.RAW.name()).concat(".")), + DATA_TYPE("The only allowed data type is ".concat(ProcessingState.RAW.name()).concat(".")), NOT_AGGREGATOR("Aggregators are not defined yet for ".concat( MonitorSource.class.getName()).concat(".")), SOURCE_TYPE("Source type should match file name."); @@ -74,8 +72,8 @@ public String getMessage(String info) { * @return TODO */ static GenericRoles validateAggregator() { - return monitor -> /*Objects.isNull(monitor.getAggregator())*/ false ? valid() - : invalid(MonitorInfo.NOT_AGGREGATOR.getMessage()); + return monitor -> /*Objects.isNull(monitor.getAggregator())*/ false ? ValidationResult.valid() + : ValidationResult.invalid(MonitorInfo.NOT_AGGREGATOR.getMessage()); } /** @@ -85,7 +83,7 @@ static GenericRoles validateAggregator() { static GenericRoles validateAppProvider() { return monitor -> Objects.nonNull(monitor.getAppProvider()) && allowedProvider().contains(monitor.getAppProvider()) ? - valid() : invalid(MonitorInfo.APP_PROVIDER.getMessage()); + ValidationResult.valid() : ValidationResult.invalid(MonitorInfo.APP_PROVIDER.getMessage()); } /** @@ -95,7 +93,7 @@ && allowedProvider().contains(monitor.getAppProvider()) ? static GenericRoles validateDataType() { return monitor -> /*Objects.nonNull(monitor.getProcessingState()) && monitor.getProcessingState().name().equals(DataType.RAW.name())*/ - invalid(MonitorInfo.DATA_TYPE.getMessage()); + ValidationResult.invalid(MonitorInfo.DATA_TYPE.getMessage()); } /** @@ -105,7 +103,7 @@ static GenericRoles validateDataType() { */ static GenericRoles validateSourceType(File file) { return monitor -> Objects.nonNull(monitor.getType()) - && removeExtension(file, YAML_EXTENSION).equalsIgnoreCase(monitor.getType()) - ? valid() : invalid(MonitorInfo.SOURCE_TYPE.getMessage()); + && ValidationSupport.removeExtension(file, YAML_EXTENSION).equalsIgnoreCase(monitor.getType()) + ? ValidationResult.valid() : ValidationResult.invalid(MonitorInfo.SOURCE_TYPE.getMessage()); } } diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/PassiveSourceRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/PassiveSourceRoles.java similarity index 82% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/PassiveSourceRoles.java rename to java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/PassiveSourceRoles.java index 806de568..76756d0b 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/PassiveSourceRoles.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/PassiveSourceRoles.java @@ -1,9 +1,4 @@ -package org.radarcns.specifications.validator; - -import static org.radarcns.specifications.SourceCatalogue.YAML_EXTENSION; -import static org.radarcns.specifications.validator.ValidationResult.invalid; -import static org.radarcns.specifications.validator.ValidationResult.valid; -import static org.radarcns.specifications.validator.ValidationSupport.removeExtension; +package org.radarcns.schema.specification.validator; import java.io.File; import java.util.HashSet; @@ -11,8 +6,10 @@ import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; -import org.radarcns.specifications.source.passive.PassiveSource; -import org.radarcns.specifications.util.Utils; + +import org.radarcns.schema.specification.SourceCatalogue; +import org.radarcns.schema.specification.util.Utils; +import org.radarcns.schema.specification.source.passive.PassiveSource; /* * Copyright 2017 King's College London and The Hyve @@ -88,7 +85,7 @@ public String getMessage(String info) { static GenericRoles validateAppProvider() { return passive -> Objects.isNull(passive.getAppProvider()) || allowedProvider().contains(passive.getAppProvider()) ? - valid() : invalid(PassiveSourceInfo.APP_PROVIDER.getMessage()); + ValidationResult.valid() : ValidationResult.invalid(PassiveSourceInfo.APP_PROVIDER.getMessage()); } /** @@ -99,9 +96,9 @@ static GenericRoles validateAppProvider() { static GenericRoles validateModelAndVendor(File file) { return passive -> Objects.nonNull(passive.getVendor()) && Objects.nonNull(passive.getModel()) - && removeExtension(file, YAML_EXTENSION).equalsIgnoreCase( - passive.getType().name().toLowerCase()) ? valid() - : invalid(PassiveSourceInfo.VENDOR_AND_NAME.getMessage()); + && ValidationSupport.removeExtension(file, SourceCatalogue.YAML_EXTENSION).equalsIgnoreCase( + passive.getType().toLowerCase()) ? ValidationResult.valid() + : ValidationResult.invalid(PassiveSourceInfo.VENDOR_AND_NAME.getMessage()); } /** @@ -117,7 +114,7 @@ static GenericRoles validateSensors() { check = check && passive.getSensors().stream().allMatch( sensor -> !temp.add(sensor.getName().name())); - return check ? valid() : invalid(PassiveSourceInfo.SENSORS.getMessage()); + return check ? ValidationResult.valid() : ValidationResult.invalid(PassiveSourceInfo.SENSORS.getMessage()); }; } @@ -127,7 +124,7 @@ static GenericRoles validateSensors() { */ static GenericRoles validateSourceType() { return passive -> Objects.nonNull(passive.getType()) ? - valid() : invalid(PassiveSourceInfo.TYPE.getMessage()); + ValidationResult.valid() : ValidationResult.invalid(PassiveSourceInfo.TYPE.getMessage()); } /** @@ -147,7 +144,7 @@ static GenericRoles validateTopics() { topics.containsAll(processor.getTopics())); return check ? valid() : invalid(PassiveSourceInfo.TOPICS.getMessage());*/ - return false ? valid() : invalid(PassiveSourceInfo.TOPICS.getMessage()); + return false ? ValidationResult.valid() : ValidationResult.invalid(PassiveSourceInfo.TOPICS.getMessage()); }; } } diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ProcessorRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ProcessorRoles.java similarity index 85% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ProcessorRoles.java rename to java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ProcessorRoles.java index a06ad25c..debece33 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ProcessorRoles.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ProcessorRoles.java @@ -1,12 +1,13 @@ -package org.radarcns.specifications.validator; +package org.radarcns.schema.specification.validator; -import static org.radarcns.specifications.validator.ValidationResult.invalid; -import static org.radarcns.specifications.validator.ValidationResult.valid; +import org.radarcns.catalogue.ProcessingState; +import org.radarcns.catalogue.SensorName; +import org.radarcns.schema.specification.source.passive.Processor; import java.util.Objects; -import org.radarcns.catalogue.DataType; -import org.radarcns.catalogue.SensorName; -import org.radarcns.specifications.source.passive.Processor; + +import static org.radarcns.schema.specification.validator.ValidationResult.invalid; +import static org.radarcns.schema.specification.validator.ValidationResult.valid; /* * Copyright 2017 King's College London and The Hyve @@ -32,7 +33,7 @@ interface ProcessorRoles extends GenericRoles { /** Messages. */ enum ProcessorInfo implements Message { DATA_TYPE("Processor data type should be equal to ".concat( - DataType.RADAR.name()).concat(".")), + ProcessingState.RADAR.name()).concat(".")), NAME("Processor name should be not null and different from ".concat( SensorName.UNKNOWN.name()).concat(".")), OUTPUT("Processor base output topic is invalid."); @@ -58,7 +59,7 @@ public String getMessage(String info) { */ static GenericRoles validateDataType() { return processor -> Objects.nonNull(processor.getProcessingState()) - && processor.getProcessingState().name().equals(DataType.RADAR.name()) + && processor.getProcessingState().name().equals(ProcessingState.RADAR.name()) ? valid() : invalid(ProcessorInfo.DATA_TYPE.getMessage()); } diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/QuestionRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/QuestionRoles.java similarity index 90% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/QuestionRoles.java rename to java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/QuestionRoles.java index f88793b2..d29ac26c 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/QuestionRoles.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/QuestionRoles.java @@ -1,11 +1,11 @@ -package org.radarcns.specifications.validator; +package org.radarcns.schema.specification.validator; -import static org.radarcns.specifications.validator.ValidationResult.invalid; -import static org.radarcns.specifications.validator.ValidationResult.valid; +import static org.radarcns.schema.specification.validator.ValidationResult.invalid; +import static org.radarcns.schema.specification.validator.ValidationResult.valid; import java.util.Objects; import org.radarcns.catalogue.RadarWidget; -import org.radarcns.specifications.source.active.questionnaire.Question; +import org.radarcns.schema.specification.source.active.questionnaire.Question; /* * Copyright 2017 King's College London and The Hyve diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/QuestionnaireRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/QuestionnaireRoles.java similarity index 71% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/QuestionnaireRoles.java rename to java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/QuestionnaireRoles.java index cf4ab6f8..121c7ce7 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/QuestionnaireRoles.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/QuestionnaireRoles.java @@ -1,13 +1,11 @@ -package org.radarcns.specifications.validator; +package org.radarcns.schema.specification.validator; -import static org.radarcns.specifications.SourceCatalogue.YAML_EXTENSION; -import static org.radarcns.specifications.validator.ValidationResult.invalid; -import static org.radarcns.specifications.validator.ValidationResult.valid; -import static org.radarcns.specifications.validator.ValidationSupport.removeExtension; +import static org.radarcns.schema.specification.SourceCatalogue.YAML_EXTENSION; import java.io.File; import java.util.Objects; -import org.radarcns.specifications.source.active.questionnaire.QuestionnaireSource; + +import org.radarcns.schema.specification.source.active.questionnaire.QuestionnaireSource; /* * Copyright 2017 King's College London and The Hyve @@ -58,9 +56,9 @@ public String getMessage(String info) { */ static GenericRoles validateQuestionnaireType(File file) { return questionnaire -> Objects.nonNull(questionnaire.getQuestionnaireType()) - && removeExtension(file, YAML_EXTENSION).equalsIgnoreCase( - questionnaire.getQuestionnaireType().name()) - ? valid() : invalid(QuestionnaireInfo.QUESTIONNAIRE_TYPE.getMessage()); + && ValidationSupport.removeExtension(file, YAML_EXTENSION).equalsIgnoreCase( + questionnaire.getQuestionnaireType()) + ? ValidationResult.valid() : ValidationResult.invalid(QuestionnaireInfo.QUESTIONNAIRE_TYPE.getMessage()); } /** @@ -70,6 +68,6 @@ && removeExtension(file, YAML_EXTENSION).equalsIgnoreCase( static GenericRoles validateQuestions() { return questionnaire -> Objects.nonNull(questionnaire.getQuestions()) && !questionnaire.getQuestions().isEmpty() - ? valid() : invalid(QuestionnaireInfo.QUESTIONS.getMessage()); + ? ValidationResult.valid() : ValidationResult.invalid(QuestionnaireInfo.QUESTIONS.getMessage()); } } diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ResponseRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ResponseRoles.java similarity index 78% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ResponseRoles.java rename to java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ResponseRoles.java index e7e60dc3..8a92adb8 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ResponseRoles.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ResponseRoles.java @@ -1,10 +1,8 @@ -package org.radarcns.specifications.validator; - -import static org.radarcns.specifications.validator.ValidationResult.invalid; -import static org.radarcns.specifications.validator.ValidationResult.valid; +package org.radarcns.schema.specification.validator; import java.util.Objects; -import org.radarcns.specifications.source.active.questionnaire.Response; + +import org.radarcns.schema.specification.source.active.questionnaire.Response; /* * Copyright 2017 King's College London and The Hyve @@ -53,7 +51,7 @@ public String getMessage(String info) { */ static GenericRoles validateScore() { return response -> Objects.nonNull(response.getScore()) - ? valid() : invalid(ResponseInfo.SCORE.getMessage()); + ? ValidationResult.valid() : ValidationResult.invalid(ResponseInfo.SCORE.getMessage()); } /** @@ -62,6 +60,6 @@ static GenericRoles validateScore() { */ static GenericRoles validateText() { return response -> Objects.nonNull(response.getText()) - ? valid() : invalid(ResponseInfo.TEXT.getMessage()); + ? ValidationResult.valid() : ValidationResult.invalid(ResponseInfo.TEXT.getMessage()); } } diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/SensorRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/SensorRoles.java similarity index 75% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/SensorRoles.java rename to java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/SensorRoles.java index 6f5909f7..5c7eb564 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/SensorRoles.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/SensorRoles.java @@ -1,14 +1,13 @@ -package org.radarcns.specifications.validator; +package org.radarcns.schema.specification.validator; -import static org.radarcns.specifications.validator.PassiveSourceRoles.allowedProvider; -import static org.radarcns.specifications.validator.ValidationResult.invalid; -import static org.radarcns.specifications.validator.ValidationResult.valid; +import org.radarcns.catalogue.ProcessingState; +import org.radarcns.catalogue.SensorName; +import org.radarcns.schema.specification.source.passive.Sensor; import java.util.Objects; import java.util.stream.Collectors; -import org.radarcns.catalogue.DataType; -import org.radarcns.catalogue.SensorName; -import org.radarcns.specifications.source.passive.Sensor; + +import static org.radarcns.schema.specification.validator.PassiveSourceRoles.allowedProvider; /* * Copyright 2017 King's College London and The Hyve @@ -37,7 +36,7 @@ enum SensorInfo implements Message { allowedProvider().stream().map(Object::toString).collect(Collectors.joining( ","))).concat(".")), DATA_TYPE("Sensor data type cannot be null and should differ from ".concat( - DataType.UNKNOWN.name()).concat(".")), + ProcessingState.UNKNOWN.name()).concat(".")), NAME("Sensor name cannot be not null and should different from ".concat( SensorName.UNKNOWN.name()).concat(".")); @@ -63,7 +62,7 @@ public String getMessage(String info) { static GenericRoles validateAppProvider() { return passive -> Objects.isNull(passive.getAppProvider()) || allowedProvider().contains(passive.getAppProvider()) ? - valid() : invalid(SensorInfo.APP_PROVIDER.getMessage()); + ValidationResult.valid() : ValidationResult.invalid(SensorInfo.APP_PROVIDER.getMessage()); } /** @@ -72,8 +71,8 @@ static GenericRoles validateAppProvider() { */ static GenericRoles validateDataType() { return sensor -> Objects.nonNull(sensor.getProcessingState()) - && !sensor.getProcessingState().name().equals(DataType.UNKNOWN.name()) - ? valid() : invalid(SensorInfo.DATA_TYPE.getMessage()); + && !sensor.getProcessingState().name().equals(ProcessingState.UNKNOWN.name()) + ? ValidationResult.valid() : ValidationResult.invalid(SensorInfo.DATA_TYPE.getMessage()); } /** @@ -83,6 +82,6 @@ static GenericRoles validateDataType() { static GenericRoles validateName() { return sensor -> Objects.nonNull(sensor.getName()) && !sensor.getName().name().equals(SensorName.UNKNOWN.name()) - ? valid() : invalid(SensorInfo.NAME.getMessage()); + ? ValidationResult.valid() : ValidationResult.invalid(SensorInfo.NAME.getMessage()); } } diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/TopicRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/TopicRoles.java similarity index 65% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/TopicRoles.java rename to java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/TopicRoles.java index faff9d34..cec20c04 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/TopicRoles.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/TopicRoles.java @@ -1,18 +1,11 @@ -package org.radarcns.specifications.validator; - -import static org.radarcns.specifications.validator.ValidationResult.invalid; -import static org.radarcns.specifications.validator.ValidationResult.valid; -import static org.radarcns.specifications.validator.ValidationSupport.Package; -import static org.radarcns.specifications.validator.ValidationSupport.isValidClass; -import static org.radarcns.specifications.validator.ValidationSupport.isValidTopic; -import static org.radarcns.specifications.validator.ValidationSupport.isValidTopicVerbose; -import static org.radarcns.specifications.validator.ValidationSupport.isValidTopicsVerbose; +package org.radarcns.schema.specification.validator; import java.util.Collection; import java.util.Objects; import java.util.function.Predicate; -import org.radarcns.specifications.source.Topic; -import org.radarcns.specifications.util.Utils; + +import org.radarcns.schema.specification.source.Topic; +import org.radarcns.schema.specification.util.Utils; /* * Copyright 2017 King's College London and The Hyve @@ -38,7 +31,7 @@ interface TopicRoles extends GenericRoles { /** Messages. */ enum TopicInfo implements Message { KEY("Kafka key class is invalid, cannot be null and must be a valid AVRO schema located at " - .concat(Utils.getProjectGroup()).concat(Package.KAFKA_KEY.getName()).concat(".")), + .concat(Utils.getProjectGroup()).concat(ValidationSupport.Package.KAFKA_KEY.getName()).concat(".")), TOPIC("Topic name is invalid."), VALUE("Kafka value class is invalid. It cannot be null and must be a valida AVRO".concat( "schema located at")); @@ -71,9 +64,9 @@ public String getMessage(String info) { static TopicRoles validateKey() { return topic -> Objects.nonNull(topic.getInputKey()) && topic.getInputKey().startsWith(Utils.getProjectGroup().concat( - Package.KAFKA_KEY.getName())) - && isValidClass(topic.getInputKey()) ? - valid() : invalid(TopicInfo.KEY.getMessage()); + ValidationSupport.Package.KAFKA_KEY.getName())) + && ValidationSupport.isValidClass(topic.getInputKey()) ? + ValidationResult.valid() : ValidationResult.invalid(TopicInfo.KEY.getMessage()); } /** @@ -81,12 +74,12 @@ && isValidClass(topic.getInputKey()) ? * @param packageName * @return TODO */ - static TopicRoles validateValue(Package packageName) { + static TopicRoles validateValue(ValidationSupport.Package packageName) { return topic -> Objects.nonNull(packageName) && Objects.nonNull(topic.getInputValue()) && topic.getInputValue().startsWith(Utils.getProjectGroup().concat( packageName.getName())) - && isValidClass(topic.getInputValue()) ? - valid() : invalid(TopicInfo.VALUE.getMessage()); + && ValidationSupport.isValidClass(topic.getInputValue()) ? + ValidationResult.valid() : ValidationResult.invalid(TopicInfo.VALUE.getMessage()); } /** @@ -95,8 +88,8 @@ && isValidClass(topic.getInputValue()) ? * @return TODO */ static TopicRoles validateTopic(String topic) { - return object -> Objects.nonNull(topic) && isValidTopic(topic) ? valid() - : invalid(TopicInfo.TOPIC.getMessage(isValidTopicVerbose(topic))); + return object -> Objects.nonNull(topic) && ValidationSupport.isValidTopic(topic) ? ValidationResult.valid() + : ValidationResult.invalid(TopicInfo.TOPIC.getMessage(ValidationSupport.isValidTopicVerbose(topic))); } /** @@ -107,8 +100,8 @@ static TopicRoles validateTopic(String topic) { static TopicRoles validateTopicNames(Collection topics) { return object -> Objects.nonNull(topics) && !topics.isEmpty() - && topics.stream().allMatch(topic -> isValidTopic(topic)) - ? valid() : invalid(TopicInfo.TOPIC.getMessage(isValidTopicsVerbose(topics))); + && topics.stream().allMatch(topic -> ValidationSupport.isValidTopic(topic)) + ? ValidationResult.valid() : ValidationResult.invalid(TopicInfo.TOPIC.getMessage(ValidationSupport.isValidTopicsVerbose(topics))); } /** @@ -119,8 +112,8 @@ static TopicRoles validateTopicNames(Collection topics) { * @return TODO */ static TopicRoles validate(Predicate predicate, Message message) { - return object -> predicate.test(object) ? valid() - : invalid(message.getMessage()); + return object -> predicate.test(object) ? ValidationResult.valid() + : ValidationResult.invalid(message.getMessage()); } /** diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ValidationResult.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ValidationResult.java similarity index 94% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ValidationResult.java rename to java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ValidationResult.java index 0fcfda90..3bdc920a 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ValidationResult.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ValidationResult.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications.validator; +package org.radarcns.schema.specification.validator; /* * Copyright 2017 King's College London and The Hyve diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ValidationSupport.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ValidationSupport.java similarity index 98% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ValidationSupport.java rename to java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ValidationSupport.java index 7252a18d..2a9ef635 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/ValidationSupport.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ValidationSupport.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications.validator; +package org.radarcns.schema.specification.validator; /* * Copyright 2017 King's College London and The Hyve diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Validator.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/Validator.java similarity index 99% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Validator.java rename to java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/Validator.java index 6f19bc73..45f9144d 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/validator/Validator.java +++ b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/Validator.java @@ -1,4 +1,4 @@ -package org.radarcns.specifications.validator; +package org.radarcns.schema.specification.validator; /* * Copyright 2017 King's College London and The Hyve diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueValidation.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueValidation.java deleted file mode 100644 index b1b10a0a..00000000 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/SourceCatalogueValidation.java +++ /dev/null @@ -1,88 +0,0 @@ -package org.radarcns.specifications; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertTrue; -import static org.radarcns.specifications.SourceCatalogue.getActiveSource; -import static org.radarcns.specifications.SourceCatalogue.getMonitorSource; -import static org.radarcns.specifications.SourceCatalogue.getPassiveSource; -import static org.radarcns.specifications.validator.ValidationSupport.isValidTopic; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; -import org.junit.Test; -import org.radarcns.active.questionnaire.QuestionnaireType; -import org.radarcns.catalogue.MonitorSourceType; -import org.radarcns.catalogue.PassiveSourceType; -import org.radarcns.specifications.source.active.questionnaire.QuestionnaireSource; -import org.radarcns.specifications.source.passive.MonitorSource; -import org.radarcns.specifications.source.passive.PassiveSource; - -/** - * TODO. - */ -public class SourceCatalogueValidation { - - @Test - public void checkActiveSourceType() { - assertTrue("Not all " + QuestionnaireType.class.getName() + " has a specification", - Arrays.stream(QuestionnaireType.values()) - .filter(type -> !type.name().equals(QuestionnaireType.UNKNOWN.name())) - .allMatch(type -> getActiveSource(type) != null)); - } - - @Test - public void checkMonitorSourceType() { - assertTrue("Not all " + MonitorSourceType.class.getName() + " has a specification", - Arrays.stream(MonitorSourceType.values()) - .filter(type -> !type.name().equals(MonitorSourceType.UNKNOWN.name())) - .allMatch(type -> getMonitorSource(type) != null)); - } - - @Test - public void checkPassiveSourceType() { - assertTrue("Not all " + PassiveSourceType.class.getName() + " has a specification", - Arrays.stream(PassiveSourceType.values()) - .filter(type -> !type.name().equals(PassiveSourceType.UNKNOWN.name())) - .allMatch(type -> getPassiveSource(type) != null)); - } - - @Test - public void validateTopicNames() { - SourceCatalogue.getTopics().forEach(topic -> - assertTrue(topic + " is invalid", isValidTopic(topic))); - } - - @Test - public void validateTopics() { - Set expected = new HashSet<>(); - - for (QuestionnaireSource source : SourceCatalogue.getActiveSources().values()) { - expected.addAll(source.getTopics()); - } - for (MonitorSource source : SourceCatalogue.getMonitorSources().values()) { - expected.addAll(source.getTopics()); - } - for (PassiveSource source : SourceCatalogue.getPassiveSources().values()) { - expected.addAll(source.getTopics()); - } - - expected.removeAll(SourceCatalogue.getTopics()); - assertTrue(expected.isEmpty()); - } -} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/Utility.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/Utility.java deleted file mode 100644 index 15f08544..00000000 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/Utility.java +++ /dev/null @@ -1,274 +0,0 @@ -package org.radarcns.specifications.value; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import java.util.HashSet; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; -import org.radarcns.catalogue.DataType; -import org.radarcns.catalogue.SensorName; -import org.radarcns.catalogue.TimeFrame; -import org.radarcns.catalogue.Unit; -import org.radarcns.specifications.source.Topic; -import org.radarcns.specifications.source.Topic.TimeLabel; -import org.radarcns.specifications.source.Topic.TopicMetadata; -import org.radarcns.specifications.source.passive.PassiveSource; -import org.radarcns.specifications.source.passive.Processor; -import org.radarcns.specifications.source.passive.Sensor; - -/** - * TODO. - */ -public class Utility { - - /*topic.getTopicNames();; - topic.getOutputTopics();*/ - - private static boolean testGenericTopic(String inputTopic, String key, String value, - String aggregator, Topic topic) { - if (Objects.isNull(aggregator)) { - assertFalse(topic.hasAggregator()); - assertNull(topic.getAggregator()); - } else { - assertTrue(topic.hasAggregator()); - assertEquals(aggregator, topic.getAggregator()); - } - - assertEquals(key, topic.getInputKey()); - assertEquals(inputTopic, topic.getInputTopic()); - assertEquals(value, topic.getInputValue()); - - return true; - } - - /** - * TODO. - * @param inputTopic TODO - * @param key TODO - * @param value TODO - * @param topic TODO - */ - public static void testTopicNonAggregatable(String inputTopic, String key, String value, - Topic topic) { - assertTrue(testGenericTopic(inputTopic, key, value, null, topic)); - - assertTrue(topic.getOutputTopics().isEmpty()); - assertEquals(1, topic.getTopicNames().size(), 0); - - assertTrue("Topics is invalid. ".concat( - topic.getTopicNames().stream().collect(Collectors.joining(","))), - topic.getTopicNames().contains(inputTopic)); - } - - /** - * TODO. - * @param aggregator TODO - * @param inputTopic TODO - * @param key TODO - * @param value TODO - * @param topic TODO - * @param baseOutput TODO - */ - public static void testTopicNonTimedAggregator(String aggregator, String inputTopic, - String key, String value, Topic topic, String baseOutput) { - assertTrue(testGenericTopic(inputTopic, key, value, aggregator, topic)); - - assertFalse(topic.getTopicNames().isEmpty()); - assertEquals(2, topic.getTopicNames().size(), 0); - - assertTrue(topic.getTopicNames().contains(inputTopic)); - assertTrue(topic.getTopicNames().contains(baseOutput.concat("_output"))); - - assertFalse(topic.getOutputTopics().isEmpty()); - assertEquals(1, topic.getOutputTopics().size(), 0); - - TopicMetadata metadata = (TopicMetadata) topic.getOutputTopics().toArray()[0]; - assertEquals(-1, metadata.getIntervalInMilliSec(), 0); - assertEquals(inputTopic, metadata.getInput()); - assertEquals(baseOutput.concat("_output"), metadata.getOutput()); - assertEquals("From-" + inputTopic + "-To-" + baseOutput, metadata.getStateStore()); - assertNull(metadata.getTimeFrame().name()); - } - - /** - * TODO. - * @param aggregator TODO - * @param inputTopic TODO - * @param key TODO - * @param value TODO - * @param topic TODO - * @param baseOutput TODO - */ - public static void testTopicTimedAggregator(String aggregator, String inputTopic, String key, - String value, Topic topic, String baseOutput) { - assertTrue(testGenericTopic(inputTopic, key, value, aggregator, topic)); - - Set topicNames = topic.getTopicNames(); - assertFalse(topicNames.isEmpty()); - assertEquals(15, topicNames.size(), 0); - assertTrue(topicNames.contains(inputTopic)); - - assertFalse(topic.getOutputTopics().isEmpty()); - assertEquals(TimeFrame.values().length - 1, - topic.getOutputTopics().size(), 0); - - - for (TimeLabel label : TimeLabel.values()) { - if (label.getIntervalInMilliSec() != -1) { - testTopicMetadata(topic, inputTopic, baseOutput, label); - } - } - } - - private static void testTopicMetadata(Topic topic, String inputTopic, String baseOutput, - TimeLabel label) { - String output = baseOutput.concat(label.getLabel()); - String stateStore = "From-".concat(inputTopic).concat("-To-").concat(output); - - - - assertTrue(topic.getTopicNames().contains(stateStore)); - assertTrue(topic.getTopicNames().contains(output)); - boolean canary = false; - for (TopicMetadata metadata : topic.getOutputTopics()) { - if (metadata.getTimeFrame().name().equals(label.getTimeFrame().name())) { - assertEquals(label.getIntervalInMilliSec(), metadata.getIntervalInMilliSec(), - 0); - assertEquals(inputTopic, metadata.getInput()); - assertEquals(output, metadata.getOutput()); - assertEquals(stateStore, metadata.getStateStore()); - canary = true; - } - } - assertTrue(canary); - } - - /** - * TODO. - * @param source TODO - * @return TODO - */ - public static boolean testSourceTopics(PassiveSource source) { - Set expectedTopics = new HashSet<>(); - for (Sensor sensor : source.getSensors()) { - expectedTopics.addAll(sensor.getTopic().getTopicNames()); - } - for (Processor processor : source.getProcessors()) { - expectedTopics.addAll(processor.getTopic().getTopicNames()); - } - - expectedTopics.removeAll(source.getTopics()); - - return expectedTopics.isEmpty(); - } - - private static boolean testBasicSensor(Sensor sensor, String appProvider, - String inputTopic, SensorName sensorName, DataType dataType, Unit unit, - double sampleRate) { - assertEquals(appProvider, sensor.getAppProvider()); - assertEquals(dataType.name(), sensor.getProcessingState().name()); - //sensor.getDoc() - assertEquals(sensorName.name(), sensor.getName().name()); - assertEquals(sampleRate, sensor.getSampleRate(), 0); - assertEquals(unit.name(), sensor.getUnit()); - - return true; - } - - /** - * TODO. - * @param sensor TODO - * @param appProvider TODO - * @param inputTopic TODO - * @param key TODO - * @param value TODO - * @param sensorName TODO - * @param dataType TODO - * @param unit TODO - * @param sampleRate TODO - * @return TODO - */ - public static boolean testSensorNonAggregatable(Sensor sensor, String appProvider, - String inputTopic, String key, String value, SensorName sensorName, DataType dataType, - Unit unit, double sampleRate) { - assertNull(sensor.getTopic().getAggregator()); - testTopicNonAggregatable(inputTopic, key, value, sensor.getTopic()); - - return testBasicSensor(sensor, appProvider, inputTopic, sensorName, dataType, unit, - sampleRate); - } - - /** - * TODO. - * @param sensor TODO - * @param aggregator TODO - * @param appProvider TODO - * @param inputTopic TODO - * @param key TODO - * @param value TODO - * @param sensorName TODO - * @param dataType TODO - * @param unit TODO - * @param sampleRate TODO - * @param baseOutput TODO - * @return TODO - */ - public static boolean testSensorNonTimed(Sensor sensor, String aggregator, String appProvider, - String inputTopic, String key, String value, SensorName sensorName, DataType dataType, - Unit unit, double sampleRate, String baseOutput) { - assertEquals(aggregator, sensor.getTopic().getAggregator()); - testTopicNonTimedAggregator(aggregator, inputTopic, key, value, sensor.getTopic(), - baseOutput); - - return testBasicSensor(sensor, appProvider, inputTopic, sensorName, dataType, unit, - sampleRate); - } - - /** - * TODO. - * @param sensor TODO - * @param aggregator TODO - * @param appProvider TODO - * @param inputTopic TODO - * @param key TODO - * @param value TODO - * @param sensorName TODO - * @param dataType TODO - * @param unit TODO - * @param sampleRate TODO - * @param baseOutput TODO - * @return TODO - */ - public static boolean testSensorTimed(Sensor sensor, String aggregator, String appProvider, - String inputTopic, String key, String value, SensorName sensorName, DataType dataType, - Unit unit, double sampleRate, String baseOutput) { - assertEquals(aggregator, sensor.getTopic().getAggregator()); - testTopicTimedAggregator(aggregator, inputTopic, key, value, sensor.getTopic(), - baseOutput); - - return testBasicSensor(sensor, appProvider, inputTopic, sensorName, dataType, unit, - sampleRate); - } - - -} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/active/Phq8Test.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/active/Phq8Test.java deleted file mode 100644 index e8801506..00000000 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/active/Phq8Test.java +++ /dev/null @@ -1,143 +0,0 @@ -package org.radarcns.specifications.value.active; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.fail; -import static org.radarcns.specifications.value.Utility.testTopicNonAggregatable; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.radarcns.active.questionnaire.QuestionnaireType; -import org.radarcns.catalogue.ActiveSourceType; -import org.radarcns.catalogue.RadarWidget; -import org.radarcns.specifications.SourceCatalogue; -import org.radarcns.specifications.source.active.questionnaire.QuestionnaireSource; -import org.radarcns.specifications.source.active.questionnaire.Response; - -/** - * TODO. - */ -public class Phq8Test { - - private static QuestionnaireSource phq8; - - @BeforeClass - public static void initSource() { - phq8 = SourceCatalogue.getActiveSource(QuestionnaireType.PHQ8); - } - - @Test - public void validateHeader() { - assertEquals(ActiveSourceType.QUESTIONNAIRE.name(), phq8.getAssessmentType().name()); - assertNotNull(phq8.getDoc()); - assertEquals(QuestionnaireType.PHQ8.name(), phq8.getName()); - assertEquals(QuestionnaireType.PHQ8.name(), phq8.getQuestionnaireType().name()); - - testTopicNonAggregatable("questionnaire_phq8", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.active.questionnaire.Questionnaire", - phq8.getTopic()); - - - } - - @Test - public void validateQuestions() { - assertNotNull(phq8.getQuestions()); - assertFalse(phq8.getQuestions().isEmpty()); - assertEquals(8, phq8.getQuestions().size(), 0); - - assertEquals("Little interest or pleasure in doing things.", - phq8.getQuestions().get(0).getContent()); - assertEquals("Over the past two weeks, how often have you been bothered by any " - + "of the following problems?", phq8.getQuestions().get(0).getLead()); - phq8.getQuestions().get(0).getResponses().forEach(response -> validateResponse(response)); - assertEquals(RadarWidget.RADIO.name(), phq8.getQuestions().get(0).getWidget().name()); - - assertEquals("Feeling down, depressed, or hopeless.", - phq8.getQuestions().get(1).getContent()); - assertEquals("Over the past two weeks, how often have you been bothered by any " - + "of the following problems?", phq8.getQuestions().get(1).getLead()); - phq8.getQuestions().get(1).getResponses().forEach(response -> validateResponse(response)); - assertEquals(RadarWidget.RADIO.name(), phq8.getQuestions().get(1).getWidget().name()); - - assertEquals("Trouble falling or staying asleep, or sleeping too much.", - phq8.getQuestions().get(2).getContent()); - assertEquals("Over the past two weeks, how often have you been bothered by any of" - + " the following problems?", phq8.getQuestions().get(2).getLead()); - phq8.getQuestions().get(2).getResponses().forEach(response -> validateResponse(response)); - assertEquals(RadarWidget.RADIO.name(), phq8.getQuestions().get(2).getWidget().name()); - - assertEquals("Feeling tired or having little energy.", - phq8.getQuestions().get(3).getContent()); - assertEquals("Over the past two weeks, how often have you been bothered by any " - + "of the following problems?", phq8.getQuestions().get(3).getLead()); - phq8.getQuestions().get(3).getResponses().forEach(response -> validateResponse(response)); - assertEquals(RadarWidget.RADIO.name(), phq8.getQuestions().get(3).getWidget().name()); - - assertEquals("Poor appetite or overeating.", - phq8.getQuestions().get(4).getContent()); - assertEquals("Over the past two weeks, how often have you been bothered by any " - + "of the following problems?", phq8.getQuestions().get(4).getLead()); - phq8.getQuestions().get(4).getResponses().forEach(response -> validateResponse(response)); - assertEquals(RadarWidget.RADIO.name(), phq8.getQuestions().get(4).getWidget().name()); - - assertEquals("Feeling bad about yourself, or that you are a failure, or have " - + "let yourself or your family down.", phq8.getQuestions().get(5).getContent()); - assertEquals("Over the past two weeks, how often have you been bothered by any " - + "of the following problems?", phq8.getQuestions().get(5).getLead()); - phq8.getQuestions().get(5).getResponses().forEach(response -> validateResponse(response)); - assertEquals(RadarWidget.RADIO.name(), phq8.getQuestions().get(5).getWidget().name()); - - assertEquals("Trouble concentrating on things, such as reading the newspaper" - + " or watching television.", - phq8.getQuestions().get(6).getContent()); - assertEquals("Over the past two weeks, how often have you been bothered by any " - + "of the following problems?", phq8.getQuestions().get(6).getLead()); - phq8.getQuestions().get(6).getResponses().forEach(response -> validateResponse(response)); - assertEquals(RadarWidget.RADIO.name(), phq8.getQuestions().get(6).getWidget().name()); - - assertEquals("Moving or speaking so slowly that other people could have " - + "noticed. Or the opposite – being so fidgety or restless that you have been " - + "moving around a lot more than usual.", phq8.getQuestions().get(7).getContent()); - assertEquals("Over the past two weeks, how often have you been bothered by any " - + "of the following problems?", phq8.getQuestions().get(7).getLead()); - phq8.getQuestions().get(7).getResponses().forEach(response -> validateResponse(response)); - assertEquals(RadarWidget.RADIO.name(), phq8.getQuestions().get(7).getWidget().name()); - } - - private void validateResponse(Response response) { - switch (response.getScore()) { - case 0: - assertEquals("Not at all", response.getText()); - break; - case 1: - assertEquals("Several days", response.getText()); - break; - case 2: - assertEquals("More than half the days", response.getText()); - break; - case 3: - assertEquals("Nearly every day", response.getText()); - break; - default: fail(response.getScore() + " is invalid."); - } - } -} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/ExternalTimeTest.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/ExternalTimeTest.java deleted file mode 100644 index a14cf82d..00000000 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/ExternalTimeTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.radarcns.specifications.value.monitor; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertEquals; -import static org.radarcns.specifications.value.Utility.testTopicNonAggregatable; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.radarcns.catalogue.DataType; -import org.radarcns.catalogue.MonitorSourceType; -import org.radarcns.catalogue.Unit; -import org.radarcns.specifications.SourceCatalogue; -import org.radarcns.specifications.source.KafkaActor; -import org.radarcns.specifications.source.passive.MonitorSource; - -/** - * TODO. - */ -public class ExternalTimeTest { - - private static MonitorSource externalTime; - - @BeforeClass - public static void initSource() { - externalTime = SourceCatalogue.getMonitorSource(MonitorSourceType.EXTERNAL_TIME); - } - - @Test - public void validate() { - assertEquals("org.radarcns.application.ApplicationServiceProvider", - externalTime.getAppProvider()); - - KafkaActor actor = externalTime.getKafkaActor(); - - assertEquals(DataType.RAW.name(), actor.getProcessingState().name()); - assertEquals(0.08, actor.getSampleRate(), 0.0); - assertEquals(MonitorSourceType.EXTERNAL_TIME.name(), externalTime.getType()); - assertEquals(Unit.NON_DIMENSIONAL.name(), actor.getUnit()); - - testTopicNonAggregatable("application_external_time", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.monitor.application.ApplicationExternalTime", - actor.getTopic()); - } -} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/RecordCountsTest.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/RecordCountsTest.java deleted file mode 100644 index 52e56fba..00000000 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/RecordCountsTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.radarcns.specifications.value.monitor; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertEquals; -import static org.radarcns.specifications.value.Utility.testTopicNonAggregatable; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.radarcns.catalogue.DataType; -import org.radarcns.catalogue.MonitorSourceType; -import org.radarcns.catalogue.Unit; -import org.radarcns.specifications.SourceCatalogue; -import org.radarcns.specifications.source.KafkaActor; -import org.radarcns.specifications.source.passive.MonitorSource; - -/** - * TODO. - */ -public class RecordCountsTest { - - private static MonitorSource recordCounts; - - @BeforeClass - public static void initSource() { - recordCounts = SourceCatalogue.getMonitorSource(MonitorSourceType.RECORD_COUNTS); - } - - @Test - public void validate() { - assertEquals("org.radarcns.application.ApplicationServiceProvider", - recordCounts.getAppProvider()); - - KafkaActor actor = recordCounts.getKafkaActor(); - - assertEquals(DataType.RAW.name(), actor.getProcessingState().name()); - assertEquals(0.08, actor.getSampleRate(), 0.0); - assertEquals(MonitorSourceType.RECORD_COUNTS.name(), recordCounts.getType()); - assertEquals(Unit.NON_DIMENSIONAL.name(), actor.getUnit()); - - testTopicNonAggregatable("application_record_counts", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.monitor.application.ApplicationRecordCounts", - actor.getTopic()); - } -} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/ServerStatusTest.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/ServerStatusTest.java deleted file mode 100644 index a4f2484c..00000000 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/ServerStatusTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.radarcns.specifications.value.monitor; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertEquals; -import static org.radarcns.specifications.value.Utility.testTopicNonAggregatable; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.radarcns.catalogue.DataType; -import org.radarcns.catalogue.MonitorSourceType; -import org.radarcns.catalogue.Unit; -import org.radarcns.specifications.SourceCatalogue; -import org.radarcns.specifications.source.KafkaActor; -import org.radarcns.specifications.source.passive.MonitorSource; - -/** - * TODO. - */ -public class ServerStatusTest { - - private static MonitorSource serverStatus; - - @BeforeClass - public static void initSource() { - serverStatus = SourceCatalogue.getMonitorSource(MonitorSourceType.SERVER_STATUS); - } - - @Test - public void validate() { - assertEquals("org.radarcns.application.ApplicationServiceProvider", - serverStatus.getAppProvider()); - - KafkaActor actor = serverStatus.getKafkaActor(); - - assertEquals(DataType.RAW.name(), actor.getProcessingState().name()); - assertEquals(0.08, actor.getSampleRate(), 0.0); - assertEquals(MonitorSourceType.SERVER_STATUS.name(), serverStatus.getType()); - assertEquals(Unit.NON_DIMENSIONAL.name(), actor.getUnit()); - - testTopicNonAggregatable("application_server_status", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.monitor.application.ApplicationServerStatus", - actor.getTopic()); - } -} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/UptimeTest.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/UptimeTest.java deleted file mode 100644 index f168e986..00000000 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/monitor/UptimeTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.radarcns.specifications.value.monitor; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertEquals; -import static org.radarcns.specifications.value.Utility.testTopicNonAggregatable; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.radarcns.catalogue.DataType; -import org.radarcns.catalogue.MonitorSourceType; -import org.radarcns.catalogue.Unit; -import org.radarcns.specifications.SourceCatalogue; -import org.radarcns.specifications.source.KafkaActor; -import org.radarcns.specifications.source.passive.MonitorSource; - -/** - * TODO. - */ -public class UptimeTest { - - private static MonitorSource uptime; - - @BeforeClass - public static void initSource() { - uptime = SourceCatalogue.getMonitorSource(MonitorSourceType.UPTIME); - } - - @Test - public void validate() { - assertEquals("org.radarcns.application.ApplicationServiceProvider", - uptime.getAppProvider()); - - KafkaActor actor = uptime.getKafkaActor(); - - assertEquals(DataType.RAW.name(), actor.getProcessingState().name()); - assertEquals(0.08, actor.getSampleRate(), 0.0); - assertEquals(MonitorSourceType.UPTIME.name(), uptime.getType()); - assertEquals(Unit.NON_DIMENSIONAL, actor.getUnit()); - - testTopicNonAggregatable("application_uptime", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.monitor.application.ApplicationUptime", - actor.getTopic()); - } -} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/AndroidPhoneTest.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/AndroidPhoneTest.java deleted file mode 100644 index 41e3f5fe..00000000 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/AndroidPhoneTest.java +++ /dev/null @@ -1,223 +0,0 @@ -package org.radarcns.specifications.value.passive; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.radarcns.catalogue.SensorName.ACCELEROMETER; -import static org.radarcns.catalogue.SensorName.BATTERY; -import static org.radarcns.catalogue.SensorName.GYROSCOPE; -import static org.radarcns.catalogue.SensorName.LIGHT; -import static org.radarcns.catalogue.SensorName.MAGNETIC_FIELD; -import static org.radarcns.catalogue.SensorName.PHONE_CALL; -import static org.radarcns.catalogue.SensorName.PHONE_SMS; -import static org.radarcns.catalogue.SensorName.PHONE_SMS_UNREAD; -import static org.radarcns.catalogue.SensorName.RELATIVE_LOCATION; -import static org.radarcns.catalogue.SensorName.STEP_COUNT; -import static org.radarcns.catalogue.SensorName.USAGE_EVENT; -import static org.radarcns.catalogue.SensorName.USER_INTERACTION; -import static org.radarcns.specifications.value.Utility.testSensorNonAggregatable; -import static org.radarcns.specifications.value.Utility.testSensorTimed; -import static org.radarcns.specifications.value.Utility.testSourceTopics; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.radarcns.catalogue.DataType; -import org.radarcns.catalogue.PassiveSourceType; -import org.radarcns.catalogue.Unit; -import org.radarcns.specifications.SourceCatalogue; -import org.radarcns.specifications.source.passive.PassiveSource; - -/** - * TODO. - */ -public class AndroidPhoneTest { - - private static PassiveSource androidPhone; - private static int countSensors; - - @BeforeClass - public static void initSource() { - androidPhone = SourceCatalogue.getPassiveSource(PassiveSourceType.ANDROID_PHONE); - countSensors = 0; - } - - @Test - public void validateHeader() { - assertEquals("ANDROID", androidPhone.getVendor()); - assertEquals("PHONE", androidPhone.getModel()); - assertEquals(PassiveSourceType.ANDROID_PHONE.name(), androidPhone.getType().name()); - assertEquals(PassiveSourceType.ANDROID_PHONE.name(), androidPhone.getName()); - - assertNull(androidPhone.getAppProvider()); - } - - @Test - public void validatePhoneSensors() { - String expectedAppProvider = "org.radarcns.phone.PhoneSensorProvider"; - - countSensors++; - assertTrue(testSensorTimed(androidPhone.getSensor(ACCELEROMETER), - "org.radarcns.kafka.aggregator.AggregatorDoubleArray", - expectedAppProvider, - "android_phone_acceleration", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.phone.PhoneAcceleration", - ACCELEROMETER, DataType.RAW, Unit.G, -1d, - "android_phone_acceleration" - )); - - countSensors++; - assertTrue(testSensorTimed(androidPhone.getSensor(BATTERY), - "org.radarcns.kafka.aggregator.AggregatorDouble", - expectedAppProvider, - "android_phone_battery_level", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.phone.PhoneBatteryLevel", - BATTERY, DataType.RAW, Unit.PERCENTAGE, -1d, - "android_phone_battery_level" - )); - - countSensors++; - assertTrue(testSensorTimed(androidPhone.getSensor(GYROSCOPE), - "org.radarcns.kafka.aggregator.AggregatorDoubleArray", - expectedAppProvider, - "android_phone_gyroscope", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.phone.PhoneGyroscope", - GYROSCOPE, DataType.RAW, Unit.RADAIAN_PER_SEC, -1d, - "android_phone_gyroscope" - )); - - countSensors++; - assertTrue(testSensorTimed(androidPhone.getSensor(LIGHT), - "org.radarcns.kafka.aggregator.AggregatorDouble", - expectedAppProvider, - "android_phone_light", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.phone.PhoneLight", - LIGHT, DataType.RAW, Unit.LUX, -1d, - "android_phone_light" - )); - - countSensors++; - assertTrue(testSensorTimed(androidPhone.getSensor(MAGNETIC_FIELD), - "org.radarcns.kafka.aggregator.AggregatorDoubleArray", - expectedAppProvider, - "android_phone_magnetic_field", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.phone.PhoneMagneticField", - MAGNETIC_FIELD, DataType.RAW, Unit.MICRO_TESLA, -1d, - "android_phone_magnetic_field" - )); - - countSensors++; - assertTrue(testSensorTimed(androidPhone.getSensor(STEP_COUNT), - "org.radarcns.kafka.aggregator.AggregatorDouble", - expectedAppProvider, - "android_phone_step_count", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.phone.PhoneStepCount", - STEP_COUNT, DataType.VENDOR, Unit.NON_DIMENSIONAL, -1d, - "android_phone_step_count" - )); - } - - @Test - public void validatePhoneLocation() { - String expectedAppProvider = "org.radarcns.phone.PhoneLocationProvider"; - - countSensors++; - assertTrue(testSensorNonAggregatable(androidPhone.getSensor(RELATIVE_LOCATION), - expectedAppProvider, - "android_phone_relative_location", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.phone.PhoneRelativeLocation", - RELATIVE_LOCATION, DataType.RAW, Unit.DEGREE, -1d - )); - } - - @Test - public void validatePhoneLogs() { - String expectedAppProvider = "org.radarcns.phone.PhoneLogProvider"; - - countSensors++; - assertTrue(testSensorNonAggregatable(androidPhone.getSensor(PHONE_CALL), - expectedAppProvider, - "android_phone_call", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.phone.PhoneCall", - PHONE_CALL, DataType.RAW, Unit.NON_DIMENSIONAL, -1d - )); - - countSensors++; - assertTrue(testSensorNonAggregatable(androidPhone.getSensor(PHONE_SMS), - expectedAppProvider, - "android_phone_sms", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.phone.PhoneSms", - PHONE_SMS, DataType.RAW, Unit.NON_DIMENSIONAL, -1d - )); - - countSensors++; - assertTrue(testSensorNonAggregatable(androidPhone.getSensor(PHONE_SMS_UNREAD), - expectedAppProvider, - "android_phone_sms_unread", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.phone.PhoneSmsUnread", - PHONE_SMS_UNREAD, DataType.RAW, Unit.NON_DIMENSIONAL, -1d - )); - } - - @Test - public void validatePhoneUsage() { - String expectedAppProvider = "org.radarcns.phone.PhoneUsageProvider"; - - countSensors++; - assertTrue(testSensorNonAggregatable(androidPhone.getSensor(USAGE_EVENT), - expectedAppProvider, - "android_phone_usage_event", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.phone.PhoneUsageEvent", - USAGE_EVENT, DataType.RAW, Unit.NON_DIMENSIONAL, -1d - )); - - countSensors++; - assertTrue(testSensorNonAggregatable(androidPhone.getSensor(USER_INTERACTION), - expectedAppProvider, - "android_phone_user_interaction", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.phone.PhoneUserInteraction", - USER_INTERACTION, DataType.RAW, Unit.NON_DIMENSIONAL, -1d - )); - } - - @Test - public void validateTopics() { - assertTrue(testSourceTopics(androidPhone)); - } - - /*@AfterClass - public static void countSensorTest() { - if (androidPhone.getSensors().size() != countSensors) { - throw new IllegalStateException("The amount of tested sensors do not match the " - + "specified sensors."); - } - }*/ - -} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/BiovotionTest.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/BiovotionTest.java deleted file mode 100644 index 6c614ce6..00000000 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/BiovotionTest.java +++ /dev/null @@ -1,256 +0,0 @@ -package org.radarcns.specifications.value.passive; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.radarcns.catalogue.SensorName.ACCELEROMETER; -import static org.radarcns.catalogue.SensorName.BATTERY; -import static org.radarcns.catalogue.SensorName.BLOOD_PULSE_WAVE; -import static org.radarcns.catalogue.SensorName.ENERGY; -import static org.radarcns.catalogue.SensorName.GALVANIC_SKIN_RESPONSE; -import static org.radarcns.catalogue.SensorName.HEART_RATE; -import static org.radarcns.catalogue.SensorName.HEART_RATE_VARIABILITY; -import static org.radarcns.catalogue.SensorName.LED; -import static org.radarcns.catalogue.SensorName.OXYGEN_SATURATION; -import static org.radarcns.catalogue.SensorName.PHOTOPLETHYSMOGRAPHY; -import static org.radarcns.catalogue.SensorName.RESPIRATION_RATE; -import static org.radarcns.catalogue.SensorName.THERMOMETER; -import static org.radarcns.specifications.value.Utility.testSensorTimed; -import static org.radarcns.specifications.value.Utility.testSourceTopics; - -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; -import org.radarcns.catalogue.DataType; -import org.radarcns.catalogue.PassiveSourceType; -import org.radarcns.catalogue.Unit; -import org.radarcns.specifications.SourceCatalogue; -import org.radarcns.specifications.source.passive.PassiveSource; - -/** - * TODO. - */ -public class BiovotionTest { - - private static PassiveSource biovotion; - private static int countSensors; - - @BeforeClass - public static void initSource() { - biovotion = SourceCatalogue.getPassiveSource(PassiveSourceType.BIOVOTION_VSM1); - countSensors = 0; - } - - @Test - public void validateHeader() { - assertEquals("BIOVOTION", biovotion.getVendor()); - assertEquals("VSM1", biovotion.getModel()); - assertEquals(PassiveSourceType.BIOVOTION_VSM1.name(), biovotion.getType().name()); - assertEquals(PassiveSourceType.BIOVOTION_VSM1.name(), biovotion.getName()); - - assertEquals("org.radarcns.biovotion.BiovotionServiceProvider", - biovotion.getAppProvider()); - } - - @Test - public void validateAcceleration() { - countSensors++; - assertTrue(testSensorTimed(biovotion.getSensor(ACCELEROMETER), - "org.radarcns.kafka.aggregator.AggregatorDoubleArray", - null, - "android_biovotion_vsm1_acceleration", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.biovotion.BiovotionVsm1Acceleration", - ACCELEROMETER, DataType.RAW, Unit.G, 51.2, - "android_biovotion_vsm1_acceleration" - )); - } - - @Test - public void validateBatteryLevel() { - countSensors++; - assertTrue(testSensorTimed(biovotion.getSensor(BATTERY), - "org.radarcns.kafka.aggregator.AggregatorDouble", - null, - "android_biovotion_vsm1_battery_level", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.biovotion.BiovotionVsm1BatteryLevel", - BATTERY, DataType.RAW, Unit.PERCENTAGE, 1d, - "android_biovotion_vsm1_battery_level" - )); - } - - @Test - public void validateBloodPulseWave() { - countSensors++; - assertTrue(testSensorTimed(biovotion.getSensor(BLOOD_PULSE_WAVE), - "org.radarcns.kafka.aggregator.AggregatorDouble", - null, - "android_biovotion_vsm1_blood_volume_pulse", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.biovotion.BiovotionVsm1BloodPulseWave", - BLOOD_PULSE_WAVE, DataType.VENDOR, Unit.NON_DIMENSIONAL, 1d, - "android_biovotion_vsm1_blood_volume_pulse" - )); - } - - @Test - public void validateEnergy() { - countSensors++; - assertTrue(testSensorTimed(biovotion.getSensor(ENERGY), - "org.radarcns.kafka.aggregator.AggregatorDouble", - null, - "android_biovotion_vsm1_energy", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.biovotion.BiovotionVsm1Energy", - ENERGY, DataType.VENDOR, Unit.CALORIES_PER_SEC, 1d, - "android_biovotion_vsm1_energy" - )); - } - - @Test - public void validateGalvanicSkinResponse() { - countSensors++; - assertTrue(testSensorTimed(biovotion.getSensor(GALVANIC_SKIN_RESPONSE), - "org.radarcns.kafka.aggregator.AggregatorDoubleArray", - null, - "android_biovotion_vsm1_galvanic_skin_response", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.biovotion.BiovotionVsm1GalvanicSkinResponse", - GALVANIC_SKIN_RESPONSE, DataType.VENDOR, Unit.KILO_OHM, 1d, - "android_biovotion_vsm1_galvanic_skin_response" - )); - } - - @Test - public void validateHeartRate() { - countSensors++; - assertTrue(testSensorTimed(biovotion.getSensor(HEART_RATE), - "org.radarcns.kafka.aggregator.AggregatorDouble", - null, - "android_biovotion_vsm1_heartrate", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.biovotion.BiovotionVsm1HeartRate", - HEART_RATE, DataType.VENDOR, Unit.BEATS_PER_MIN, 1d, - "android_biovotion_vsm1_heartrate" - )); - } - - @Test - public void validateHeartRateVariability() { - countSensors++; - assertTrue(testSensorTimed(biovotion.getSensor(HEART_RATE_VARIABILITY), - "org.radarcns.kafka.aggregator.AggregatorDouble", - null, - "android_biovotion_vsm1_heartrate_variability", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.biovotion.BiovotionVsm1HeartRateVariability", - HEART_RATE_VARIABILITY, DataType.VENDOR, Unit.RMSSD_IN_MILLI_SEC, 1d, - "android_biovotion_vsm1_heartrate_variability" - )); - } - - @Test - public void validateLedCurrent() { - countSensors++; - assertTrue(testSensorTimed(biovotion.getSensor(LED), - "org.radarcns.kafka.aggregator.AggregatorDoubleArray", - null, - "android_biovotion_vsm1_led_current", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.biovotion.BiovotionVsm1LedCurrent", - LED, DataType.VENDOR, Unit.MILLI_AMPERE, 1d, - "android_biovotion_vsm1_led_current" - )); - } - - @Test - public void validatePpgRaw() { - countSensors++; - assertTrue(testSensorTimed(biovotion.getSensor(PHOTOPLETHYSMOGRAPHY), - "org.radarcns.kafka.aggregator.AggregatorDoubleArray", - null, - "android_biovotion_vsm1_ppg_raw", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.biovotion.BiovotionVsm1PpgRaw", - PHOTOPLETHYSMOGRAPHY, DataType.RAW, Unit.NON_DIMENSIONAL, 51.2, - "android_biovotion_vsm1_ppg_raw" - )); - } - - @Test - public void validateRespirationRate() { - countSensors++; - assertTrue(testSensorTimed(biovotion.getSensor(RESPIRATION_RATE), - "org.radarcns.kafka.aggregator.AggregatorDouble", - null, - "android_biovotion_vsm1_respiration_rate", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.biovotion.BiovotionVsm1RespirationRate", - RESPIRATION_RATE, DataType.VENDOR, Unit.BEATS_PER_MIN, 1d, - "android_biovotion_vsm1_respiration_rate" - )); - } - - @Test - public void validateOxygenSaturation() { - countSensors++; - assertTrue(testSensorTimed(biovotion.getSensor(OXYGEN_SATURATION), - "org.radarcns.kafka.aggregator.AggregatorDouble", - null, - "android_biovotion_vsm1_oxygen_saturation", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.biovotion.BiovotionVsm1OxygenSaturation", - OXYGEN_SATURATION, DataType.VENDOR, Unit.PERCENTAGE, 1d, - "android_biovotion_vsm1_oxygen_saturation" - )); - } - - @Test - public void validateTemperature() { - countSensors++; - assertTrue(testSensorTimed(biovotion.getSensor(THERMOMETER), - "org.radarcns.kafka.aggregator.AggregatorDouble", - null, - "android_biovotion_vsm1_temperature", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.biovotion.BiovotionVsm1Temperature", - THERMOMETER, DataType.RAW, Unit.CELSIUS, 1d, - "android_biovotion_vsm1_temperature" - )); - } - - @Test - public void validateProcessors() { - assertTrue(biovotion.getProcessors().isEmpty()); - } - - @Test - public void validateTopics() { - assertTrue(testSourceTopics(biovotion)); - } - - @AfterClass - public static void countSensorTest() { - if (biovotion.getSensors().size() != countSensors) { - throw new IllegalStateException("The amount of tested sensors do not match the " - + "specified sensors."); - } - } - -} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/EmpaticaE4Test.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/EmpaticaE4Test.java deleted file mode 100644 index 7b6fc43a..00000000 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/EmpaticaE4Test.java +++ /dev/null @@ -1,185 +0,0 @@ -package org.radarcns.specifications.value.passive; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.radarcns.catalogue.SensorName.ACCELEROMETER; -import static org.radarcns.catalogue.SensorName.BATTERY; -import static org.radarcns.catalogue.SensorName.BLOOD_VOLUME_PULSE; -import static org.radarcns.catalogue.SensorName.ELECTRODERMAL_ACTIVITY; -import static org.radarcns.catalogue.SensorName.HEART_RATE; -import static org.radarcns.catalogue.SensorName.INTER_BEAT_INTERVAL; -import static org.radarcns.catalogue.SensorName.THERMOMETER; -import static org.radarcns.specifications.value.Utility.testSensorTimed; -import static org.radarcns.specifications.value.Utility.testSourceTopics; -import static org.radarcns.specifications.value.Utility.testTopicTimedAggregator; - -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; -import org.radarcns.catalogue.DataType; -import org.radarcns.catalogue.PassiveSourceType; -import org.radarcns.catalogue.Unit; -import org.radarcns.specifications.SourceCatalogue; -import org.radarcns.specifications.source.passive.PassiveSource; -import org.radarcns.specifications.source.passive.Processor; - -/** - * TODO. - */ -public class EmpaticaE4Test { - - private static PassiveSource empaticaE4; - private static int countSensors; - - @BeforeClass - public static void initSource() { - empaticaE4 = SourceCatalogue.getPassiveSource(PassiveSourceType.EMPATICA_E4); - countSensors = 0; - } - - @Test - public void validateHeader() { - assertEquals("EMPATICA", empaticaE4.getVendor()); - assertEquals("E4", empaticaE4.getModel()); - assertEquals(PassiveSourceType.EMPATICA_E4.name(), empaticaE4.getType().name()); - assertEquals(PassiveSourceType.EMPATICA_E4.name(), empaticaE4.getName()); - - assertEquals("org.radarcns.empatica.E4ServiceProvider", - empaticaE4.getAppProvider()); - } - - @Test - public void validateAccelerometer() { - countSensors++; - assertTrue(testSensorTimed(empaticaE4.getSensor(ACCELEROMETER), - "org.radarcns.kafka.aggregator.AggregatorDoubleArray", - null, - "android_empatica_e4_acceleration", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.empatica.EmpaticaE4Acceleration", - ACCELEROMETER, DataType.RAW, Unit.G, 32d, - "android_empatica_e4_acceleration" - )); - } - - @Test - public void validateBattery() { - countSensors++; - assertTrue(testSensorTimed(empaticaE4.getSensor(BATTERY), - "org.radarcns.kafka.aggregator.AggregatorDouble", - null, - "android_empatica_e4_battery_level", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.empatica.EmpaticaE4BatteryLevel", - BATTERY, DataType.RAW, Unit.PERCENTAGE, 1d, - "android_empatica_e4_battery_level" - )); - } - - @Test - public void validateBloodVolumePulse() { - countSensors++; - assertTrue(testSensorTimed(empaticaE4.getSensor(BLOOD_VOLUME_PULSE), - "org.radarcns.kafka.aggregator.AggregatorDouble", - null, - "android_empatica_e4_blood_volume_pulse", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.empatica.EmpaticaE4BloodVolumePulse", - BLOOD_VOLUME_PULSE, DataType.RAW, Unit.NANO_WATT, 64d, - "android_empatica_e4_blood_volume_pulse" - )); - } - - @Test - public void validateElectroDermalActivity() { - countSensors++; - assertTrue(testSensorTimed(empaticaE4.getSensor(ELECTRODERMAL_ACTIVITY), - "org.radarcns.kafka.aggregator.AggregatorDouble", - null, - "android_empatica_e4_electrodermal_activity", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.empatica.EmpaticaE4ElectroDermalActivity", - ELECTRODERMAL_ACTIVITY, DataType.RAW, Unit.MICRO_SIEMENS, 4d, - "android_empatica_e4_electrodermal_activity" - )); - } - - @Test - public void validateInterBeatInterval() { - countSensors++; - assertTrue(testSensorTimed(empaticaE4.getSensor(INTER_BEAT_INTERVAL), - "org.radarcns.kafka.aggregator.AggregatorDouble", - null, - "android_empatica_e4_inter_beat_interval", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.empatica.EmpaticaE4InterBeatInterval", - INTER_BEAT_INTERVAL, DataType.VENDOR, Unit.BEATS_PER_MIN, 1d, - "android_empatica_e4_inter_beat_interval" - )); - } - - @Test - public void validateTemperature() { - countSensors++; - assertTrue(testSensorTimed(empaticaE4.getSensor(THERMOMETER), - "org.radarcns.kafka.aggregator.AggregatorDouble", - null, - "android_empatica_e4_temperature", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.empatica.EmpaticaE4Temperature", - THERMOMETER, DataType.RAW, Unit.CELSIUS, 4d, - "android_empatica_e4_temperature" - )); - } - - @Test - public void validateProcessors() { - assertEquals(1, empaticaE4.getProcessors().size(), 0); - Processor processor = empaticaE4.getProcessor(HEART_RATE); - assertEquals("org.radarcns.kafka.aggregator.AggregatorDouble", - processor.getTopic().getAggregator()); - assertEquals(DataType.RADAR.name(), processor.getProcessingState().name()); - //processor.getDoc(); - assertEquals(HEART_RATE.name(), processor.getName()); - assertEquals(1.0, processor.getSampleRate(), 0.0); - assertEquals(Unit.BEATS_PER_MIN.name(), processor.getUnit()); - testTopicTimedAggregator( - "org.radarcns.kafka.aggregator.AggregatorDouble", - "android_empatica_e4_inter_beat_interval", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.empatica.EmpaticaE4InterBeatInterval", - processor.getTopic(), - "android_empatica_e4_heartrate"); - } - - @Test - public void validateTopics() { - assertTrue(testSourceTopics(empaticaE4)); - } - - @AfterClass - public static void countSensorTest() { - if (empaticaE4.getSensors().size() != countSensors) { - throw new IllegalStateException("The amount of tested sensors do not match the " - + "specified sensors."); - } - } - -} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/Pebble2Test.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/Pebble2Test.java deleted file mode 100644 index 9ce1e227..00000000 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/specifications/value/passive/Pebble2Test.java +++ /dev/null @@ -1,136 +0,0 @@ -package org.radarcns.specifications.value.passive; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.radarcns.catalogue.SensorName.ACCELEROMETER; -import static org.radarcns.catalogue.SensorName.BATTERY; -import static org.radarcns.catalogue.SensorName.HEART_RATE; -import static org.radarcns.catalogue.SensorName.HEART_RATE_FILTERED; -import static org.radarcns.specifications.value.Utility.testSensorTimed; -import static org.radarcns.specifications.value.Utility.testSourceTopics; - -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; -import org.radarcns.catalogue.DataType; -import org.radarcns.catalogue.PassiveSourceType; -import org.radarcns.catalogue.Unit; -import org.radarcns.specifications.SourceCatalogue; -import org.radarcns.specifications.source.passive.PassiveSource; - -/** - * TODO. - */ -public class Pebble2Test { - - private static PassiveSource pebble2; - private static int countSensors; - - @BeforeClass - public static void initSource() { - pebble2 = SourceCatalogue.getPassiveSource(PassiveSourceType.PEBBLE_2); - countSensors = 0; - } - - @Test - public void validateHeader() { - assertEquals("PEBBLE", pebble2.getVendor()); - assertEquals("2", pebble2.getModel()); - assertEquals(PassiveSourceType.PEBBLE_2.name(), pebble2.getType().name()); - assertEquals(PassiveSourceType.PEBBLE_2.name(), pebble2.getName()); - - assertEquals("org.radarcns.pebble.PebbleServiceProvider", - pebble2.getAppProvider()); - } - - @Test - public void validateAccelerometer() { - countSensors++; - assertTrue(testSensorTimed(pebble2.getSensor(ACCELEROMETER), - "org.radarcns.kafka.aggregator.AggregatorDoubleArray", - null, - "android_pebble_2_acceleration", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.pebble.Pebble2Acceleration", - ACCELEROMETER, DataType.RAW, Unit.G, 10d, - "android_pebble_2_acceleration" - )); - } - - @Test - public void validateBattery() { - countSensors++; - assertTrue(testSensorTimed(pebble2.getSensor(BATTERY), - "org.radarcns.kafka.aggregator.AggregatorDouble", - null, - "android_pebble_2_battery_level", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.pebble.Pebble2BatteryLevel", - BATTERY, DataType.RAW, Unit.PERCENTAGE, 1d, - "android_pebble_2_battery_level" - )); - } - - @Test - public void validateHeartRate() { - countSensors++; - assertTrue(testSensorTimed(pebble2.getSensor(HEART_RATE), - "org.radarcns.kafka.aggregator.AggregatorDouble", - null, - "android_pebble_2_heartrate", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.pebble.Pebble2HeartRate", - HEART_RATE, DataType.VENDOR, Unit.BEATS_PER_MIN, 1d, - "android_pebble_2_heartrate" - )); - } - - @Test - public void validateHeartRateFiltered() { - countSensors++; - assertTrue(testSensorTimed(pebble2.getSensor(HEART_RATE_FILTERED), - "org.radarcns.kafka.aggregator.AggregatorDouble", - null, - "android_pebble_2_heartrate_filtered", - "org.radarcns.kafka.key.KeyMeasurement", - "org.radarcns.passive.pebble.Pebble2HeartRateFiltered", - HEART_RATE_FILTERED, DataType.VENDOR, Unit.BEATS_PER_MIN, 1d, - "android_pebble_2_heartrate_filtered" - )); - } - - @Test - public void validateProcessors() { - assertTrue(pebble2.getProcessors().isEmpty()); - } - - @Test - public void validateTopics() { - assertTrue(testSourceTopics(pebble2)); - } - - @AfterClass - public static void countSensorTest() { - if (pebble2.getSensors().size() != countSensors) { - throw new IllegalStateException("The amount of tested sensors do not match the " - + "specified sensors."); - } - } - -} diff --git a/java-sdk/radar-schemas-validator/build.gradle b/java-sdk/radar-schemas-validator/build.gradle index 8a0a24f5..46815441 100644 --- a/java-sdk/radar-schemas-validator/build.gradle +++ b/java-sdk/radar-schemas-validator/build.gradle @@ -4,18 +4,12 @@ plugins { id 'pmd' } -ext.artifactName = 'radar-schemas-validator' +ext.artifactName = 'radar-schemas-validation' ext.description = 'RADAR Schemas Validator. JUnit tests to check schema acceptance.' targetCompatibility = '1.8' sourceCompatibility = '1.8' -idea { - module { - downloadSources = true - } -} - sourceSets { test { java.srcDir 'src/test/java' @@ -27,8 +21,11 @@ ext.junitVersion = '4.12' ext.slf4jVersion = '1.7.25' dependencies { - compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.8.10' - compile group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.8.10' + api group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.8.10' + implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.8.10' + implementation project(':radar-schemas-commons') + implementation project(':radar-schemas-specifications') + testCompile group: 'junit', name: 'junit', version: junitVersion testCompile group: 'org.slf4j', name: 'slf4j-simple', version: slf4jVersion } diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/Invalid.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/Invalid.java similarity index 97% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/Invalid.java rename to java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/Invalid.java index 47013367..dbf1717a 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/Invalid.java +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/Invalid.java @@ -1,4 +1,4 @@ -package org.radarcns.validator; +package org.radarcns.schema.validation; /* * Copyright 2017 King's College London and The Hyve diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/SchemaRepository.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SchemaRepository.java similarity index 97% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/SchemaRepository.java rename to java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SchemaRepository.java index b6ccaca0..65863ca4 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/SchemaRepository.java +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SchemaRepository.java @@ -1,4 +1,4 @@ -package org.radarcns.validator; +package org.radarcns.schema.validation; /* * Copyright 2017 King's College London and The Hyve diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/SchemaValidationRoles.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SchemaValidationRoles.java similarity index 85% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/SchemaValidationRoles.java rename to java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SchemaValidationRoles.java index 6f74b76c..85b9f503 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/SchemaValidationRoles.java +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SchemaValidationRoles.java @@ -1,23 +1,18 @@ -package org.radarcns.validator; - -import static org.radarcns.validator.SchemaValidationRoles.Message.DEFAULT_VALUE; -import static org.radarcns.validator.SchemaValidationRoles.Message.DOC; -import static org.radarcns.validator.SchemaValidationRoles.Message.ENUMERATION_SYMBOL; -import static org.radarcns.validator.SchemaValidationRoles.Message.ENUMERATION_UNKNOWN_SYMBOL; -import static org.radarcns.validator.SchemaValidationRoles.Message.FIELDS; -import static org.radarcns.validator.SchemaValidationRoles.Message.FILED_NAME; -import static org.radarcns.validator.SchemaValidationRoles.Message.NOT_TIME_COMPLETED_FIELD; -import static org.radarcns.validator.SchemaValidationRoles.Message.NOT_TIME_RECEIVED_FIELD; -import static org.radarcns.validator.SchemaValidationRoles.Message.RECORD_NAME; -import static org.radarcns.validator.SchemaValidationRoles.Message.SYMBOLS; -import static org.radarcns.validator.SchemaValidationRoles.Message.TIME_COMPLETED_FIELD; -import static org.radarcns.validator.SchemaValidationRoles.Message.TIME_FIELD; -import static org.radarcns.validator.SchemaValidationRoles.Message.TIME_RECEIVED_FIELD; -import static org.radarcns.validator.ValidationResult.invalid; -import static org.radarcns.validator.ValidationResult.valid; -import static org.radarcns.validator.ValidationSupport.extractEnumerationFields; -import static org.radarcns.validator.ValidationSupport.getNamespace; -import static org.radarcns.validator.ValidationSupport.getRecordName; +package org.radarcns.schema.validation; + +import static org.radarcns.schema.validation.SchemaValidationRoles.Message.DEFAULT_VALUE; +import static org.radarcns.schema.validation.SchemaValidationRoles.Message.DOC; +import static org.radarcns.schema.validation.SchemaValidationRoles.Message.ENUMERATION_SYMBOL; +import static org.radarcns.schema.validation.SchemaValidationRoles.Message.ENUMERATION_UNKNOWN_SYMBOL; +import static org.radarcns.schema.validation.SchemaValidationRoles.Message.FIELDS; +import static org.radarcns.schema.validation.SchemaValidationRoles.Message.FIELD_NAME; +import static org.radarcns.schema.validation.SchemaValidationRoles.Message.NOT_TIME_COMPLETED_FIELD; +import static org.radarcns.schema.validation.SchemaValidationRoles.Message.NOT_TIME_RECEIVED_FIELD; +import static org.radarcns.schema.validation.SchemaValidationRoles.Message.RECORD_NAME; +import static org.radarcns.schema.validation.SchemaValidationRoles.Message.SYMBOLS; +import static org.radarcns.schema.validation.SchemaValidationRoles.Message.TIME_COMPLETED_FIELD; +import static org.radarcns.schema.validation.SchemaValidationRoles.Message.TIME_FIELD; +import static org.radarcns.schema.validation.SchemaValidationRoles.Message.TIME_RECEIVED_FIELD; import java.nio.file.Path; import java.util.Objects; @@ -29,6 +24,7 @@ import java.util.stream.Stream; import org.apache.avro.Schema; import org.apache.avro.Schema.Type; +import org.radarcns.schema.Scope; /* @@ -106,7 +102,7 @@ enum Message { NOT_TIME_RECEIVED_FIELD("\"" + TIME_RECEIVED + "\" is allow only in " + Scope.PASSIVE + " schemas."), FIELDS("Avro Record must have field list."), - FILED_NAME("Field name does not respect lowerCamelCase name convention. It cannot contain" + FIELD_NAME("Field name does not respect lowerCamelCase name convention. It cannot contain" + " any of the following values [" + Stream.of(FieldNameNotAllowed.values()) .map(FieldNameNotAllowed::getName) @@ -148,12 +144,12 @@ public String getMessage() { * @return TODO */ static SchemaValidationRoles validateNameSpace(Path schemaPath, Scope scope) { - String expected = getNamespace(schemaPath, scope); + String expected = ValidationSupport.getNamespace(schemaPath, scope); return schema -> Objects.nonNull(schema.getNamespace()) && NAMESPACE_PATTERN.matcher(schema.getNamespace()).matches() - && schema.getNamespace().equalsIgnoreCase(expected) ? valid() : - invalid(Message.NAME_SPACE.getMessage().concat(expected).concat( + && schema.getNamespace().equalsIgnoreCase(expected) ? ValidationResult.valid() : + ValidationResult.invalid(Message.NAME_SPACE.getMessage().concat(expected).concat( "\". ").concat(schema.getFullName()).concat(" is invalid.")); } @@ -173,12 +169,12 @@ static SchemaValidationRoles validateRecordName(Path path) { * @return TODO */ static SchemaValidationRoles validateRecordName(Path path, boolean skip) { - String expected = getRecordName(path); + String expected = ValidationSupport.getRecordName(path); return schema -> skip || matches(schema.getName(), RECORD_NAME_PATTERN) - && schema.getName().equalsIgnoreCase(expected) ? valid() : - invalid(RECORD_NAME.getMessage().concat(expected).concat("\". ").concat( + && schema.getName().equalsIgnoreCase(expected) ? ValidationResult.valid() : + ValidationResult.invalid(RECORD_NAME.getMessage().concat(expected).concat("\". ").concat( schema.getFullName()).concat(" is invalid.")); } @@ -217,21 +213,14 @@ static SchemaValidationRoles validateFieldName(Set skip) { .stream() .map(Schema.Field::name); if (skip != null && !skip.isEmpty()) { - stream = stream.filter(name -> !skip::contains(name)); + stream = stream.filter(name -> !skip.contains(name)); } - } - schema.getFields() - .stream() - .map(Schema.Field::name); - - - - .filter(name -> skip == null || !skip.contains(name)) - .allMatch(name -> + return stream.allMatch(name -> matches(name, FIELD_NAME_PATTERN) - && Stream.of(FieldNameNotAllowed.values()) - .noneMatch(notAllowed -> name.contains(notAllowed.getName()))), - FILED_NAME); + && Stream.of(FieldNameNotAllowed.values()) + .noneMatch(notAllowed -> name.contains(notAllowed.getName()))); + }, + FIELD_NAME); } /** @@ -261,7 +250,7 @@ static SchemaValidationRoles validateSymbols() { */ static SchemaValidationRoles validateEnumerationSymbols() { return validate(schema -> - extractEnumerationFields(schema).stream() + ValidationSupport.extractEnumerationFields(schema).stream() .allMatch(matches(ENUM_SYMBOL_PATTERN)), ENUMERATION_SYMBOL); } @@ -326,7 +315,7 @@ static SchemaValidationRoles validateNotTimeReceived() { * @return TODO */ static SchemaValidationRoles validateUnknownSymbol() { - return validate(schema -> extractEnumerationFields(schema).contains(UNKNOWN), + return validate(schema -> ValidationSupport.extractEnumerationFields(schema).contains(UNKNOWN), ENUMERATION_UNKNOWN_SYMBOL); } @@ -337,7 +326,7 @@ static SchemaValidationRoles validateUnknownSymbol() { * @return TODO */ static SchemaValidationRoles validate(Predicate predicate, Message message) { - return schema -> predicate.test(schema) ? valid() : invalid(message.getMessage(schema)); + return schema -> predicate.test(schema) ? ValidationResult.valid() : ValidationResult.invalid(message.getMessage(schema)); } /** diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/SchemaValidator.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SchemaValidator.java similarity index 85% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/SchemaValidator.java rename to java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SchemaValidator.java index 19ca4d3f..a18c4f54 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/SchemaValidator.java +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SchemaValidator.java @@ -1,4 +1,4 @@ -package org.radarcns.validator; +package org.radarcns.schema.validation; /* * Copyright 2017 King's College London and The Hyve @@ -18,7 +18,8 @@ import org.apache.avro.Schema; import org.apache.avro.Schema.Type; -import org.radarcns.validator.config.ExcludeConfig; +import org.radarcns.schema.Scope; +import org.radarcns.schema.validation.config.ExcludeConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,11 +29,11 @@ import java.util.Objects; import java.util.Set; -import static org.radarcns.validator.SchemaValidationRoles.getActiveValidator; -import static org.radarcns.validator.SchemaValidationRoles.getGeneralEnumValidator; -import static org.radarcns.validator.SchemaValidationRoles.getGeneralRecordValidator; -import static org.radarcns.validator.SchemaValidationRoles.getMonitorValidator; -import static org.radarcns.validator.SchemaValidationRoles.getPassiveValidator; +import static org.radarcns.schema.validation.SchemaValidationRoles.getActiveValidator; +import static org.radarcns.schema.validation.SchemaValidationRoles.getGeneralEnumValidator; +import static org.radarcns.schema.validation.SchemaValidationRoles.getGeneralRecordValidator; +import static org.radarcns.schema.validation.SchemaValidationRoles.getMonitorValidator; +import static org.radarcns.schema.validation.SchemaValidationRoles.getPassiveValidator; final class SchemaValidator { diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/SpecificationsValidator.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SpecificationsValidator.java similarity index 78% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/SpecificationsValidator.java rename to java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SpecificationsValidator.java index 84cc077e..ea20b00c 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/SpecificationsValidator.java +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SpecificationsValidator.java @@ -1,4 +1,4 @@ -package org.radarcns.validator; +package org.radarcns.schema.validation; /* * Copyright 2017 King's College London and The Hyve @@ -16,13 +16,14 @@ * limitations under the License. */ -import org.radarcns.validator.config.ExcludeConfig; +import org.radarcns.schema.Scope; +import org.radarcns.schema.validation.config.ExcludeConfig; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import static org.radarcns.validator.ValidationSupport.matchesExtension; +import static org.radarcns.schema.validation.SchemaRepository.SPECIFICATIONS_PATH; /** * TODO. @@ -36,13 +37,13 @@ public SpecificationsValidator(ExcludeConfig config) { } public boolean specificationsAreYmlFiles(Scope scope) throws IOException { - return Files.walk(scope.getSpecificationsPath()) + return Files.walk(scope.getPath(SPECIFICATIONS_PATH)) .filter(Files::isRegularFile) .filter(p -> !config.skipFile(p)) .allMatch(SpecificationsValidator::isYmlFile); } private static boolean isYmlFile(Path path) { - return matchesExtension(path, YML_EXTENSION); + return ValidationSupport.matchesExtension(path, YML_EXTENSION); } } diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/ValidationResult.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationResult.java similarity index 95% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/ValidationResult.java rename to java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationResult.java index 377c0b91..02eea46a 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/ValidationResult.java +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationResult.java @@ -1,4 +1,4 @@ -package org.radarcns.validator; +package org.radarcns.schema.validation; /* * Copyright 2017 King's College London and The Hyve diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/ValidationSupport.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationSupport.java similarity index 84% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/ValidationSupport.java rename to java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationSupport.java index ad0a39e1..34bceecf 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/ValidationSupport.java +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationSupport.java @@ -1,4 +1,4 @@ -package org.radarcns.validator; +package org.radarcns.schema.validation; /* * Copyright 2017 King's College London and The Hyve @@ -16,7 +16,9 @@ * limitations under the License. */ -import static org.radarcns.validator.SchemaValidationRoles.UNKNOWN; +import static org.radarcns.schema.specification.util.Utils.toSnakeCase; +import static org.radarcns.schema.validation.SchemaRepository.COMMONS_PATH; +import static org.radarcns.schema.validation.SchemaValidationRoles.UNKNOWN; import java.io.IOException; import java.nio.file.Path; @@ -30,6 +32,7 @@ import org.apache.avro.Schema; import org.apache.avro.Schema.Field; import org.apache.avro.Schema.Type; +import org.radarcns.schema.Scope; /** * TODO. @@ -85,10 +88,13 @@ public static String getProjectGroup() { * @return TODO */ public static String getNamespace(Path schemaPath, Scope scope) { - String expected = getProjectGroup() + '.' + scope.getName(); + String expected = getProjectGroup() + '.' + scope.getLower(); // add subfolder of root to namespace - Path rootPath = scope.getCommonsPath(); + Path rootPath = scope.getPath(COMMONS_PATH); + if (rootPath == null) { + throw new IllegalArgumentException("Scope " + scope + " does not have a commons path"); + } Path relativePath = rootPath.relativize(schemaPath); if (relativePath.getNameCount() > 1) { expected = expected + '.' + relativePath.getName(0); @@ -105,30 +111,7 @@ public static String getNamespace(Path schemaPath, Scope scope) { public static String getRecordName(Path path) { Objects.requireNonNull(path); - char[] fileName = path.getFileName().toString().toCharArray(); - - StringBuilder recordName = new StringBuilder(fileName.length); - - boolean nextIsUpperCase = true; - for (char c : fileName) { - switch (c) { - case '_': - nextIsUpperCase = true; - break; - case '.': - return recordName.toString(); - default: - if (nextIsUpperCase) { - recordName.append(String.valueOf(c).toUpperCase(Locale.ENGLISH)); - nextIsUpperCase = false; - } else { - recordName.append(c); - } - break; - } - } - - return recordName.toString(); + return toSnakeCase(path.getFileName().toString()); } /** diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/config/ConfigItem.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/config/ConfigItem.java similarity index 97% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/config/ConfigItem.java rename to java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/config/ConfigItem.java index a4f7695f..8c2215d8 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/config/ConfigItem.java +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/config/ConfigItem.java @@ -1,4 +1,4 @@ -package org.radarcns.validator.config; +package org.radarcns.schema.validation.config; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonSetter; diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/config/ExcludeConfig.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/config/ExcludeConfig.java similarity index 99% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/config/ExcludeConfig.java rename to java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/config/ExcludeConfig.java index 09bbee83..e9e675e7 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/config/ExcludeConfig.java +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/config/ExcludeConfig.java @@ -1,4 +1,4 @@ -package org.radarcns.validator.config; +package org.radarcns.schema.validation.config; /* * Copyright 2017 King's College London and The Hyve diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/Scope.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/Scope.java deleted file mode 100644 index fb45a727..00000000 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/validator/Scope.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.radarcns.validator; - -import java.nio.file.Files; -import java.nio.file.Path; - -public enum Scope { - ACTIVE("active"), - KAFKA("kafka"), - CATALOGUE("catalogue"), - MONITOR("monitor"), - PASSIVE("passive"); - - private final Path specificationsPath; - private final Path commonsPath; - private final String name; - - Scope(String name) { - this.name = name; - Path newSpecificationsPath = SchemaRepository.SPECIFICATIONS_PATH.resolve(name); - if (Files.exists(newSpecificationsPath)) { - specificationsPath = newSpecificationsPath; - } else { - specificationsPath = null; - } - commonsPath = SchemaRepository.COMMONS_PATH.resolve(name); - - } - - public Path getSpecificationsPath() { - return specificationsPath; - } - - public Path getCommonsPath() { - return commonsPath; - } - - public String getName() { - return name; - } -} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/AvroValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/AvroValidator.java similarity index 86% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/AvroValidator.java rename to java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/AvroValidator.java index cb5eb4a0..b002e3f2 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/AvroValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/AvroValidator.java @@ -1,4 +1,4 @@ -package org.radarcns.validator; +package org.radarcns.schema.validation; /* * Copyright 2017 King's College London and The Hyve @@ -19,13 +19,14 @@ import org.apache.avro.Schema; import org.apache.avro.Schema.Parser; import org.junit.Assert; -import org.radarcns.validator.config.ExcludeConfig; +import org.radarcns.schema.Scope; +import org.radarcns.schema.validation.config.ExcludeConfig; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import static org.radarcns.validator.ValidationSupport.matchesExtension; +import static org.radarcns.schema.validation.SchemaRepository.COMMONS_PATH; public final class AvroValidator { public static final String AVRO_EXTENSION = "avsc"; @@ -42,11 +43,11 @@ public AvroValidator(ExcludeConfig config) { */ public void analyseFiles(Scope scope) throws IOException { - Files.walk(scope.getCommonsPath()) + Files.walk(scope.getPath(COMMONS_PATH)) .filter(Files::isRegularFile) .filter(p -> !config.skipFile(p)) .forEach(p -> { - Assert.assertTrue(scope.getName() + " should contain only " + Assert.assertTrue(scope.getLower() + " should contain only " + AVRO_EXTENSION + " files. " + p.toAbsolutePath() + " is invalid.", isAvscFile(p)); @@ -83,6 +84,6 @@ private static String getMessage(ValidationResult result) { * @return TODO */ public static boolean isAvscFile(Path file) { - return matchesExtension(file, AVRO_EXTENSION); + return ValidationSupport.matchesExtension(file, AVRO_EXTENSION); } } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/ExcludeConfigTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/ExcludeConfigTest.java similarity index 94% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/ExcludeConfigTest.java rename to java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/ExcludeConfigTest.java index a1c73abf..1ec35e74 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/ExcludeConfigTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/ExcludeConfigTest.java @@ -1,4 +1,4 @@ -package org.radarcns.validator; +package org.radarcns.schema.validation; /* * Copyright 2017 King's College London and The Hyve @@ -17,13 +17,13 @@ */ import org.junit.Test; -import org.radarcns.validator.config.ExcludeConfig; +import org.radarcns.schema.validation.config.ExcludeConfig; import java.nio.file.Paths; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.radarcns.validator.config.ExcludeConfig.VALID_INPUT_REGEX; +import static org.radarcns.schema.validation.config.ExcludeConfig.VALID_INPUT_REGEX; /** * TODO. diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaValidationRolesTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SchemaValidationRolesTest.java similarity index 84% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaValidationRolesTest.java rename to java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SchemaValidationRolesTest.java index dfddc0a3..4c407f39 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaValidationRolesTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SchemaValidationRolesTest.java @@ -1,4 +1,4 @@ -package org.radarcns.validator; +package org.radarcns.schema.validation; /* * Copyright 2017 King's College London and The Hyve @@ -28,14 +28,12 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -import static org.radarcns.validator.Scope.ACTIVE; -import static org.radarcns.validator.Scope.MONITOR; -import static org.radarcns.validator.SchemaValidationRoles.ENUM_SYMBOL_PATTERN; -import static org.radarcns.validator.SchemaValidationRoles.FIELD_NAME_PATTERN; -import static org.radarcns.validator.SchemaValidationRoles.NAMESPACE_PATTERN; -import static org.radarcns.validator.SchemaValidationRoles.RECORD_NAME_PATTERN; -import static org.radarcns.validator.SchemaValidationRoles.matches; +import static org.radarcns.schema.validation.SchemaRepository.COMMONS_PATH; +import static org.radarcns.schema.Scope.ACTIVE; +import static org.radarcns.schema.Scope.MONITOR; +import static org.radarcns.schema.validation.SchemaValidationRoles.matches; /** * TODO. @@ -63,56 +61,56 @@ public void fileNameTest() { @Test public void nameSpaceRegex() { - assertTrue(matches("org.radarcns", NAMESPACE_PATTERN)); - assertFalse(matches("Org.radarcns", NAMESPACE_PATTERN)); - assertFalse(matches("org.radarCns", NAMESPACE_PATTERN)); - assertFalse(matches(".org.radarcns", NAMESPACE_PATTERN)); - assertFalse(matches("org.radar-cns", NAMESPACE_PATTERN)); - assertFalse(matches("org.radarcns.empaticaE4", NAMESPACE_PATTERN)); + assertTrue(SchemaValidationRoles.matches("org.radarcns", SchemaValidationRoles.NAMESPACE_PATTERN)); + assertFalse(SchemaValidationRoles.matches("Org.radarcns", SchemaValidationRoles.NAMESPACE_PATTERN)); + assertFalse(SchemaValidationRoles.matches("org.radarCns", SchemaValidationRoles.NAMESPACE_PATTERN)); + assertFalse(SchemaValidationRoles.matches(".org.radarcns", SchemaValidationRoles.NAMESPACE_PATTERN)); + assertFalse(SchemaValidationRoles.matches("org.radar-cns", SchemaValidationRoles.NAMESPACE_PATTERN)); + assertFalse(SchemaValidationRoles.matches("org.radarcns.empaticaE4", SchemaValidationRoles.NAMESPACE_PATTERN)); } @Test public void recordNameRegex() { - assertTrue(matches("Questionnaire", RECORD_NAME_PATTERN)); - assertTrue(matches("EmpaticaE4Acceleration", RECORD_NAME_PATTERN)); - assertTrue(matches("Heart4Me", RECORD_NAME_PATTERN)); - assertTrue(matches("Heart4M", RECORD_NAME_PATTERN)); - - assertFalse(matches("Heart4", RECORD_NAME_PATTERN)); - assertFalse(matches("Heart4me", RECORD_NAME_PATTERN)); - assertFalse(matches("Heart4ME", RECORD_NAME_PATTERN)); - assertFalse(matches("4Me", RECORD_NAME_PATTERN)); - assertFalse(matches("TTest", RECORD_NAME_PATTERN)); - assertFalse(matches("questionnaire", RECORD_NAME_PATTERN)); - assertFalse(matches("questionnaire4", RECORD_NAME_PATTERN)); - assertFalse(matches("questionnaire4Me", RECORD_NAME_PATTERN)); - assertFalse(matches("questionnaire4me", RECORD_NAME_PATTERN)); - assertFalse(matches("A4MM", RECORD_NAME_PATTERN)); - assertFalse(matches("Aaaa4MMaa", RECORD_NAME_PATTERN)); + assertTrue(SchemaValidationRoles.matches("Questionnaire", SchemaValidationRoles.RECORD_NAME_PATTERN)); + assertTrue(SchemaValidationRoles.matches("EmpaticaE4Acceleration", SchemaValidationRoles.RECORD_NAME_PATTERN)); + assertTrue(SchemaValidationRoles.matches("Heart4Me", SchemaValidationRoles.RECORD_NAME_PATTERN)); + assertTrue(SchemaValidationRoles.matches("Heart4M", SchemaValidationRoles.RECORD_NAME_PATTERN)); + + assertFalse(SchemaValidationRoles.matches("Heart4", SchemaValidationRoles.RECORD_NAME_PATTERN)); + assertFalse(SchemaValidationRoles.matches("Heart4me", SchemaValidationRoles.RECORD_NAME_PATTERN)); + assertFalse(SchemaValidationRoles.matches("Heart4ME", SchemaValidationRoles.RECORD_NAME_PATTERN)); + assertFalse(SchemaValidationRoles.matches("4Me", SchemaValidationRoles.RECORD_NAME_PATTERN)); + assertFalse(SchemaValidationRoles.matches("TTest", SchemaValidationRoles.RECORD_NAME_PATTERN)); + assertFalse(SchemaValidationRoles.matches("questionnaire", SchemaValidationRoles.RECORD_NAME_PATTERN)); + assertFalse(SchemaValidationRoles.matches("questionnaire4", SchemaValidationRoles.RECORD_NAME_PATTERN)); + assertFalse(SchemaValidationRoles.matches("questionnaire4Me", SchemaValidationRoles.RECORD_NAME_PATTERN)); + assertFalse(SchemaValidationRoles.matches("questionnaire4me", SchemaValidationRoles.RECORD_NAME_PATTERN)); + assertFalse(SchemaValidationRoles.matches("A4MM", SchemaValidationRoles.RECORD_NAME_PATTERN)); + assertFalse(SchemaValidationRoles.matches("Aaaa4MMaa", SchemaValidationRoles.RECORD_NAME_PATTERN)); } @Test public void fieldNameRegex() { - assertTrue(matches("interBeatInterval", FIELD_NAME_PATTERN)); - assertTrue(matches("x", FIELD_NAME_PATTERN)); - assertTrue(matches(SchemaValidationRoles.TIME, FIELD_NAME_PATTERN)); - assertTrue(matches("subjectId", FIELD_NAME_PATTERN)); - assertTrue(matches("listOfSeveralThings", FIELD_NAME_PATTERN)); - assertFalse(matches("Time", FIELD_NAME_PATTERN)); - assertFalse(matches("E4Heart", FIELD_NAME_PATTERN)); + assertTrue(SchemaValidationRoles.matches("interBeatInterval", SchemaValidationRoles.FIELD_NAME_PATTERN)); + assertTrue(SchemaValidationRoles.matches("x", SchemaValidationRoles.FIELD_NAME_PATTERN)); + assertTrue(SchemaValidationRoles.matches(SchemaValidationRoles.TIME, SchemaValidationRoles.FIELD_NAME_PATTERN)); + assertTrue(SchemaValidationRoles.matches("subjectId", SchemaValidationRoles.FIELD_NAME_PATTERN)); + assertTrue(SchemaValidationRoles.matches("listOfSeveralThings", SchemaValidationRoles.FIELD_NAME_PATTERN)); + assertFalse(SchemaValidationRoles.matches("Time", SchemaValidationRoles.FIELD_NAME_PATTERN)); + assertFalse(SchemaValidationRoles.matches("E4Heart", SchemaValidationRoles.FIELD_NAME_PATTERN)); } @Test public void enumerationRegex() { - assertTrue(matches("PHQ8", ENUM_SYMBOL_PATTERN)); - assertTrue(matches("HELLO", ENUM_SYMBOL_PATTERN)); - assertTrue(matches("HELLOTHERE", ENUM_SYMBOL_PATTERN)); - assertTrue(matches("HELLO_THERE", ENUM_SYMBOL_PATTERN)); - assertFalse(matches("Hello", ENUM_SYMBOL_PATTERN)); - assertFalse(matches("hello", ENUM_SYMBOL_PATTERN)); - assertFalse(matches("HelloThere", ENUM_SYMBOL_PATTERN)); - assertFalse(matches("Hello_There", ENUM_SYMBOL_PATTERN)); - assertFalse(matches("HELLO.THERE", ENUM_SYMBOL_PATTERN)); + assertTrue(SchemaValidationRoles.matches("PHQ8", SchemaValidationRoles.ENUM_SYMBOL_PATTERN)); + assertTrue(SchemaValidationRoles.matches("HELLO", SchemaValidationRoles.ENUM_SYMBOL_PATTERN)); + assertTrue(SchemaValidationRoles.matches("HELLOTHERE", SchemaValidationRoles.ENUM_SYMBOL_PATTERN)); + assertTrue(SchemaValidationRoles.matches("HELLO_THERE", SchemaValidationRoles.ENUM_SYMBOL_PATTERN)); + assertFalse(SchemaValidationRoles.matches("Hello", SchemaValidationRoles.ENUM_SYMBOL_PATTERN)); + assertFalse(SchemaValidationRoles.matches("hello", SchemaValidationRoles.ENUM_SYMBOL_PATTERN)); + assertFalse(SchemaValidationRoles.matches("HelloThere", SchemaValidationRoles.ENUM_SYMBOL_PATTERN)); + assertFalse(SchemaValidationRoles.matches("Hello_There", SchemaValidationRoles.ENUM_SYMBOL_PATTERN)); + assertFalse(SchemaValidationRoles.matches("HELLO.THERE", SchemaValidationRoles.ENUM_SYMBOL_PATTERN)); } @Test @@ -120,6 +118,7 @@ public void nameSpaceTest() { Schema schema; ValidationResult result; Path path; + Path root; schema = SchemaBuilder .builder("org.radarcns.active.questionnaire") @@ -127,7 +126,9 @@ public void nameSpaceTest() { .fields() .endRecord(); - path = ACTIVE.getCommonsPath().resolve("questionnaire/questionnaire.avsc"); + root = ACTIVE.getPath(COMMONS_PATH); + assertNotNull(root); + path = root.resolve("questionnaire/questionnaire.avsc"); result = SchemaValidationRoles.validateNameSpace(path, ACTIVE).apply(schema); @@ -139,7 +140,9 @@ public void nameSpaceTest() { .fields() .endRecord(); - path = MONITOR.getCommonsPath().resolve("test/record_name.avsc"); + root = MONITOR.getPath(COMMONS_PATH); + assertNotNull(root); + path = root.resolve("test/record_name.avsc"); result = SchemaValidationRoles.validateNameSpace(path, MONITOR).apply(schema); assertFalse(result.isValid()); diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaValidatorTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java similarity index 82% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaValidatorTest.java rename to java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java index 1306a613..fc027be4 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SchemaValidatorTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java @@ -1,4 +1,4 @@ -package org.radarcns.validator; +package org.radarcns.schema.validation; /* * Copyright 2017 King's College London and The Hyve @@ -18,6 +18,7 @@ import org.apache.avro.Schema; import org.apache.avro.SchemaBuilder; +import org.junit.Assert; import org.junit.Test; import java.nio.file.Path; @@ -26,9 +27,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.radarcns.validator.Scope.MONITOR; -import static org.radarcns.validator.SchemaValidator.getPath; -import static org.radarcns.validator.SchemaValidator.validate; +import static org.radarcns.schema.Scope.MONITOR; +import static org.radarcns.schema.validation.SchemaValidator.validate; /** * TODO. @@ -43,7 +43,7 @@ public void testGetPath() { String expected = "/RADAR-Schemas/commons/monitor/application/" + "application_external_time.avsc"; - assertEquals(expected, getPath(path)); + Assert.assertEquals(expected, SchemaValidator.getPath(path)); } @Test @@ -59,7 +59,7 @@ public void testEnumerator() { .doc(documentation) .symbols("CONNECTED", "DISCONNECTED", "UNKNOWN"); - ValidationResult result = validate(schema, schemaPath, MONITOR); + ValidationResult result = SchemaValidator.validate(schema, schemaPath, MONITOR); assertTrue(result.isValid()); @@ -68,7 +68,7 @@ public void testEnumerator() { .doc(documentation) .symbols("CONNECTED", "DISCONNECTED", "un_known"); - result = validate(schema, schemaPath, MONITOR); + result = SchemaValidator.validate(schema, schemaPath, MONITOR); assertFalse(result.isValid()); } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SpecificationsValidatorTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SpecificationsValidatorTest.java similarity index 84% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SpecificationsValidatorTest.java rename to java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SpecificationsValidatorTest.java index 3d09be68..cf861a3b 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/validator/SpecificationsValidatorTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SpecificationsValidatorTest.java @@ -1,8 +1,9 @@ -package org.radarcns.validator; +package org.radarcns.schema.validation; import org.junit.Before; import org.junit.Test; -import org.radarcns.validator.config.ExcludeConfig; +import org.radarcns.schema.Scope; +import org.radarcns.schema.validation.config.ExcludeConfig; import java.io.IOException; diff --git a/restapi/header/header.avsc b/restapi/header/header.avsc index b41f3169..a8d8e638 100644 --- a/restapi/header/header.avsc +++ b/restapi/header/header.avsc @@ -6,8 +6,8 @@ "fields": [ { "name": "subjectId", "type": "string", "doc": "Subject identifier." }, { "name": "sourceId", "type": "string", "doc": "Source identifier." }, - { "name": "source", "type": ["org.radarcns.catalogue.ActiveSourceType", "org.radarcns.catalogue.PassiveSourceType"], "doc": "Source information, it can be a device or assessment name." }, - { "name": "type", "type": ["org.radarcns.catalogue.SensorName", "org.radarcns.active.questionnaire.QuestionnaireType"], "doc": "Report the sensor name or specific type of assessment." }, + { "name": "source", "type": "string", "doc": "Source information, it can be a device or assessment name." }, + { "name": "type", "type": ["org.radarcns.catalogue.SensorName", "string"], "doc": "Report the sensor name or specific type of assessment." }, { "name": "descriptiveStatistic", "type": "DescriptiveStatistic", "doc": "Statical value expressed by samples." }, { "name": "unit", "type": "org.radarcns.catalogue.Unit", "doc": "Unit used by the source." }, { "name": "timeFrame", "type": "org.radarcns.catalogue.TimeFrame", "doc": "Time interval between two consecutive samples." }, diff --git a/restapi/source/source.avsc b/restapi/source/source.avsc index e6336a58..0455913a 100644 --- a/restapi/source/source.avsc +++ b/restapi/source/source.avsc @@ -5,7 +5,7 @@ "doc": "Source details", "fields": [ {"name": "id", "type": "string", "doc": "Source identifier" }, - {"name": "type", "type": "org.radarcns.catalogue.PassiveSourceType", "doc": "Source name" }, + {"name": "type", "type": "string", "doc": "Source name" }, {"name": "summary", "type": ["null", "SourceSummary"], "default": null, "doc": "Source details" } ] } diff --git a/restapi/spec/sensor_specification.avsc b/restapi/spec/sensor_specification.avsc index c9ab077e..f94e8e75 100644 --- a/restapi/spec/sensor_specification.avsc +++ b/restapi/spec/sensor_specification.avsc @@ -5,7 +5,7 @@ "doc": "Sensor specification", "fields": [ {"name": "name", "type": "org.radarcns.catalogue.SensorName", "doc": "Sensor name"}, - {"name": "dataType", "type": "org.radarcns.catalogue.DataType", "doc": "Explains if the values is a raw data, otherwise it reports who computes it"}, + {"name": "dataType", "type": "org.radarcns.catalogue.ProcessingState", "doc": "Explains if the values is a raw data, otherwise it reports who computes it"}, {"name": "frequency", "type": "double", "default": -1.0, "doc": "Number of expected samples per second"}, {"name": "unit", "type": "org.radarcns.catalogue.Unit", "doc": "Measurement unit used by the sensor"} ] diff --git a/restapi/spec/source_specification.avsc b/restapi/spec/source_specification.avsc index bbad0145..edc6e064 100644 --- a/restapi/spec/source_specification.avsc +++ b/restapi/spec/source_specification.avsc @@ -4,7 +4,7 @@ "name": "SourceSpecification", "doc": "Source specification", "fields": [ - {"name": "name", "type": "org.radarcns.catalogue.PassiveSourceType", "doc": "Source name"}, + {"name": "name", "type": "string", "doc": "Source name"}, {"name": "sensors", "type": {"type": "map", "values": "SensorSpecification" }, "doc": "Specifications of on board sensors. It is a map where the key is the String conversion of a SensorType"} ] } diff --git a/specifications/monitor/external_time.yml b/specifications/monitor/external_time.yml index 34716380..b5faa15e 100644 --- a/specifications/monitor/external_time.yml +++ b/specifications/monitor/external_time.yml @@ -4,7 +4,7 @@ app_provider: .application.ApplicationServiceProvider doc: Information sent by the Android pRMT about time synchronisation with a NTS different from the default one. sample_rate: 0.08 unit: NON_DIMENSIONAL -data_type: RAW +processing_state: RAW topic: application_external_time key: .kafka.key.KeyMeasurement value: .monitor.application.ApplicationExternalTime diff --git a/specifications/monitor/record_counts.yml b/specifications/monitor/record_counts.yml index e9ba406d..697728f3 100644 --- a/specifications/monitor/record_counts.yml +++ b/specifications/monitor/record_counts.yml @@ -4,7 +4,7 @@ app_provider: .application.ApplicationServiceProvider doc: Monitor used by the Android pRMT to report the number of cached and created records. sample_rate: 0.08 unit: NON_DIMENSIONAL -data_type: RAW +processing_state: RAW topic: application_record_counts key: .kafka.key.KeyMeasurement value: .monitor.application.ApplicationRecordCounts diff --git a/specifications/monitor/server_status.yml b/specifications/monitor/server_status.yml index e5c1de67..5345a267 100644 --- a/specifications/monitor/server_status.yml +++ b/specifications/monitor/server_status.yml @@ -4,7 +4,7 @@ app_provider: .application.ApplicationServiceProvider doc: Monitor used by the Android pRMT to report the server connection status between the android client and the RADAR-CNS Platform. sample_rate: 0.08 unit: NON_DIMENSIONAL -data_type: RAW +processing_state: RAW topic: application_server_status key: .kafka.key.KeyMeasurement value: .monitor.application.ApplicationServerStatus diff --git a/specifications/monitor/uptime.yml b/specifications/monitor/uptime.yml index a0572ca6..4abac95b 100644 --- a/specifications/monitor/uptime.yml +++ b/specifications/monitor/uptime.yml @@ -4,7 +4,7 @@ app_provider: .application.ApplicationServiceProvider doc: Monitor used by the Android pRMT to notify the time duration since last reboot. sample_rate: 0.08 unit: NON_DIMENSIONAL -data_type: RAW +processing_state: RAW topic: application_uptime key: .kafka.key.KeyMeasurement value: .monitor.application.ApplicationUptime diff --git a/specifications/passive/android_phone.yml b/specifications/passive/android_phone.yml index c0ca22fb..c38b026a 100644 --- a/specifications/passive/android_phone.yml +++ b/specifications/passive/android_phone.yml @@ -5,54 +5,48 @@ sensors: #Phone sensors - name: ACCELEROMETER app_provider: .phone.PhoneSensorProvider - sample_rate: -1 #TODO unit: G - data_type: RAW + processing_state: RAW topic: android_phone_acceleration key: .kafka.key.KeyMeasurement value: .passive.phone.PhoneAcceleration aggregator: .kafka.aggregator.AggregatorDoubleArray - name: BATTERY app_provider: .phone.PhoneSensorProvider - sample_rate: -1 #TODO unit: PERCENTAGE - data_type: RAW + processing_state: RAW topic: android_phone_battery_level key: .kafka.key.KeyMeasurement value: .passive.phone.PhoneBatteryLevel aggregator: .kafka.aggregator.AggregatorDouble - name: GYROSCOPE app_provider: .phone.PhoneSensorProvider - sample_rate: -1 #TODO unit: RADAIAN_PER_SEC - data_type: RAW + processing_state: RAW topic: android_phone_gyroscope key: .kafka.key.KeyMeasurement value: .passive.phone.PhoneGyroscope aggregator: .kafka.aggregator.AggregatorDoubleArray - name: LIGHT app_provider: .phone.PhoneSensorProvider - sample_rate: -1 #TODO unit: LUX - data_type: RAW + processing_state: RAW topic: android_phone_light key: .kafka.key.KeyMeasurement value: .passive.phone.PhoneLight aggregator: .kafka.aggregator.AggregatorDouble - name: MAGNETIC_FIELD app_provider: .phone.PhoneSensorProvider - sample_rate: -1 #TODO unit: MICRO_TESLA - data_type: RAW + processing_state: RAW topic: android_phone_magnetic_field key: .kafka.key.KeyMeasurement value: .passive.phone.PhoneMagneticField aggregator: .kafka.aggregator.AggregatorDoubleArray - name: STEP_COUNT app_provider: .phone.PhoneSensorProvider - sample_rate: -1 #TODO unit: NON_DIMENSIONAL - data_type: VENDOR + processing_state: VENDOR topic: android_phone_step_count key: .kafka.key.KeyMeasurement value: .passive.phone.PhoneStepCount @@ -60,51 +54,45 @@ sensors: # Location - name: RELATIVE_LOCATION app_provider: .phone.PhoneLocationProvider - sample_rate: -1 #TODO unit: DEGREE - data_type: RAW + processing_state: RAW topic: android_phone_relative_location key: .kafka.key.KeyMeasurement value: .passive.phone.PhoneRelativeLocation # Log - name: PHONE_CALL app_provider: .phone.PhoneLogProvider - sample_rate: -1 #TODO unit: NON_DIMENSIONAL - data_type: RAW + processing_state: RAW topic: android_phone_call key: .kafka.key.KeyMeasurement value: .passive.phone.PhoneCall - name: PHONE_SMS app_provider: .phone.PhoneLogProvider - sample_rate: -1 #TODO unit: NON_DIMENSIONAL - data_type: RAW + processing_state: RAW topic: android_phone_sms key: .kafka.key.KeyMeasurement value: .passive.phone.PhoneSms - name: PHONE_SMS_UNREAD app_provider: .phone.PhoneLogProvider - sample_rate: -1 #TODO unit: NON_DIMENSIONAL - data_type: RAW + processing_state: RAW topic: android_phone_sms_unread key: .kafka.key.KeyMeasurement value: .passive.phone.PhoneSmsUnread # Usage - name: USAGE_EVENT app_provider: .phone.PhoneUsageProvider - sample_rate: -1 #TODO unit: NON_DIMENSIONAL - data_type: RAW + processing_state: RAW topic: android_phone_usage_event key: .kafka.key.KeyMeasurement value: .passive.phone.PhoneUsageEvent - name: USER_INTERACTION app_provider: .phone.PhoneUsageProvider - sample_rate: -1 #TODO unit: NON_DIMENSIONAL - data_type: RAW + processing_state: RAW topic: android_phone_user_interaction key: .kafka.key.KeyMeasurement value: .passive.phone.PhoneUserInteraction diff --git a/specifications/passive/biovotion_vsm1.yml b/specifications/passive/biovotion_vsm1.yml index 6419cd5c..5c3e8146 100644 --- a/specifications/passive/biovotion_vsm1.yml +++ b/specifications/passive/biovotion_vsm1.yml @@ -6,7 +6,7 @@ sensors: - name: ACCELEROMETER sample_rate: 51.2 unit: G - data_type: RAW + processing_state: RAW topic: android_biovotion_vsm1_acceleration key: .kafka.key.KeyMeasurement value: .passive.biovotion.BiovotionVsm1Acceleration @@ -14,7 +14,7 @@ sensors: - name: BATTERY sample_rate: 1.0 unit: PERCENTAGE - data_type: RAW + processing_state: RAW topic: android_biovotion_vsm1_battery_level key: .kafka.key.KeyMeasurement value: .passive.biovotion.BiovotionVsm1BatteryLevel @@ -22,7 +22,7 @@ sensors: - name: BLOOD_PULSE_WAVE sample_rate: 1.0 unit: NON_DIMENSIONAL - data_type: VENDOR + processing_state: VENDOR topic: android_biovotion_vsm1_blood_volume_pulse key: .kafka.key.KeyMeasurement value: .passive.biovotion.BiovotionVsm1BloodPulseWave @@ -30,7 +30,7 @@ sensors: - name: ENERGY sample_rate: 1.0 unit: CALORIES_PER_SEC - data_type: VENDOR + processing_state: VENDOR topic: android_biovotion_vsm1_energy key: .kafka.key.KeyMeasurement value: .passive.biovotion.BiovotionVsm1Energy @@ -38,7 +38,7 @@ sensors: - name: GALVANIC_SKIN_RESPONSE sample_rate: 1.0 unit: KILO_OHM - data_type: VENDOR + processing_state: VENDOR topic: android_biovotion_vsm1_galvanic_skin_response key: .kafka.key.KeyMeasurement value: .passive.biovotion.BiovotionVsm1GalvanicSkinResponse @@ -46,7 +46,7 @@ sensors: - name: HEART_RATE sample_rate: 1.0 unit: BEATS_PER_MIN - data_type: VENDOR + processing_state: VENDOR topic: android_biovotion_vsm1_heartrate key: .kafka.key.KeyMeasurement value: .passive.biovotion.BiovotionVsm1HeartRate @@ -54,7 +54,7 @@ sensors: - name: HEART_RATE_VARIABILITY sample_rate: 1.0 unit: RMSSD_IN_MILLI_SEC - data_type: VENDOR + processing_state: VENDOR topic: android_biovotion_vsm1_heartrate_variability key: .kafka.key.KeyMeasurement value: .passive.biovotion.BiovotionVsm1HeartRateVariability @@ -62,7 +62,7 @@ sensors: - name: LED sample_rate: 1.0 unit: MILLI_AMPERE - data_type: VENDOR + processing_state: VENDOR topic: android_biovotion_vsm1_led_current key: .kafka.key.KeyMeasurement value: .passive.biovotion.BiovotionVsm1LedCurrent @@ -70,7 +70,7 @@ sensors: - name: PHOTOPLETHYSMOGRAPHY sample_rate: 51.2 unit: NON_DIMENSIONAL - data_type: RAW + processing_state: RAW topic: android_biovotion_vsm1_ppg_raw key: .kafka.key.KeyMeasurement value: .passive.biovotion.BiovotionVsm1PpgRaw @@ -78,7 +78,7 @@ sensors: - name: RESPIRATION_RATE sample_rate: 1.0 unit: BEATS_PER_MIN - data_type: VENDOR + processing_state: VENDOR topic: android_biovotion_vsm1_respiration_rate key: .kafka.key.KeyMeasurement value: .passive.biovotion.BiovotionVsm1RespirationRate @@ -86,7 +86,7 @@ sensors: - name: OXYGEN_SATURATION sample_rate: 1.0 unit: PERCENTAGE - data_type: VENDOR + processing_state: VENDOR topic: android_biovotion_vsm1_oxygen_saturation key: .kafka.key.KeyMeasurement value: .passive.biovotion.BiovotionVsm1OxygenSaturation @@ -94,7 +94,7 @@ sensors: - name: THERMOMETER sample_rate: 1.0 unit: CELSIUS - data_type: RAW + processing_state: RAW topic: android_biovotion_vsm1_temperature key: .kafka.key.KeyMeasurement value: .passive.biovotion.BiovotionVsm1Temperature diff --git a/specifications/passive/empatica_e4.yml b/specifications/passive/empatica_e4.yml index d284513c..eb5d4e5d 100644 --- a/specifications/passive/empatica_e4.yml +++ b/specifications/passive/empatica_e4.yml @@ -6,7 +6,7 @@ sensors: - name: ACCELEROMETER sample_rate: 32.0 unit: G - data_type: RAW + processing_state: RAW topic: android_empatica_e4_acceleration key: .kafka.key.KeyMeasurement value: .passive.empatica.EmpaticaE4Acceleration @@ -14,7 +14,7 @@ sensors: - name: BATTERY sample_rate: 1.0 unit: PERCENTAGE - data_type: RAW + processing_state: RAW topic: android_empatica_e4_battery_level key: .kafka.key.KeyMeasurement value: .passive.empatica.EmpaticaE4BatteryLevel @@ -22,7 +22,7 @@ sensors: - name: BLOOD_VOLUME_PULSE sample_rate: 64.0 unit: NANO_WATT - data_type: RAW + processing_state: RAW topic: android_empatica_e4_blood_volume_pulse key: .kafka.key.KeyMeasurement value: .passive.empatica.EmpaticaE4BloodVolumePulse @@ -30,7 +30,7 @@ sensors: - name: ELECTRODERMAL_ACTIVITY sample_rate: 4.0 unit: MICRO_SIEMENS - data_type: RAW + processing_state: RAW topic: android_empatica_e4_electrodermal_activity key: .kafka.key.KeyMeasurement value: .passive.empatica.EmpaticaE4ElectroDermalActivity @@ -38,7 +38,7 @@ sensors: - name: INTER_BEAT_INTERVAL sample_rate: 1.0 unit: BEATS_PER_MIN - data_type: VENDOR + processing_state: VENDOR topic: android_empatica_e4_inter_beat_interval key: .kafka.key.KeyMeasurement value: .passive.empatica.EmpaticaE4InterBeatInterval @@ -46,7 +46,7 @@ sensors: - name: THERMOMETER sample_rate: 4.0 unit: CELSIUS - data_type: RAW + processing_state: RAW topic: android_empatica_e4_temperature key: .kafka.key.KeyMeasurement value: .passive.empatica.EmpaticaE4Temperature @@ -55,7 +55,7 @@ processors: - name: HEART_RATE sample_rate: 1.0 unit: BEATS_PER_MIN - data_type: RADAR + processing_state: RADAR input_topic: android_empatica_e4_inter_beat_interval input_key: .kafka.key.KeyMeasurement input_value: .passive.empatica.EmpaticaE4InterBeatInterval diff --git a/specifications/passive/pebble_2.yml b/specifications/passive/pebble_2.yml index 5c39003c..bade2051 100644 --- a/specifications/passive/pebble_2.yml +++ b/specifications/passive/pebble_2.yml @@ -6,7 +6,7 @@ sensors: - name: ACCELEROMETER sample_rate: 10.0 unit: G - data_type: RAW + processing_state: RAW topic: android_pebble_2_acceleration key: .kafka.key.KeyMeasurement value: .passive.pebble.Pebble2Acceleration @@ -14,7 +14,7 @@ sensors: - name: BATTERY sample_rate: 1.0 unit: PERCENTAGE - data_type: RAW + processing_state: RAW topic: android_pebble_2_battery_level key: .kafka.key.KeyMeasurement value: .passive.pebble.Pebble2BatteryLevel @@ -22,7 +22,7 @@ sensors: - name: HEART_RATE sample_rate: 1.0 unit: BEATS_PER_MIN - data_type: VENDOR + processing_state: VENDOR topic: android_pebble_2_heartrate key: .kafka.key.KeyMeasurement value: .passive.pebble.Pebble2HeartRate @@ -30,7 +30,7 @@ sensors: - name: HEART_RATE_FILTERED sample_rate: 1.0 unit: BEATS_PER_MIN - data_type: VENDOR + processing_state: VENDOR topic: android_pebble_2_heartrate_filtered key: .kafka.key.KeyMeasurement value: .passive.pebble.Pebble2HeartRateFiltered From 9061a7c63aade6b9d87857ffe0c894b04ed3f93b Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Wed, 13 Sep 2017 15:26:08 +0200 Subject: [PATCH 057/112] Moved some validation to the validator package --- .../radar-schemas-specifications/build.gradle | 12 +- .../schema/specification/CommandLineApp.java | 22 +- .../schema/specification/SourceCatalogue.java | 74 ++- .../specification/source/KafkaActor.java | 9 +- .../specification/source/MonitorSource.java | 7 +- .../schema/specification/source/Source.java | 3 +- .../schema/specification/source/Topic.java | 37 +- .../source/active/ActiveSource.java | 15 +- .../source/active/questionnaire/Question.java | 11 +- .../questionnaire/QuestionnaireSource.java | 3 +- .../source/active/questionnaire/Response.java | 7 +- .../source/passive/PassiveSource.java | 7 +- .../source/passive/Processor.java | 7 +- .../specification/source/passive/Sensor.java | 7 +- .../schema/specification/util/Utils.java | 4 +- .../validator/ActiveSourceRoles.java | 77 --- .../validator/AggregatableRoles.java | 110 ---- .../specification/validator/GenericRoles.java | 170 ------ .../specification/validator/MonitorRoles.java | 109 ---- .../validator/PassiveSourceRoles.java | 150 ------ .../validator/ProcessorRoles.java | 86 --- .../validator/QuestionRoles.java | 93 ---- .../validator/QuestionnaireRoles.java | 73 --- .../validator/ResponseRoles.java | 65 --- .../specification/validator/SensorRoles.java | 87 --- .../specification/validator/TopicRoles.java | 130 ----- .../validator/ValidationResult.java | 37 -- .../validator/ValidationSupport.java | 174 ------ .../specification/validator/Validator.java | 157 ------ java-sdk/radar-schemas-validator/build.gradle | 2 +- .../radarcns/schema/validation/Invalid.java | 59 -- .../schema/validation/InvalidResult.java} | 8 +- .../validation/SchemaValidationRoles.java | 507 ------------------ .../schema/validation/SchemaValidator.java | 10 +- .../schema/validation/ValidationResult.java | 14 +- .../schema/validation/ValidationSupport.java | 212 +++++++- .../validation/config/ExcludeConfig.java | 6 +- .../validation/roles/ActiveSourceRoles.java | 54 ++ .../validation/roles/AggregatableRoles.java | 58 ++ .../schema/validation/roles/MonitorRoles.java | 62 +++ .../validation/roles/PassiveSourceRoles.java | 99 ++++ .../validation/roles/ProcessorRoles.java | 56 ++ .../validation/roles/QuestionRoles.java | 74 +++ .../validation/roles/QuestionnaireRoles.java | 58 ++ .../validation/roles/ResponseRoles.java} | 25 +- .../roles/SchemaValidationRoles.java | 461 ++++++++++++++++ .../schema/validation/roles/SensorRoles.java | 69 +++ .../schema/validation/roles/TopicRoles.java | 91 ++++ .../schema/validation/roles/Validator.java | 173 ++++++ .../schema/validation}/ActiveValidation.java | 4 +- .../schema/validation}/MonitorValidation.java | 4 +- .../schema/validation}/PassiveValidation.java | 5 +- .../validation/SchemaValidatorTest.java | 7 +- .../SourceCatalogueValidation.java | 20 +- .../SchemaValidationRolesTest.java | 194 ++++--- .../schema/validation}/util/TopicTest.java | 21 +- .../schema/validation}/util/UtilsTest.java | 3 +- 57 files changed, 1735 insertions(+), 2364 deletions(-) delete mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ActiveSourceRoles.java delete mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/AggregatableRoles.java delete mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/GenericRoles.java delete mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/MonitorRoles.java delete mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/PassiveSourceRoles.java delete mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ProcessorRoles.java delete mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/QuestionRoles.java delete mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/QuestionnaireRoles.java delete mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ResponseRoles.java delete mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/SensorRoles.java delete mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/TopicRoles.java delete mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ValidationResult.java delete mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ValidationSupport.java delete mode 100644 java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/Validator.java delete mode 100644 java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/Invalid.java rename java-sdk/{radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/Invalid.java => radar-schemas-validator/src/main/java/org/radarcns/schema/validation/InvalidResult.java} (86%) delete mode 100644 java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SchemaValidationRoles.java create mode 100644 java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/ActiveSourceRoles.java create mode 100644 java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/AggregatableRoles.java create mode 100644 java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/MonitorRoles.java create mode 100644 java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/PassiveSourceRoles.java create mode 100644 java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/ProcessorRoles.java create mode 100644 java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/QuestionRoles.java create mode 100644 java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/QuestionnaireRoles.java rename java-sdk/{radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/Message.java => radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/ResponseRoles.java} (52%) create mode 100644 java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/SchemaValidationRoles.java create mode 100644 java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/SensorRoles.java create mode 100644 java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/TopicRoles.java create mode 100644 java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/Validator.java rename java-sdk/{radar-schemas-specifications/src/test/java/org/radarcns/schema/specification => radar-schemas-validator/src/test/java/org/radarcns/schema/validation}/ActiveValidation.java (93%) rename java-sdk/{radar-schemas-specifications/src/test/java/org/radarcns/schema/specification => radar-schemas-validator/src/test/java/org/radarcns/schema/validation}/MonitorValidation.java (91%) rename java-sdk/{radar-schemas-specifications/src/test/java/org/radarcns/schema/specification => radar-schemas-validator/src/test/java/org/radarcns/schema/validation}/PassiveValidation.java (93%) rename java-sdk/{radar-schemas-specifications/src/test/java/org/radarcns/schema/specification => radar-schemas-validator/src/test/java/org/radarcns/schema/validation}/SourceCatalogueValidation.java (81%) rename java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/{ => roles}/SchemaValidationRolesTest.java (77%) rename java-sdk/{radar-schemas-specifications/src/test/java/org/radarcns/schema/specification => radar-schemas-validator/src/test/java/org/radarcns/schema/validation}/util/TopicTest.java (88%) rename java-sdk/{radar-schemas-specifications/src/test/java/org/radarcns/schema/specification => radar-schemas-validator/src/test/java/org/radarcns/schema/validation}/util/UtilsTest.java (93%) diff --git a/java-sdk/radar-schemas-specifications/build.gradle b/java-sdk/radar-schemas-specifications/build.gradle index 1e33d523..c40a47dd 100644 --- a/java-sdk/radar-schemas-specifications/build.gradle +++ b/java-sdk/radar-schemas-specifications/build.gradle @@ -27,19 +27,9 @@ dependencies { implementation group: 'org.radarcns', name: 'radar-commons', version: radarCommonsVersion + testCompile project(':radar-schemas-validator') testCompile group: 'junit', name: 'junit', version: junitVersion testCompile group: 'org.slf4j', name: 'slf4j-simple', version: slf4jVersion - - // For Topic name validation based on Kafka classes - testCompile (group: 'org.apache.kafka', name: 'kafka_2.11', version: kafkaVersion) { - exclude group: 'org.apache.kafka', module: 'kafka-clients' - exclude group: 'net.sf.jopt-simple' - exclude group: 'com.yammer.metrics' - exclude group: 'org.scala-lang.modules' - exclude group: 'org.slf4j' - exclude group: 'com.101tec' - exclude group: 'org.apache.zookeeper' - } } //---------------------------------------------------------------------------// diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/CommandLineApp.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/CommandLineApp.java index 0c93df76..6ee73037 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/CommandLineApp.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/CommandLineApp.java @@ -109,7 +109,7 @@ private Set getAllTopics() { Set set = new HashSet<>(); catalogue.getActiveSources().values().stream() - .map(QuestionnaireSource::getTopic) + .map(ActiveSource::getTopic) .forEach(set::add); catalogue.getMonitorSources().values().stream() @@ -138,7 +138,7 @@ private Set getAllTopics() { * @return TODO */ public String getTopicsVerbose(boolean reduced, String source) { - String result = ""; + StringBuilder result = new StringBuilder(); Map> map = getTopicsInfoVerbose(reduced); @@ -147,20 +147,20 @@ public String getTopicsVerbose(boolean reduced, String source) { for (String key : rootKeys) { if (Objects.isNull(source) || key.equalsIgnoreCase(source)) { - result = result.concat(key).concat("\n"); + result.append(key).append('\n'); List firstLevelKeys = new ArrayList<>(map.get(key).keySet()); Collections.sort(firstLevelKeys); for (String details : firstLevelKeys) { - result = result.concat("\t").concat(details).concat("\n"); - result = result.concat("\t\t").concat(map.get(key).get(details)); + result.append('\t').append(details).append('\n'); + result.append("\t\t").append(map.get(key).get(details)); } - result = result.concat("\n"); + result.append('\n'); } } - return result; + return result.toString(); } /** @@ -172,8 +172,12 @@ private Map> getTopicsInfoVerbose(boolean reduced) { Map> map = new HashMap<>(); Map details = new HashMap<>(); - for (QuestionnaireSource source : catalogue.getActiveSources().values()) { - details.put(source.getQuestionnaireType(), source.getTopic().toString(reduced)); + for (ActiveSource source : catalogue.getActiveSources().values()) { + if (source instanceof QuestionnaireSource) { + details.put( + ((QuestionnaireSource)source).getQuestionnaireType(), + source.getTopic().toString(reduced)); + } } map.put(ActiveSource.RadarSourceTypes.QUESTIONNAIRE.name(), details); diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java index 13066ff1..a511ff67 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java @@ -16,15 +16,20 @@ * limitations under the License. */ +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.PropertyNamingStrategy; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import org.radarcns.config.YamlConfigLoader; import org.radarcns.schema.Scope; import org.radarcns.schema.specification.source.Source; +import org.radarcns.schema.specification.source.active.ActiveSource; import org.radarcns.schema.specification.source.active.questionnaire.QuestionnaireSource; import org.radarcns.schema.specification.source.MonitorSource; import org.radarcns.schema.specification.source.passive.PassiveSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -36,6 +41,7 @@ import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -49,14 +55,14 @@ public class SourceCatalogue { public static final Path BASE_PATH = Paths.get("../.."); - private final Map activeSources; + private final Map activeSources; private final Map monitorSources; private final Map passiveSources; private final Set sources; // package private for testing - SourceCatalogue(Map activeSources, + SourceCatalogue(Map activeSources, Map monitorSources, Map passiveSources) { this.activeSources = activeSources; @@ -72,14 +78,47 @@ public class SourceCatalogue { public static SourceCatalogue load(Path root) throws IOException { Path specRoot = root.resolve("specifications"); + YamlConfigLoader configLoader = new YamlConfigLoader(); + return new SourceCatalogue( - initSources(specRoot, Scope.ACTIVE, QuestionnaireSource.class), - initSources(specRoot, Scope.MONITOR, MonitorSource.class), - initSources(specRoot, Scope.PASSIVE, PassiveSource.class) + initActiveSources(configLoader, specRoot), + initSources(configLoader, specRoot, Scope.MONITOR, MonitorSource.class), + initSources(configLoader, specRoot, Scope.PASSIVE, PassiveSource.class) ); } - private static Map initSources(Path root, Scope scope, Class sourceClass) + private static Map initSources(YamlConfigLoader configLoader, Path root, + Scope scope, Class sourceClass) throws IOException { + return initSources(root, scope, f -> { + try { + return configLoader.load(f.toFile(), sourceClass); + } catch (IOException e) { + logger.error("Failed to load configuration {}", f, e); + return null; + } + }); + } + + private static Map initActiveSources(YamlConfigLoader configLoader, + Path root) throws IOException { + return initSources(root, Scope.ACTIVE, f -> { + try { + File file = f.toFile(); + ActiveSource source = configLoader.load(file, ActiveSource.class); + switch (source.getAssessmentType().toUpperCase(Locale.ENGLISH)) { + case "QUESTIONNAIRE": + return configLoader.load(file, QuestionnaireSource.class); + default: + return source; + } + } catch (IOException e) { + logger.error("Failed to load configuration {}", f, e); + return null; + } + }); + } + + private static Map initSources(Path root, Scope scope, Function map) throws IOException { Path baseFolder = scope.getPath(root); if (baseFolder == null) { @@ -87,22 +126,13 @@ private static Map initSources(Path root, Scope scope, Class s return Collections.emptyMap(); } - YamlConfigLoader configLoader = new YamlConfigLoader(); - return Files.walk(baseFolder) .filter(Files::isRegularFile) - .map(f -> { - try { - return new AbstractMap.SimpleImmutableEntry<>( - f.getFileName().toString() - .split("\\.")[0] - .toUpperCase(Locale.ENGLISH), - configLoader.load(f.toFile(), sourceClass)); - } catch (IOException e) { - logger.error("Failed to load configuration", e); - return null; - } - }) + .map(f -> new AbstractMap.SimpleImmutableEntry<>( + f.getFileName().toString() + .split("\\.")[0] + .toUpperCase(Locale.ENGLISH), + map.apply(f))) .filter(Objects::nonNull) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); } @@ -111,7 +141,7 @@ private static Map initSources(Path root, Scope scope, Class s * TODO. * @return TODO */ - public Map getActiveSources() { + public Map getActiveSources() { return activeSources; } @@ -120,7 +150,7 @@ public Map getActiveSources() { * @param type TODO * @return TODO */ - public QuestionnaireSource getActiveSource(String type) { + public ActiveSource getActiveSource(String type) { return activeSources.get(type); } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/KafkaActor.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/KafkaActor.java index 7e465d58..8b0f1a27 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/KafkaActor.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/KafkaActor.java @@ -34,13 +34,10 @@ public class KafkaActor { private final Topic topic; - private static final String NULL_MESSAGE = " in ".concat( - Sensor.class.getName()).concat(" cannot be null."); - public KafkaActor(String doc, double sampleRate, String unit, ProcessingState dataType, Topic topic) { - Objects.requireNonNull(dataType, Labels.PROCESSING_STATE.concat(NULL_MESSAGE)); - Objects.requireNonNull(topic, Labels.TOPIC.concat(NULL_MESSAGE)); - Objects.requireNonNull(unit, Labels.UNIT.concat(NULL_MESSAGE)); + Objects.requireNonNull(dataType); + Objects.requireNonNull(topic); + Objects.requireNonNull(unit); this.doc = doc; this.sampleRate = sampleRate; diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/MonitorSource.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/MonitorSource.java index 82d93a86..1cd4a511 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/MonitorSource.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/MonitorSource.java @@ -36,9 +36,6 @@ public enum RadarSourceTypes { private final String appProvider; private final KafkaActor kafkaActor; - private static final String NULL_MESSAGE = " in ".concat( - MonitorSource.class.getName()).concat(" cannot be null."); - /** * TODO. * @@ -67,10 +64,10 @@ public MonitorSource( @JsonProperty(Labels.AGGREGATOR) String aggregator) { super(name, doc); - Objects.requireNonNull(appProvider, Labels.APP_PROVIDER.concat(NULL_MESSAGE)); + Objects.requireNonNull(appProvider); this.type = name; - this.appProvider = Utils.getProjectGroup().concat(appProvider); + this.appProvider = Utils.getProjectGroup() + appProvider; this.kafkaActor = new KafkaActor(doc, sampleRate, unit, dataType, new Topic(topic, key, value, aggregator, null)); diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/Source.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/Source.java index 6f1d4612..ecb0bf8b 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/Source.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/Source.java @@ -34,8 +34,7 @@ public abstract class Source { * @param doc TODO */ public Source(String name, String doc) { - Objects.requireNonNull(name, NAME.concat(" in ").concat( - Source.class.getName()).concat(" cannot be null")); + Objects.requireNonNull(name); this.name = name; this.doc = doc; } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/Topic.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/Topic.java index 0b38a04d..9bbeda79 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/Topic.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/Topic.java @@ -133,10 +133,10 @@ public Topic(String inputTopic, String inputKey, String inputValue, String aggre Objects.requireNonNull(inputValue); this.inputTopic = inputTopic; - this.inputKey = Utils.getProjectGroup().concat(inputKey); - this.inputValue = Utils.getProjectGroup().concat(inputValue); + this.inputKey = Utils.getProjectGroup() + inputKey; + this.inputValue = Utils.getProjectGroup() + inputValue; this.aggregator = Objects.isNull(aggregator) ? null : - Utils.getProjectGroup().concat(aggregator); + Utils.getProjectGroup() + aggregator; this.baseOutput = Objects.nonNull(baseOutput) ? baseOutput : inputTopic; @@ -234,26 +234,27 @@ public int hashCode() { } public String toString(boolean reduced) { - String result = "inputTopic: " + inputTopic + '\n' - + "inputKey: " + inputKey + '\n' - + "inputValue: " + inputValue + '\n' - + "aggregator: " + aggregator + '\n'; + StringBuilder result = new StringBuilder() + .append("inputTopic: ").append(inputTopic).append('\n') + .append("inputKey: ").append(inputKey).append('\n') + .append("inputValue: ").append(inputValue).append('\n') + .append("aggregator: ").append(aggregator).append('\n'); if (output.isEmpty()) { - result = result + "output: empty"; + result.append("output: empty"); } else { - result = result + "output:\n\t- "; + result.append("output:\n\t- "); } if (reduced) { - result = result + output.stream().map( - TopicMetadata::getOutput).collect(Collectors.joining("\n\t- ")); + result.append(output.stream().map( + TopicMetadata::getOutput).collect(Collectors.joining("\n\t- "))); } else { - result = result + output.stream().map(metadata -> metadata.getInput().concat( - "\t").concat(metadata.getStateStore()).concat("\t").concat( - metadata.getOutput())).collect(Collectors.joining("\n\t- ")); + result.append(output.stream().map(metadata -> metadata.getInput() + + '\t' + metadata.getStateStore() + '\t' + + metadata.getOutput()).collect(Collectors.joining("\n\t- "))); } - return result.concat("\n"); + return result.append('\n').toString(); } /** @@ -262,7 +263,7 @@ public String toString(boolean reduced) { * @return TODO */ public static String getOutTopic(String topicName) { - return topicName.concat(OUTPUT_LABEL); + return topicName + OUTPUT_LABEL; } /** @@ -272,7 +273,7 @@ public static String getOutTopic(String topicName) { * @return TODO */ public static String getOutTopic(String topicName, TimeLabel timeLabel) { - return topicName.concat(timeLabel.getLabel()); + return topicName + timeLabel.getLabel(); } /** @@ -285,7 +286,7 @@ public static Set getTimedOutTopics(String topicName) { for (TimeLabel label : TimeLabel.values()) { if (label.getIntervalInMilliSec() != -1) { - set.add(topicName.concat(label.getLabel())); + set.add(topicName + label.getLabel()); } } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/ActiveSource.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/ActiveSource.java index 60ee4e2d..d4f20477 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/ActiveSource.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/ActiveSource.java @@ -17,6 +17,7 @@ */ import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import org.radarcns.schema.specification.source.Source; import org.radarcns.schema.specification.source.Topic; @@ -34,7 +35,8 @@ /** * TODO. */ -public abstract class ActiveSource extends Source { +@JsonIgnoreProperties(ignoreUnknown = true) +public class ActiveSource extends Source { public enum RadarSourceTypes { QUESTIONNAIRE } @@ -44,9 +46,6 @@ public enum RadarSourceTypes { private final Set topics; - private static final String NULL_MESSAGE = " in ".concat( - ActiveSource.class.getName()).concat(" cannot be null."); - /** * TODO. * @param name TODO @@ -65,10 +64,10 @@ public ActiveSource( @JsonProperty(DOC) String description) { super(name, description); - Objects.requireNonNull(assessmentType, ASSESSMENT_TYPE.concat(NULL_MESSAGE)); - Objects.requireNonNull(key, KEY.concat(NULL_MESSAGE)); - Objects.requireNonNull(topic, TOPIC.concat(NULL_MESSAGE)); - Objects.requireNonNull(value, VALUE.concat(NULL_MESSAGE)); + Objects.requireNonNull(assessmentType); + Objects.requireNonNull(key); + Objects.requireNonNull(topic); + Objects.requireNonNull(value); this.assessmentType = assessmentType; diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/Question.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/Question.java index d27464f7..9c712c3c 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/Question.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/Question.java @@ -36,9 +36,6 @@ public class Question { private final List responses; - private static final String NULL_MESSAGE = " in ".concat( - Question.class.getName()).concat(" cannot be null."); - /** * TODO. * @param lead TODO @@ -53,10 +50,10 @@ public Question( @JsonProperty(Labels.WIDGET) RadarWidget widget, @JsonProperty(Labels.RESPONSES) List responses) { - Objects.requireNonNull(lead, Labels.LEAD.concat(NULL_MESSAGE)); - Objects.requireNonNull(content, Labels.CONTENT.concat(NULL_MESSAGE)); - Objects.requireNonNull(widget, Labels.WIDGET.concat(NULL_MESSAGE)); - Objects.requireNonNull(responses, Labels.RESPONSES.concat(NULL_MESSAGE)); + Objects.requireNonNull(lead); + Objects.requireNonNull(content); + Objects.requireNonNull(widget); + Objects.requireNonNull(responses); this.lead = lead; this.content = content; diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/QuestionnaireSource.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/QuestionnaireSource.java index 3ac10b26..134b59a4 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/QuestionnaireSource.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/QuestionnaireSource.java @@ -65,8 +65,7 @@ public QuestionnaireSource( super(assessmentType, name, topic, key, value, doc); this.type = name; - Objects.requireNonNull(questions, QUESTIONS.concat(" in ").concat( - QuestionnaireSource.class.getName()).concat(" cannot be null.")); + Objects.requireNonNull(questions); this.questions = questions; } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/Response.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/Response.java index b8dd9dc9..b49b4063 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/Response.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/Response.java @@ -31,9 +31,6 @@ public class Response { private final String text; private final Integer score; - private static final String NULL_MESSAGE = " in ".concat( - Response.class.getName()).concat(" cannot be null."); - /** * TODO. * @param text TODO @@ -44,8 +41,8 @@ public Response( @JsonProperty(TEXT) String text, @JsonProperty(SCORE) Integer score) { - Objects.requireNonNull(score, SCORE.concat(NULL_MESSAGE)); - Objects.requireNonNull(text, TEXT.concat(NULL_MESSAGE)); + Objects.requireNonNull(score); + Objects.requireNonNull(text); this.score = score; this.text = text; diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/PassiveSource.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/PassiveSource.java index 88c3ca1d..bf003e10 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/PassiveSource.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/PassiveSource.java @@ -65,15 +65,14 @@ public PassiveSource( @JsonProperty(Labels.APP_PROVIDER) String appProvider, @JsonProperty(Labels.SENSORS) Set sensors, @JsonProperty(Labels.PROCESSORS) Set processors) { - super(vendor.concat("_").concat(model), description); + super(vendor + '_' + model, description); - Objects.requireNonNull(sensors, Labels.SENSORS.concat(" in ").concat( - PassiveSource.class.getName()).concat(" cannot be null.")); + Objects.requireNonNull(sensors); this.type = vendor + '_' + model; this.vendor = vendor; this.model = model; this.appProvider = Objects.isNull(appProvider) - ? null : Utils.getProjectGroup().concat(appProvider); + ? null : Utils.getProjectGroup() + appProvider; this.sensors = sensors; this.processors = Objects.isNull(processors) ? new HashSet<>() : processors; diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/Processor.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/Processor.java index e4e5c390..a114be3f 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/Processor.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/Processor.java @@ -32,9 +32,6 @@ public class Processor extends KafkaActor { private final String name; - private static final String NULL_MESSAGE = " in " - + Processor.class.getName() + " cannot be null."; - /** * TODO. * @param name TODO @@ -63,8 +60,8 @@ public Processor( super(doc, sampleRate, unit, dataType, new Topic(inputTopic, inputKey, inputValue, aggregator, baseOutputTopic)); - Objects.requireNonNull(baseOutputTopic, Labels.BASE_OUTPUT_TOPIC.concat(NULL_MESSAGE)); - Objects.requireNonNull(name, Labels.NAME + NULL_MESSAGE); + Objects.requireNonNull(baseOutputTopic); + Objects.requireNonNull(name); this.name = name; } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/Sensor.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/Sensor.java index 7780b9c7..aa7e2ab6 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/Sensor.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/Sensor.java @@ -35,9 +35,6 @@ public class Sensor extends KafkaActor { private final SensorName name; private final String appProvider; - private static final String NULL_MESSAGE = " in ".concat( - Processor.class.getName()).concat(" cannot be null."); - /** * TODO. * @param name TODO @@ -66,11 +63,11 @@ public Sensor( super(doc, sampleRate, unit, dataType, new Topic(topic, key, value, aggregator, null)); - Objects.requireNonNull(name, Labels.NAME.concat(NULL_MESSAGE)); + Objects.requireNonNull(name); this.name = name; this.appProvider = Objects.isNull(appProvider) - ? null : Utils.getProjectGroup().concat(appProvider); + ? null : Utils.getProjectGroup() + appProvider; } public String getAppProvider() { diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/util/Utils.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/util/Utils.java index 07b6e12f..72264309 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/util/Utils.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/util/Utils.java @@ -58,8 +58,8 @@ public static String getProjectGroup() { ClassLoader.getSystemClassLoader().getResourceAsStream(GRADLE_PROPERTIES)); projectGroup = prop.getProperty(PROPERTY_VALUE); } catch (IOException exc) { - throw new IllegalStateException(PROPERTY_VALUE.concat( - " cannot be extracted from ").concat(GRADLE_PROPERTIES), exc); + throw new IllegalStateException(PROPERTY_VALUE + + " cannot be extracted from " + GRADLE_PROPERTIES, exc); } } diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ActiveSourceRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ActiveSourceRoles.java deleted file mode 100644 index bffd7f15..00000000 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ActiveSourceRoles.java +++ /dev/null @@ -1,77 +0,0 @@ -package org.radarcns.schema.specification.validator; - -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; - -import org.radarcns.schema.specification.source.active.ActiveSource; -import org.radarcns.schema.specification.source.active.questionnaire.QuestionnaireSource; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * TODO. - */ -interface ActiveSourceRoles extends GenericRoles { - - /** Messages. */ - enum ActiveSourceInfo implements Message { - ASSESSMENT_TYPE("Assessment Type should be equal to ".concat( - ActiveSource.RadarSourceTypes.QUESTIONNAIRE.name()).concat(".")), - TOPICS("Topic set is invalid. It should contain only to the topic specified in ".concat( - "the configuration file.")); - - private final String message; - - ActiveSourceInfo(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } - - public String getMessage(String info) { - return message.concat(" ").concat(info); - } - } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateAssessmentType() { - return questionnaire -> Objects.nonNull(questionnaire.getAssessmentType()) - && questionnaire.getAssessmentType().equals( - ActiveSource.RadarSourceTypes.QUESTIONNAIRE.name()) - ? ValidationResult.valid() : ValidationResult.invalid(ActiveSourceInfo.ASSESSMENT_TYPE.getMessage()); - } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateTopics() { - return questionnaire -> { - Set input = questionnaire.getTopics(); - return Objects.nonNull(input) && input.size() == 1 ? - ValidationResult.valid() : ValidationResult.invalid(ActiveSourceInfo.TOPICS.getMessage( - input == null ? "" : input.stream().map(Object::toString).collect( - Collectors.joining(",")))); - }; - } -} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/AggregatableRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/AggregatableRoles.java deleted file mode 100644 index ec2dbb94..00000000 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/AggregatableRoles.java +++ /dev/null @@ -1,110 +0,0 @@ -package org.radarcns.schema.specification.validator; - -import java.util.Objects; - -import org.radarcns.schema.specification.source.Topic; -import org.radarcns.schema.specification.util.Utils; -import org.radarcns.schema.specification.source.Aggregatable; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * TODO. - */ -interface AggregatableRoles extends GenericRoles { - - /** Messages. */ - enum AggregatableInfo implements Message { - AGGREGATOR("Kafka aggregator class is invalid, it should must be a valid AVRO " - .concat("schema located at ").concat(ValidationSupport.Package.AGGREGATOR.getName()).concat(".")), - TOPICS("Topic set is not compliant with the provided aggregator. ".concat( - "In case of null aggregator, the set should contain only the input topic. ").concat( - "In case of non timed aggregator, the set should contain the input ").concat( - "topic and the correspondent output topic. In case of timed aggregator, ").concat( - "the set should contain the input topic and all the ").concat( - Integer.toString(Topic.TimeLabel.values().length)).concat(" related time frame topics.")); - - private final String message; - - AggregatableInfo(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } - - public String getMessage(String info) { - return message.concat(" ").concat(info); - } - } - - /** - * TODO. - * @param nullable TODO - * @return TODO - */ - static GenericRoles validateAggregator(boolean nullable) { - return aggregatable -> nullable || Objects.nonNull(aggregatable.getAggregator()) - && aggregatable.getAggregator().startsWith(Utils.getProjectGroup().concat( - ValidationSupport.Package.AGGREGATOR.getName())) - && ValidationSupport.isValidClass(aggregatable.getAggregator()) ? - ValidationResult.valid() : ValidationResult.invalid(AggregatableInfo.AGGREGATOR.getMessage()); - } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateTopics() { - return aggregatable -> { - boolean check; - /*if (Objects.isNull(aggregatable.getAggregator())) { - check = aggregatable.getTopics().size() == 1; - check = check && aggregatable.getTopics().contains(aggregatable.getInputTopic()); - } else if (Utils.isTimedAggregator(aggregatable.getAggregator())) { - check = aggregatable.getTopics().size() == 1 + TimeLabel.values().length; - check = check && aggregatable.getTopics().contains(aggregatable.getInputTopic()); - check = check && aggregatable.getTopics().contains( - aggregatable.getInputTopic().concat(TimeLabel.TEN_SECOND.getLabel())); - check = check && aggregatable.getTopics().contains( - aggregatable.getInputTopic().concat(TimeLabel.THIRTY_SECOND.getLabel())); - check = check && aggregatable.getTopics().contains( - aggregatable.getInputTopic().concat(TimeLabel.ONE_MIN.getLabel())); - check = check && aggregatable.getTopics().contains( - aggregatable.getInputTopic().concat(TimeLabel.TEN_MIN.getLabel())); - check = check && aggregatable.getTopics().contains( - aggregatable.getInputTopic().concat(TimeLabel.ONE_HOUR.getLabel())); - check = check && aggregatable.getTopics().contains( - aggregatable.getInputTopic().concat(TimeLabel.ONE_DAY.getLabel())); - check = check && aggregatable.getTopics().contains( - aggregatable.getInputTopic().concat(TimeLabel.ONE_WEEK.getLabel())); - } else { - check = aggregatable.getTopics().size() == 2; - check = check && aggregatable.getTopics().contains(aggregatable.getInputTopic()); - check = check && aggregatable.getTopics().contains( - Topic.getOutTopic(aggregatable.getInputTopic())); - }*/ - check = false; - - return check ? ValidationResult.valid() : ValidationResult.invalid(AggregatableInfo.TOPICS.getMessage( - /*aggregatable.getTopics().stream().map(Object::toString).collect( - Collectors.joining(","))*/ - )); - }; - } -} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/GenericRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/GenericRoles.java deleted file mode 100644 index f5835717..00000000 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/GenericRoles.java +++ /dev/null @@ -1,170 +0,0 @@ -package org.radarcns.schema.specification.validator; - -import java.util.Collection; -import java.util.Objects; -import java.util.function.Function; -import java.util.function.Predicate; -import org.radarcns.catalogue.Unit; -import org.radarcns.schema.specification.util.Utils; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * TODO. - */ -interface GenericRoles extends Function { - - /** Messages. */ - enum GeneralInfo implements Message { - DOCUMENTATION("Documentation should not be null and should be ended by a dot."), - DOCUMENTATION_OPTIONAL("Documentation should be ended by a dot."), - KEY("Kafka key class is invalid, cannot be null and must be a valid AVRO schema located at " - .concat(Utils.getProjectGroup()).concat(ValidationSupport.Package.KAFKA_KEY.getName()).concat(".")), - NAME("Name cannot be null"), - SAMPLE_RATE("Sample rate cannot be null."), - TOPIC("Topic name is invalid."), - UNIT("Unit cannot be null or equal to ".concat(Unit.UNKNOWN.name()).concat(".")), - VALUE("Kafka value class is invalid. It cannot be null and must be a valida AVRO".concat( - "schema located at")); - - private final String message; - - GeneralInfo(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } - - public String getMessage(String info) { - return message.concat(" ").concat(info); - } - } - - /** - * TODO. - * @param name - * @return TODO - */ - static GenericRoles validateName(String name) { - return object -> Objects.nonNull(name) ? ValidationResult.valid() : ValidationResult.invalid(GeneralInfo.NAME.getMessage()); - } - - /** - * TODO. - * @param key - * @return TODO - */ - static GenericRoles validateKey(String key) { - return object -> Objects.nonNull(key) - && key.startsWith(Utils.getProjectGroup().concat( - ValidationSupport.Package.KAFKA_KEY.getName())) - && ValidationSupport.isValidClass(key) ? - ValidationResult.valid() : ValidationResult.invalid(GeneralInfo.KEY.getMessage()); - } - - /** - * TODO. - * @param packageName - * @param value - * @return TODO - */ - static GenericRoles validateValue(ValidationSupport.Package packageName, String value) { - return object -> Objects.nonNull(packageName) && Objects.nonNull(value) - && value.startsWith(Utils.getProjectGroup().concat(packageName.getName())) - && ValidationSupport.isValidClass(value) ? - ValidationResult.valid() : ValidationResult.invalid(GeneralInfo.VALUE.getMessage()); - } - - /** - * TODO. - * @param topic TODO - * @return TODO - */ - static GenericRoles validateTopic(String topic) { - return object -> Objects.nonNull(topic) && ValidationSupport.isValidTopic(topic) ? ValidationResult.valid() - : ValidationResult.invalid(GeneralInfo.TOPIC.getMessage(ValidationSupport.isValidTopicVerbose(topic))); - } - - /** - * TODO. - * @param topics TODO - * @return TODO - */ - static GenericRoles validateTopicNames(Collection topics) { - return object -> Objects.nonNull(topics) - && !topics.isEmpty() - && topics.stream().allMatch(topic -> ValidationSupport.isValidTopic(topic)) - ? ValidationResult.valid() : ValidationResult.invalid(GeneralInfo.TOPIC.getMessage(ValidationSupport.isValidTopicsVerbose(topics))); - } - - /** - * TODO. - * @param doc TODO - * @param nullable TODO - * @return TODO - */ - static GenericRoles validateDoc(String doc, boolean nullable) { - return object -> nullable || Objects.nonNull(doc) && doc.endsWith(".") ? - ValidationResult.valid() : ValidationResult.invalid(nullable ? GeneralInfo.DOCUMENTATION_OPTIONAL.getMessage() - : GeneralInfo.DOCUMENTATION.getMessage()); - } - - /** - * TODO. - * @param rate TODO - * @return TODO - */ - static GenericRoles validateSampleRate(double rate) { - return object -> Objects.nonNull(rate) ? ValidationResult.valid() - : ValidationResult.invalid(GeneralInfo.SAMPLE_RATE.getMessage()); - } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateUnit(Unit unit) { - return object-> Objects.nonNull(unit) && !unit.name().equals(Unit.UNKNOWN) ? - ValidationResult.valid() : ValidationResult.invalid(GeneralInfo.UNIT.getMessage()); - } - - /** - * - * TODO. - * @param predicate TODO - * @param message TODO - * @return TODO - */ - static GenericRoles validate(Predicate predicate, Message message) { - return object -> predicate.test(object) ? ValidationResult.valid() - : ValidationResult.invalid(message.getMessage()); - } - - /** - * TODO. - * @param other TODO - * @return TODO - */ - default GenericRoles and(GenericRoles other) { - return object -> { - final ValidationResult result = this.apply((T)object); - return result.isValid() ? other.apply((T) object) : result; - }; - } -} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/MonitorRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/MonitorRoles.java deleted file mode 100644 index 1c3fc48e..00000000 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/MonitorRoles.java +++ /dev/null @@ -1,109 +0,0 @@ -package org.radarcns.schema.specification.validator; - -import org.radarcns.catalogue.ProcessingState; -import org.radarcns.schema.specification.source.MonitorSource; -import org.radarcns.schema.specification.util.Utils; - -import java.io.File; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static org.radarcns.schema.specification.SourceCatalogue.YAML_EXTENSION; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * TODO. - */ -interface MonitorRoles extends GenericRoles { - - /** - * TODO. - * @return TODO - */ - static Set allowedProvider() { - return Stream.of( - Utils.getProjectGroup().concat(".application.ApplicationServiceProvider") - ).collect(Collectors.toSet()); - } - - /** Messages. */ - enum MonitorInfo implements Message { - APP_PROVIDER("App provider should be equal to one of the following values".concat( - allowedProvider().stream().collect(Collectors.joining("'"))).concat(".")), - DATA_TYPE("The only allowed data type is ".concat(ProcessingState.RAW.name()).concat(".")), - NOT_AGGREGATOR("Aggregators are not defined yet for ".concat( - MonitorSource.class.getName()).concat(".")), - SOURCE_TYPE("Source type should match file name."); - - private final String message; - - MonitorInfo(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } - - public String getMessage(String info) { - return message.concat(" ").concat(info); - } - } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateAggregator() { - return monitor -> /*Objects.isNull(monitor.getAggregator())*/ false ? ValidationResult.valid() - : ValidationResult.invalid(MonitorInfo.NOT_AGGREGATOR.getMessage()); - } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateAppProvider() { - return monitor -> Objects.nonNull(monitor.getAppProvider()) - && allowedProvider().contains(monitor.getAppProvider()) ? - ValidationResult.valid() : ValidationResult.invalid(MonitorInfo.APP_PROVIDER.getMessage()); - } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateDataType() { - return monitor -> /*Objects.nonNull(monitor.getProcessingState()) - && monitor.getProcessingState().name().equals(DataType.RAW.name())*/ - ValidationResult.invalid(MonitorInfo.DATA_TYPE.getMessage()); - } - - /** - * TODO. - * @param file - * @return TODO - */ - static GenericRoles validateSourceType(File file) { - return monitor -> Objects.nonNull(monitor.getType()) - && ValidationSupport.removeExtension(file, YAML_EXTENSION).equalsIgnoreCase(monitor.getType()) - ? ValidationResult.valid() : ValidationResult.invalid(MonitorInfo.SOURCE_TYPE.getMessage()); - } -} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/PassiveSourceRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/PassiveSourceRoles.java deleted file mode 100644 index 76756d0b..00000000 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/PassiveSourceRoles.java +++ /dev/null @@ -1,150 +0,0 @@ -package org.radarcns.schema.specification.validator; - -import java.io.File; -import java.util.HashSet; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import org.radarcns.schema.specification.SourceCatalogue; -import org.radarcns.schema.specification.util.Utils; -import org.radarcns.schema.specification.source.passive.PassiveSource; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * TODO. - */ -interface PassiveSourceRoles extends GenericRoles { - - /** - * TODO. - * @return TODO - */ - static Set allowedProvider() { - return Stream.of( - Utils.getProjectGroup().concat(".phone.PhoneLocationProvider"), - Utils.getProjectGroup().concat(".phone.PhoneLogProvider"), - Utils.getProjectGroup().concat(".phone.PhoneUsageProvider"), - Utils.getProjectGroup().concat(".phone.PhoneSensorProvider"), - Utils.getProjectGroup().concat(".biovotion.BiovotionServiceProvider"), - Utils.getProjectGroup().concat(".empatica.E4ServiceProvider"), - Utils.getProjectGroup().concat(".pebble.PebbleServiceProvider") - ).collect(Collectors.toSet()); - } - - /** Messages. */ - enum PassiveSourceInfo implements Message { - APP_PROVIDER("App provider must be equal to one of the following ".concat( - allowedProvider().stream().map(Object::toString).collect(Collectors.joining( - ","))).concat(".")), - SENSORS("Sensor list cannot be null or empty and cannot contain two sensors with".concat( - "the same name")), - TOPICS("Union of sensors and processors topic sets does not match topic set".concat( - "a source level.")), - TYPE("Passive Source Type should be the concatenation of vendor and name values".concat( - "in uppercase separated by underscore.")), - VENDOR_AND_NAME("Vendor and name values cannot be null. The concatenation of ".concat( - "vendor with \"_\" and name should be equal to the source file").concat( - " name in lowercase.")); - - private final String message; - - PassiveSourceInfo(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } - - public String getMessage(String info) { - return message.concat(" ").concat(info); - } - } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateAppProvider() { - return passive -> Objects.isNull(passive.getAppProvider()) - || allowedProvider().contains(passive.getAppProvider()) ? - ValidationResult.valid() : ValidationResult.invalid(PassiveSourceInfo.APP_PROVIDER.getMessage()); - } - - /** - * TODO. - * @param file - * @return TODO - */ - static GenericRoles validateModelAndVendor(File file) { - return passive -> Objects.nonNull(passive.getVendor()) - && Objects.nonNull(passive.getModel()) - && ValidationSupport.removeExtension(file, SourceCatalogue.YAML_EXTENSION).equalsIgnoreCase( - passive.getType().toLowerCase()) ? ValidationResult.valid() - : ValidationResult.invalid(PassiveSourceInfo.VENDOR_AND_NAME.getMessage()); - } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateSensors() { - return passive -> { - boolean check = Objects.nonNull(passive.getSensors()); - check = check && !passive.getSensors().isEmpty(); - - Set temp = new HashSet<>(); - check = check && passive.getSensors().stream().allMatch( - sensor -> !temp.add(sensor.getName().name())); - - return check ? ValidationResult.valid() : ValidationResult.invalid(PassiveSourceInfo.SENSORS.getMessage()); - }; - } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateSourceType() { - return passive -> Objects.nonNull(passive.getType()) ? - ValidationResult.valid() : ValidationResult.invalid(PassiveSourceInfo.TYPE.getMessage()); - } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateTopics() { - return passive -> { - /*Set topics = passive.getTopics(); - boolean check = Objects.nonNull(topics) - && !topics.isEmpty() - && passive.getSensors().stream().allMatch(sensor -> - topics.containsAll(sensor.getTopics())); - - check = check && Objects.nonNull(passive.getProcessors()) - && passive.getProcessors().stream().allMatch(processor -> - topics.containsAll(processor.getTopics())); - - return check ? valid() : invalid(PassiveSourceInfo.TOPICS.getMessage());*/ - return false ? ValidationResult.valid() : ValidationResult.invalid(PassiveSourceInfo.TOPICS.getMessage()); - }; - } -} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ProcessorRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ProcessorRoles.java deleted file mode 100644 index debece33..00000000 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ProcessorRoles.java +++ /dev/null @@ -1,86 +0,0 @@ -package org.radarcns.schema.specification.validator; - -import org.radarcns.catalogue.ProcessingState; -import org.radarcns.catalogue.SensorName; -import org.radarcns.schema.specification.source.passive.Processor; - -import java.util.Objects; - -import static org.radarcns.schema.specification.validator.ValidationResult.invalid; -import static org.radarcns.schema.specification.validator.ValidationResult.valid; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * TODO. - */ -interface ProcessorRoles extends GenericRoles { - - /** Messages. */ - enum ProcessorInfo implements Message { - DATA_TYPE("Processor data type should be equal to ".concat( - ProcessingState.RADAR.name()).concat(".")), - NAME("Processor name should be not null and different from ".concat( - SensorName.UNKNOWN.name()).concat(".")), - OUTPUT("Processor base output topic is invalid."); - - private final String message; - - ProcessorInfo(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } - - public String getMessage(String info) { - return message.concat(" ").concat(info); - } - } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateDataType() { - return processor -> Objects.nonNull(processor.getProcessingState()) - && processor.getProcessingState().name().equals(ProcessingState.RADAR.name()) - ? valid() : invalid(ProcessorInfo.DATA_TYPE.getMessage()); - } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateName() { - return processor -> Objects.nonNull(processor.getName()) - && !processor.getName().equals(SensorName.UNKNOWN.name()) - ? valid() : invalid(ProcessorInfo.NAME.getMessage()); - } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateBaseOutputTopic() { - return processor -> /*Objects.nonNull(processor.getBaseOutputTopic()) - && isValidTopic(processor.getBaseOutputTopic())*/ - false ? valid() : invalid(ProcessorInfo.OUTPUT.getMessage( - /*isValidTopicVerbose(processor.getBaseOutputTopic())*/)); - } -} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/QuestionRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/QuestionRoles.java deleted file mode 100644 index d29ac26c..00000000 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/QuestionRoles.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.radarcns.schema.specification.validator; - -import static org.radarcns.schema.specification.validator.ValidationResult.invalid; -import static org.radarcns.schema.specification.validator.ValidationResult.valid; - -import java.util.Objects; -import org.radarcns.catalogue.RadarWidget; -import org.radarcns.schema.specification.source.active.questionnaire.Question; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * TODO. - */ -interface QuestionRoles extends GenericRoles { - - /** Messages. */ - enum QuestionInfo implements Message { - CONTENT("Question content cannot be null and should be ended by a point."), - LEAD("Question lead cannot be null and should be ended by a question mark."), - WIDGET("Widget cannot be null and must be different from ".concat( - RadarWidget.UNKNOWN.name()).concat(".")), - RESPONSES("Responses list cannot be null or empty."); - - private final String message; - - QuestionInfo(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } - - public String getMessage(String info) { - return message.concat(" ").concat(info); - } - } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateContent() { - return question -> Objects.nonNull(question.getContent()) - && question.getContent().endsWith(".") - ? valid() : invalid(QuestionInfo.CONTENT.getMessage()); - } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateLead() { - return question -> Objects.nonNull(question.getLead()) - && question.getLead().endsWith("?") - ? valid() : invalid(QuestionInfo.LEAD.getMessage()); - } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateWidget() { - return question -> Objects.nonNull(question.getWidget()) - && !question.getWidget().name().equals(RadarWidget.UNKNOWN.name()) - ? valid() : invalid(QuestionInfo.WIDGET.getMessage()); - } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateResponses() { - return question -> Objects.nonNull(question.getResponses()) - && !question.getResponses().isEmpty() - ? valid() : invalid(QuestionInfo.RESPONSES.getMessage()); - } -} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/QuestionnaireRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/QuestionnaireRoles.java deleted file mode 100644 index 121c7ce7..00000000 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/QuestionnaireRoles.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.radarcns.schema.specification.validator; - -import static org.radarcns.schema.specification.SourceCatalogue.YAML_EXTENSION; - -import java.io.File; -import java.util.Objects; - -import org.radarcns.schema.specification.source.active.questionnaire.QuestionnaireSource; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * TODO. - */ -interface QuestionnaireRoles extends GenericRoles { - - /** Messages. */ - enum QuestionnaireInfo implements Message { - QUESTIONS("Questions list cannot null or empty."), - QUESTIONNAIRE_TYPE("Questionnaire Type cannot be null and should match with the ".concat( - "configuration file name.")); - - private final String message; - - QuestionnaireInfo(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } - - public String getMessage(String info) { - return message.concat(" ").concat(info); - } - } - - /** - * TODO. - * @param file - * @return TODO - */ - static GenericRoles validateQuestionnaireType(File file) { - return questionnaire -> Objects.nonNull(questionnaire.getQuestionnaireType()) - && ValidationSupport.removeExtension(file, YAML_EXTENSION).equalsIgnoreCase( - questionnaire.getQuestionnaireType()) - ? ValidationResult.valid() : ValidationResult.invalid(QuestionnaireInfo.QUESTIONNAIRE_TYPE.getMessage()); - } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateQuestions() { - return questionnaire -> Objects.nonNull(questionnaire.getQuestions()) - && !questionnaire.getQuestions().isEmpty() - ? ValidationResult.valid() : ValidationResult.invalid(QuestionnaireInfo.QUESTIONS.getMessage()); - } -} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ResponseRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ResponseRoles.java deleted file mode 100644 index 8a92adb8..00000000 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ResponseRoles.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.radarcns.schema.specification.validator; - -import java.util.Objects; - -import org.radarcns.schema.specification.source.active.questionnaire.Response; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * TODO. - */ -interface ResponseRoles extends GenericRoles { - - /** Messages. */ - enum ResponseInfo implements Message { - SCORE("Answer score cannot be null."), - TEXT("Answer text cannot be null."); - - private final String message; - - ResponseInfo(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } - - public String getMessage(String info) { - return message.concat(" ").concat(info); - } - } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateScore() { - return response -> Objects.nonNull(response.getScore()) - ? ValidationResult.valid() : ValidationResult.invalid(ResponseInfo.SCORE.getMessage()); - } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateText() { - return response -> Objects.nonNull(response.getText()) - ? ValidationResult.valid() : ValidationResult.invalid(ResponseInfo.TEXT.getMessage()); - } -} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/SensorRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/SensorRoles.java deleted file mode 100644 index 5c7eb564..00000000 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/SensorRoles.java +++ /dev/null @@ -1,87 +0,0 @@ -package org.radarcns.schema.specification.validator; - -import org.radarcns.catalogue.ProcessingState; -import org.radarcns.catalogue.SensorName; -import org.radarcns.schema.specification.source.passive.Sensor; - -import java.util.Objects; -import java.util.stream.Collectors; - -import static org.radarcns.schema.specification.validator.PassiveSourceRoles.allowedProvider; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * TODO. - */ -interface SensorRoles extends TopicRoles { - - /** Messages. */ - enum SensorInfo implements Message { - APP_PROVIDER("App provider must be equal to one of the following ".concat( - allowedProvider().stream().map(Object::toString).collect(Collectors.joining( - ","))).concat(".")), - DATA_TYPE("Sensor data type cannot be null and should differ from ".concat( - ProcessingState.UNKNOWN.name()).concat(".")), - NAME("Sensor name cannot be not null and should different from ".concat( - SensorName.UNKNOWN.name()).concat(".")); - - private final String message; - - SensorInfo(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } - - public String getMessage(String info) { - return message.concat(" ").concat(info); - } - } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateAppProvider() { - return passive -> Objects.isNull(passive.getAppProvider()) - || allowedProvider().contains(passive.getAppProvider()) ? - ValidationResult.valid() : ValidationResult.invalid(SensorInfo.APP_PROVIDER.getMessage()); - } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateDataType() { - return sensor -> Objects.nonNull(sensor.getProcessingState()) - && !sensor.getProcessingState().name().equals(ProcessingState.UNKNOWN.name()) - ? ValidationResult.valid() : ValidationResult.invalid(SensorInfo.DATA_TYPE.getMessage()); - } - - /** - * TODO. - * @return TODO - */ - static GenericRoles validateName() { - return sensor -> Objects.nonNull(sensor.getName()) - && !sensor.getName().name().equals(SensorName.UNKNOWN.name()) - ? ValidationResult.valid() : ValidationResult.invalid(SensorInfo.NAME.getMessage()); - } -} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/TopicRoles.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/TopicRoles.java deleted file mode 100644 index cec20c04..00000000 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/TopicRoles.java +++ /dev/null @@ -1,130 +0,0 @@ -package org.radarcns.schema.specification.validator; - -import java.util.Collection; -import java.util.Objects; -import java.util.function.Predicate; - -import org.radarcns.schema.specification.source.Topic; -import org.radarcns.schema.specification.util.Utils; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * TODO. - */ -interface TopicRoles extends GenericRoles { - - /** Messages. */ - enum TopicInfo implements Message { - KEY("Kafka key class is invalid, cannot be null and must be a valid AVRO schema located at " - .concat(Utils.getProjectGroup()).concat(ValidationSupport.Package.KAFKA_KEY.getName()).concat(".")), - TOPIC("Topic name is invalid."), - VALUE("Kafka value class is invalid. It cannot be null and must be a valida AVRO".concat( - "schema located at")); - - private final String message; - - TopicInfo(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } - - public String getMessage(String info) { - return message.concat(" ").concat(info); - } - } - - //public String getInputTopic() - //public boolean hasAggregator() - //public String getAggregator() - //public Set getOutput() - //public Set getTopicNames() - - /** - * TODO. - * @return TODO - */ - static TopicRoles validateKey() { - return topic -> Objects.nonNull(topic.getInputKey()) - && topic.getInputKey().startsWith(Utils.getProjectGroup().concat( - ValidationSupport.Package.KAFKA_KEY.getName())) - && ValidationSupport.isValidClass(topic.getInputKey()) ? - ValidationResult.valid() : ValidationResult.invalid(TopicInfo.KEY.getMessage()); - } - - /** - * TODO. - * @param packageName - * @return TODO - */ - static TopicRoles validateValue(ValidationSupport.Package packageName) { - return topic -> Objects.nonNull(packageName) && Objects.nonNull(topic.getInputValue()) - && topic.getInputValue().startsWith(Utils.getProjectGroup().concat( - packageName.getName())) - && ValidationSupport.isValidClass(topic.getInputValue()) ? - ValidationResult.valid() : ValidationResult.invalid(TopicInfo.VALUE.getMessage()); - } - - /** - * TODO. - * @param topic TODO - * @return TODO - */ - static TopicRoles validateTopic(String topic) { - return object -> Objects.nonNull(topic) && ValidationSupport.isValidTopic(topic) ? ValidationResult.valid() - : ValidationResult.invalid(TopicInfo.TOPIC.getMessage(ValidationSupport.isValidTopicVerbose(topic))); - } - - /** - * TODO. - * @param topics TODO - * @return TODO - */ - static TopicRoles validateTopicNames(Collection topics) { - return object -> Objects.nonNull(topics) - && !topics.isEmpty() - && topics.stream().allMatch(topic -> ValidationSupport.isValidTopic(topic)) - ? ValidationResult.valid() : ValidationResult.invalid(TopicInfo.TOPIC.getMessage(ValidationSupport.isValidTopicsVerbose(topics))); - } - - /** - * - * TODO. - * @param predicate TODO - * @param message TODO - * @return TODO - */ - static TopicRoles validate(Predicate predicate, Message message) { - return object -> predicate.test(object) ? ValidationResult.valid() - : ValidationResult.invalid(message.getMessage()); - } - - /** - * TODO. - * @param other TODO - * @return TODO - */ - default TopicRoles and(TopicRoles other) { - return object -> { - final ValidationResult result = this.apply(object); - return result.isValid() ? other.apply(object) : result; - }; - } -} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ValidationResult.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ValidationResult.java deleted file mode 100644 index 3bdc920a..00000000 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ValidationResult.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.radarcns.schema.specification.validator; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.util.Optional; - -/** - * TODO. - */ -public interface ValidationResult { - - static ValidationResult valid() { - return ValidationSupport.getValid(); - } - - static ValidationResult invalid(String reason) { - return new Invalid(reason); - } - - boolean isValid(); - - Optional getReason(); -} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ValidationSupport.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ValidationSupport.java deleted file mode 100644 index 2a9ef635..00000000 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/ValidationSupport.java +++ /dev/null @@ -1,174 +0,0 @@ -package org.radarcns.schema.specification.validator; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.io.File; -import java.util.Collection; -import java.util.Objects; -import java.util.Optional; -import org.apache.kafka.common.errors.InvalidTopicException; -import scala.MatchError; - -/** - * TODO. - */ -public final class ValidationSupport { - - /** Package names. */ - public enum Package { - AGGREGATOR(".kafka.aggregator"), - BIOVOTION(".passive.biovotion"), - EMPATICA(".passive.empatica"), - KAFKA_KEY(".kafka.key"), - MONITOR(".monitor"), - PEBBLE(".passive.pebble"), - QUESTIONNAIRE(".active.questionnaire"); - - private final String name; - - Package(String name) { - this.name = name; - } - - public String getName() { - return name; - } - } - - static final ValidationResult VALID = new ValidationResult() { - public boolean isValid() { - return true; - } - - public Optional getReason() { - return Optional.empty(); - } - }; - - - private ValidationSupport() { - //Static class - } - - static ValidationResult getValid() { - return VALID; - } - - /** - * TODO. - * @param className TODO. - * @return TODO. - */ - public static boolean isValidClass(String className){ - try { - Class.forName(className); - return true; - } catch( ClassNotFoundException e ) { - return false; - } - } - - /** - * TODO. - * @param topicName TODO - * @return TODO - */ - public static boolean isValidTopic(String topicName) { - try { - kafka.common.Topic.validate(topicName); - return true; - } catch (InvalidTopicException | MatchError exc) { - return false; - } - } - - /** - * TODO. - * @param topicName TODO - * @return TODO - */ - public static String isValidTopicVerbose(String topicName) { - if (topicName == null) { - return ". Topic is null."; - } - try { - kafka.common.Topic.validate(topicName); - return ""; - } catch (InvalidTopicException | MatchError exc) { - return exc.toString(); - } - } - - /** - * TODO. - * @param topicNames TODO - * @return TODO - */ - public static String isValidTopicsVerbose(Collection topicNames) { - Objects.requireNonNull(topicNames); - - StringBuilder reason = new StringBuilder(topicNames.size() * 100); - boolean first = true; - String temp; - for (String value : topicNames) { - temp = isValidTopicVerbose(value); - if (!temp.isEmpty()) { - if (first) { - reason.append(temp); - first = false; - } else { - reason.append(", ".concat(temp)); - } - } - } - - if (first) { - return ""; - } - - return reason.toString(); - } - - /** - * TODO. - * @param file TODO - * @return TODO - */ - public static String getMessage(File file, ValidationResult result) { - if (result.isValid()) { - return ""; - } - - return result.getReason().get().concat(" ").concat( - file.getAbsolutePath()).concat(" is invalid."); - } - - /** - * TODO. - * @param file TODO - * @param extension TODO - * @return TODO - */ - public static String removeExtension(File file, String extension) { - String value = file.getName(); - if (value.endsWith(extension)) { - value = value.substring(0, value.length() - extension.length()); - } - return value; - } - -} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/Validator.java b/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/Validator.java deleted file mode 100644 index 45f9144d..00000000 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/Validator.java +++ /dev/null @@ -1,157 +0,0 @@ -package org.radarcns.schema.specification.validator; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * TODO - */ -public final class Validator { - - private Validator() { - //Static class - } - - /** - * TODO. - * @param source TODO - * @param file TODO - * @return TODO - */ - /* public static ValidationResult validateMonitor(MonitorSource source, File file) { - return (ValidationResult) MonitorRoles.validateAppProvider() - .and(MonitorRoles.validateAggregator()) - .and(MonitorRoles.validateDataType()) - .and(GenericRoles.validateDoc(source.getDoc(), false)) - //.and(GenericRoles.validateKey(source.getKey())) - .and(GenericRoles.validateName(source.getName())) - .and(GenericRoles.validateSampleRate(source.getSampleRate())) - .and(MonitorRoles.validateSourceType(file)) - //.and(GenericRoles.validateTopic(source.getTopic())) - .and(AggregatableRoles.validateTopics()) - .and(GenericRoles.validateTopicNames(source.getTopics())) - //.and(GenericRoles.validateValue(Package.MONITOR, source.getValue())) - .and(GenericRoles.validateUnit(source.getUnit())) - .apply(source); - }*/ - - /** - * TODO. - * @param question TODO - * @return TODO - */ - /*public static ValidationResult validateQuestion(Question question) { - return (ValidationResult) QuestionRoles.validateContent() - .and(QuestionRoles.validateLead()) - .and(QuestionRoles.validateWidget()) - .and(QuestionRoles.validateResponses()) - .apply(question); - }*/ - - /** - * TODO. - * @param source TODO - * @param file TODO - * @return TODO - */ - /*public static ValidationResult validateQuestionnaire(QuestionnaireSource source, File file) { - return (ValidationResult) ActiveSourceRoles.validateAssessmentType() - .and(GenericRoles.validateDoc(source.getDoc(), false)) - .and(GenericRoles.validateKey(source.getKey())) - .and(GenericRoles.validateName(source.getName())) - .and(QuestionnaireRoles.validateQuestions()) - .and(QuestionnaireRoles.validateQuestionnaireType(file)) - .and(GenericRoles.validateTopic(source.getTopic())) - .and(ActiveSourceRoles.validateTopics()) - .and(GenericRoles.validateTopicNames(source.getTopics())) - .and(GenericRoles.validateValue(Package.QUESTIONNAIRE, source.getValue())) - .apply(source); - }*/ - - /** - * TODO. - * @param source TODO - * @param file TODO - * @return TODO - */ - /*public static ValidationResult validatePassive(PassiveSource source, File file) { - return (ValidationResult) PassiveSourceRoles.validateAppProvider() - .and(GenericRoles.validateDoc(source.getDoc(), true)) - .and(PassiveSourceRoles.validateModelAndVendor(file)) - .and(GenericRoles.validateName(source.getName())) - .and(PassiveSourceRoles.validateSensors()) - .and(PassiveSourceRoles.validateSourceType()) - .and(PassiveSourceRoles.validateTopics()) - .and(GenericRoles.validateTopicNames(source.getTopics())) - .apply(source); - }*/ - - /** - * TODO. - * @param response TODO - * @return TODO - */ - /*public static ValidationResult validateResponse(Response response) { - return (ValidationResult) ResponseRoles.validateScore() - .and(ResponseRoles.validateText()) - .apply(response); - }*/ - - /** - * TODO. - * @param sensor TODO - * @param packageName TODO - * @return TODO - */ - /*public static ValidationResult validateSensor(Package packageName, Sensor sensor) { - return (ValidationResult) SensorRoles.validateAppProvider() - .and(SensorRoles.validateDataType()) - .and(GenericRoles.validateDoc(sensor.getDoc(), true)) - //.and(GenericRoles.validateKey(sensor.getKey())) - .and(SensorRoles.validateName()) - .and(GenericRoles.validateSampleRate(sensor.getSampleRate())) - .and(GenericRoles.validateTopic(sensor.getInputTopic())) - //.and(GenericRoles.validateTopic(sensor.getTopic())) - .and(AggregatableRoles.validateTopics()) - .and(AggregatableRoles.validateAggregator(false)) - .and(GenericRoles.validateTopicNames(sensor.getTopics())) - .and(GenericRoles.validateUnit(sensor.getUnit())) - //.and(GenericRoles.validateValue(packageName, sensor.getValue())) - .apply(sensor); - }*/ - - /** - * TODO. - * @param processor TODO - * @param packageName TODO - * @return TODO - */ - /*public static ValidationResult validateProcessor(Package packageName, Processor processor) { - return (ValidationResult) ProcessorRoles.validateBaseOutputTopic() - .and(ProcessorRoles.validateDataType()) - .and(GenericRoles.validateDoc(processor.getDoc(), true)) - //.and(GenericRoles.validateKey(processor.getInputKey())) - .and(ProcessorRoles.validateName()) - .and(GenericRoles.validateSampleRate(processor.getSampleRate())) - .and(GenericRoles.validateTopic(processor.getInputTopic())) - .and(AggregatableRoles.validateTopics()) - .and(AggregatableRoles.validateAggregator(false)) - .and(GenericRoles.validateTopicNames(processor.getTopics())) - .and(GenericRoles.validateUnit(processor.getUnit())) - //.and(GenericRoles.validateValue(packageName, processor.getInputValue())) - .apply(processor); - }*/ -} diff --git a/java-sdk/radar-schemas-validator/build.gradle b/java-sdk/radar-schemas-validator/build.gradle index 46815441..b12260f3 100644 --- a/java-sdk/radar-schemas-validator/build.gradle +++ b/java-sdk/radar-schemas-validator/build.gradle @@ -22,9 +22,9 @@ ext.slf4jVersion = '1.7.25' dependencies { api group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.8.10' + api project(':radar-schemas-specifications') implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.8.10' implementation project(':radar-schemas-commons') - implementation project(':radar-schemas-specifications') testCompile group: 'junit', name: 'junit', version: junitVersion testCompile group: 'org.slf4j', name: 'slf4j-simple', version: slf4jVersion diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/Invalid.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/Invalid.java deleted file mode 100644 index dbf1717a..00000000 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/Invalid.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.radarcns.schema.validation; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.util.Objects; -import java.util.Optional; - -/** - * TODO. - */ -public class Invalid implements ValidationResult { - - private final String reason; - - Invalid(String reason) { - this.reason = reason; - } - - public boolean isValid() { - return false; - } - - public Optional getReason() { - return Optional.of(reason); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || !getClass().equals(o.getClass())) { - return false; - } - - Invalid invalid = (Invalid) o; - - return Objects.equals(reason, invalid.reason); - } - - @Override - public int hashCode() { - return reason != null ? reason.hashCode() : 0; - } -} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/Invalid.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/InvalidResult.java similarity index 86% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/Invalid.java rename to java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/InvalidResult.java index e557e9b2..6c71e616 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/Invalid.java +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/InvalidResult.java @@ -1,4 +1,4 @@ -package org.radarcns.schema.specification.validator; +package org.radarcns.schema.validation; /* * Copyright 2017 King's College London and The Hyve @@ -22,11 +22,11 @@ /** * TODO. */ -public class Invalid implements ValidationResult { +public class InvalidResult implements ValidationResult { private final String reason; - Invalid(String reason) { + public InvalidResult(String reason) { this.reason = reason; } @@ -46,7 +46,7 @@ public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) { return false; } - Invalid invalid = (Invalid) o; + InvalidResult invalid = (InvalidResult) o; return Objects.equals(reason, invalid.reason); } diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SchemaValidationRoles.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SchemaValidationRoles.java deleted file mode 100644 index 85b9f503..00000000 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SchemaValidationRoles.java +++ /dev/null @@ -1,507 +0,0 @@ -package org.radarcns.schema.validation; - -import static org.radarcns.schema.validation.SchemaValidationRoles.Message.DEFAULT_VALUE; -import static org.radarcns.schema.validation.SchemaValidationRoles.Message.DOC; -import static org.radarcns.schema.validation.SchemaValidationRoles.Message.ENUMERATION_SYMBOL; -import static org.radarcns.schema.validation.SchemaValidationRoles.Message.ENUMERATION_UNKNOWN_SYMBOL; -import static org.radarcns.schema.validation.SchemaValidationRoles.Message.FIELDS; -import static org.radarcns.schema.validation.SchemaValidationRoles.Message.FIELD_NAME; -import static org.radarcns.schema.validation.SchemaValidationRoles.Message.NOT_TIME_COMPLETED_FIELD; -import static org.radarcns.schema.validation.SchemaValidationRoles.Message.NOT_TIME_RECEIVED_FIELD; -import static org.radarcns.schema.validation.SchemaValidationRoles.Message.RECORD_NAME; -import static org.radarcns.schema.validation.SchemaValidationRoles.Message.SYMBOLS; -import static org.radarcns.schema.validation.SchemaValidationRoles.Message.TIME_COMPLETED_FIELD; -import static org.radarcns.schema.validation.SchemaValidationRoles.Message.TIME_FIELD; -import static org.radarcns.schema.validation.SchemaValidationRoles.Message.TIME_RECEIVED_FIELD; - -import java.nio.file.Path; -import java.util.Objects; -import java.util.Set; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.regex.Pattern; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import org.apache.avro.Schema; -import org.apache.avro.Schema.Type; -import org.radarcns.schema.Scope; - - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * TODO. - */ -@SuppressWarnings("PMD.GodClass") -//TODO split in record and enumerator. -interface SchemaValidationRoles extends Function { - - String TIME = "time"; - String TIME_RECEIVED = "timeReceived"; - String TIME_COMPLETED = "timeCompleted"; - - String UNKNOWN = "UNKNOWN"; - - Pattern NAMESPACE_PATTERN = Pattern.compile("^[a-z][a-z.]*$"); - - Pattern RECORD_NAME_PATTERN = Pattern.compile("(^[A-Z][a-z]+)|(^[A-Z][a-z0-9]+[A-Z]$)" - + "|(^[A-Z][a-z0-9]+([A-Z][a-z0-9]+)+$)|(^[A-Z][a-z0-9]+([A-Z][a-z0-9]+)+[A-Z]$)"); - - Pattern FIELD_NAME_PATTERN = Pattern.compile("^[a-z][a-zA-Z]*$"); - - Pattern ENUM_SYMBOL_PATTERN = Pattern.compile("^[A-Z][A-Z0-9_]*$"); - - /** Field names cannot contain the following values. */ - enum FieldNameNotAllowed { - LOWER_VALUE("value"), - UPPER_VALUE("Value"), - LOWER_VAL("val"), - UPPER_VAL("Val"); - - private final String name; - - FieldNameNotAllowed(String name) { - this.name = name; - } - - public String getName() { - return name; - } - } - - /** Messages. */ - enum Message { - NAME_SPACE("Namespace cannot be null and must fully lowercase dot separated without " - + "numeric. In this case the expected value is \""), - RECORD_NAME("Record name must be the conversion of the .avsc file name in UpperCamelCase " - + "and must explicitly contain the device name. The expected value is "), - TIME_FIELD("Any schema representing collected data must have a \"" + TIME - + "\" field formatted in " + Type.DOUBLE + "."), - TIME_COMPLETED_FIELD("Any " + Scope.ACTIVE + " schema must have a \"" - + TIME_COMPLETED + "\" field formatted in " - + Type.DOUBLE + "."), - NOT_TIME_COMPLETED_FIELD("\"" + TIME_COMPLETED + "\" is allow only in " - + Scope.ACTIVE + " schemas."), - TIME_RECEIVED_FIELD("Any " + Scope.PASSIVE - + " schema must have a \"" + TIME_RECEIVED + "\" field formatted in " - + Type.DOUBLE + "."), - NOT_TIME_RECEIVED_FIELD("\"" + TIME_RECEIVED + "\" is allow only in " - + Scope.PASSIVE + " schemas."), - FIELDS("Avro Record must have field list."), - FIELD_NAME("Field name does not respect lowerCamelCase name convention. It cannot contain" - + " any of the following values [" - + Stream.of(FieldNameNotAllowed.values()) - .map(FieldNameNotAllowed::getName) - .collect(Collectors.joining(",")) - + "]. Please avoid abbreviations and write out the field name instead."), - DOC("Documentation is mandatory for any schema and field. The documentation should report " - + "what is being measured, how, and what units or ranges are applicable. Abbreviations " - + "and acronyms in the documentation should be written out. The sentence must be ended " - + "by a point. Please add \"doc\" property."), - SYMBOLS("Avro Enumerator must have symbol list."), - ENUMERATION_SYMBOL("Enumerator items should be written in uppercase characters separated " - + "by underscores."), - ENUMERATION_UNKNOWN_SYMBOL("Enumerator must contain the \"" + UNKNOWN + "\" symbol. It is " - + "useful to specify default value for a field using type equals to \"enum\"."), - DEFAULT_VALUE("Any NULLABLE Avro field must specify a default value. The allowed default " - + "values are: \"UNKNOWN\" for ENUMERATION, \"MIN_VALUE\" or \"MAX_VALUE\" " - + "for nullable int and long, \"NaN\" for nullable float and double, \"true\" or " - + "\"false\" for nullable boolean, \"byte[]\" or \"null\" for bytes, and \"null\" " - + "for all the other cases."); - - private final String message; - - Message(String message) { - this.message = message; - } - - public String getMessage(Schema schema) { - return message.concat(" ").concat(schema.getFullName()).concat(" is invalid."); - } - - public String getMessage() { - return message; - } - } - - /** - * TODO. - * @param scope TODO - * @return TODO - */ - static SchemaValidationRoles validateNameSpace(Path schemaPath, Scope scope) { - String expected = ValidationSupport.getNamespace(schemaPath, scope); - - return schema -> Objects.nonNull(schema.getNamespace()) - && NAMESPACE_PATTERN.matcher(schema.getNamespace()).matches() - && schema.getNamespace().equalsIgnoreCase(expected) ? ValidationResult.valid() : - ValidationResult.invalid(Message.NAME_SPACE.getMessage().concat(expected).concat( - "\". ").concat(schema.getFullName()).concat(" is invalid.")); - } - - /** - * TODO. - * @param path TODO - * @return TODO - */ - static SchemaValidationRoles validateRecordName(Path path) { - return validateRecordName(path, false); - } - - /** - * TODO. - * @param path TODO - * @param skip TODO - * @return TODO - */ - static SchemaValidationRoles validateRecordName(Path path, boolean skip) { - String expected = ValidationSupport.getRecordName(path); - - return schema -> - skip || matches(schema.getName(), RECORD_NAME_PATTERN) - && schema.getName().equalsIgnoreCase(expected) ? ValidationResult.valid() : - ValidationResult.invalid(RECORD_NAME.getMessage().concat(expected).concat("\". ").concat( - schema.getFullName()).concat(" is invalid.")); - } - - /** - * TODO. - * @return TODO - */ - static SchemaValidationRoles validateSchemaDocumentation() { - return validate(schema -> Objects.nonNull(schema.getDoc()), DOC); - } - - /** - * TODO. - * @return TODO - */ - static SchemaValidationRoles validateFields() { - return validate(schema -> !schema.getFields().isEmpty(), FIELDS); - } - - /** - * TODO. - * @return TODO - */ - static SchemaValidationRoles validateFieldName() { - return validateFieldName(null); - } - - /** - * TODO. - * @param skip TODO - * @return TODO - */ - static SchemaValidationRoles validateFieldName(Set skip) { - return validate(schema -> { - Stream stream = schema.getFields() - .stream() - .map(Schema.Field::name); - if (skip != null && !skip.isEmpty()) { - stream = stream.filter(name -> !skip.contains(name)); - } - return stream.allMatch(name -> - matches(name, FIELD_NAME_PATTERN) - && Stream.of(FieldNameNotAllowed.values()) - .noneMatch(notAllowed -> name.contains(notAllowed.getName()))); - }, - FIELD_NAME); - } - - /** - * TODO. - * @return TODO - */ - static SchemaValidationRoles validateFieldDocumentation() { - return validate(schema -> - schema.getFields() - .stream() - .allMatch(field -> Objects.nonNull(field.doc()) - && field.doc().lastIndexOf(".") == field.doc().length() - 1) , - DOC); - } - - /** - * TODO. - * @return TODO - */ - static SchemaValidationRoles validateSymbols() { - return validate(schema -> !schema.getEnumSymbols().isEmpty(), SYMBOLS); - } - - /** - * TODO. - * @return TODO - */ - static SchemaValidationRoles validateEnumerationSymbols() { - return validate(schema -> - ValidationSupport.extractEnumerationFields(schema).stream() - .allMatch(matches(ENUM_SYMBOL_PATTERN)), - ENUMERATION_SYMBOL); - } - - /** - * TODO. - * @return TODO - */ - static SchemaValidationRoles validateDefault() { - return validate(ValidationSupport::validateDefault, DEFAULT_VALUE); - } - - /** - * TODO. - * @return TODO - */ - static SchemaValidationRoles validateTime() { - return validate(schema -> Objects.nonNull(schema.getField(TIME)) - && schema.getField(TIME).schema().getType().equals(Type.DOUBLE), TIME_FIELD); - } - - /** - * TODO. - * @return TODO - */ - static SchemaValidationRoles validateTimeCompleted() { - return validate(schema -> Objects.nonNull(schema.getField(TIME_COMPLETED)) - && schema.getField(TIME_COMPLETED).schema().getType().equals(Type.DOUBLE), - TIME_COMPLETED_FIELD); - } - - /** - * TODO. - * @return TODO - */ - static SchemaValidationRoles validateNotTimeCompleted() { - return validate(schema -> Objects.isNull(schema.getField(TIME_COMPLETED)), - NOT_TIME_COMPLETED_FIELD); - } - - /** - * TODO. - * @return TODO - */ - static SchemaValidationRoles validateTimeReceived() { - return validate(schema -> Objects.nonNull(schema.getField(TIME_RECEIVED)) - && schema.getField(TIME_RECEIVED).schema().getType().equals(Type.DOUBLE), - TIME_RECEIVED_FIELD); - } - - /** - * TODO. - * @return TODO - */ - static SchemaValidationRoles validateNotTimeReceived() { - return validate(schema -> Objects.isNull(schema.getField(TIME_RECEIVED)), - NOT_TIME_RECEIVED_FIELD); - } - - /** - * TODO. - * @return TODO - */ - static SchemaValidationRoles validateUnknownSymbol() { - return validate(schema -> ValidationSupport.extractEnumerationFields(schema).contains(UNKNOWN), - ENUMERATION_UNKNOWN_SYMBOL); - } - - /** - * TODO. - * @param predicate TODO - * @param message TODO - * @return TODO - */ - static SchemaValidationRoles validate(Predicate predicate, Message message) { - return schema -> predicate.test(schema) ? ValidationResult.valid() : ValidationResult.invalid(message.getMessage(schema)); - } - - /** - * TODO. - * @param also TODO - * @return TODO - */ - default SchemaValidationRoles and(SchemaValidationRoles also) { - return schema -> { - ValidationResult result = this.apply(schema); - return result.isValid() ? also.apply(schema) : result; - }; - } - - /** - * TODO. - * @param pathToSchema TODO - * @param root TODO - * @return TODO - */ - static SchemaValidationRoles getGeneralRecordValidator(Path pathToSchema, - Scope root) { - return validateNameSpace(pathToSchema, root) - .and(validateRecordName(pathToSchema)) - .and(validateSchemaDocumentation()) - .and(validateFields()) - .and(validateFieldName()) - .and(validateFieldDocumentation()) - .and(validateEnumerationSymbols()); - } - - /** - * TODO. - * @param pathToSchema TODO - * @param root TODO - * @param skipRecordName TODO - * @param skipFieldName TODO - * @return TODO - */ - static SchemaValidationRoles getGeneralRecordValidator(Path pathToSchema, - Scope root, boolean skipRecordName, - Set skipFieldName) { - return validateNameSpace(pathToSchema, root) - .and(validateRecordName(pathToSchema, skipRecordName)) - .and(validateSchemaDocumentation()) - .and(validateFields()) - .and(validateFieldName(skipFieldName)) - .and(validateFieldDocumentation()) - .and(validateEnumerationSymbols()); - } - - /** - * TODO. - * @param pathToSchema TODO - * @param root TODO - * @return TODO - */ - static SchemaValidationRoles getActiveValidator(Path pathToSchema, Scope root) { - return getGeneralRecordValidator(pathToSchema, root) - .and(validateTime()) - .and(validateTimeCompleted()) - .and(validateNotTimeReceived()); - } - - /** - * TODO. - * @param pathToSchema TODO - * @param root TODO - * @param skipRecordName TODO - * @param skipFieldName TODO - * @return TODO - */ - static SchemaValidationRoles getActiveValidator(Path pathToSchema, Scope root, - boolean skipRecordName, Set skipFieldName) { - return getGeneralRecordValidator(pathToSchema, root, skipRecordName, - skipFieldName) - .and(validateTime()) - .and(validateTimeCompleted()) - .and(validateNotTimeReceived()); - } - - /** - * TODO. - * @param pathToSchema TODO - * @param root TODO - * @return TODO - */ - static SchemaValidationRoles getMonitorValidator(Path pathToSchema, Scope root) { - return getGeneralRecordValidator(pathToSchema, root) - .and(validateTime()); - } - - /** - * TODO. - * @param pathToSchema TODO - * @param root TODO - * @param skipRecordName TODO - * @param skipFieldName TODO - * @return TODO - */ - static SchemaValidationRoles getMonitorValidator(Path pathToSchema, Scope root, - boolean skipRecordName, Set skipFieldName) { - return getGeneralRecordValidator(pathToSchema, root, skipRecordName, - skipFieldName) - .and(validateTime()); - } - - /** - * TODO. - * @param pathToSchema TODO - * @param root TODO - * @return TODO - */ - static SchemaValidationRoles getPassiveValidator(Path pathToSchema, Scope root) { - return getGeneralRecordValidator(pathToSchema, root) - .and(validateTime()) - .and(validateTimeReceived()) - .and(validateNotTimeCompleted()); - } - - /** - * TODO. - * @param pathToSchema TODO - * @param root TODO - * @param skipRecordName TODO - * @param skipFieldName TODO - * @return TODO - */ - static SchemaValidationRoles getPassiveValidator(Path pathToSchema, Scope root, - boolean skipRecordName, Set skipFieldName) { - return getGeneralRecordValidator(pathToSchema, root, skipRecordName, - skipFieldName) - .and(validateTime()) - .and(validateTimeReceived()) - .and(validateNotTimeCompleted()); - } - - /** - * TODO. - * @param pathToSchema TODO - * @param root TODO - * @return TODO - */ - static SchemaValidationRoles getGeneralEnumValidator(Path pathToSchema, Scope root) { - return validateNameSpace(pathToSchema, root) - .and(validateRecordName(pathToSchema)) - .and(validateSchemaDocumentation()) - .and(validateSymbols()) - .and(validateEnumerationSymbols()) - .and(validateUnknownSymbol()); - } - - /** - * TODO. - * @param pathToSchema TODO - * @param root TODO - * @param skipRecordName TODO - * @return TODO - */ - static SchemaValidationRoles getGeneralEnumValidator(Path pathToSchema, Scope root, - boolean skipRecordName) { - return validateNameSpace(pathToSchema, root) - .and(validateRecordName(pathToSchema, skipRecordName)) - .and(validateSchemaDocumentation()) - .and(validateSymbols()) - .and(validateEnumerationSymbols()) - .and(validateUnknownSymbol()); - - } - - static boolean matches(String str, Pattern pattern) { - return pattern.matcher(str).matches(); - } - - static Predicate matches(Pattern pattern) { - return str -> pattern.matcher(str).matches(); - } -} diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SchemaValidator.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SchemaValidator.java index a18c4f54..1d319275 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SchemaValidator.java +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SchemaValidator.java @@ -29,11 +29,11 @@ import java.util.Objects; import java.util.Set; -import static org.radarcns.schema.validation.SchemaValidationRoles.getActiveValidator; -import static org.radarcns.schema.validation.SchemaValidationRoles.getGeneralEnumValidator; -import static org.radarcns.schema.validation.SchemaValidationRoles.getGeneralRecordValidator; -import static org.radarcns.schema.validation.SchemaValidationRoles.getMonitorValidator; -import static org.radarcns.schema.validation.SchemaValidationRoles.getPassiveValidator; +import static org.radarcns.schema.validation.roles.SchemaValidationRoles.getActiveValidator; +import static org.radarcns.schema.validation.roles.SchemaValidationRoles.getGeneralEnumValidator; +import static org.radarcns.schema.validation.roles.SchemaValidationRoles.getGeneralRecordValidator; +import static org.radarcns.schema.validation.roles.SchemaValidationRoles.getMonitorValidator; +import static org.radarcns.schema.validation.roles.SchemaValidationRoles.getPassiveValidator; final class SchemaValidator { diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationResult.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationResult.java index 02eea46a..18fbbe14 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationResult.java +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationResult.java @@ -23,12 +23,22 @@ */ public interface ValidationResult { + ValidationResult VALID = new ValidationResult() { + public boolean isValid() { + return true; + } + + public Optional getReason() { + return Optional.empty(); + } + }; + static ValidationResult valid() { - return ValidationSupport.getValid(); + return VALID; } static ValidationResult invalid(String reason) { - return new Invalid(reason); + return new InvalidResult(reason); } boolean isValid(); diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationSupport.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationSupport.java index 34bceecf..d995b320 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationSupport.java +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationSupport.java @@ -16,52 +16,65 @@ * limitations under the License. */ -import static org.radarcns.schema.specification.util.Utils.toSnakeCase; -import static org.radarcns.schema.validation.SchemaRepository.COMMONS_PATH; -import static org.radarcns.schema.validation.SchemaValidationRoles.UNKNOWN; +import org.apache.avro.JsonProperties; +import org.apache.avro.Schema; +import org.apache.avro.Schema.Field; +import org.apache.avro.Schema.Type; +import org.radarcns.schema.Scope; import java.io.IOException; import java.nio.file.Path; +import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Objects; -import java.util.Optional; import java.util.Properties; -import org.apache.avro.JsonProperties; -import org.apache.avro.Schema; -import org.apache.avro.Schema.Field; -import org.apache.avro.Schema.Type; -import org.radarcns.schema.Scope; +import java.util.function.Predicate; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static org.radarcns.schema.specification.util.Utils.toSnakeCase; +import static org.radarcns.schema.validation.SchemaRepository.COMMONS_PATH; +import static org.radarcns.schema.validation.roles.SchemaValidationRoles.UNKNOWN; /** * TODO. */ public final class ValidationSupport { - private static final String GRADLE_PROPERTIES = "gradle.properties"; - private static final String PROPERTY_VALUE = "project.group"; - private static String projectGroup; + /** Package names. */ + public enum Package { + AGGREGATOR(".kafka.aggregator"), + BIOVOTION(".passive.biovotion"), + EMPATICA(".passive.empatica"), + KAFKA_KEY(".kafka.key"), + MONITOR(".monitor"), + PEBBLE(".passive.pebble"), + QUESTIONNAIRE(".active.questionnaire"); - static final ValidationResult VALID = new ValidationResult() { - public boolean isValid() { - return true; + private final String name; + + Package(String name) { + this.name = name; } - public Optional getReason() { - return Optional.empty(); + public String getName() { + return name; } - }; + } + private static final String GRADLE_PROPERTIES = "gradle.properties"; + private static final String PROPERTY_VALUE = "project.group"; + private static String projectGroup; + // snake case + private static final Pattern TOPIC_PATTERN = Pattern.compile( + "[A-Za-z][a-z0-9-]*(_[A-Za-z0-9-]+)*"); private ValidationSupport() { //Static class } - static ValidationResult getValid() { - return VALID; - } - /** * TODO. * @return TODO @@ -74,8 +87,8 @@ public static String getProjectGroup() { GRADLE_PROPERTIES)); projectGroup = prop.getProperty(PROPERTY_VALUE); } catch (IOException exc) { - throw new IllegalStateException(PROPERTY_VALUE.concat( - " cannot be extracted from ").concat(GRADLE_PROPERTIES), exc); + throw new IllegalStateException(PROPERTY_VALUE + + " cannot be extracted from " + GRADLE_PROPERTIES, exc); } } @@ -88,18 +101,17 @@ public static String getProjectGroup() { * @return TODO */ public static String getNamespace(Path schemaPath, Scope scope) { - String expected = getProjectGroup() + '.' + scope.getLower(); - // add subfolder of root to namespace Path rootPath = scope.getPath(COMMONS_PATH); if (rootPath == null) { throw new IllegalArgumentException("Scope " + scope + " does not have a commons path"); } Path relativePath = rootPath.relativize(schemaPath); + + String expected = getProjectGroup() + '.' + scope.getLower(); if (relativePath.getNameCount() > 1) { expected = expected + '.' + relativePath.getName(0); } - return expected; } @@ -114,6 +126,20 @@ public static String getRecordName(Path path) { return toSnakeCase(path.getFileName().toString()); } + /** + * TODO. + * @param className TODO. + * @return TODO. + */ + public static boolean isValidClass(String className) { + try { + Class.forName(className).newInstance(); + return true; + } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) { + return false; + } + } + /** * TODO. * @param root TODO @@ -133,6 +159,89 @@ public static List extractEnumerationFields(Schema root) { return symbols; } + /** + * TODO. + * @param topicName TODO + * @return TODO + */ + public static boolean isValidTopic(String topicName) { + return topicName != null && TOPIC_PATTERN.matcher(topicName).matches(); + } + + /** + * TODO. + * @param topicName TODO + * @return TODO + */ + public static String isValidTopicVerbose(String topicName) { + if (topicName == null || topicName.trim().isEmpty()) { + return "Topic is not specified."; + } + Matcher matcher = TOPIC_PATTERN.matcher(topicName); + if (matcher.find()) { + StringBuilder builder = new StringBuilder(); + builder.append("Kafka topic name is invalid (fix the string between brackets): \""); + + int start = matcher.start(); + int end = matcher.end(); + if (start > 0) { + builder.append('[') + .append(topicName.substring(0, start)) + .append(']'); + } + builder.append(topicName.substring(start, end)); + while (matcher.find()) { + start = matcher.start(); + builder.append('[') + .append(topicName.substring(end, start)) + .append(']'); + end = matcher.end(); + builder.append(topicName.substring(start, end)); + } + if (end < topicName.length()) { + builder.append('[') + .append(topicName.substring(end, topicName.length())) + .append(']'); + } + + return builder + .append(". Use lower case alphanumeric strings with underscores.") + .toString(); + } else { + return "Use lower case alphanumeric strings with underscores for Kafka topics"; + } + } + + /** + * TODO. + * @param topicNames TODO + * @return TODO + */ + public static String isValidTopicsVerbose(Collection topicNames) { + Objects.requireNonNull(topicNames); + + StringBuilder reason = new StringBuilder(topicNames.size() * 100); + boolean first = true; + String temp; + for (String value : topicNames) { + temp = isValidTopicVerbose(value); + if (!temp.isEmpty()) { + if (first) { + reason.append(temp); + first = false; + } else { + reason.append('\n'); + } + } + } + + if (first) { + return ""; + } + + return reason.toString(); + } + /** * TODO. * @param input TODO @@ -158,7 +267,9 @@ public static boolean validateDefault(Schema input) { flag = field.schema().getEnumSymbols().contains(UNKNOWN) && field.defaultVal().equals(UNKNOWN); break; - default: break; + default: + flag = field.defaultVal() == null; + break; } if (!flag) { @@ -196,6 +307,19 @@ public static boolean validateDefault(Schema input) { } }*/ + /** + * TODO. + * @param path TODO + * @return TODO + */ + public static String getMessage(Path path, ValidationResult result) { + if (result.isValid()) { + return ""; + } + + return result.getReason().orElse("INVALID") + + ' ' + path.toAbsolutePath() + " is invalid."; + } /** * TODO. @@ -206,4 +330,36 @@ public static boolean matchesExtension(Path file, String extension) { return file.toString().toLowerCase(Locale.ENGLISH) .endsWith("." + extension.toLowerCase(Locale.ENGLISH)); } + + /** + * TODO. + * @param file TODO + * @param extension TODO + * @return TODO + */ + public static boolean equalsFileName(String str, Path file, String extension) { + return equalsFileName(file, extension).test(str); + } + + + /** + * TODO. + * @param file TODO + * @param extension TODO + * @return TODO + */ + public static Predicate equalsFileName(Path file, String extension) { + return str -> { + String fileName = file.getFileName().toString(); + if (fileName.endsWith(extension)) { + fileName = fileName.substring(0, fileName.length() - extension.length()); + } + + return str.equalsIgnoreCase(fileName); + }; + } + + public static boolean nonEmpty(Collection c) { + return c != null && !c.isEmpty(); + } } diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/config/ExcludeConfig.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/config/ExcludeConfig.java index e9e675e7..e390e0d8 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/config/ExcludeConfig.java +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/config/ExcludeConfig.java @@ -98,7 +98,7 @@ private static boolean validateClass(Stream stream) { * @return TODO */ public boolean contains(Schema schema) { - return validation.containsKey(schema.getNamespace().concat(WILD_CARD_PACKAGE)) + return validation.containsKey(schema.getNamespace() + WILD_CARD_PACKAGE) || validation.containsKey(schema.getFullName()); } @@ -109,7 +109,7 @@ public boolean contains(Schema schema) { */ public boolean isNameRecordEnable(Schema schema) { ConfigItem item = validation.get(schema.getFullName()) == null - ? validation.get(schema.getNamespace().concat(WILD_CARD_PACKAGE)) + ? validation.get(schema.getNamespace() + WILD_CARD_PACKAGE) : validation.get(schema.getFullName()); return item == null || item.isNameRecordDisable(); @@ -122,7 +122,7 @@ public boolean isNameRecordEnable(Schema schema) { */ public Set skippedNameFieldCheck(Schema schema) { ConfigItem item = validation.get(schema.getFullName()) == null - ? validation.get(schema.getNamespace().concat(WILD_CARD_PACKAGE)) + ? validation.get(schema.getNamespace() + WILD_CARD_PACKAGE) : validation.get(schema.getFullName()); return item == null ? new HashSet<>() : item.getFields(); diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/ActiveSourceRoles.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/ActiveSourceRoles.java new file mode 100644 index 00000000..a7cadcee --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/ActiveSourceRoles.java @@ -0,0 +1,54 @@ +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.radarcns.schema.validation.roles; + +import org.radarcns.schema.specification.source.active.ActiveSource; +import org.radarcns.schema.specification.source.active.questionnaire.QuestionnaireSource; + +import static org.radarcns.schema.validation.roles.Validator.validateNonNull; + +/** + * TODO. + */ +public final class ActiveSourceRoles { + private static final String ASSESSMENT_TYPE = "Assessment Type should be equal to " + + ActiveSource.RadarSourceTypes.QUESTIONNAIRE.name() + "."; + private static final String TOPICS = "Topic set is invalid. It should contain only the topic" + + " specified in the configuration file."; + + + private ActiveSourceRoles() { + // utility class + } + + /** + * TODO. + * @return TODO + */ + static Validator validateAssessmentType() { + return validateNonNull(QuestionnaireSource::getQuestionnaireType, type -> type.equals( + ActiveSource.RadarSourceTypes.QUESTIONNAIRE.name()), ASSESSMENT_TYPE); + } + + /** + * TODO. + * @return TODO + */ + static Validator validateTopics() { + return validateNonNull(ActiveSource::getTopics, topics -> topics.size() == 1, TOPICS); + } +} diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/AggregatableRoles.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/AggregatableRoles.java new file mode 100644 index 00000000..4aa71122 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/AggregatableRoles.java @@ -0,0 +1,58 @@ +package org.radarcns.schema.validation.roles; + +import org.radarcns.schema.specification.util.Utils; +import org.radarcns.schema.specification.source.Aggregatable; +import org.radarcns.schema.validation.ValidationSupport; + +import static org.radarcns.schema.validation.ValidationSupport.isValidClass; +import static org.radarcns.schema.validation.roles.Validator.validateNonNull; +import static org.radarcns.schema.validation.roles.Validator.validateOrNull; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * TODO. + */ +public final class AggregatableRoles { + private static final String AGGREGATOR_PACKAGE = Utils.getProjectGroup() + + ValidationSupport.Package.AGGREGATOR.getName(); + + private static final String AGGREGATOR = "Kafka aggregator class is invalid," + + " it should must be a valid AVRO " + + "schema located at " + ValidationSupport.Package.AGGREGATOR.getName() + "."; + + private AggregatableRoles() { + // utility class + } + + /** + * TODO. + * @param nullable TODO + * @return TODO + */ + static Validator validateAggregator(boolean nullable) { + if (nullable) { + return validateOrNull(Aggregatable::getAggregator, + aggregator -> aggregator.startsWith(AGGREGATOR_PACKAGE) + && isValidClass(aggregator), AGGREGATOR); + } else { + return validateNonNull(Aggregatable::getAggregator, + aggregator -> aggregator.startsWith(AGGREGATOR_PACKAGE) + && isValidClass(aggregator), AGGREGATOR); + } + } +} diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/MonitorRoles.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/MonitorRoles.java new file mode 100644 index 00000000..a85428b9 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/MonitorRoles.java @@ -0,0 +1,62 @@ +package org.radarcns.schema.validation.roles; + +import org.radarcns.schema.specification.source.MonitorSource; +import org.radarcns.schema.specification.util.Utils; + +import java.nio.file.Path; +import java.util.Collections; +import java.util.Set; + +import static org.radarcns.schema.specification.SourceCatalogue.YAML_EXTENSION; +import static org.radarcns.schema.validation.ValidationSupport.equalsFileName; +import static org.radarcns.schema.validation.roles.Validator.validateNonNull; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * TODO. + */ +public final class MonitorRoles { + private static final Set ALLOWED_PROVIDERS = Collections.singleton( + Utils.getProjectGroup() + ".application.ApplicationServiceProvider"); + + private static final String APP_PROVIDER = "App provider should be equal to one of the" + + " following values: " + ALLOWED_PROVIDERS + "."; + private static final String SOURCE_TYPE = "Source type should match file name."; + + private MonitorRoles() { + // utility class + } + + /** + * TODO. + * @return TODO + */ + static Validator validateAppProvider() { + return validateNonNull(MonitorSource::getAppProvider, ALLOWED_PROVIDERS::contains, + APP_PROVIDER); + } + + /** + * TODO. + * @return TODO + */ + static Validator validateSourceType(Path file) { + return validateNonNull(MonitorSource::getType, equalsFileName(file, YAML_EXTENSION), + SOURCE_TYPE); + } +} diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/PassiveSourceRoles.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/PassiveSourceRoles.java new file mode 100644 index 00000000..56da46b9 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/PassiveSourceRoles.java @@ -0,0 +1,99 @@ +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.radarcns.schema.validation.roles; + +import org.radarcns.schema.specification.SourceCatalogue; +import org.radarcns.schema.specification.source.passive.PassiveSource; +import org.radarcns.schema.specification.util.Utils; + +import java.nio.file.Path; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +import static org.radarcns.schema.validation.ValidationSupport.equalsFileName; +import static org.radarcns.schema.validation.roles.Validator.validate; +import static org.radarcns.schema.validation.roles.Validator.validateNonNull; +import static org.radarcns.schema.validation.roles.Validator.validateOrNull; + +/** + * TODO. + */ +public final class PassiveSourceRoles { + public static final Set RADAR_PROVIDERS = new HashSet<>(Arrays.asList( + Utils.getProjectGroup() + ".phone.PhoneLocationProvider", + Utils.getProjectGroup() + ".phone.PhoneLogProvider", + Utils.getProjectGroup() + ".phone.PhoneUsageProvider", + Utils.getProjectGroup() + ".phone.PhoneSensorProvider", + Utils.getProjectGroup() + ".biovotion.BiovotionServiceProvider", + Utils.getProjectGroup() + ".empatica.E4ServiceProvider", + Utils.getProjectGroup() + ".pebble.PebbleServiceProvider" + )); + + /** Messages. */ + private static final String APP_PROVIDER = "App provider must be equal to one of the following " + + RADAR_PROVIDERS + "."; + private static final String SENSORS = "Sensor list cannot be null or empty and cannot contain" + + " two sensors with the same name"; + private static final String TYPE = "Passive Source Type should be the concatenation of vendor" + + " and name values in uppercase separated by underscore."; + private static final String VENDOR_AND_NAME = "Vendor and name values cannot be null." + + " The concatenation of vendor with \"_\" and name should be equal to the source file" + + " name in lowercase."; + + private PassiveSourceRoles() { + // utility class + } + + /** + * TODO. + * @return TODO + */ + static Validator validateAppProvider() { + return validateOrNull(PassiveSource::getAppProvider, RADAR_PROVIDERS::contains, + APP_PROVIDER); + } + + /** + * TODO. + * @return TODO + */ + static Validator validateModelAndVendor(Path file) { + return validate(passive -> Objects.nonNull(passive.getVendor()) + && Objects.nonNull(passive.getModel()) + && equalsFileName(passive.getVendor() + '_' + passive.getModel(), + file, SourceCatalogue.YAML_EXTENSION), VENDOR_AND_NAME); + } + + /** + * TODO. + * @return TODO + */ + static Validator validateSensors() { + return validateNonNull(PassiveSource::getSensors, sensors -> !sensors.isEmpty() + && new HashSet<>(sensors).size() == sensors.size(), SENSORS); + } + + /** + * TODO. + * @return TODO + */ + static Validator validateSourceType() { + return validateNonNull(PassiveSource::getType, TYPE); + } +} diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/ProcessorRoles.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/ProcessorRoles.java new file mode 100644 index 00000000..c7408207 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/ProcessorRoles.java @@ -0,0 +1,56 @@ +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.radarcns.schema.validation.roles; + +import org.radarcns.catalogue.ProcessingState; +import org.radarcns.catalogue.SensorName; +import org.radarcns.schema.specification.source.passive.Processor; + +import static org.radarcns.schema.validation.roles.Validator.validateNonNull; + +/** + * TODO. + */ +public final class ProcessorRoles { + + private static final String DATA_TYPE = "Processor data type should be equal to " + + ProcessingState.RADAR.name() + "."; + private static final String NAME = "Processor name should be not null and different from " + + SensorName.UNKNOWN.name() + "."; + + private ProcessorRoles() { + // utility class + } + + /** + * TODO. + * @return TODO + */ + static Validator validateDataType() { + return validateNonNull(Processor::getProcessingState, ProcessingState.RADAR::equals, + DATA_TYPE); + } + + /** + * TODO. + * @return TODO + */ + static Validator validateName() { + return validateNonNull(Processor::getName, + name -> !name.equalsIgnoreCase(SensorName.UNKNOWN.name()), NAME); + } +} diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/QuestionRoles.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/QuestionRoles.java new file mode 100644 index 00000000..ac533720 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/QuestionRoles.java @@ -0,0 +1,74 @@ +package org.radarcns.schema.validation.roles; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import org.radarcns.catalogue.RadarWidget; +import org.radarcns.schema.specification.source.active.questionnaire.Question; + +import static org.radarcns.schema.validation.roles.Validator.validateNonNull; + +/** + * TODO. + */ +public final class QuestionRoles { + private static final String CONTENT = "Question content cannot be null and should be ended by" + + " a point."; + private static final String LEAD = "Question lead cannot be null and should be ended by a" + + " question mark."; + private static final String WIDGET = "Widget cannot be null and must be different from " + + RadarWidget.UNKNOWN.name() + '.'; + private static final String RESPONSES = "Responses list cannot be null or empty."; + + + private QuestionRoles() { + // utility class + } + + /** + * TODO. + * @return TODO + */ + static Validator validateContent() { + return validateNonNull(Question::getContent, content -> content.endsWith("."), CONTENT); + } + + /** + * TODO. + * @return TODO + */ + static Validator validateLead() { + return validateNonNull(Question::getLead, lead -> lead.endsWith("?"), LEAD); + } + + /** + * TODO. + * @return TODO + */ + static Validator validateWidget() { + return validateNonNull(Question::getWidget, widget -> widget != RadarWidget.UNKNOWN, + WIDGET); + } + + /** + * TODO. + * @return TODO + */ + static Validator validateResponses() { + return validateNonNull(Question::getResponses, responses -> !responses.isEmpty(), + RESPONSES); + } +} diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/QuestionnaireRoles.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/QuestionnaireRoles.java new file mode 100644 index 00000000..06006231 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/QuestionnaireRoles.java @@ -0,0 +1,58 @@ +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.radarcns.schema.validation.roles; + +import org.radarcns.schema.specification.source.active.questionnaire.QuestionnaireSource; + +import java.nio.file.Path; + +import static org.radarcns.schema.specification.SourceCatalogue.YAML_EXTENSION; +import static org.radarcns.schema.validation.ValidationSupport.equalsFileName; +import static org.radarcns.schema.validation.roles.Validator.validateNonEmpty; +import static org.radarcns.schema.validation.roles.Validator.validateNonNull; + +/** + * TODO. + */ +public final class QuestionnaireRoles { + + private static final String QUESTIONS = "Questions list cannot null or empty."; + private static final String QUESTIONNAIRE_TYPE = "Questionnaire Type cannot be null" + + " and should match with the configuration file name."; + + private QuestionnaireRoles() { + // utility class + } + + /** + * TODO. + * @return TODO + */ + static Validator validateQuestionnaireType(Path file) { + return validateNonNull(QuestionnaireSource::getQuestionnaireType, + equalsFileName(file, YAML_EXTENSION), + QUESTIONNAIRE_TYPE); + } + + /** + * TODO. + * @return TODO + */ + static Validator validateQuestions() { + return validateNonEmpty(QuestionnaireSource::getQuestions, QUESTIONS); + } +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/Message.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/ResponseRoles.java similarity index 52% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/Message.java rename to java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/ResponseRoles.java index f80f686e..a13e53c4 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/validator/Message.java +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/ResponseRoles.java @@ -1,5 +1,3 @@ -package org.radarcns.schema.specification.validator; - /* * Copyright 2017 King's College London and The Hyve * @@ -16,21 +14,36 @@ * limitations under the License. */ +package org.radarcns.schema.validation.roles; + +import org.radarcns.schema.specification.source.active.questionnaire.Response; + +import static org.radarcns.schema.validation.roles.Validator.validateNonNull; + /** * TODO. */ -public interface Message { +public final class ResponseRoles { + private static final String SCORE = "Answer score cannot be null."; + private static final String TEXT = "Answer text cannot be null."; + + private ResponseRoles() { + // utility class + } /** * TODO. * @return TODO */ - String getMessage(); + static Validator validateScore() { + return validateNonNull(Response::getScore, SCORE); + } /** * TODO. - * @param info TODO * @return TODO */ - String getMessage(String info); + static Validator validateText() { + return validateNonNull(Response::getText, TEXT); + } } diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/SchemaValidationRoles.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/SchemaValidationRoles.java new file mode 100644 index 00000000..4a4b9cbe --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/SchemaValidationRoles.java @@ -0,0 +1,461 @@ +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.radarcns.schema.validation.roles; + +import org.apache.avro.Schema; +import org.apache.avro.Schema.Type; +import org.radarcns.schema.Scope; +import org.radarcns.schema.validation.ValidationSupport; + +import java.nio.file.Path; +import java.util.Arrays; +import java.util.Objects; +import java.util.Set; +import java.util.function.Function; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.radarcns.schema.validation.ValidationSupport.extractEnumerationFields; +import static org.radarcns.schema.validation.ValidationSupport.nonEmpty; +import static org.radarcns.schema.validation.roles.Validator.matches; +import static org.radarcns.schema.validation.roles.Validator.validate; +import static org.radarcns.schema.validation.roles.Validator.validateNonEmpty; +import static org.radarcns.schema.validation.roles.Validator.validateNonNull; + + +/** + * TODO. + */ +@SuppressWarnings("PMD.GodClass") +//TODO split in record and enumerator. +public final class SchemaValidationRoles { + + static final String TIME = "time"; + private static final String TIME_RECEIVED = "timeReceived"; + private static final String TIME_COMPLETED = "timeCompleted"; + + public static final String UNKNOWN = "UNKNOWN"; + + static final Pattern NAMESPACE_PATTERN = Pattern.compile("^[a-z][a-z.]*$"); + + static final Pattern RECORD_NAME_PATTERN = Pattern.compile("(^[A-Z][a-z]+)" + + "|(^[A-Z][a-z0-9]+[A-Z]$)" + + "|(^[A-Z][a-z0-9]+([A-Z][a-z0-9]+)+$)" + + "|(^[A-Z][a-z0-9]+([A-Z][a-z0-9]+)+[A-Z]$)"); + + static final Pattern FIELD_NAME_PATTERN = Pattern.compile("^[a-z][a-zA-Z]*$"); + + static final Pattern ENUM_SYMBOL_PATTERN = Pattern.compile("^[A-Z][A-Z0-9_]*$"); + + /** Field names cannot contain the following values. */ + enum FieldNameNotAllowed { + LOWER_VALUE("value"), + UPPER_VALUE("Value"), + LOWER_VAL("val"), + UPPER_VAL("Val"); + + private final String name; + + FieldNameNotAllowed(String name) { + this.name = name; + } + + public String getName() { + return name; + } + } + + private static final String NAME_SPACE = "Namespace cannot be null and must fully lowercase dot" + + " separated without numeric. In this case the expected value is \""; + private static final String RECORD_NAME = "Record name must be the conversion of the .avsc file" + + " name in UpperCamelCase and must explicitly contain the device name." + + " The expected value is "; + private static final String TIME_FIELD = "Any schema representing collected data must have a \"" + + TIME + "\" field formatted in " + Type.DOUBLE + "."; + private static final String TIME_COMPLETED_FIELD = "Any " + Scope.ACTIVE + + " schema must have a \"" + TIME_COMPLETED + "\" field formatted in " + + Type.DOUBLE + "."; + private static final String NOT_TIME_COMPLETED_FIELD = "\"" + TIME_COMPLETED + + "\" is allow only in " + Scope.ACTIVE + " schemas."; + private static final String TIME_RECEIVED_FIELD = "Any " + Scope.PASSIVE + + " schema must have a \"" + TIME_RECEIVED + "\" field formatted in " + + Type.DOUBLE + "."; + private static final String NOT_TIME_RECEIVED_FIELD = "\"" + TIME_RECEIVED + + "\" is allow only in " + Scope.PASSIVE + " schemas."; + private static final String FIELDS = "Avro Record must have field list."; + private static final String FIELD_NAME = "Field name does not respect lowerCamelCase name" + + " convention. It cannot contain any of the following values [" + + Arrays.stream(FieldNameNotAllowed.values()) + .map(FieldNameNotAllowed::getName) + .collect(Collectors.joining(", ")) + + "]. Please avoid abbreviations and write out the field name instead."; + private static final String DOC = "Documentation is mandatory for any schema and field." + + " The documentation should report " + + "what is being measured, how, and what units or ranges are applicable. Abbreviations " + + "and acronyms in the documentation should be written out. The sentence must be ended " + + "by a point. Please add \"doc\" property."; + private static final String SYMBOLS = "Avro Enumerator must have symbol list."; + private static final String ENUMERATION_SYMBOL = "Enumerator items should be written in" + + " uppercase characters separated by underscores."; + private static final String ENUMERATION_UNKNOWN_SYMBOL = "Enumerator must contain the \"" + + UNKNOWN + "\" symbol. It is useful to specify default value for a field using type" + + " equals to \"enum\"."; + private static final String DEFAULT_VALUE = "Any NULLABLE Avro field must specify a default" + + " value. The allowed default values are: \"UNKNOWN\" for ENUMERATION, and \"null\" " + + "for all the other cases."; + + private SchemaValidationRoles() { + // utility class + } + + /** + * TODO. + * @param scope TODO + * @return TODO + */ + public static Validator validateNameSpace(Path schemaPath, Scope scope) { + String expected = ValidationSupport.getNamespace(schemaPath, scope); + + return validateNonNull(Schema::getNamespace, + namespace -> matches(namespace, NAMESPACE_PATTERN) + && namespace.equalsIgnoreCase(expected), + schema -> NAME_SPACE + expected + "\". " + schema.getFullName() + " is invalid."); + } + + /** + * TODO. + * @param path TODO + * @return TODO + */ + public static Validator validateRecordName(Path path) { + return validateRecordName(path, false); + } + + /** + * TODO. + * @param path TODO + * @param skip TODO + * @return TODO + */ + public static Validator validateRecordName(Path path, boolean skip) { + String expected = ValidationSupport.getRecordName(path); + + return validate(schema -> skip + || matches(schema.getName(), RECORD_NAME_PATTERN) + && schema.getName().equalsIgnoreCase(expected), + schema -> RECORD_NAME + '"' + expected + "\". " + schema.getFullName() + + " is invalid."); + } + + /** + * TODO. + * @return TODO + */ + public static Validator validateSchemaDocumentation() { + return validateNonNull(Schema::getDoc, doc -> doc.charAt(doc.length() - 1) == '.', + message(DOC)); + } + + /** + * TODO. + * @return TODO + */ + public static Validator validateFields() { + return validateNonEmpty(Schema::getFields, message(FIELDS)); + } + + /** + * TODO. + * @return TODO + */ + public static Validator validateFieldName() { + return validateFieldName(null); + } + + /** + * TODO. + * @param skip TODO + * @return TODO + */ + public static Validator validateFieldName(Set skip) { + return validate(schema -> { + Stream stream = schema.getFields() + .stream() + .map(Schema.Field::name); + if (skip != null && !skip.isEmpty()) { + stream = stream.filter(name -> !skip.contains(name)); + } + return stream.allMatch(name -> + matches(name, FIELD_NAME_PATTERN) + && Stream.of(FieldNameNotAllowed.values()) + .noneMatch(notAllowed -> name.contains(notAllowed.getName()))); + }, message(FIELD_NAME)); + } + + /** + * TODO. + * @return TODO + */ + public static Validator validateFieldDocumentation() { + return validate(schema -> + schema.getFields() + .stream() + .allMatch(field -> field.doc() != null + && field.doc().charAt(field.doc().length() - 1) == '.'), + message(DOC)); + } + + /** + * TODO. + * @return TODO + */ + public static Validator validateSymbols() { + return validate(schema -> nonEmpty(schema.getEnumSymbols()), message(SYMBOLS)); + } + + /** + * TODO. + * @return TODO + */ + public static Validator validateEnumerationSymbols() { + return validate(schema -> + extractEnumerationFields(schema).stream().allMatch(matches(ENUM_SYMBOL_PATTERN)), + message(ENUMERATION_SYMBOL)); + } + + /** + * TODO. + * @return TODO + */ + public static Validator validateDefault() { + return validate(ValidationSupport::validateDefault, message(DEFAULT_VALUE)); + } + + /** + * TODO. + * @return TODO + */ + public static Validator validateTime() { + return validateNonNull(s -> s.getField(TIME), + time -> time.schema().getType().equals(Type.DOUBLE), message(TIME_FIELD)); + } + + /** + * TODO. + * @return TODO + */ + public static Validator validateTimeCompleted() { + return validateNonNull(s -> s.getField(TIME_COMPLETED), + time -> time.schema().getType().equals(Type.DOUBLE), message(TIME_COMPLETED_FIELD)); + } + + /** + * TODO. + * @return TODO + */ + public static Validator validateNotTimeCompleted() { + return validate(schema -> Objects.isNull(schema.getField(TIME_COMPLETED)), + message(NOT_TIME_COMPLETED_FIELD)); + } + + /** + * TODO. + * @return TODO + */ + public static Validator validateTimeReceived() { + return validateNonNull(s -> s.getField(TIME_RECEIVED), + time -> time.schema().getType().equals(Type.DOUBLE), message(TIME_RECEIVED_FIELD)); + } + + /** + * TODO. + * @return TODO + */ + public static Validator validateNotTimeReceived() { + return validate(schema -> Objects.isNull(schema.getField(TIME_RECEIVED)), + message(NOT_TIME_RECEIVED_FIELD)); + } + + /** + * TODO. + * @return TODO + */ + public static Validator validateUnknownSymbol() { + return validate(schema -> extractEnumerationFields(schema).contains(UNKNOWN), + message(ENUMERATION_UNKNOWN_SYMBOL)); + } + + /** + * TODO. + * @param pathToSchema TODO + * @param root TODO + * @return TODO + */ + public static Validator getGeneralRecordValidator(Path pathToSchema, + Scope root) { + return validateNameSpace(pathToSchema, root) + .and(validateRecordName(pathToSchema)) + .and(validateSchemaDocumentation()) + .and(validateFields()) + .and(validateFieldName()) + .and(validateFieldDocumentation()) + .and(validateEnumerationSymbols()); + } + + /** + * TODO. + * @param pathToSchema TODO + * @param root TODO + * @param skipRecordName TODO + * @param skipFieldName TODO + * @return TODO + */ + public static Validator getGeneralRecordValidator(Path pathToSchema, + Scope root, boolean skipRecordName, + Set skipFieldName) { + return validateNameSpace(pathToSchema, root) + .and(validateRecordName(pathToSchema, skipRecordName)) + .and(validateSchemaDocumentation()) + .and(validateFields()) + .and(validateFieldName(skipFieldName)) + .and(validateFieldDocumentation()) + .and(validateEnumerationSymbols()); + } + + /** + * TODO. + * @param pathToSchema TODO + * @param root TODO + * @return TODO7 + */ + public static Validator getActiveValidator(Path pathToSchema, Scope root) { + return getGeneralRecordValidator(pathToSchema, root) + .and(validateTime()) + .and(validateTimeCompleted()) + .and(validateNotTimeReceived()); + } + + /** + * TODO. + * @param pathToSchema TODO + * @param root TODO + * @param skipRecordName TODO + * @param skipFieldName TODO + * @return TODO + */ + public static Validator getActiveValidator(Path pathToSchema, Scope root, + boolean skipRecordName, Set skipFieldName) { + return getGeneralRecordValidator(pathToSchema, root, skipRecordName, + skipFieldName) + .and(validateTime()) + .and(validateTimeCompleted()) + .and(validateNotTimeReceived()); + } + + /** + * TODO. + * @param pathToSchema TODO + * @param root TODO + * @return TODO + */ + public static Validator getMonitorValidator(Path pathToSchema, Scope root) { + return getGeneralRecordValidator(pathToSchema, root) + .and(validateTime()); + } + + /** + * TODO. + * @param pathToSchema TODO + * @param root TODO + * @param skipRecordName TODO + * @param skipFieldName TODO + * @return TODO + */ + public static Validator getMonitorValidator(Path pathToSchema, Scope root, + boolean skipRecordName, Set skipFieldName) { + return getGeneralRecordValidator(pathToSchema, root, skipRecordName, + skipFieldName) + .and(validateTime()); + } + + /** + * TODO. + * @param pathToSchema TODO + * @param root TODO + * @return TODO + */ + public static Validator getPassiveValidator(Path pathToSchema, Scope root) { + return getGeneralRecordValidator(pathToSchema, root) + .and(validateTime()) + .and(validateTimeReceived()) + .and(validateNotTimeCompleted()); + } + + /** + * TODO. + * @param pathToSchema TODO + * @param root TODO + * @param skipRecordName TODO + * @param skipFieldName TODO + * @return TODO + */ + public static Validator getPassiveValidator(Path pathToSchema, Scope root, + boolean skipRecordName, Set skipFieldName) { + return getGeneralRecordValidator(pathToSchema, root, skipRecordName, + skipFieldName) + .and(validateTime()) + .and(validateTimeReceived()) + .and(validateNotTimeCompleted()); + } + + /** + * TODO. + * @param pathToSchema TODO + * @param root TODO + * @return TODO + */ + public static Validator getGeneralEnumValidator(Path pathToSchema, Scope root) { + return validateNameSpace(pathToSchema, root) + .and(validateRecordName(pathToSchema)) + .and(validateSchemaDocumentation()) + .and(validateSymbols()) + .and(validateEnumerationSymbols()) + .and(validateUnknownSymbol()); + } + + /** + * TODO. + * @param pathToSchema TODO + * @param root TODO + * @param skipRecordName TODO + * @return TODO + */ + public static Validator getGeneralEnumValidator(Path pathToSchema, Scope root, + boolean skipRecordName) { + return validateNameSpace(pathToSchema, root) + .and(validateRecordName(pathToSchema, skipRecordName)) + .and(validateSchemaDocumentation()) + .and(validateSymbols()) + .and(validateEnumerationSymbols()) + .and(validateUnknownSymbol()); + } + + private static Function message(String text) { + return schema -> text + ' ' + schema.getFullName() + " is invalid."; + } +} diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/SensorRoles.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/SensorRoles.java new file mode 100644 index 00000000..1a44b9c6 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/SensorRoles.java @@ -0,0 +1,69 @@ +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.radarcns.schema.validation.roles; + +import org.radarcns.catalogue.ProcessingState; +import org.radarcns.catalogue.SensorName; +import org.radarcns.schema.specification.source.passive.Sensor; + +import static org.radarcns.schema.validation.roles.PassiveSourceRoles.RADAR_PROVIDERS; +import static org.radarcns.schema.validation.roles.Validator.validateNonNull; +import static org.radarcns.schema.validation.roles.Validator.validateOrNull; + +/** + * TODO. + */ +public final class SensorRoles { + private static final String APP_PROVIDER = + "App provider must be equal to one of the following: " + RADAR_PROVIDERS + "."; + private static final String DATA_TYPE = + "Sensor data type cannot be null and should differ from " + + ProcessingState.UNKNOWN.name() + "."; + private static final String NAME = + "Sensor name cannot be not null and should different from " + + SensorName.UNKNOWN.name() + "."; + + private SensorRoles() { + // utility class + } + + /** + * TODO. + * @return TODO + */ + static Validator validateAppProvider() { + return validateOrNull(Sensor::getAppProvider, RADAR_PROVIDERS::contains, APP_PROVIDER); + } + + /** + * TODO. + * @return TODO + */ + static Validator validateDataType() { + return validateNonNull(Sensor::getProcessingState, + state -> !state.name().equals(ProcessingState.UNKNOWN.name()), DATA_TYPE); + } + + /** + * TODO. + * @return TODO + */ + static Validator validateName() { + return validateNonNull(Sensor::getName, + name -> name.name().equals(SensorName.UNKNOWN.name()), NAME); + } +} diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/TopicRoles.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/TopicRoles.java new file mode 100644 index 00000000..d2ab5ccb --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/TopicRoles.java @@ -0,0 +1,91 @@ +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.radarcns.schema.validation.roles; + +import org.radarcns.schema.specification.source.Topic; +import org.radarcns.schema.specification.util.Utils; +import org.radarcns.schema.validation.InvalidResult; +import org.radarcns.schema.validation.ValidationSupport; + +import java.util.Collection; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +import static org.radarcns.schema.validation.ValidationResult.VALID; +import static org.radarcns.schema.validation.ValidationSupport.isValidClass; +import static org.radarcns.schema.validation.ValidationSupport.isValidTopic; +import static org.radarcns.schema.validation.roles.Validator.validate; +import static org.radarcns.schema.validation.roles.Validator.validateNonNull; + +/** + * TODO. + */ +public final class TopicRoles { + public static final String TOPIC_KEY_PACKAGE = Utils.getProjectGroup() + + ValidationSupport.Package.KAFKA_KEY.getName(); + + /** Messages. */ + private static final String KEY = "Kafka key class is invalid, cannot be null and must be a" + + " valid AVRO schema located at " + TOPIC_KEY_PACKAGE + "."; + private static final String TOPIC = "Topic name is invalid."; + private static final String VALUE = "Kafka value class is invalid. It cannot be null and must" + + " be a valida AVRO schema located at"; + + private TopicRoles() { + // utility class + } + + /** + * TODO. + * @return TODO + */ + static Validator validateKey() { + return validateNonNull(Topic::getInputKey, + key -> key.startsWith(TOPIC_KEY_PACKAGE) && isValidClass(key), KEY); + } + + /** + * TODO. + * @return TODO + */ + static Validator validateValue(ValidationSupport.Package packageName) { + Objects.requireNonNull(packageName); + return validateNonNull(Topic::getInputValue, + value -> value.startsWith(Utils.getProjectGroup() + packageName.getName()) + && isValidClass(value), VALUE); + } + + /** + * TODO. + * @return TODO + */ + static Validator validateTopic() { + return validate(ValidationSupport::isValidTopic, + topic -> TOPIC + ValidationSupport.isValidTopicVerbose(topic)); + } + + static Validator> validateTopics() { + return topics -> { + List invalidTopics = topics.stream() + .filter(topic -> !isValidTopic(topic)) + .collect(Collectors.toList()); + return invalidTopics.isEmpty() ? VALID + : new InvalidResult(TOPIC + ValidationSupport.isValidTopicsVerbose(topics)); + }; + } +} diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/Validator.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/Validator.java new file mode 100644 index 00000000..fa539806 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/Validator.java @@ -0,0 +1,173 @@ + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.radarcns.schema.validation.roles; + +import org.radarcns.schema.validation.InvalidResult; +import org.radarcns.schema.validation.ValidationResult; + +import java.util.Collection; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.regex.Pattern; + +/** + * TODO. + */ +public interface Validator extends Function { + /** + * TODO. + * @param predicate TODO + * @param message TODO + * @return TODO + */ + static Validator validate(Predicate predicate, String message) { + return object -> predicate.test(object) ? ValidationResult.VALID + : new InvalidResult(message); + } + + /** + * TODO. + * @param predicate TODO + * @param message TODO + * @return TODO + */ + static Validator validate(Predicate predicate, Function message) { + return object -> predicate.test(object) + ? ValidationResult.VALID + : new InvalidResult(message.apply(object)); + } + + /** + * TODO. + * @param predicate TODO + * @param message TODO + * @return TODO + */ + static Validator validateNonNull(Predicate predicate, String message) { + return validate(o -> o != null && predicate.test(o), message); + } + + /** + * TODO. + * @param predicate TODO + * @param message TODO + * @return TODO + */ + static Validator validateNonNull(Function property, Predicate predicate, + Function message) { + return validate(o -> { + V val = property.apply(o); + return val != null && predicate.test(val); + }, message); + } + + /** + * TODO. + * @param predicate TODO + * @param message TODO + * @return TODO + */ + static Validator validateNonNull(Function property, Predicate predicate, + String message) { + return validate(o -> { + V val = property.apply(o); + return val != null && predicate.test(val); + }, message); + } + + /** + * TODO. + * @param message TODO + * @return TODO + */ + static Validator validateNonNull(Function property, String message) { + return validate(o -> property.apply(o) != null, message); + } + + /** + * TODO. + * @param message TODO + * @return TODO + */ + static > Validator validateNonEmpty(Function property, + String message) { + return validate(o -> { + V val = property.apply(o); + return val != null && !val.isEmpty(); + }, message); + } + + + /** + * TODO. + * @param message TODO + * @return TODO + */ + static > Validator validateNonEmpty(Function property, + Function message) { + return validate(o -> { + V val = property.apply(o); + return val != null && !val.isEmpty(); + }, message); + } + + + /** + * TODO. + * @param predicate TODO + * @param message TODO + * @return TODO + */ + static Validator validateOrNull(Predicate predicate, String message) { + return validate(o -> o == null || predicate.test(o), message); + } + + /** + * TODO. + * @param predicate TODO + * @param message TODO + * @return TODO + */ + static Validator validateOrNull(Function property, Predicate predicate, + String message) { + return validate(o -> { + V val = property.apply(o); + return val == null || predicate.test(val); + }, message); + } + + /** + * TODO. + * @param other TODO + * @return TODO + */ + default Validator and(Validator other) { + return object -> { + final ValidationResult result = this.apply(object); + return result.isValid() ? other.apply(object) : result; + }; + } + + static boolean matches(String str, Pattern pattern) { + return pattern.matcher(str).matches(); + } + + static Predicate matches(Pattern pattern) { + return str -> pattern.matcher(str).matches(); + } +} diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/ActiveValidation.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/ActiveValidation.java similarity index 93% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/ActiveValidation.java rename to java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/ActiveValidation.java index e8a83a69..55cfca3e 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/ActiveValidation.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/ActiveValidation.java @@ -1,4 +1,4 @@ -package org.radarcns.schema.specification; +package org.radarcns.schema.validation; /* * Copyright 2017 King's College London and The Hyve @@ -34,7 +34,7 @@ public void validate() throws IOException { File file = new File(BASE_PATH.resolve( NameFolder.ACTIVE.getName()).resolve( - type.name().toLowerCase().concat(YAML_EXTENSION)).toUri()); + type.name().toLowerCase() + YAML_EXTENSION)).toUri()); QuestionnaireSource source = new YamlConfigLoader().load(file, QuestionnaireSource.class); diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/MonitorValidation.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/MonitorValidation.java similarity index 91% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/MonitorValidation.java rename to java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/MonitorValidation.java index 33356507..61c859a0 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/MonitorValidation.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/MonitorValidation.java @@ -1,4 +1,4 @@ -package org.radarcns.schema.specification; +package org.radarcns.schema.validation; /* * Copyright 2017 King's College London and The Hyve @@ -34,7 +34,7 @@ public void validate() throws IOException { File file = new File(BASE_PATH.resolve( NameFolder.MONITOR.getName()).resolve( - type.name().toLowerCase().concat(YAML_EXTENSION)).toUri()); + type.name().toLowerCase() + YAML_EXTENSION)).toUri()); MonitorSource source = new YamlConfigLoader().load(file, MonitorSource.class); diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/PassiveValidation.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/PassiveValidation.java similarity index 93% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/PassiveValidation.java rename to java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/PassiveValidation.java index 07bacf91..29115211 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/PassiveValidation.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/PassiveValidation.java @@ -1,4 +1,4 @@ -package org.radarcns.schema.specification; +package org.radarcns.schema.validation; /* * Copyright 2017 King's College London and The Hyve @@ -19,7 +19,6 @@ import org.junit.BeforeClass; import org.junit.Test; import org.radarcns.schema.specification.source.passive.PassiveSource; -import org.radarcns.schema.specification.validator.ValidationSupport; import java.io.IOException; import java.util.HashMap; @@ -56,7 +55,7 @@ public void validate() throws IOException { File file = new File(BASE_PATH.resolve( NameFolder.PASSIVE.getName()).resolve( - type.name().toLowerCase().concat(YAML_EXTENSION)).toUri()); + type.name().toLowerCase() + YAML_EXTENSION)).toUri()); PassiveSource source = new YamlConfigLoader().load(file, PassiveSource.class); diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java index fc027be4..a158a749 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java @@ -18,7 +18,6 @@ import org.apache.avro.Schema; import org.apache.avro.SchemaBuilder; -import org.junit.Assert; import org.junit.Test; import java.nio.file.Path; @@ -43,7 +42,7 @@ public void testGetPath() { String expected = "/RADAR-Schemas/commons/monitor/application/" + "application_external_time.avsc"; - Assert.assertEquals(expected, SchemaValidator.getPath(path)); + assertEquals(expected, SchemaValidator.getPath(path)); } @Test @@ -59,7 +58,7 @@ public void testEnumerator() { .doc(documentation) .symbols("CONNECTED", "DISCONNECTED", "UNKNOWN"); - ValidationResult result = SchemaValidator.validate(schema, schemaPath, MONITOR); + ValidationResult result = validate(schema, schemaPath, MONITOR); assertTrue(result.isValid()); @@ -68,7 +67,7 @@ public void testEnumerator() { .doc(documentation) .symbols("CONNECTED", "DISCONNECTED", "un_known"); - result = SchemaValidator.validate(schema, schemaPath, MONITOR); + result = validate(schema, schemaPath, MONITOR); assertFalse(result.isValid()); } diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/SourceCatalogueValidation.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SourceCatalogueValidation.java similarity index 81% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/SourceCatalogueValidation.java rename to java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SourceCatalogueValidation.java index cd5cde09..2e39b130 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/SourceCatalogueValidation.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SourceCatalogueValidation.java @@ -1,4 +1,4 @@ -package org.radarcns.schema.specification; +package org.radarcns.schema.validation; /* * Copyright 2017 King's College London and The Hyve @@ -18,7 +18,9 @@ import org.junit.BeforeClass; import org.junit.Test; +import org.radarcns.schema.specification.SourceCatalogue; import org.radarcns.schema.specification.source.MonitorSource; +import org.radarcns.schema.specification.source.active.ActiveSource; import org.radarcns.schema.specification.source.active.questionnaire.QuestionnaireSource; import org.radarcns.schema.specification.source.passive.PassiveSource; import org.slf4j.Logger; @@ -32,7 +34,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.radarcns.schema.specification.SourceCatalogue.BASE_PATH; -import static org.radarcns.schema.specification.validator.ValidationSupport.isValidTopic; +import static org.radarcns.schema.validation.ValidationSupport.isValidTopic; /** * TODO. @@ -51,19 +53,21 @@ public void checkActiveSourceType() { assertTrue("Not all " + QuestionnaireSource.RadarSourceTypes.class.getName() + " have a specification", Arrays.stream(QuestionnaireSource.RadarSourceTypes.values()) - .allMatch(type -> catalogue.getActiveSource(type.name()) != null)); + .allMatch(type -> catalogue.getActiveSource(type.name()) != null)); } @Test public void checkMonitorSourceType() { - assertTrue("Not all " + MonitorSource.RadarSourceTypes.class.getName() + " have a specification", - Arrays.stream(MonitorSource.RadarSourceTypes.values()) - .allMatch(type -> catalogue.getMonitorSource(type.name()) != null)); + assertTrue("Not all " + MonitorSource.RadarSourceTypes.class.getName() + + " have a specification", + Arrays.stream(MonitorSource.RadarSourceTypes.values()) + .allMatch(type -> catalogue.getMonitorSource(type.name()) != null)); } @Test public void checkPassiveSourceType() { - assertEquals("Not all " + PassiveSource.RadarSourceTypes.class.getName() + " have a specification", 0, + assertEquals("Not all " + PassiveSource.RadarSourceTypes.class.getName() + + " have a specification", 0, Arrays.stream(PassiveSource.RadarSourceTypes.values()) .filter(type -> catalogue.getPassiveSource(type.name()) == null) .peek(t -> logger.error("Passive source {} unknown", t)) @@ -80,7 +84,7 @@ public void validateTopicNames() { public void validateTopics() { Set expected = new HashSet<>(); - for (QuestionnaireSource source : catalogue.getActiveSources().values()) { + for (ActiveSource source : catalogue.getActiveSources().values()) { expected.addAll(source.getTopics()); } for (MonitorSource source : catalogue.getMonitorSources().values()) { diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SchemaValidationRolesTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/roles/SchemaValidationRolesTest.java similarity index 77% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SchemaValidationRolesTest.java rename to java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/roles/SchemaValidationRolesTest.java index 4c407f39..3d008277 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SchemaValidationRolesTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/roles/SchemaValidationRolesTest.java @@ -1,4 +1,4 @@ -package org.radarcns.schema.validation; +package org.radarcns.schema.validation.roles; /* * Copyright 2017 King's College London and The Hyve @@ -20,6 +20,8 @@ import org.apache.avro.Schema.Parser; import org.apache.avro.SchemaBuilder; import org.junit.Test; +import org.radarcns.schema.validation.ValidationResult; +import org.radarcns.schema.validation.ValidationSupport; import java.nio.file.Path; import java.nio.file.Paths; @@ -30,10 +32,15 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -import static org.radarcns.schema.validation.SchemaRepository.COMMONS_PATH; import static org.radarcns.schema.Scope.ACTIVE; import static org.radarcns.schema.Scope.MONITOR; -import static org.radarcns.schema.validation.SchemaValidationRoles.matches; +import static org.radarcns.schema.validation.SchemaRepository.COMMONS_PATH; +import static org.radarcns.schema.validation.roles.SchemaValidationRoles.ENUM_SYMBOL_PATTERN; +import static org.radarcns.schema.validation.roles.SchemaValidationRoles.FIELD_NAME_PATTERN; +import static org.radarcns.schema.validation.roles.SchemaValidationRoles.NAMESPACE_PATTERN; +import static org.radarcns.schema.validation.roles.SchemaValidationRoles.RECORD_NAME_PATTERN; +import static org.radarcns.schema.validation.roles.SchemaValidationRoles.validateNameSpace; +import static org.radarcns.schema.validation.roles.Validator.matches; /** * TODO. @@ -61,121 +68,132 @@ public void fileNameTest() { @Test public void nameSpaceRegex() { - assertTrue(SchemaValidationRoles.matches("org.radarcns", SchemaValidationRoles.NAMESPACE_PATTERN)); - assertFalse(SchemaValidationRoles.matches("Org.radarcns", SchemaValidationRoles.NAMESPACE_PATTERN)); - assertFalse(SchemaValidationRoles.matches("org.radarCns", SchemaValidationRoles.NAMESPACE_PATTERN)); - assertFalse(SchemaValidationRoles.matches(".org.radarcns", SchemaValidationRoles.NAMESPACE_PATTERN)); - assertFalse(SchemaValidationRoles.matches("org.radar-cns", SchemaValidationRoles.NAMESPACE_PATTERN)); - assertFalse(SchemaValidationRoles.matches("org.radarcns.empaticaE4", SchemaValidationRoles.NAMESPACE_PATTERN)); + assertTrue(matches("org.radarcns", NAMESPACE_PATTERN)); + assertFalse(matches("Org.radarcns", NAMESPACE_PATTERN)); + assertFalse(matches("org.radarCns", NAMESPACE_PATTERN)); + assertFalse(matches(".org.radarcns", NAMESPACE_PATTERN)); + assertFalse(matches("org.radar-cns", NAMESPACE_PATTERN)); + assertFalse(matches("org.radarcns.empaticaE4", NAMESPACE_PATTERN)); } @Test public void recordNameRegex() { - assertTrue(SchemaValidationRoles.matches("Questionnaire", SchemaValidationRoles.RECORD_NAME_PATTERN)); - assertTrue(SchemaValidationRoles.matches("EmpaticaE4Acceleration", SchemaValidationRoles.RECORD_NAME_PATTERN)); - assertTrue(SchemaValidationRoles.matches("Heart4Me", SchemaValidationRoles.RECORD_NAME_PATTERN)); - assertTrue(SchemaValidationRoles.matches("Heart4M", SchemaValidationRoles.RECORD_NAME_PATTERN)); - - assertFalse(SchemaValidationRoles.matches("Heart4", SchemaValidationRoles.RECORD_NAME_PATTERN)); - assertFalse(SchemaValidationRoles.matches("Heart4me", SchemaValidationRoles.RECORD_NAME_PATTERN)); - assertFalse(SchemaValidationRoles.matches("Heart4ME", SchemaValidationRoles.RECORD_NAME_PATTERN)); - assertFalse(SchemaValidationRoles.matches("4Me", SchemaValidationRoles.RECORD_NAME_PATTERN)); - assertFalse(SchemaValidationRoles.matches("TTest", SchemaValidationRoles.RECORD_NAME_PATTERN)); - assertFalse(SchemaValidationRoles.matches("questionnaire", SchemaValidationRoles.RECORD_NAME_PATTERN)); - assertFalse(SchemaValidationRoles.matches("questionnaire4", SchemaValidationRoles.RECORD_NAME_PATTERN)); - assertFalse(SchemaValidationRoles.matches("questionnaire4Me", SchemaValidationRoles.RECORD_NAME_PATTERN)); - assertFalse(SchemaValidationRoles.matches("questionnaire4me", SchemaValidationRoles.RECORD_NAME_PATTERN)); - assertFalse(SchemaValidationRoles.matches("A4MM", SchemaValidationRoles.RECORD_NAME_PATTERN)); - assertFalse(SchemaValidationRoles.matches("Aaaa4MMaa", SchemaValidationRoles.RECORD_NAME_PATTERN)); + assertTrue(matches("Questionnaire", RECORD_NAME_PATTERN)); + assertTrue(matches("EmpaticaE4Acceleration", RECORD_NAME_PATTERN)); + assertTrue(matches("Heart4Me", RECORD_NAME_PATTERN)); + assertTrue(matches("Heart4M", RECORD_NAME_PATTERN)); + + assertFalse(matches("Heart4", RECORD_NAME_PATTERN)); + assertFalse(matches("Heart4me", RECORD_NAME_PATTERN)); + assertFalse(matches("Heart4ME", RECORD_NAME_PATTERN)); + assertFalse(matches("4Me", RECORD_NAME_PATTERN)); + assertFalse(matches("TTest", RECORD_NAME_PATTERN)); + assertFalse(matches("questionnaire", RECORD_NAME_PATTERN)); + assertFalse(matches("questionnaire4", RECORD_NAME_PATTERN)); + assertFalse(matches("questionnaire4Me", RECORD_NAME_PATTERN)); + assertFalse(matches("questionnaire4me", RECORD_NAME_PATTERN)); + assertFalse(matches("A4MM", RECORD_NAME_PATTERN)); + assertFalse(matches("Aaaa4MMaa", RECORD_NAME_PATTERN)); } @Test public void fieldNameRegex() { - assertTrue(SchemaValidationRoles.matches("interBeatInterval", SchemaValidationRoles.FIELD_NAME_PATTERN)); - assertTrue(SchemaValidationRoles.matches("x", SchemaValidationRoles.FIELD_NAME_PATTERN)); - assertTrue(SchemaValidationRoles.matches(SchemaValidationRoles.TIME, SchemaValidationRoles.FIELD_NAME_PATTERN)); - assertTrue(SchemaValidationRoles.matches("subjectId", SchemaValidationRoles.FIELD_NAME_PATTERN)); - assertTrue(SchemaValidationRoles.matches("listOfSeveralThings", SchemaValidationRoles.FIELD_NAME_PATTERN)); - assertFalse(SchemaValidationRoles.matches("Time", SchemaValidationRoles.FIELD_NAME_PATTERN)); - assertFalse(SchemaValidationRoles.matches("E4Heart", SchemaValidationRoles.FIELD_NAME_PATTERN)); + assertTrue(matches("interBeatInterval", FIELD_NAME_PATTERN)); + assertTrue(matches("x", FIELD_NAME_PATTERN)); + assertTrue(matches(SchemaValidationRoles.TIME, FIELD_NAME_PATTERN)); + assertTrue(matches("subjectId", FIELD_NAME_PATTERN)); + assertTrue(matches("listOfSeveralThings", FIELD_NAME_PATTERN)); + assertFalse(matches("Time", FIELD_NAME_PATTERN)); + assertFalse(matches("E4Heart", FIELD_NAME_PATTERN)); } @Test public void enumerationRegex() { - assertTrue(SchemaValidationRoles.matches("PHQ8", SchemaValidationRoles.ENUM_SYMBOL_PATTERN)); - assertTrue(SchemaValidationRoles.matches("HELLO", SchemaValidationRoles.ENUM_SYMBOL_PATTERN)); - assertTrue(SchemaValidationRoles.matches("HELLOTHERE", SchemaValidationRoles.ENUM_SYMBOL_PATTERN)); - assertTrue(SchemaValidationRoles.matches("HELLO_THERE", SchemaValidationRoles.ENUM_SYMBOL_PATTERN)); - assertFalse(SchemaValidationRoles.matches("Hello", SchemaValidationRoles.ENUM_SYMBOL_PATTERN)); - assertFalse(SchemaValidationRoles.matches("hello", SchemaValidationRoles.ENUM_SYMBOL_PATTERN)); - assertFalse(SchemaValidationRoles.matches("HelloThere", SchemaValidationRoles.ENUM_SYMBOL_PATTERN)); - assertFalse(SchemaValidationRoles.matches("Hello_There", SchemaValidationRoles.ENUM_SYMBOL_PATTERN)); - assertFalse(SchemaValidationRoles.matches("HELLO.THERE", SchemaValidationRoles.ENUM_SYMBOL_PATTERN)); + assertTrue(matches("PHQ8", ENUM_SYMBOL_PATTERN)); + assertTrue(matches("HELLO", ENUM_SYMBOL_PATTERN)); + assertTrue(matches("HELLOTHERE", ENUM_SYMBOL_PATTERN)); + assertTrue(matches("HELLO_THERE", ENUM_SYMBOL_PATTERN)); + assertFalse(matches("Hello", ENUM_SYMBOL_PATTERN)); + assertFalse(matches("hello", ENUM_SYMBOL_PATTERN)); + assertFalse(matches("HelloThere", ENUM_SYMBOL_PATTERN)); + assertFalse(matches("Hello_There", ENUM_SYMBOL_PATTERN)); + assertFalse(matches("HELLO.THERE", ENUM_SYMBOL_PATTERN)); } @Test public void nameSpaceTest() { - Schema schema; - ValidationResult result; - Path path; - Path root; - - schema = SchemaBuilder - .builder("org.radarcns.active.questionnaire") - .record("Questionnaire") - .fields() - .endRecord(); + Schema schema = SchemaBuilder + .builder("org.radarcns.active.questionnaire") + .record("Questionnaire") + .fields() + .endRecord(); - root = ACTIVE.getPath(COMMONS_PATH); + Path root = ACTIVE.getPath(COMMONS_PATH); assertNotNull(root); - path = root.resolve("questionnaire/questionnaire.avsc"); + Path path = root.resolve("questionnaire/questionnaire.avsc"); - result = SchemaValidationRoles.validateNameSpace(path, ACTIVE).apply(schema); + ValidationResult result = validateNameSpace(path, ACTIVE).apply(schema); assertTrue(result.isValid()); + } - schema = SchemaBuilder - .builder("org.radar-cns.monitors.test") - .record(RECORD_NAME_MOCK) - .fields() - .endRecord(); + @Test + public void nameSpaceInvalidDashTest() { + Schema schema = SchemaBuilder + .builder("org.radar-cns.monitors.test") + .record(RECORD_NAME_MOCK) + .fields() + .endRecord(); - root = MONITOR.getPath(COMMONS_PATH); + Path root = MONITOR.getPath(COMMONS_PATH); assertNotNull(root); - path = root.resolve("test/record_name.avsc"); - result = SchemaValidationRoles.validateNameSpace(path, MONITOR).apply(schema); + Path path = root.resolve("test/record_name.avsc"); + ValidationResult result = validateNameSpace(path, MONITOR).apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("Namespace cannot be null and must fully lowercase dot " - + "separated without numeric. In this case the expected value is " - + "\"org.radarcns.monitor.test\". org.radar-cns.monitors.test." - + RECORD_NAME_MOCK + INVALID_TEXT), + + "separated without numeric. In this case the expected value is " + + "\"org.radarcns.monitor.test\". org.radar-cns.monitors.test." + + RECORD_NAME_MOCK + INVALID_TEXT), result.getReason()); + } - schema = SchemaBuilder - .builder("org.radarcns.monitors.test") - .record(RECORD_NAME_MOCK) - .fields() - .endRecord(); + @Test + public void nameSpaceInvalidPlural() { + Schema schema = SchemaBuilder + .builder("org.radarcns.monitors.test") + .record(RECORD_NAME_MOCK) + .fields() + .endRecord(); - result = SchemaValidationRoles.validateNameSpace(path, MONITOR).apply(schema); + Path root = MONITOR.getPath(COMMONS_PATH); + assertNotNull(root); + Path path = root.resolve("test/record_name.avsc"); + ValidationResult result = validateNameSpace(path, MONITOR).apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of("Namespace cannot be null and must fully lowercase dot " - + "separated without numeric. In this case the expected value is " - + "\"org.radarcns.monitor.test\". org.radarcns.monitors.test." - + RECORD_NAME_MOCK + INVALID_TEXT), + + "separated without numeric. In this case the expected value is " + + "\"org.radarcns.monitor.test\". org.radarcns.monitors.test." + + RECORD_NAME_MOCK + INVALID_TEXT), result.getReason()); + } - schema = SchemaBuilder + @Test + public void nameSpaceInvalidLastPartPlural() { + + Schema schema = SchemaBuilder .builder("org.radarcns.monitor.tests") .record(RECORD_NAME_MOCK) .fields() .endRecord(); - result = SchemaValidationRoles.validateNameSpace(path, MONITOR).apply(schema); + Path root = MONITOR.getPath(COMMONS_PATH); + assertNotNull(root); + Path path = root.resolve("test/record_name.avsc"); + ValidationResult result = validateNameSpace(path, MONITOR).apply(schema); assertFalse(result.isValid()); @@ -217,7 +235,7 @@ public void recordNameTest() { assertEquals(Optional.of("Record name must be the conversion of the .avsc file name in " + "UpperCamelCase and must explicitly contain the device name. " - + "The expected value is EmpaticaE4Acceleration\". org.radarcns.passive.empatica." + + "The expected value is \"EmpaticaE4Acceleration\". org.radarcns.passive.empatica." + fieldName + INVALID_TEXT), result.getReason()); @@ -380,7 +398,7 @@ public void fieldNameTest() { assertFalse(result.isValid()); String message = "Field name does not respect lowerCamelCase name convention. " - + "It cannot contain any of the following values [value,Value,val,Val]. " + + "It cannot contain any of the following values [value, Value, val, Val]. " + "Please avoid abbreviations and write out the field name instead. "; assertEquals(Optional.of(message @@ -545,8 +563,8 @@ public void enumerationSymbolTest() { String schemaTxtEnd = "] } } ] }"; - schema = new Parser().parse(schemaTxtInit.concat( - "\"CONNECTED\", \"NOT_CONNECTED\", \"" + UNKNOWN_MOCK + "\"".concat(schemaTxtEnd))); + schema = new Parser().parse(schemaTxtInit + + "\"CONNECTED\", \"NOT_CONNECTED\", \"" + UNKNOWN_MOCK + "\"" + schemaTxtEnd); result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); @@ -583,16 +601,16 @@ public void enumerationSymbolTest() { assertFalse(result.isValid()); assertEquals(Optional.of(invalidMessage), result.getReason()); - schema = new Parser().parse(schemaTxtInit.concat( - "\"CONNECTED\", \"Not_Connected\", \"" + UNKNOWN_MOCK + "\"".concat(schemaTxtEnd))); + schema = new Parser().parse(schemaTxtInit + + "\"CONNECTED\", \"Not_Connected\", \"" + UNKNOWN_MOCK + "\"" + schemaTxtEnd); result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); assertFalse(result.isValid()); assertEquals(Optional.of(invalidMessage), result.getReason()); - schema = new Parser().parse(schemaTxtInit.concat( - "\"Connected\", \"NotConnected\", \"" + UNKNOWN_MOCK + "\"".concat(schemaTxtEnd))); + schema = new Parser().parse(schemaTxtInit + + "\"Connected\", \"NotConnected\", \"" + UNKNOWN_MOCK + "\"" + schemaTxtEnd); result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); @@ -724,10 +742,8 @@ public void defaultValueTest() { result = SchemaValidationRoles.validateDefault().apply(schema); String invalidMessage = "Any NULLABLE Avro field must specify a default value. " - + "The allowed default values are: \"UNKNOWN\" for ENUMERATION, \"MIN_VALUE\" or " - + "\"MAX_VALUE\" for nullable int and long, \"NaN\" for nullable float and double, " - + "\"true\" or \"false\" for nullable boolean, \"byte[]\" or \"null\" for bytes, " - + "and \"null\" for all the other cases. org.radarcns.test.TestRecord" + + "The allowed default values are: \"UNKNOWN\" for ENUMERATION, and \"null\"" + + " for all the other cases. org.radarcns.test.TestRecord" + INVALID_TEXT; assertFalse(result.isValid()); @@ -744,7 +760,7 @@ public void defaultValueTest() { } private static String getFinalMessage(String nameSpace, String recordName) { - return nameSpace.concat(".").concat(recordName).concat(INVALID_TEXT); + return nameSpace + "." + recordName + INVALID_TEXT; } } diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/util/TopicTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/util/TopicTest.java similarity index 88% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/util/TopicTest.java rename to java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/util/TopicTest.java index 9481dbab..55e46691 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/util/TopicTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/util/TopicTest.java @@ -1,4 +1,4 @@ -package org.radarcns.schema.specification.util; +package org.radarcns.schema.validation.util; /* * Copyright 2017 King's College London and The Hyve @@ -16,16 +16,15 @@ * limitations under the License. */ -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import org.junit.Test; +import org.radarcns.schema.specification.source.Topic; import java.util.HashSet; import java.util.Set; -import org.junit.Assert; -import org.junit.Test; -import org.radarcns.schema.specification.source.Topic; -import org.radarcns.schema.specification.validator.ValidationSupport; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.radarcns.schema.validation.ValidationSupport.isValidTopic; /** * TODO. @@ -34,7 +33,7 @@ public class TopicTest { @Test public void getOutTopicTest() { - Assert.assertEquals("topic_name_output", Topic.getOutTopic("topic_name")); + assertEquals("topic_name_output", Topic.getOutTopic("topic_name")); } @Test @@ -51,7 +50,7 @@ public void getOutTopicWithTimeTest() { Set actual = Topic.getTimedOutTopics("topic_name_output"); assertEquals(expected.size(), actual.size()); - actual.forEach(value -> expected.remove(value)); + actual.forEach(expected::remove); assertTrue(expected.isEmpty()); } @@ -72,10 +71,10 @@ public void getTimeIntervalTest() { @Test public void getStateStoreNameTest() { - Assert.assertEquals("From-topic_in-To-topic_out", + assertEquals("From-topic_in-To-topic_out", Topic.getStateStoreName("topic_in", "topic_out")); - assertTrue(ValidationSupport.isValidTopic(Topic.getStateStoreName("topic_in", "topic_out"))); + assertTrue(isValidTopic(Topic.getStateStoreName("topic_in", "topic_out"))); } @Test(expected = NullPointerException.class) diff --git a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/util/UtilsTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/util/UtilsTest.java similarity index 93% rename from java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/util/UtilsTest.java rename to java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/util/UtilsTest.java index 393bd0ba..83e7efb4 100644 --- a/java-sdk/radar-schemas-specifications/src/test/java/org/radarcns/schema/specification/util/UtilsTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/util/UtilsTest.java @@ -1,4 +1,4 @@ -package org.radarcns.schema.specification.util; +package org.radarcns.schema.validation.util; /* * Copyright 2017 King's College London and The Hyve @@ -23,6 +23,7 @@ import org.junit.Test; import org.radarcns.kafka.aggregator.AggregatorDouble; import org.radarcns.kafka.aggregator.AggregatorDoubleArray; +import org.radarcns.schema.specification.util.Utils; /** * TODO. From 2d3e131e96f2f087db4adfec6c519228436c4340 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Wed, 13 Sep 2017 15:39:12 +0200 Subject: [PATCH 058/112] FIxed gitignore files --- .gitignore | 16 ------------- java-sdk/radar-schemas-commons/.gitignore | 1 + .../main/java/org/radarcns/schema/Scope.java | 24 +++++++++++++++++++ java-sdk/radar-schemas-restapi/.gitignore | 1 + .../radar-schemas-specifications/build.gradle | 1 - .../schema/specification/SourceCatalogue.java | 5 +--- 6 files changed, 27 insertions(+), 21 deletions(-) create mode 100644 java-sdk/radar-schemas-commons/.gitignore create mode 100644 java-sdk/radar-schemas-commons/src/main/java/org/radarcns/schema/Scope.java create mode 100644 java-sdk/radar-schemas-restapi/.gitignore diff --git a/.gitignore b/.gitignore index 12be7158..c8a5dbbe 100644 --- a/.gitignore +++ b/.gitignore @@ -7,19 +7,3 @@ out/ .gradletasknamecache gradle.properties exchange.properties -*.java - -#======================================== Schemas Common =======================================# -java-sdk/radar-schemas-commons/build -java-sdk/radar-schemas-commons/out - -#======================================== Schemas Validator =======================================# -!java-sdk/radar-schemas-validator/**/*.java -java-sdk/radar-schemas-validator/build -java-sdk/radar-schemas-validator/out - -#====================================== Schemas Specification =====================================# -!java-sdk/radar-schemas-specifications/**/*.java -java-sdk/radar-schemas-specifications/build -java-sdk/radar-schemas-specifications/out - diff --git a/java-sdk/radar-schemas-commons/.gitignore b/java-sdk/radar-schemas-commons/.gitignore new file mode 100644 index 00000000..d3db8f9b --- /dev/null +++ b/java-sdk/radar-schemas-commons/.gitignore @@ -0,0 +1 @@ +src/generated/ diff --git a/java-sdk/radar-schemas-commons/src/main/java/org/radarcns/schema/Scope.java b/java-sdk/radar-schemas-commons/src/main/java/org/radarcns/schema/Scope.java new file mode 100644 index 00000000..ab1e4b97 --- /dev/null +++ b/java-sdk/radar-schemas-commons/src/main/java/org/radarcns/schema/Scope.java @@ -0,0 +1,24 @@ +package org.radarcns.schema; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Locale; + +public enum Scope { + ACTIVE, KAFKA, CATALOGUE, MONITOR, PASSIVE; + + private final String lower; + + Scope() { + this.lower = name().toLowerCase(Locale.ENGLISH); + } + + public Path getPath(Path root) { + Path path = root.resolve(name().toLowerCase(Locale.ENGLISH)); + return Files.exists(path) ? path : null; + } + + public String getLower() { + return lower; + } +} diff --git a/java-sdk/radar-schemas-restapi/.gitignore b/java-sdk/radar-schemas-restapi/.gitignore new file mode 100644 index 00000000..c83f90a2 --- /dev/null +++ b/java-sdk/radar-schemas-restapi/.gitignore @@ -0,0 +1 @@ +src/generated diff --git a/java-sdk/radar-schemas-specifications/build.gradle b/java-sdk/radar-schemas-specifications/build.gradle index c40a47dd..d96335a7 100644 --- a/java-sdk/radar-schemas-specifications/build.gradle +++ b/java-sdk/radar-schemas-specifications/build.gradle @@ -27,7 +27,6 @@ dependencies { implementation group: 'org.radarcns', name: 'radar-commons', version: radarCommonsVersion - testCompile project(':radar-schemas-validator') testCompile group: 'junit', name: 'junit', version: junitVersion testCompile group: 'org.slf4j', name: 'slf4j-simple', version: slf4jVersion } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java index a511ff67..8eda4a10 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java +++ b/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java @@ -16,15 +16,12 @@ * limitations under the License. */ -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.PropertyNamingStrategy; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import org.radarcns.config.YamlConfigLoader; import org.radarcns.schema.Scope; +import org.radarcns.schema.specification.source.MonitorSource; import org.radarcns.schema.specification.source.Source; import org.radarcns.schema.specification.source.active.ActiveSource; import org.radarcns.schema.specification.source.active.questionnaire.QuestionnaireSource; -import org.radarcns.schema.specification.source.MonitorSource; import org.radarcns.schema.specification.source.passive.PassiveSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; From 02d80e8382b54df59ed4a04d1c5cf3233ceae96c Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Wed, 13 Sep 2017 16:09:56 +0200 Subject: [PATCH 059/112] Run tests over the schemas in the repository --- commons/catalogue/sensor_name.avsc | 2 +- commons/catalogue/time_frame.avsc | 2 +- commons/catalogue/unit.avsc | 2 +- commons/kafka/key/key_windowed.avsc | 2 +- .../org/radarcns/catalogue/SensorName.class | Bin 3465 -> 3466 bytes .../classes/org/radarcns/catalogue/Unit.class | Bin 2552 -> 2553 bytes .../org/radarcns/kafka/key/KeyWindowed.class | Bin 5410 -> 5411 bytes .../specification/source/KafkaActor.java | 6 +- .../roles/SchemaValidationRoles.java | 2 +- .../schema/validation/AvroValidator.java | 76 ++++++++++++------ .../roles/SchemaValidationRolesTest.java | 72 ----------------- 11 files changed, 59 insertions(+), 105 deletions(-) diff --git a/commons/catalogue/sensor_name.avsc b/commons/catalogue/sensor_name.avsc index 4161d009..81ada32b 100644 --- a/commons/catalogue/sensor_name.avsc +++ b/commons/catalogue/sensor_name.avsc @@ -2,7 +2,7 @@ "namespace": "org.radarcns.catalogue", "type": "enum", "name": "SensorName", - "doc": "Sensor types", + "doc": "Sensor types.", "symbols": [ "ACCELEROMETER" , "BATTERY", diff --git a/commons/catalogue/time_frame.avsc b/commons/catalogue/time_frame.avsc index b73fe2c6..af9260f0 100644 --- a/commons/catalogue/time_frame.avsc +++ b/commons/catalogue/time_frame.avsc @@ -2,7 +2,7 @@ "namespace": "org.radarcns.catalogue", "type": "enum", "name": "TimeFrame", - "doc": "Interval between two consecutive samples", + "doc": "Interval between two consecutive samples.", "symbols": [ "TEN_SECOND" , "THIRTY_SECOND" , diff --git a/commons/catalogue/unit.avsc b/commons/catalogue/unit.avsc index c8b782db..ec069dcf 100644 --- a/commons/catalogue/unit.avsc +++ b/commons/catalogue/unit.avsc @@ -2,7 +2,7 @@ "namespace": "org.radarcns.catalogue", "type": "enum", "name": "Unit", - "doc": "Measurement units", + "doc": "Measurement units.", "symbols": [ "BEATS_PER_MIN" , "CALORIES_PER_SEC", diff --git a/commons/kafka/key/key_windowed.avsc b/commons/kafka/key/key_windowed.avsc index 376d0caf..c346ac95 100644 --- a/commons/kafka/key/key_windowed.avsc +++ b/commons/kafka/key/key_windowed.avsc @@ -2,7 +2,7 @@ "namespace": "org.radarcns.kafka.key", "type": "record", "name": "KeyWindowed", - "doc": "Windowed key in the RADAR-CNS project", + "doc": "Windowed key in the RADAR-CNS project.", "fields": [ {"name": "userId", "type": "string", "doc": "User Identifier created during the enrolment."}, {"name": "sourceId", "type": "string", "doc": "Unique identifier associated with the source."}, diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/SensorName.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/SensorName.class index 873e900f63dcea9e66dd55387cba3d97637d7105..ab8e2a0f4849fd31b9f61c60930fd1314d3dbdd7 100644 GIT binary patch delta 20 bcmeB_?vmc1$Hu5JS)VPMQEzh>+kZ9yJV*uc delta 18 ZcmeB@?v&o3$Hu5WS)VO>b2r<6HUKm=1;PLT diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/Unit.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/Unit.class index 2438392e5c4d5d7bc2c765582925aabb066d2fcb..4522a3e4e197fa189c4ff59f79906591d6d12019 100644 GIT binary patch delta 20 ccmew%{8M getGeneralEnumValidator(Path pathToSchema, Scope } private static Function message(String text) { - return schema -> text + ' ' + schema.getFullName() + " is invalid."; + return schema -> schema.getFullName() + " is invalid. " + text; } } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/AvroValidator.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/AvroValidator.java index b002e3f2..086f01b6 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/AvroValidator.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/AvroValidator.java @@ -18,22 +18,51 @@ import org.apache.avro.Schema; import org.apache.avro.Schema.Parser; -import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; import org.radarcns.schema.Scope; import org.radarcns.schema.validation.config.ExcludeConfig; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.stream.Collectors; +import static org.junit.Assert.fail; import static org.radarcns.schema.validation.SchemaRepository.COMMONS_PATH; public final class AvroValidator { public static final String AVRO_EXTENSION = "avsc"; - private final ExcludeConfig config; + private ExcludeConfig config; - public AvroValidator(ExcludeConfig config) { - this.config = config; + @Before + public void setUp() { + config = ExcludeConfig.load(); + } + + @Test + public void active() throws IOException { + analyseFiles(Scope.ACTIVE); + } + + @Test + public void monitor() throws IOException { + analyseFiles(Scope.MONITOR); + } + + @Test + public void passive() throws IOException { + analyseFiles(Scope.PASSIVE); + } + + @Test + public void kafka() throws IOException { + analyseFiles(Scope.KAFKA); + } + + @Test + public void catalogue() throws IOException { + analyseFiles(Scope.CATALOGUE); } /** @@ -43,39 +72,38 @@ public AvroValidator(ExcludeConfig config) { */ public void analyseFiles(Scope scope) throws IOException { - Files.walk(scope.getPath(COMMONS_PATH)) + Parser parser = new Parser(); + String errors = Files.walk(scope.getPath(COMMONS_PATH)) .filter(Files::isRegularFile) .filter(p -> !config.skipFile(p)) - .forEach(p -> { - Assert.assertTrue(scope.getLower() + " should contain only " - + AVRO_EXTENSION + " files. " + p.toAbsolutePath() - + " is invalid.", - isAvscFile(p)); + .map(p -> { + if (!isAvscFile(p)) { + return new InvalidResult(scope.getLower() + " should contain only " + + AVRO_EXTENSION + " files. " + p.toAbsolutePath() + + " is invalid."); + } try { - Schema schema = new Parser().parse(p.toFile()); - - ValidationResult result; + Schema schema = parser.parse(p.toFile()); if (config.contains(schema)) { - result = SchemaValidator.validate(schema, p, scope, + return SchemaValidator.validate(schema, p, scope, config.isNameRecordEnable(schema), config.skippedNameFieldCheck(schema)); } else { - result = SchemaValidator.validate(schema, p, scope); + return SchemaValidator.validate(schema, p, scope); } - - Assert.assertTrue(getMessage(result), result.isValid()); } catch (IOException e) { - throw new AssertionError("Cannot parse file", e); + return new InvalidResult("Cannot parse file: " + e); } + }) + .filter(r -> !r.isValid()) + .map(r -> "\nValidation FAILED:\n" + r.getReason().orElse("") + "\n") + .collect(Collectors.joining()); - //TODO add file layout validation - }); - } - - private static String getMessage(ValidationResult result) { - return result.getReason().orElse(""); + if (!errors.isEmpty()) { + fail(errors); + } } /** diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/roles/SchemaValidationRolesTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/roles/SchemaValidationRolesTest.java index 3d008277..4221c570 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/roles/SchemaValidationRolesTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/roles/SchemaValidationRolesTest.java @@ -258,8 +258,6 @@ public void fieldsTest() { result = SchemaValidationRoles.validateFields().apply(schema); assertFalse(result.isValid()); - assertEquals(Optional.of("Avro Record must have field list. " - + getFinalMessage(MONITOR_NAME_SPACE_MOCK, RECORD_NAME_MOCK)), result.getReason()); schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) @@ -289,11 +287,6 @@ public void timeTest() { assertFalse(result.isValid()); - assertEquals(Optional.of("Any schema representing collected data must have a \"time\" field" - + " formatted in DOUBLE. org.radarcns.time.test." + RECORD_NAME_MOCK - + INVALID_TEXT), - result.getReason()); - schema = SchemaBuilder .builder("org.radarcns.time.test") .record(RECORD_NAME_MOCK) @@ -320,9 +313,6 @@ public void timeCompletedTest() { result = SchemaValidationRoles.validateTimeCompleted().apply(schema); assertFalse(result.isValid()); - assertEquals(Optional.of("Any ACTIVE schema must have a \"timeCompleted\" field formatted " - + "in DOUBLE. org.radarcns.active.test." + RECORD_NAME_MOCK + INVALID_TEXT), - result.getReason()); result = SchemaValidationRoles.validateNotTimeCompleted().apply(schema); assertTrue(result.isValid()); @@ -339,9 +329,6 @@ public void timeCompletedTest() { result = SchemaValidationRoles.validateNotTimeCompleted().apply(schema); assertFalse(result.isValid()); - assertEquals(Optional.of("\"timeCompleted\" is allow only in ACTIVE schemas. " - + getFinalMessage(ACTIVE_NAME_SPACE_MOCK, RECORD_NAME_MOCK)), - result.getReason()); } @Test @@ -358,9 +345,6 @@ public void timeReceivedTest() { result = SchemaValidationRoles.validateTimeReceived().apply(schema); assertFalse(result.isValid()); - assertEquals(Optional.of("Any PASSIVE schema must have a \"timeReceived\" field formatted " - + "in DOUBLE. org.radarcns.monitor.test." + RECORD_NAME_MOCK + INVALID_TEXT), - result.getReason()); result = SchemaValidationRoles.validateNotTimeReceived().apply(schema); assertTrue(result.isValid()); @@ -377,9 +361,6 @@ public void timeReceivedTest() { result = SchemaValidationRoles.validateNotTimeReceived().apply(schema); assertFalse(result.isValid()); - assertEquals(Optional.of("\"timeReceived\" is allow only in PASSIVE schemas. " - + getFinalMessage(MONITOR_NAME_SPACE_MOCK, RECORD_NAME_MOCK)), - result.getReason()); } @Test @@ -397,14 +378,6 @@ public void fieldNameTest() { result = SchemaValidationRoles.validateFieldName().apply(schema); assertFalse(result.isValid()); - String message = "Field name does not respect lowerCamelCase name convention. " - + "It cannot contain any of the following values [value, Value, val, Val]. " - + "Please avoid abbreviations and write out the field name instead. "; - - assertEquals(Optional.of(message - + getFinalMessage(MONITOR_NAME_SPACE_MOCK, RECORD_NAME_MOCK)), - result.getReason()); - schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) .record(RECORD_NAME_MOCK) @@ -414,9 +387,6 @@ public void fieldNameTest() { result = SchemaValidationRoles.validateFieldName().apply(schema); assertFalse(result.isValid()); - assertEquals(Optional.of(message - + getFinalMessage(MONITOR_NAME_SPACE_MOCK, RECORD_NAME_MOCK)), - result.getReason()); schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) @@ -429,9 +399,6 @@ public void fieldNameTest() { result = SchemaValidationRoles.validateFieldName( Collections.singleton(SchemaValidationRoles.TIME)).apply(schema); assertFalse(result.isValid()); - assertEquals(Optional.of(message - + getFinalMessage(MONITOR_NAME_SPACE_MOCK,RECORD_NAME_MOCK)), - result.getReason()); schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) @@ -470,12 +437,6 @@ public void filedDocumentationTest() { result = SchemaValidationRoles.validateFieldDocumentation().apply(schema); assertFalse(result.isValid()); - assertEquals(Optional.of("Documentation is mandatory for any schema and field. The " - + "documentation should report what is being measured, how, and what units or " - + "ranges are applicable. Abbreviations and acronyms in the documentation should " - + "be written out. The sentence must be ended by a point. Please add \"doc\" " - + "property. org.radarcns.kafka.key.key is invalid."), - result.getReason()); schema = new Parser().parse("{\"namespace\": \"org.radarcns.kafka.key\", " + "\"type\": \"record\", \"name\": \"key\", \"type\": \"record\", \"fields\": [" @@ -499,13 +460,6 @@ public void schemaDocumentationTest() { result = SchemaValidationRoles.validateSchemaDocumentation().apply(schema); assertFalse(result.isValid()); - assertEquals(Optional.of("Documentation is mandatory for any schema and field. The " - + "documentation should report what is being measured, how, and what units or " - + "ranges are applicable. Abbreviations and acronyms in the documentation should " - + "be written out. The sentence must be ended by a point. " - + "Please add \"doc\" property. " - + getFinalMessage(MONITOR_NAME_SPACE_MOCK, RECORD_NAME_MOCK)), - result.getReason()); schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) @@ -536,8 +490,6 @@ public void enumerationSymbolsTest() { result = SchemaValidationRoles.validateSymbols().apply(schema); assertFalse(result.isValid()); - assertEquals(Optional.of("Avro Enumerator must have symbol list. " - + ENUMERATOR_NAME_SPACE_MOCK + INVALID_TEXT), result.getReason()); } @Test @@ -576,12 +528,7 @@ public void enumerationSymbolTest() { result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); - String invalidMessage = "Enumerator items should be written in uppercase characters " - + "separated by underscores. " - + "org.radarcns.monitor.application.ApplicationServerStatus is invalid."; - assertFalse(result.isValid()); - assertEquals(Optional.of(invalidMessage), result.getReason()); schema = SchemaBuilder .enumeration(enumName) @@ -590,7 +537,6 @@ public void enumerationSymbolTest() { result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); assertFalse(result.isValid()); - assertEquals(Optional.of(invalidMessage), result.getReason()); schema = SchemaBuilder .enumeration(enumName) @@ -599,7 +545,6 @@ public void enumerationSymbolTest() { result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); assertFalse(result.isValid()); - assertEquals(Optional.of(invalidMessage), result.getReason()); schema = new Parser().parse(schemaTxtInit + "\"CONNECTED\", \"Not_Connected\", \"" + UNKNOWN_MOCK + "\"" + schemaTxtEnd); @@ -607,7 +552,6 @@ public void enumerationSymbolTest() { result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); assertFalse(result.isValid()); - assertEquals(Optional.of(invalidMessage), result.getReason()); schema = new Parser().parse(schemaTxtInit + "\"Connected\", \"NotConnected\", \"" + UNKNOWN_MOCK + "\"" + schemaTxtEnd); @@ -615,7 +559,6 @@ public void enumerationSymbolTest() { result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); assertFalse(result.isValid()); - assertEquals(Optional.of(invalidMessage), result.getReason()); } @Test @@ -636,10 +579,6 @@ public void unknownSymbolTest() { result = SchemaValidationRoles.validateUnknownSymbol().apply(schema); assertFalse(result.isValid()); - assertEquals(Optional.of("Enumerator must contain the \"UNKNOWN\" symbol. It is " - + "useful to specify default value for a field using type equals to \"enum\". " - + ENUMERATOR_NAME_SPACE_MOCK + INVALID_TEXT), - result.getReason()); } @Test(expected = IllegalArgumentException.class) @@ -741,13 +680,7 @@ public void defaultValueTest() { result = SchemaValidationRoles.validateDefault().apply(schema); - String invalidMessage = "Any NULLABLE Avro field must specify a default value. " - + "The allowed default values are: \"UNKNOWN\" for ENUMERATION, and \"null\"" - + " for all the other cases. org.radarcns.test.TestRecord" - + INVALID_TEXT; - assertFalse(result.isValid()); - assertEquals(Optional.of(invalidMessage), result.getReason()); /*schema = new Parser().parse(scemaTxtInit + "[ {\"name\": \"nullableBoolean\", \"type\": [ \"null\", \"boolean\"], " @@ -758,9 +691,4 @@ public void defaultValueTest() { assertFalse(result.isValid()); assertEquals(Optional.of(invalidMessage), result.getReason());*/ } - - private static String getFinalMessage(String nameSpace, String recordName) { - return nameSpace + "." + recordName + INVALID_TEXT; - } - } From 5a7ae80e620cf1c33beafa592170919dd93243d4 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Wed, 13 Sep 2017 16:14:41 +0200 Subject: [PATCH 060/112] Removed binary files --- .gitignore | 1 + .../radarcns/active/questionnaire/Answer$1.class | Bin 234 -> 0 bytes .../active/questionnaire/Answer$Builder.class | Bin 5026 -> 0 bytes .../radarcns/active/questionnaire/Answer.class | Bin 5067 -> 0 bytes .../active/questionnaire/Questionnaire$1.class | Bin 255 -> 0 bytes .../questionnaire/Questionnaire$Builder.class | Bin 6823 -> 0 bytes .../active/questionnaire/Questionnaire.class | Bin 7188 -> 0 bytes .../radarcns/catalogue/ActiveSourceType.class | Bin 1652 -> 0 bytes .../org/radarcns/catalogue/DataType.class | Bin 1805 -> 0 bytes .../radarcns/catalogue/MonitorSourceType.class | Bin 1862 -> 0 bytes .../radarcns/catalogue/PassiveSourceType.class | Bin 1856 -> 0 bytes .../org/radarcns/catalogue/SensorName.class | Bin 3466 -> 0 bytes .../classes/org/radarcns/catalogue/Unit.class | Bin 2553 -> 0 bytes .../kafka/aggregator/AggregatorDouble$1.class | Bin 256 -> 0 bytes .../aggregator/AggregatorDouble$Builder.class | Bin 7712 -> 0 bytes .../kafka/aggregator/AggregatorDouble.class | Bin 7116 -> 0 bytes .../aggregator/AggregatorDoubleArray$1.class | Bin 271 -> 0 bytes .../AggregatorDoubleArray$Builder.class | Bin 8019 -> 0 bytes .../kafka/aggregator/AggregatorDoubleArray.class | Bin 7779 -> 0 bytes .../radarcns/kafka/key/KeyMeasurement$1.class | Bin 236 -> 0 bytes .../kafka/key/KeyMeasurement$Builder.class | Bin 4234 -> 0 bytes .../org/radarcns/kafka/key/KeyMeasurement.class | Bin 4559 -> 0 bytes .../org/radarcns/kafka/key/KeyWindowed$1.class | Bin 227 -> 0 bytes .../radarcns/kafka/key/KeyWindowed$Builder.class | Bin 5500 -> 0 bytes .../org/radarcns/kafka/key/KeyWindowed.class | Bin 5411 -> 0 bytes .../application/ApplicationExternalTime$1.class | Bin 283 -> 0 bytes .../ApplicationExternalTime$Builder.class | Bin 6858 -> 0 bytes .../application/ApplicationExternalTime.class | Bin 6837 -> 0 bytes .../application/ApplicationRecordCounts$1.class | Bin 283 -> 0 bytes .../ApplicationRecordCounts$Builder.class | Bin 6092 -> 0 bytes .../application/ApplicationRecordCounts.class | Bin 5875 -> 0 bytes .../application/ApplicationServerStatus$1.class | Bin 283 -> 0 bytes .../ApplicationServerStatus$Builder.class | Bin 5668 -> 0 bytes .../application/ApplicationServerStatus.class | Bin 5716 -> 0 bytes .../application/ApplicationUptime$1.class | Bin 265 -> 0 bytes .../application/ApplicationUptime$Builder.class | Bin 4520 -> 0 bytes .../monitor/application/ApplicationUptime.class | Bin 4768 -> 0 bytes .../application/ExternalTimeProtocol.class | Bin 1932 -> 0 bytes .../monitor/application/ServerStatus.class | Bin 1709 -> 0 bytes .../biovotion/BiovotionVsm1Acceleration$1.class | Bin 285 -> 0 bytes .../BiovotionVsm1Acceleration$Builder.class | Bin 6539 -> 0 bytes .../biovotion/BiovotionVsm1Acceleration.class | Bin 6128 -> 0 bytes .../BiovotionVsm1BloodPulseWave$1.class | Bin 291 -> 0 bytes .../BiovotionVsm1BloodPulseWave$Builder.class | Bin 6180 -> 0 bytes .../biovotion/BiovotionVsm1BloodPulseWave.class | Bin 5935 -> 0 bytes .../biovotion/BiovotionVsm1Energy$1.class | Bin 267 -> 0 bytes .../biovotion/BiovotionVsm1Energy$Builder.class | Bin 6050 -> 0 bytes .../passive/biovotion/BiovotionVsm1Energy.class | Bin 5820 -> 0 bytes .../BiovotionVsm1GalvanicSkinResponse$1.class | Bin 309 -> 0 bytes ...ovotionVsm1GalvanicSkinResponse$Builder.class | Bin 6395 -> 0 bytes .../BiovotionVsm1GalvanicSkinResponse.class | Bin 6052 -> 0 bytes .../biovotion/BiovotionVsm1HeartRate$1.class | Bin 276 -> 0 bytes .../BiovotionVsm1HeartRate$Builder.class | Bin 6030 -> 0 bytes .../biovotion/BiovotionVsm1HeartRate.class | Bin 5776 -> 0 bytes .../BiovotionVsm1HeartRateVariability$1.class | Bin 309 -> 0 bytes ...ovotionVsm1HeartRateVariability$Builder.class | Bin 6360 -> 0 bytes .../BiovotionVsm1HeartRateVariability.class | Bin 6207 -> 0 bytes .../biovotion/BiovotionVsm1LedCurrent$1.class | Bin 279 -> 0 bytes .../BiovotionVsm1LedCurrent$Builder.class | Bin 7123 -> 0 bytes .../biovotion/BiovotionVsm1LedCurrent.class | Bin 6426 -> 0 bytes .../BiovotionVsm1OxygenSaturation$1.class | Bin 297 -> 0 bytes .../BiovotionVsm1OxygenSaturation$Builder.class | Bin 6120 -> 0 bytes .../BiovotionVsm1OxygenSaturation.class | Bin 5878 -> 0 bytes .../biovotion/BiovotionVsm1PpgRaw$1.class | Bin 267 -> 0 bytes .../biovotion/BiovotionVsm1PpgRaw$Builder.class | Bin 7033 -> 0 bytes .../passive/biovotion/BiovotionVsm1PpgRaw.class | Bin 6522 -> 0 bytes .../BiovotionVsm1RespirationRate$1.class | Bin 294 -> 0 bytes .../BiovotionVsm1RespirationRate$Builder.class | Bin 6210 -> 0 bytes .../biovotion/BiovotionVsm1RespirationRate.class | Bin 5949 -> 0 bytes .../biovotion/BiovotionVsm1Temperature$1.class | Bin 282 -> 0 bytes .../BiovotionVsm1Temperature$Builder.class | Bin 6739 -> 0 bytes .../biovotion/BiovotionVsm1Temperature.class | Bin 6279 -> 0 bytes .../empatica/EmpaticaE4Acceleration$1.class | Bin 274 -> 0 bytes .../EmpaticaE4Acceleration$Builder.class | Bin 6460 -> 0 bytes .../empatica/EmpaticaE4Acceleration.class | Bin 6061 -> 0 bytes .../empatica/EmpaticaE4BatteryLevel$1.class | Bin 274 -> 0 bytes .../EmpaticaE4BatteryLevel$Builder.class | Bin 5387 -> 0 bytes .../empatica/EmpaticaE4BatteryLevel.class | Bin 5355 -> 0 bytes .../empatica/EmpaticaE4BloodVolumePulse$1.class | Bin 286 -> 0 bytes .../EmpaticaE4BloodVolumePulse$Builder.class | Bin 5487 -> 0 bytes .../empatica/EmpaticaE4BloodVolumePulse.class | Bin 5444 -> 0 bytes .../EmpaticaE4ElectroDermalActivity$1.class | Bin 301 -> 0 bytes ...EmpaticaE4ElectroDermalActivity$Builder.class | Bin 5612 -> 0 bytes .../EmpaticaE4ElectroDermalActivity.class | Bin 5640 -> 0 bytes .../empatica/EmpaticaE4InterBeatInterval$1.class | Bin 289 -> 0 bytes .../EmpaticaE4InterBeatInterval$Builder.class | Bin 5512 -> 0 bytes .../empatica/EmpaticaE4InterBeatInterval.class | Bin 5634 -> 0 bytes .../empatica/EmpaticaE4SensorStatus$1.class | Bin 274 -> 0 bytes .../EmpaticaE4SensorStatus$Builder.class | Bin 5891 -> 0 bytes .../empatica/EmpaticaE4SensorStatus.class | Bin 5710 -> 0 bytes .../passive/empatica/EmpaticaE4Tag$1.class | Bin 247 -> 0 bytes .../passive/empatica/EmpaticaE4Tag$Builder.class | Bin 4420 -> 0 bytes .../passive/empatica/EmpaticaE4Tag.class | Bin 4900 -> 0 bytes .../empatica/EmpaticaE4Temperature$1.class | Bin 271 -> 0 bytes .../empatica/EmpaticaE4Temperature$Builder.class | Bin 5362 -> 0 bytes .../passive/empatica/EmpaticaE4Temperature.class | Bin 5379 -> 0 bytes .../passive/pebble/Pebble2Acceleration$1.class | Bin 261 -> 0 bytes .../pebble/Pebble2Acceleration$Builder.class | Bin 6362 -> 0 bytes .../passive/pebble/Pebble2Acceleration.class | Bin 5978 -> 0 bytes .../passive/pebble/Pebble2BatteryLevel$1.class | Bin 261 -> 0 bytes .../pebble/Pebble2BatteryLevel$Builder.class | Bin 6746 -> 0 bytes .../passive/pebble/Pebble2BatteryLevel.class | Bin 6281 -> 0 bytes .../passive/pebble/Pebble2HeartRate$1.class | Bin 252 -> 0 bytes .../pebble/Pebble2HeartRate$Builder.class | Bin 5214 -> 0 bytes .../passive/pebble/Pebble2HeartRate.class | Bin 5292 -> 0 bytes .../pebble/Pebble2HeartRateFiltered$1.class | Bin 276 -> 0 bytes .../Pebble2HeartRateFiltered$Builder.class | Bin 5374 -> 0 bytes .../pebble/Pebble2HeartRateFiltered.class | Bin 5446 -> 0 bytes .../radarcns/passive/phone/BatteryStatus.class | Bin 1795 -> 0 bytes .../passive/phone/LocationProvider.class | Bin 1673 -> 0 bytes .../passive/phone/PhoneAcceleration$1.class | Bin 253 -> 0 bytes .../phone/PhoneAcceleration$Builder.class | Bin 6303 -> 0 bytes .../passive/phone/PhoneAcceleration.class | Bin 5928 -> 0 bytes .../passive/phone/PhoneBatteryLevel$1.class | Bin 253 -> 0 bytes .../phone/PhoneBatteryLevel$Builder.class | Bin 6820 -> 0 bytes .../passive/phone/PhoneBatteryLevel.class | Bin 6458 -> 0 bytes .../org/radarcns/passive/phone/PhoneCall$1.class | Bin 229 -> 0 bytes .../passive/phone/PhoneCall$Builder.class | Bin 7330 -> 0 bytes .../org/radarcns/passive/phone/PhoneCall.class | Bin 6931 -> 0 bytes .../radarcns/passive/phone/PhoneCallType.class | Bin 1787 -> 0 bytes .../passive/phone/PhoneGyroscope$1.class | Bin 244 -> 0 bytes .../passive/phone/PhoneGyroscope$Builder.class | Bin 6243 -> 0 bytes .../radarcns/passive/phone/PhoneGyroscope.class | Bin 5832 -> 0 bytes .../passive/phone/PhoneInteractionState.class | Bin 1787 -> 0 bytes .../radarcns/passive/phone/PhoneLight$1.class | Bin 232 -> 0 bytes .../passive/phone/PhoneLight$Builder.class | Bin 5055 -> 0 bytes .../org/radarcns/passive/phone/PhoneLight.class | Bin 5103 -> 0 bytes .../passive/phone/PhoneMagneticField$1.class | Bin 256 -> 0 bytes .../phone/PhoneMagneticField$Builder.class | Bin 6323 -> 0 bytes .../passive/phone/PhoneMagneticField.class | Bin 5915 -> 0 bytes .../passive/phone/PhoneRelativeLocation$1.class | Bin 265 -> 0 bytes .../phone/PhoneRelativeLocation$Builder.class | Bin 9147 -> 0 bytes .../passive/phone/PhoneRelativeLocation.class | Bin 8693 -> 0 bytes .../org/radarcns/passive/phone/PhoneSms$1.class | Bin 226 -> 0 bytes .../passive/phone/PhoneSms$Builder.class | Bin 8680 -> 0 bytes .../org/radarcns/passive/phone/PhoneSms.class | Bin 7810 -> 0 bytes .../radarcns/passive/phone/PhoneSmsType.class | Bin 1713 -> 0 bytes .../passive/phone/PhoneSmsUnread$1.class | Bin 244 -> 0 bytes .../passive/phone/PhoneSmsUnread$Builder.class | Bin 5159 -> 0 bytes .../radarcns/passive/phone/PhoneSmsUnread.class | Bin 5232 -> 0 bytes .../passive/phone/PhoneStepCount$1.class | Bin 244 -> 0 bytes .../passive/phone/PhoneStepCount$Builder.class | Bin 5139 -> 0 bytes .../radarcns/passive/phone/PhoneStepCount.class | Bin 5186 -> 0 bytes .../passive/phone/PhoneUsageEvent$1.class | Bin 247 -> 0 bytes .../passive/phone/PhoneUsageEvent$Builder.class | Bin 7328 -> 0 bytes .../radarcns/passive/phone/PhoneUsageEvent.class | Bin 6900 -> 0 bytes .../passive/phone/PhoneUserInteraction$1.class | Bin 262 -> 0 bytes .../phone/PhoneUserInteraction$Builder.class | Bin 5399 -> 0 bytes .../passive/phone/PhoneUserInteraction.class | Bin 5539 -> 0 bytes .../radarcns/passive/phone/UsageEventType.class | Bin 1864 -> 0 bytes .../roles/SchemaValidationRolesTest.java | 4 ++-- 151 files changed, 3 insertions(+), 2 deletions(-) delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Answer$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Answer$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Answer.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Questionnaire$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Questionnaire$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Questionnaire.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/ActiveSourceType.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/DataType.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/MonitorSourceType.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/PassiveSourceType.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/SensorName.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/Unit.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDouble$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDouble$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDouble.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDoubleArray$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDoubleArray$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDoubleArray.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyMeasurement$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyMeasurement$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyMeasurement.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyWindowed$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyWindowed$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyWindowed.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationExternalTime$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationExternalTime$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationExternalTime.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationRecordCounts$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationRecordCounts$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationRecordCounts.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationServerStatus$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationServerStatus$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationServerStatus.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationUptime$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationUptime$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationUptime.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ExternalTimeProtocol.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ServerStatus.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Acceleration$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Acceleration$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Acceleration.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BloodPulseWave$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BloodPulseWave$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BloodPulseWave.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Energy$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Energy$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Energy.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1GalvanicSkinResponse$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1GalvanicSkinResponse$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1GalvanicSkinResponse.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRate$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRate$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRate.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRateVariability$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRateVariability$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRateVariability.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1LedCurrent$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1LedCurrent$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1LedCurrent.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1OxygenSaturation$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1OxygenSaturation$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1OxygenSaturation.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1PpgRaw$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1PpgRaw$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1PpgRaw.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1RespirationRate$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1RespirationRate$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1RespirationRate.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Temperature$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Temperature$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Temperature.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Acceleration$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Acceleration$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Acceleration.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BatteryLevel$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BatteryLevel$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BatteryLevel.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BloodVolumePulse$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BloodVolumePulse$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BloodVolumePulse.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4ElectroDermalActivity$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4ElectroDermalActivity$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4ElectroDermalActivity.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4InterBeatInterval$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4InterBeatInterval$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4InterBeatInterval.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4SensorStatus$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4SensorStatus$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4SensorStatus.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Tag$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Tag$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Tag.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Temperature$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Temperature$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Temperature.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2Acceleration$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2Acceleration$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2Acceleration.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2BatteryLevel$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2BatteryLevel$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2BatteryLevel.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2HeartRate$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2HeartRate$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2HeartRate.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2HeartRateFiltered$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2HeartRateFiltered$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2HeartRateFiltered.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/BatteryStatus.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/LocationProvider.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneAcceleration$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneAcceleration$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneAcceleration.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneBatteryLevel$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneBatteryLevel$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneBatteryLevel.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneCall$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneCall$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneCall.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneCallType.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneGyroscope$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneGyroscope$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneGyroscope.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneInteractionState.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneLight$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneLight$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneLight.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneMagneticField$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneMagneticField$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneMagneticField.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneRelativeLocation$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneRelativeLocation$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneRelativeLocation.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneSms$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneSms$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneSms.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneSmsType.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneSmsUnread$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneSmsUnread$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneSmsUnread.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneStepCount$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneStepCount$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneStepCount.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUsageEvent$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUsageEvent$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUsageEvent.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUserInteraction$1.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUserInteraction$Builder.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUserInteraction.class delete mode 100644 java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/UsageEventType.class diff --git a/.gitignore b/.gitignore index c8a5dbbe..34a65423 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ out/ .gradletasknamecache gradle.properties exchange.properties +*.class diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Answer$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Answer$1.class deleted file mode 100644 index 30235ac0513ce88aafb1a19bee9fc7310a41b961..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 234 zcma)$K?=e!5JmrJwOR#x1Q#yEg+V-lh=L1o;R#|o)JU0N((2t@cmNM2M!bN3nEx3V z9{=@zJOL~*NRg)K6SAXgyy2~_m@rsLxU-*M^i2~+8!?p&R?0osXIG@i2s7tP<#nOG zk)X7x?Tyv7;ZR#AqOE83gG?5L;ZB78y3!$VAmm@JsGn2Ul z#7k|h_gh=9eb5(|;<81tOF}KKwo6?;_~5gbSD)2aU&Qa<=ggUt%w#cPE!IA>_x`Wn zf7{{D|9k6g03-Ne0=;-zmS<$S7{~qiSOO2?0pE*W@MzBxHr5MMFYzQN(t;nS@snJRRb#qE-OS=tX$Pr z=$yV}tyrm?m0w7mo4aIZDq{-qa>XiDW}GDws7VFG&S%|S+fgU)RE{Zx`v)#4L?#MZ z(rlY{^7h&4(wtqIvF37GY$0RiE?6Z;_TFKnvgnj4?ReG6W$luJc`Bc`OA|S(T()^J zJY6U)q)JxSDrNHJl$EJCD|TwRYL_ccA)mLLlARjQmoM9;K2HQ~9qr#dmzW+cR2IdC zt?7!DdG?G|)J75^h5fCI91~H=mMs`#cobp_cIAQ#|MvcYW&wzmeTu36MuLHs6$XHc zEm~zyD}(p6LL!s1t&(?ih=$w)`X*f=fVE^<>&|4M%HT6bCfx~8jrLF8n=*P35Yw*h z4;&vDyAyqEg8E4+fq|)Ax^EwQkH^;5AeY9nTW5-OneL9R_LhrZnxG7?N&q(B=1g&=5XWf-QCk|pl#l0Wc({MynGMY7(MUw+(d-D{Y`As z9D_bbWZ319D>A){j#b=u6Yatpaap6n+S$k&^;qR9z}hLS(a4Or8HTud09&~JlrH=X zJ8%vA@pBx)FK`mCVG*yRfM4PT{0cw84W7QCq1frV>p=lh9;6(FAxgRr;X4!%GBC`4 zz>y;)=G5@8ddS1-x`(&8uhHt-0Ija(Xl-wFxrUZp1zc`GYeyq%4K29}ux^CbZ>!!8y9{3m2=HD#A{{*D9`_hi#gPycu&zKkild7r9aWVUEfIsH*KaO#a z|0019eLWhp$nZX$5Id9m0##R+sbN!Lw5tfZR1~{ZTL88mAGRLC)<+Er$D6|zSr41q z7BI99+k_9>VGp*rpdML+m~LFE8;05y5EA#jootGhG>W=s8ZEUqz+Xq}#0F?ZgJ{)C zClE;&t^Gvn0MSYjt%G+#YpOX~(FU|03m95Q>tu7ZqD|16AX<|FA$7F)7Ibq%9bs<%IO@i!kn>+wVlmz~~*4);bfvqXy2T_3^ef$Kj@jcZe2+ z49jx1W1Mg5#-_H4_pD1fyc`IE*VH<|`SFw+1l`;u2+`y%gzLlFt!|guoldomNK$+V z=b^Niv?pegk(4@blaU>2E=O=9gL~6XiT?ik+ fNA-7>^B6kXy==;lG9c%;M@NkRx%Ndohxq>ifOBmf diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Answer.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Answer.class deleted file mode 100644 index a349294facaf9deaebd9b742dea9faede988068c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5067 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 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Questionnaire.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/active/questionnaire/Questionnaire.class deleted file mode 100644 index 76d415c10164eaad6b15f89c46f19064be7b395d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7188 zcmcIo*?SY$6+dH39$UyZHQ<0DWDthfGDrauHajHVAU0qV+dwI$%^;2K0eK{5Mi@#- z(j`sTq)pp&Z_?Finzn?U(CxYJeea*phvxhG(Dv)^+_@T!#xmIMSNJqD_ug~Q`JMHi z>%aWxgFh0{F8V_QCFsQ%ZKjuE)JQM$@H71QEI&TSkI(bt6<+;>TfZZt!StyFzP^gsQL$PksG;&#lk1~W%A9wZ4`J;M4`lYr|#Mai1q4_&mO5H_HPV5cl zg3non+zF9~s}VR=?5H{=f;CkP#{!~408&V@3S=SbhTtBUVu2$fH!B5}vlDwff(n6h zodw3gLY5*7KwchT#Y;N`YD-C>aUEj(+A!xKtHij* zv`_{@e7$9b>U%OdS*K&;`J$aM4w_uOTPmEN;w)CkGhXoIbqYqtoHR4(UYx^+3>@`* z;C9DpJEh_@K!b6bqj%zzrYGX`BtM>_-ErE(kG-@nPQRje6>1M3=*&$X*}mE+Zhd-I zGp(#~iCF{B%5ZV1nDWva=b51L^GTsSEN&Sw$WnjJkN5cTn>h8*(<=QoPQRmTD!m`4 z>vSVd2k4nN-K1M8-Hy{8x~tMXg&qxS=oRVqW4et#2o+U+M3Yw%E)JH&{sfwryq!&K zOK{tPafL(Vw1Xyy*T6khQYhth4yg;l0~7SwdK5w_ZetT?O2WrwAb4Uc^n_7t(Fge=0a)xVZC+etbN)F~AX(N(b zdDo%8XnW%;NL`-B)N^xU`mn zBRwt;r@&o^3-|9Ay~n!}DU@E~fuT^>LqUy+^4_OAIBXwZBsFeIOGMJXL!njT{6j}E zG#WTeS9swfuG!*_Ho&)7?(0V<`PMK{wRPXUCBhv;tdOW#;(IG5b+c@n3VEU|l; zlD0h5eTYD`D}2cqv@*Ca?ybBi=j&D&G7aAlBi%l{Y85Zd2_oiX^v*cQm>E7S$!!MQ)LrTo=7X z^~}9iaNkHOzPl(w+rWK0t%h;e0m@@A;T9;(QV)2XrBukk`mjK<6{a2r0-j^j)`~AS zWkh_j>7sNP-yZURRp{Tw7Silgh_ z#goJwzZu15{JQYt(AbOL)5)6@xl0Y#@Q%uN9S>A~)L*+#u~RK8?oj+sAPyR7H{x** z%(NFu@5BH7Fiba$*dxHTdH{SQ9i?ORJm8IiOFh-Kt7;??!FZe|BQAI)&S*B(nqC= zJF(0@tuNUe-$B2Q1^iksMJRNNJ|_3~LOA=ip%l^Ow1|m?)6nAM0sA-jI2-7+2vP;> z)!+!%hu~zY!a1`boM;$M4sd230_PL-NvT~q;crqM*M^{J+yIuSZ<-h28!zM!fSOHH zm+XS;!$7Vg$zBWqsq^hp2fOSB4~5QF1)_$5yiyfNraBNc4CFNcdHo?kvSdJ&J}48k zNPQT{n^k~#g=7-iOwqJtax7?>K&kU0<}CnvdqF_^z^PoW*jC+`@uZlj>*tUcp8Yq8 zyg+E)ra^qM{wT+DZvsK!gKQ>y?|DDxIp^&EpZ@s|z#Tlwz<_Jv7G_KgnYeA? zBJQZyT_w4fM$V#B6F;OepqTef{A3}Exise0xnSaFhV1XpD)rUnm0GR5{ItR_Sq-Cx z8}UsZc|q)YJmG%WXbHFMC2~j9!&c;p)z{mi#9%(F{Zd=`qei#-(v!-s<#C1~ZO^y4 z_foigCkov<-I`pfkFS-h6pdl(`5B`0?Qp*(VutC$!87O|d3pNkEi?AWV27!+5CYBh+l$VnT zjsM1@SVYv2gNwZ!P$C*&5i55S3~&E*5}I^p))9o8GwrC(5_KGfjwGg`S7HiTJXoOO z;R2D;X6TW)D&r&{Zslc=h=wjb&-HHQW4&B)kyPW?&5h8Ho!RHk7Yj)gg{E52 zBjFDHoNiTGoS|>hMf#cY4ul zV?CEn?IW`XOB3e|P1wEvk|?!H`?*g3?D`(q2V~dx(Vsj29vAjtsx;fE^y}=;5rQUe fQk@3c=}qAV>GWWlxNYo;be8CEk!2P?ViuXtSM-#Q diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/DataType.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/DataType.class deleted file mode 100644 index 8e92454b4c366f7247a18a9c9c73bb1437469f82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1805 zcma)7ZF3S=6n-{rSint8sK$^+-6CyCM5s0PC8TL+f|`n?6BLJW`r)!%V4Y=`xx2*4 zbo!}(s3kL|Q>Pt2_eXVl?uCdp>6iuf+;i`FKhL@R{m&nN0l0%|96IhM@CCj!aLvG1 z30%h4^0h8ciZLuCh$?0yhDEvgO$;eXH)B|m^jia^1m>|5Ls`;$2JUN!?3bQu_^9HG zPC>916Sfx=Y!))t?+kchhgOdd`@E zY{PcPuI{`QNZA|oHr|`qCN(8d^9RD__Z(TNnUikkWtlXj_6J_*^myF~97??8d49-3 z$M-1m?5RcveQrB#$1aqp?f1FI1q*qrXyU3w>@^b)u&d$vdw^!*2EI3u#fpg!v20=i zS4=F*S4zH?aK*qw4OgX|(>2Nbz(l|Wwcuo7?s^o8Dk%@7;hd(WeoBV~>hyY=Q>D_m zwCp8uC;5+e0)nyJCRh2B*~q_{4H9bk_E^hmIfC1vduZ9d>(Yw1thO(D7W1qw6Rj6a za4X=RFD&|oT^7=IU{OJ>Cg+~j7yMRV_%;s$(sTl=#oGkrmPO;4w@TijrBF<6+HEel z7g}xM_vEP+P)~SZz3BSnyVoB`ChYQ&LY|@w4tq`C4btn+(j-qCqd}&H8f2p5K~Dep zvxy2G5eg@BBC$j>Z@a!n5V=HXoSf}7pHr#?qjx4t)w=kW*qc$CXiBT3w{UhB$zNag zQA6&G0s7y0*t$*E+-15jqgyG78-OT5M^QqLq68q4NJ(%3b4wDP#7`rR>##sqA#rJ< z@<|M#y~NaOM1CcXE-rdU)tN!^H;@_2uVG5a|2QXG|E*~TMn>wDjOJJgIU{$4XQ_18gkXy))16fuM0DTDKzah^ch5~Y9 z$zP~c^08k*ZzN-pW5kb;P|O8gF{WZ>rWG@*n2S-x%o%@@Qe;TCM}s_>wZ`-iv$aNa zh`HJkv{#sK93z?h;3X~{!H~&}YB#HLynrJ3C6HlYL)8@BI1Y6Mc4Ql* zYTDn}@7RdcOsiJ)>-M9joqJ6~GV-A@;vPTuyxsepbNtW0f4&BA7quj!_%emBurA}K zj6w?6vB8(Gxn?tgxfDqOzDZ!7Z*C=UgUez93tWDiz#^9=8F~scc$~mCm*2^FB4JYh zv98xD#qwT#dqkY#3#%>r@Zd9IBsy|dD$VTb0zEfP1FefsxBW6CcG}iZA z&7ij~qqy=?vsiBE6k+x0WzG}tvrfv+1@;!)`k)=y?<=lH-c0wiT2*%=be|CCul-vtCGdV#DkVQ*E3%i0<^d z8}EL@O)6X}Y>$UF=WceaW%8Us37J~Y3GA-bw0)bXC_0WCu)ua5x=U`XEBqtNv=41l zD^iaCLWOU$~q%PZjkaZ8Uwi8%w!9|vtf!(*VzL-rvPp1Bh?!Mdc)%B<9xdA8D zxtS$=Ze|IGGs|DXnN@%KMZqq+_e0PhV6F|*@3ROxHfT_as}|G8xb)D8E~_O0Ni zaK`L(hDM$|D*4S`%sS;e;=D^(I~({k&c$AZtvmGbyH1}|c`L(<4UnXI3rQsxlBzBw z6`m|Jyfc95dER4$V@N{9N06{YNF~Xi)Bw^;OuRwlH$oCVrZp~fGTGn4Cqw&tm=L?E zbadqp#NHsv?I+IJ=V(U>t+0$0p{EulE1vNVBJ`shtgJ4aApW~hkJ66{YRzJelT91=lMg!j6Odt@_#`}mwBC;bbOkLaJG_Zd9ELnQwLNGrnf diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/PassiveSourceType.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/catalogue/PassiveSourceType.class deleted file mode 100644 index 7c1b0074a36dce41b3b7ad7fdffda5bebd799177..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1856 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 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDouble$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDouble$1.class deleted file mode 100644 index 718b381975412ee028820391a1e4fc0513470338..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 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 V9q40!DDs%UnEC(e{sM2J_J6P*K^p)7 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDouble.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDouble.class deleted file mode 100644 index b50d1ec38670bdf6f41c3764ee339c1e811dd7aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7116 zcmcgx>vtSw8UIa^-Pzr2lG2+^TVNZ~Hrm!F5z{GI zMf?Y^HwSIIST@RJOGK;3 zPa3C>cBlZSJoWj+@S5gGe<*cUiVo9w6SH zEk`sgA1`M4fCitD+uoU$@(GJt-KNMpM$T}ub}4hpm^x)-jOl5|oHoiuCo|{|M_e^% zc%)~(a{jj~wO5)?*A*yW3RPIEuaxraOjXin|9^PvnoWHf;(Y4rD>rkjVO7uAmcZEq z$4{DBvD4_3W#)6VHf@YHj!L5?Z+}%C6$<%?BJU9rFH|?wK*SS|lod6Iab?)`&KTFcp+FcEUzKxe(8`rV zzTYmdBCFYihE4Mp>ndJDD~Z-NTSargfhc-ziMR2`jVWVMYv(}nkR z47#qj9H^A(5B>63%|+!Hu33iIp^ z;&$vw;x+s_iEY@P#0}EiD9ugM+$_y4*qOv`8T|&oWo8TKV4>@!SziZChC@a!W!X7% zR+zlbgc*(p%uZ^__Z|&53hkv^o^W_Wn)A|JNMZoD>UcAWw{TI%r6k_QJ4xJz!6e?r zWgYJ&@jgD#@u7yR!_v4RwELjpuuP$6dV}WO4|bKA0=jl~vA8HYxvt(W+bGC9{1V z4%aF-GG>>=>H2!CSaB_a6;Fwt7La9I-?o4ds)}n!Tcr-Auq6>?N!XBN z?G1QpvHHIfbG6p=dH5D+IF50a%ZyzGS_Mr=3Q9hjXH3-$)ksYN#jyVL=~wAg$<$=9 zY(~f`o|MCi*<6ZD_dcA&NBEtF-mtg%!D-TqQh{1meEIi_zT=j>8v2$NLNsh$5YvQm z_#vajN_g`kPqPqS8j$Yo8dj)y$lNk^AP`Ag-RD(5i&Ops8J~>{J}6C+i8aAmZPd>42NJWw z&Tuxb)(HwjF#GZ`hb-H0&U$xQnOzg+$TI=6XA!Kb5)IouF6tMmSH0I`P$ex@iohJ9 zy(*ZugkgF`M?E4gO7H4_LRodR7AbHv3@s95m2%Kn{a+-j!z!u%kcrGl9%c{-a;aML zJTd$qvg_uTLEhe$BiO)y)#!$XjcCPMY(bjit^AjjCiJ3Hsv?f*zSz!{Pjf8)<^n{y zwu8MUHBy5e7ETRzSWPw9VTsjXhjka4Jp}#a+=N{rBrMA6-d!sN5O1uNnn(3<3}Kkq zM>t#0UjACnLwlXQhEcX6AFzxqOG37CGQ(b0Bk4x zPs!zf5PXdNfLu;*y@=+w(30*|eI$Lo>Z9q-7B$e*oe?#Nr8}cTtx6QQi#$WgNz z-NaFg8r{rMM2$rKQ8n7lH68mncBLI4mtEX*A7wx39`Kdh$C;?Cs@$N)`U4tk@ilf3 zhj>FY_E(}2WT)1>!WOt+wemDj1}bJKJcs$+$#0V1-RU>c@-|vuXCLwUsMqUWAM^US z97@RKGLpxZw_QT}ha?eH?*M(^R;uzg3OGnmLlk`&hdDaNM=sxqWk2r;caCHEs|t4u$9wqQ#V^b60e%mqdp|;lGK7{n z+*g}L=5Vk!i_T%FHq+;@qc)4pVUx_3(WvIIuC|ewLt9M^H8V?70`ReWv7ZKTfbt%s z42O`Tj1HxIm{LATl+WR)(nZRZ%Gbs7o-QaUPuxvSiB?(>?`@O6L|dE+Ifl==YN0JR zaRkJw@5ph`X6_5vOw6~Ld+<5${vg?l&BUu7R&&#Y+L)#*oCv&H+(#P6y?k9U*Zb+W;^9|ud!f<8@=j;M-?yn0+S#=1`qjljJ4dFz?aGoHXa|^&ZUKfsXt`MB3 z>%z%4grkSyyg)cFE&wN27mo7r5S*9m!Z91diG|_3N;t1A0A~u*w6iO-#hZvrVhP&u zg#ea_XM%40JV67raMB}kkiFP*G`*D`D}dba7%gQdU zxLi(gl&`Bf6%a#c{}@19^SVMq&8alyit7UXGd1^@0MPkf7l(}^L5b!zs2D;gzKpAm zX_v4(oRgki>M}OCldcO`Bb?njsa@UeKu6Q#Sl{#%XOD2N36J`<*_Sxq%x^9C XHnGRD82@kWI`r@f*5OC^3F7|-TqLN` diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDoubleArray$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDoubleArray$1.class deleted file mode 100644 index a2720e4c5ec0384c9c39b3919f6869ae8e0940c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 271 zcmbV{JqiLr4256(TU`aWwz9Bx5b*%w4_JtWC&;ej_%qBvW)-}eg$M9Z;@DVOnMd+? z5WbM->;3>RMms^0phZZx{vw559<3(yrpAaiTzZ-NOK$a4gm1$WUzyNdxWf8ybY`u~ zgWn}c2@@|y3GY}67u1>eXIA`$sGq#Sh|pO%r)6e21RV(3=Y+ECjN0TUU6h3JALOhL bLM1-d9EL1<{>%4V$<%hr0UohXDJyf&a-isvvZ}m>v@SKFBT{srDs91L**iN*6y&p>extBH*`pn3}H=W zo6l#fCTAtHIW|EY+zUM^_ts-cYo?ISPV)(UnsYm$)gi7@^6o=NtYm>-ew%PhMM)#Uct2QDqVBNOiow{^Jp%c$j?~G z^x$YsFakF41=9sV4G@))ZTg)Y`t?I_^47~PMNW~CE zKQ>A;D9u0=FXKDXJ0;C4QM`)pMX>}+qxe345XBGiqcBcK@fv;-#!sVo9d8gC=9V5& zoWakcSSCt0NwZv<71AW6>67N?I7=9)Ag4z0Ce9IB)ST+DxQB_$95LwKy&>MhJzU15 zrz}@YR`ymD6G#&VEAYU%xCs6J=`J5EgzNoE<=f8JeIjQ`$;n$&{`T_AQpu*~aN5d@a}^faDjmXgOMCB{$BiB(!p=m~`MqW) zJqta zMo2VbK8=vph&dWD(FoZZHKNhv)2PuJO^!yBXw=vmVbN&zX@s>#v!l^08ev-_A{s3| zjfmE0aWq;)BVudBlv}MzWr+)mNA0z@Iy$YQ6Jy6@i>e@7v>)xfMYRY~9TrkOR#Fse zr~%uk5r-(oslFMJgvWh;QURDv76IwO!26w&dnDDG4tfwH1V3$_k#LkI&L!2C^tH$Cb8V&p& zl;cyLN0bU4YYnco+XIm{mW5bLV8CqQrqbOq^B6^D~$A2kF^rgJ%LDLex$E?l*^Hh&V!UMFOAeqL4Ks? z80lM#^gJWIP%+Z6V5Ffkr0;mvQ9}B;V5GLw0Z89tq`zgP?|ZD3knRmc+T=(2M~`wj z($CL>l&?{Z)XmX;q#rQSKQYn|8R?%ZM*4+dq%~zo|KeFk3F*FIq_)!mNIznvA2ZT_ zdaRX@-WiCr*^l&7k8(NEyXHa4<&Q?{USd9^Mg;XnEn-F;+Ku{(k=`AQH0(!ew0hQ2 zLV8ayQrqcrq{h_<8P_0cTlB9$B8a*>EcsONqGGbjqbVq%ZwOx%9Q$0ay!+wTK1AQIEMs*Bt*chq-VG zVl21IY<%)Iy7yhg)g#O7TI3{udU0uW8ZliQ&EgvM?X^$|R1eq!jgElS)V4sI5(sI5 zm?I!1v@OuC1ZuQElOrG%vn{Yl352ykvm+n{vMtb|1R`3X#SxHt*cRwi0!-KTvh_5Y zoE>*Wx|W?Cc^lX5<1f$af6Xv}f8Zlr%XH-fX$9&T&I5=T52Dw22s@33F=;%4=Zq6L zV?2uA8;{}d#^d00hqZX6MD9fK{@bc;ND>Pn0hg;lI7(DUne9x!W%j;98n#bV!y#NRw|r%z-I z{CRh;R$j+HrS=ZRFQTgSy8~5iYGw5S3FkPoD00YyzfRdqL7UmaM!3l3Umoy28o_pC zUs%FDuQhB(K15}#$QBJ{@o11m`tL2u$BS!`XS5UQeK^LW299GL|Lo-P9{x}2wHzBW Q{ES$H|2O={_%3Sy141Bi@c;k- diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDoubleArray.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/aggregator/AggregatorDoubleArray.class deleted file mode 100644 index 531bb7679d22ea17f3dd9a02684961776f22bf2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7779 zcmd5>YjhN68Ga_&dzOR-i6qdnO#_4_%^E4t5DLu=2!@6x5E^T%lg$tYc4x!vECea` zhL_f=tyb;DYrRC+oa*ugm>=VSGP^ z4fsJAKaAlnx&J7PABXWq7(Y=EA2JNh?9ZtAyp~rG?knh-Da}-{I6z59p11fSHlWRzT3WTVDFx9necDj1f~hHJ^YQL+ zo-?X3of^m$CNo;kUaoH*Ef|)b)yDO_&beO0$XTjI;MA$9bcwf(jYgd%rhFl*Aehck z0-w~g(+VPI3aUwX1hBI_01tdwKmw^&KSMKykB<%=9UP@u63fh@=TZYyGke_BEzRVT z@aSOgKn3PeO{IUxTtBT@w%;7)(!2ULUvL!kE%43g3un_ z(5=11+rD*NLE~^PO|Pr;Jzu*#0qdkrL+-G}o9dKmrj2~+w0h#Sno_5yO>J7Wa%QU6 zBOTB5nx=Z5Nb~JJ8}@wE&!S1wQccd!xY{Up_~Ddwp%3E!DNm&^yb&$LSWyO3F^+0U zD_Gk;wAEQ{pS6+6Q(9V1YUqTnWu_R<$`G@`n5CvqA694FK&hQ6aA{Nf(DIeCOX#d5 z4X$lm{+@5S?_tRgjSS>v8DjIY$+9k?n7k`yjo;5bf+1*QP_V`SwyZcCwcwIWVN13N zv6f^FnX!ooXZoEC65*UniblPXPlV4V>NxYTms{??o=%nAs-TV%7X@`+N0~};is}tX zsuGYk5i_)NULDxyW|f;f_HC{JM$8lK)#MFNfRog!-#(bLPD(+0;FeG*u&Pp{=T_mb zIw#d(aF!LqP&2G_uB%x*oHIF6uz2e1*sjgl$Im%Deg+oV!P&GnV^_s6e#+W!vX(4L zUgwuQWE2J0$gy1Olk2=@vD}l+xHTj;mMfTPZNFVPTgujhPC3~M9AlO?3HccNDT< zsZ$Bvn9^oN^v_sLmnIwqJtC;es1un#mtjtZU&PUaJz@MZjyLgE7;ne%EBrc+2e3De z-{5i>@5FHhSHpN$!JU5mPF8L^qMB^Tct~9$&~c&FVoht^-O9cxXHKIwwp39ou zeVu1lCOq7wv#4CBUC28Z3pshGa%pmnYWYIOO5{!?rc_H!6gk*db&|&}1o_t8k6tM5 z%nK1b!q^)e7$1cV(kM|UG_>+s5bI07|Tk<_3scYee*EpXg3bt2~HWh5E z2yE0&a(!x^pDbH$kegpDRiJ6>Qn1FZ2CSe%BPB&+ty>`NhIq^}bz|BtySuCE4BEQv z#pkM9Tx_qZYHFOFb5-r!a|=6es^~bzADe?1yW~M5%`a9~JX*Ktjin8b4WzV#puhTb zLp9I4YuS6=<=>G!B{9y=0lU3Y&{gVN_hYBr21U`*ISb4I#-$Cj*n)d)m)kv+6XKwB zm#&1ec&Y-@sVV5YL6AksWk2AW{3a=W_XTI9$KZ)C-K7}j%hd4xvao)6E9bu3I?g|M zC3q=lMIBnO8CyuV^G{+m*otQ9>_{up*P#|E(!eKp)u0QX8rrOj<5m; z+r?JF3u+j8!bo-F93-xg<)ulz6LF&{Z{hxi0Vjmu)j=g-^z`OhcSD;+xoj&I% zb^um$WE;#;I8(gKY%sZins-Rll(25XAZOwZ1NP$ppJeeta&fT|<2}N;4q2SsHjmn5 z$2;yIWUhs~ERh$6d!TWAr`*;oT8cM#4+RGdQG6ZD^$q<$yB181@ zHN++w>lP6I0~eG!VlUO(NA(`0@p>6ueWdycasY=oju4^*Lz4r_bHoIJjS%t?zKbE! z5paH-c^IRvD*xd=V#rIbDzl{JS5##uX;FEY*KuBxyt2uTKVlUlY7QeV8JNR>O9toA z?UJE6bh>1C4)?fZWDe_GGCGGM{*F*T zya}k?-m#h{b+Rnfs2}Q|t_xK%fLIiGXZx!mCES diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyMeasurement$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyMeasurement$Builder.class deleted file mode 100644 index cabd504e31ac97d2d5e5c9727caf15db17f3d52e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4234 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 Pm=%-YzgKQz7m5D?b~jkt diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyWindowed$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyWindowed$1.class deleted file mode 100644 index 93fe2578da76d7a95e3550da9055612ac439af80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 227 zcmaiuO$x$5429olwY3WN2qIlOh({0w5pm(d^*D{SKg_^PReCiS9>7D1ap%rFl1Cu# zBd_=431ER?h%m%JAU@cu)3h#X5=gex9t)G%J7u#{-ITz1Wpr(QVe%a{7n_BM1ybvB z=~SkiHeOchTq#*mD}UnYTwt^@hTO7N-jiqgmndsxa=Aa1q#J?he^4@kK!>0HR+k0d S0`%Ae^m#_yG2aMwB+&-|e>w&L diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyWindowed$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyWindowed$Builder.class deleted file mode 100644 index b3ef2d617041c7d25e507146248a41444e2bd30e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5500 zcmbW5Yj9J?703T8>*`AK#a0Y9*r6d%1GbzZY`0KjN&#aC#KZ|Qq=dB1wRCM?EF@PC zzzI$IO44`I1d@;k=_AwhLqDXQ#!j1=B%QX?_w-xeou;&%e(dKyru3ZMmF~49*P=6? zy?1xdIeYfE=bp3jPyX|r*8vRTD^YAjnj43ksR+6-9mOWhaO3jW=?FEm{FdS7OcYt< zqL{;nOyqf_zyd{XN>Q}otci2{JkKNZY;cwv66ivSn|W5c&&2&v>P&Ixf{72Ccp!?K z@F4d;V&bDFK4#+M0-;jD$sbM&w2hs%&)SKMot;i3i+MLYJuDC|vullkV2aec53#hJtrL_G6Gv0F*eLbx*J$^n2tgqGVK(P zYt(Ccdh5ZC6g-i=J+%_O4J_tEVw|-zCBh$>u?yvu>7?!!XijAuJ6|5#M&4W(>t@Sh9Ji6zS9~#pK|7kZZ1m)pQkTRVCi{}Po8#C zMVkDCKyM?F*4-~-EpUE2x!1^1^^<$Y8?s#ffEu&P5g$0;FL1OGga#M+VZhymd zc2+w?1ztimz-dzx4Wi7^o{WqBN*qPXW${~vS; z6f5ma*`-WTTOC+#XZqy)PU)kgDD__qCT8-vb9||i(bQ3mRzar=-$uG@5_$v?;H*Pe z(*UOt`J_xDpOi7^xsGNiVUhGL)Z0NlLCj^QgTRO zK*~_&Q#QoCFr@5T@xDcb;-u0v(DyBbUq$3HHpgiossHJIWe0yw}!3EA!?lAG8|Y>uOcYym`u}x*YFcQY`)oYl-9l zeuE+W4u|o3r11yL64?ic;tTi_zKTEN+xQE9i@#FuZ$92vE4;4~?|1uo4{6>*inpK> z9#*_bhc1A0E=HU}_hots$Pft0!N2=H4MUq3*p2sS<&zXJ{26s}c=9nV&}*MB^gV-g z?j-mRG~=I$;a{}RfBSsztoYuEJ@j3(Pw&NEy-YtX!akZDsZE1lU+SeWd|sLrFZW@; zR^LlrvU*EglwE6@hMB7uo6pRxz+z%sxnD`;Sq zNc0R!V4@q%Vl!f53)YIQD*zj<4=h*%Y`f1(57@!_z?5rsfbAk+!vt)%&zcA95N_4@ z2lVNMDZ)5wd0SM>Mt%C>3h=`?qV?~g$e{zmdKqNKzy|p_b;dXNvYuyCVH-z_xC5)j zo#+zBeAw1&`(%yctcO+*xUD`mqXye4pQ9eOu?n`GI?f^-rp6Ltvf2m-rkL^>iBxub zv@R`9)ZWe%t(;Haqjmc-v_gJb<;3F)eMM`YXx&G&?k8FoR-iRrpH`@b)rtZhn9qnui*D&EHpINV5dc?SL)Xbg+&I>!Qp9Dd$&}AtqPnOu(*oAZqTDV8 zf`dw+wJgA;K?!t70YeMKUczb}c2YnU+qF_Aq-EBWWjNoH5hb&(@8z-AaMMY;Gi-Q+ zyak@XMZAqdge&YOgem1biLiJIz2a#c5toq_&){+KEG~-Ya7jEbcYZU;hv_F)Qs(nZ zh+qQ8rL`+McDSY%5V?lVN{$yMhOW_tM%7rE`-e=NNdB+k)+N$GC0jLkjbM}Q9o*a% z+ebf^-lvX%Tqzfk1>9T}vG|(r40TS7fhzvpT6u_`0osKTUqq94K~oh-DXR-bIiZp$ zPT?L9{T`U3`mO~tY=X)ZjnoG#UibE kFZBYj>FUJK6#D7eMdKT(-A+e(lKO~+>EEW0;nRrx7eWJ|Pyhe` diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyWindowed.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/kafka/key/KeyWindowed.class deleted file mode 100644 index 3918da15ddebf6353f7638cab11c736a63b31846..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5411 zcmbtX`+F2;6@Dk#?CdU^ivc183ey-$vVpA7wAuvG+@MPXl!Sz)h&t>}l7Y?ac6OG4 zh^@EUdaZZSdTUi`>+@JaN^71+>#zRezvE9nzGr53b{ICW)qS4%uID@FJ(usCZ~yt9 zzy1xtqxfSI8cHcVjIxZLlg3V=9Tgcl(o|)7NyS5H52b-bkF8!2ocs`au9zijJ~yR6Ii{d}vSd{p-EtQ6 zV%2DSM0@$w_s{?9-#j@t`Q-HR@qPu{W=i&QRxj)M6(g%(vP;=Hj#l+C1@S7m<_ZeB zXD;ZM^lVYLma}t?ZCcCRO-&hP+sNyVL5l6ORm(9~jRmt}o-Z2XmQ`|ehfs*JCv>`g zh8z-=Qq|5IBB6~aZAU??VR5FOna!P^p6yql-Gk07Wv6tfx_ZVo9m6IUb#{7u>H);F zhE6k)xMSIHT=RKKD(D>;yhlV}fY@ZIU?}LEF)ianb@jYqpVp}zEpy1UOy@B14h$}c zeM)&6U#APW?bF1Z6_eWcyX)q z#`j&BDbWid3U@AGx}u8;lGM7Ua4W|OwhrV5Lv$z4Uoi3xVZ@hAqgbHfl^mmI&e8K1 zkLzV$qt%&Na8No-y9Ybm@rNT(-MerQo4hbWvm64ZP<^Q`#ZJYr>9k) z9cUs50(vhXn`Yita#kb-?E4@x6wEe*Y3u`HX|-TTF`q9^vb4)Axt+MgQ)m zyofns%8l*{UB_XGO$DBT!kMvBHuC0@na_?hPaZXxiY5Dvr7?tkX?y~Q)7X#UG!9Dh zWBeq|QnELV5ovyk>r4jGTq}(H)EVf@`#PZ)H0B25vT!{`bkWIT^hf~4Ha)FcqpoYmsk3q z)@@#H-WY$-GI6!fxl%UzM*CPKN_L@dU!SF~$~qBRk|hT+?9K&6LB;lq4#Y z^4zYaOO1;(kH)yyX2++-XZKH@nA6I3Ns`zw$=xJY=^H(JwIOl;AR3$Edue;-2+0tx81 znm*&b3lvD?J>c#r7No-X^L2q)-d{#t(%40}3{~7oLeScQTwR#GUTz z&V7vV&8NB*^5hav3>*vBS+~3?7;Gl-_aAU`^n6pawL;fS0rL1BZ-(z!^ZfQa(AW$S zru39s*z}e5kmkP{D!l3&Vd6 zH4;!`Eu~RlPBE5Tm`_Au`jxH`6Az_-^nNI7fgh8qs$il?kTuTXunJyyJyDa?o}6uE zDGt1pVJZF__dc)h9rqSs|7AY7z<*{MKi*s<(2GZ~m*WBccWc2Qwo5(cSdnVXl`O}= zNBPCMc7VMiC3=G$mh267SjQXg^h*6C*Ip@^?6>gm;1d|7lrheBvX@`%CX~0?D>%ef zkN{n5`D|b-lv(z&+LpP4mOpdQ5+dD=PjV&g5#Uo8=S&Vyu$99vq7`lIH94Fax{cP% zzT1dp_P>L++lXhj$J~Kh=i5sVpwVJ9SrQrkR~Y+-Y8usI`?=o z1D&UE6i*USj(aNFv{+14IX#A_e3<_rV}W$ehk1%)`PE=%IDU-ZWM<#{NYg7fFyaqm zH!vu}cF#jMu%kXxZ=k&nUwr1_-$fK)z-UA}M3j#+4yG6bv$XxEG41N0d4K{P&iOhJ zBxZ1&8j3av#I;nay*)`qPT-`kPCW$0sw4}$Y$oKgHlMwMr*Xou_%xw0$F|lka3TKV3xEz9$4D6D0-6~gTu^}8c$Rlu`ZwTkv4dI0H zf#;@|2XB2J8R; diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationExternalTime$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationExternalTime$1.class deleted file mode 100644 index f27569c1ea11e83d737d019c8c1e2f21631887c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 283 zcmbV{v1$TA5QhJWmz+5R-UFntuyzS)LOKxz3$ZXSFs{qFvNtQc8}ZpJ@&I`#ajmRu zoS&JWABJz3|MTe&z$bbo$`Y@HYUO`}HZ$uC;eEW{JF7WaFVkZ(LD>D+){J(1U_yT? z+WBauS(vo-n-Ue_+lNL4-f++oRqMqj9~9p}>JD`HL3o>sm@si1qltw2dPg~yMlIJn jqZ8rlQG7iB;VD0RtxgtlD)5}Wz)POp+*RJ8?5MjJyO~jZ diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationExternalTime$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationExternalTime$Builder.class deleted file mode 100644 index eda9644c2b8a3eb53239dc2fa873dfe069be6a95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6858 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 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationServerStatus$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationServerStatus$Builder.class deleted file mode 100644 index 67a47eeb4ba9a8e29a00f06e5e4727bbda4a3560..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5668 zcmb_gTX0)P8U9umA6q%~B~BdMbxTUz#+I8XwrS(kX&T#d+E6=bBV$Ng3dhp1eG*wx zjwCk?m(o(8<<=XwaA{$NVg@=8I>adr({_O2fd__1F0VYpD^G-P_Z&%US;8K>Gxi?s zp8x;$|G)pTEB)!eZ@&Xz7(a?&FXrTsltZcsU9cm#4fAqXkZX%g9GnQ6aZXOp%OM@X z5;75Fkuz{XzH{YrUWyhB6y04++-#nTgqmfLe`C0xm?;w zS_LPYi6u0JQGq5WHtq%v&~Vft$T5LnU;ixkp2()S zcgvKMu}>A3=4^MynoDzK=TtUnrDrYIk#m1BR9JKfY>XG3bjo&V@5xNYb|=zSK5z5I z_{R2*RczNy@AV;R;bh8>$haDdR^Hp13GfILCYiP^*IS9x zm<cmlvS`|YxdX{zCa|AExJkjgd>l*o;o>oP#&8m`f;}$hU5@6@p(Ke zKYc+CUo`P0Ja1wjdQE&8Uor7je9gqy@q&SuOuUR&41B}HH}Nfj*2*F5wRaQW#&=9y z#&=EJjynVnY}j-4USncE`qsdDox{ZU@O^=i4Z-SoZQ=)bRiM3MZn=sDdL^nJnK7or znPNuXT*_jSnb%C5!fAoyTQ#F}WC;va@40dI34E|xX?+Uu_};Q{tWF~_@xbKtSg%0m zy81}4QkE?ClAFB})*18P$tpj*{_V!TsXo^*@7U=SZ(89K@`J!_ef^KtF{4+B&=^A< z{io;Iqvd6y65#T6!*ueqR@zB%kavXP_4awz`;Z!h-^S%lA|$C6*zcbyy6+1%Z;5Oh z_j}Jc1=;z3$P%m$m%a}Vn7krXpt}aBPpH7YYLFV+2{fi`J2#Qd@%nYFo`0h?JX^mc zup^}|YCc`ONX2>0RG~@Og%fFOfe{KZGGwKZj#IKs$Vo_7TxR<@=~uds-v1bk5+ys+RJ|y6oLrIM#pba0okwAlP!qPU0h*rq|^Xs zcXKBAY>d8%&^3gAr6lj<7~vbRy%=~E2l&bK9VjY0pMH{f3F~Ho9>gqxdbx@ea=5U4G4e z4+Z=V&*JxZ4Syh$f7EzdDf6^Ko(}6gjr%-}D4qn#zsKW=SyjqNFNLm<+JFjJ10{ez z*T_aeqmKIek0HbW13fZ($nbu}VP|x|mS+{rosb`; zX)1$^W5NfC@hL&VQC3X_z@zFvnsT_T9LJ=ud{(sypi5E3%3DQebU>@F3ZUXi1h7K{ z(JDgNBf=U_U1grS$kQFlrW3V!3RUwYnl&pcJl$XB>A25Rb5xW}TSHc}47Y4Tq6?EK0knyzRx;g?G^tNVPc=ATp{ekc(5j6Y&s2|Gx_VkGQPUBdbl zVN_!A(yWTT!W$HR^ zIm;8})^}+Mpy5vP$858;A%Sb4OUvW-||JC}{; z0-EqJTb4w+lkm=vmTSEq~0n%P?dUkNehFYdadB`@iAZd2%j0o=a!of7M;>x=?J*(-6ynEgA&Si-%BYkPx#Q!U1@H-c eQavpk;qxVtH(b~u(=S4h+rvCvs^=>=> diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationServerStatus.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationServerStatus.class deleted file mode 100644 index 144ebf8c2d00b69745a55a4541ce235ab9685e5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5716 zcmb_g`F9i775>JOHI|TV;sgW6P(^WqEgPw9Ex{DL$beXEY8$(h&}5Ltc!)eBMv}p$ zPMfsN(sW7JbYIeimbT|mC?P55wEa1MR8PMF&0-S^$^-Fx4?SNiBb z|M(|>{rGDX36x@Z8rNdj1Y3q>xm4s*m3Q+ht~cRE3{6;2@kJFkReVXsVhk;KMJ`{K z%U4AH)fisGS2y8n___>Vm*E?m@Fw0;@pcT`aIFd7lKZz+d?$uZyrbf~G3=82_f&je z#Sc{cP(eIrnz}t))XHVOtUw*A8pVQcE7)AtZ9^+g>2}$$%=5Xd0_Bu~=3&b$S2VLS zr4_4s<9nfZ-aWbNqiL?37(O|2cCbsqwlkJ}C8L$J{H&hQ=4~r8!KXQ`UqQHH%;^Lo zSS+iTY(1}4^n!xz<5g3pri`+2xu_4Crd81@)Jsb3XRd1VTBfL(S29a$2o@*9dEK6% zWR-FmN3E?DG&^sWGjo<{R4ki3N=1We2$q=$EFeJCC=C`0wqEAywt$w2ifx!zD4 z0?pQX#xV8K>fB}Bp44b21(72LcX?DnsJmxMHeu!IGL4Sov?mj;%o^O_;kC^(xMZq2 zOHFkL%#*dMMDJf4Zy87cz_YK*IN)3tmwusfYIX_nS;3a>Tu%UC?DADTU!fTzGlpI) z&_7C!p~*RXPoulr-VKuE<&Cbty!%Qxo-K95#VYS|70-iw*~ zbw6Qb*R!crLafU}p-W$1$F9~wagWktt-BTk-Dg#1B@qs-ZRNGWUfKAr`u{JxX}&Ib zYUBoUm8lh(alN2r8gpZQtXkoD>6aJ@SS;dbSQZ}>N67sfs zIDmt3`~*K$&{bc$1j8#%{=CHP#^Cbf9Ds0-n1X>dAy%p^S?^XOEj$8Pnia#mXS#Jq9BX^zC?6Mq-i1*OYeKT2EDCx<= zNtScVE+qSsrZy+zRmgb)Wi|*RMLp@7nbKa>PHRi0h~fn+PeIpQiM+**B`@KZU?alP zpSW&RW)qrOuq~sIU=ZnMCCyb%Z73%XU%Xi(BrOIfJh}y^-uUnZecs6H36UZ0T#5co zoSz&{beDV5$;Cb&guC~<4j;_7fo@jk_|~&P(8GLNUYNUV6@^lAcx-fZWO#BU%h%c5 zL~wY1^z`W1^l0+ZVr}QH%13uDyDaE4TD4fAeQN6hT>S=zg6^&_Ce3QGnB;amE0mpP zhx5{@IcF;Ey`sh4xy4I0A}2Mwa9y+Ygi)Z8dB}7-Va<3pPXwH{jG1U$ytEj{ZTwk5 zUwvTt=XJt6xPiV(!uBugUgNe`3Jz`b+$iW>lij!zA%;0ijmsH(pa+4htLS zu#U!cmBi)k|JgO2&H!d*im}xiG4pKQnJy34SH)Vrbu1AqUv%@3VQTh*x0XH8u6m7> z2^lzP)r#?Ep8(7I;o(s{hwGn9_=H%xt=NhWKZy`APE&6cn-Vy z+|3{L4d}skX)E~5f{!%cWcUnxlHUm5?d4sOCS#Qub{;FvbV#M<+72nsytg5W!{{g0 z5so@}mrwXElsmjD_zbV257^8rdmLUxGQ+#PZA?8t!{7MO5D?vo0lta50vN;)N3wXB zS6OT!gfQ=0WpS$aeT42Koa(zzv_1C`S%PavBgLMj@Ne)r!i5)_GJL2y#&56F-g>6nfO?1bM!7`pJVeulw&(-I{>Ax_V<>lLX<9skE_$_x9!-iah~xt6|#XJizoy>DTg zJT}wnx6r)AQ(WK@?Vw69R5}?ZDH`!04KctioMI>pa314WlOC8=u9vw|HDWt`5bzG(cTpE2YQ<(M^AEiR!5=r&ato1}*VjOD$A`zcR zghcieL&4{8VFen_zm4 M^6%Vl;G2m47nak_lK=n! diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationUptime$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationUptime$1.class deleted file mode 100644 index c2b76cef76996bacedbf9e9e49e518715be86a56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 265 zcmb7gp=Em9>Sn!Ji9=C|HPvcz~D7D1v9hpo9y5;z z!#B+Hb$25Td<^~#hx8P2vy zkr5WwmCW&iJ7GMltWm)_#=i*mgBwo?{jD+5tu*&udP4rWz%(}{+n+8{1j6ipa6ST| a5nuaMGYT;!Xhl!ZjWC9bnlWhZ^_UZOTgmKEZue5IIncY8vKtLwOHvm9v~8<3QtSB8sheKHhnlu)s80oL0%g8OY8 z#RE1T#6uPyws9PfSa{UNV|ZMlZ81UEcmhw_cnVM3xKIo{gJ%``PyYbhcn;4iv@bZQ zogIZPu@}T|h~*lqb_9eusFo}5|gHz2#cr0 zN)7MXwRfmXVNG4nrr5nR4$tvAbCiN{`|sqm`BzKu?WwcU?9wvnx!DYF&ggELC|uax zbH@^4bZHT}G&IrgneA<+IBO)LxZ1j0M znBA1iTc1byI`bT%Aer_>h0eu=GAJ28r1FvmRH37R(HhtnEjH4?okDBIbqmA!!UGC} zOXWAvAhY@{g=HCiA^ULg+8p60gf30WE$_}cQ>;*gl_4sv1m7bv&B4lMu`}+ZQ^}Tn zXZ=gX?$;(*U%xo))b2nQZvk4}DmDx8lH|B;UPu^JLq;j@i1 zG8f-=adjnEiqF=>=ZMT9`WfdTT+A`fC-5XJQqm=y*+vcj}h8ApRzL6Wm*7_Ge-HuV!)9_c(hN%fF=aS+s>C<029f)fM%sk$$5p zuL7zoL^To_m$<_^?hR<={6)s}64u~lY{M(K7Ox_O*HFgmcnELkd{{d|C9*u=~f zE~Pdxnx|68!e;&luBI$`-_Q4?pYL%WGm{y^URfV@*biG?1;Vb&xV>Jrnz6hJs4kW9 zTddUE=)gM|z`NLq_pl%D^A`F5597l?#>ZN(x{tyV%@(uBmQKu`%VJpLwL}OY#Jf2vH z%AALviSjQ2Be9y1fre;FyDr!;X#E<{Z>{NXUjnU25UpzQ192I&ej{4H6Rkgp*2z<# zbxmWmB6Vo}83=R%t-;17t#7VU}OO;ep{G|DUz)|iHE+ys)KV_J=$wZ_a@>A zcH2j2_nT%G=T-@0rIv|oF)}NvGIC;SGVQ&ej(&r+2gykt-|3>>f-y3JVTlfQF7OYz zVji1V@tYaPm4ej~LB8ok@9!i_J!8bEPJvpu|Lg=B!b_5_f{^mN6*&a=wGP{u$L)zkK wBa7<)TNHY#S)|9kT!nBG_UY%%=;5=2`OV diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationUptime.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ApplicationUptime.class deleted file mode 100644 index d56ce369287008aeaba6a15916105faadee2918e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4768 zcmbtYTX!2*75h_F z$VnOkl>4QHmOF*QV;^`a3DhlK3wY+2@CR6nCl=qH8A*fWG>L03pEE~i?{9y5pMCZo z`Jey&>)!x8gFnP@1o=3Q!iXb|4Owo=uq8`V!}Ta`#G#>}p{T)%qXQ)w$})UKB<(mV za5_-Mwk&VT@>U0K;}s2GjiVPv6kn71>l(fh$6>sx;hS*`$owr0-`4OQ4c}ErWG&0E zGX=d;F)9k$Ow}yp4O`(r#js7iuxi*9vt+GgXBE^Xh0aXLsyMpktm=iT5&74@|FgBS z^j4OdOPS~AE>90D9GWlLn`ynQ=eCTrzHOJ%OMEKoQwm|nEE)tNSbWwf+eS`zjJ(3( z#i}J+t7gSqFBsF7RdRHPc1fvk{<^-crwh8ZnQrJ1ti4+H;IylY+2y%KnohQuHcRPQ z-KiF@+NNXJ)Y2B`re_}_ylCi*0foCZ4abd*=Yc~1$Y_g+hIg4#p5ArOo0joHwYYBB z%R0Rw({rX}I_DKaBcrPdJ@cg;BdasM-1cR{&X!4UPrLB8p4aW1RY@01R4mzyX1QQ8 zSPV&ey79c?Mu0?5j0B@psuFjq^%Ku{Ae^3{LX3XaTnzD9p?4%Z8UR>Wzi#9l3HpX< z6!HwU;+c0YIePBKWxeeC5Gq%x+BcGI)fCh1+mbWX?P=ZT!O-rqn;r)lDe1l#QIZVdm1)tbi8{7Fj8EQwfYaqvw;Rl{an))@v-+%@;;tQlR#iU;_HO3_q6PCkcEKCpEm0z?=A~hMy(ybNnKK zQ+OtUU*cC9ex1N?@Ro+(DjaEcz^g06S9F^lg+;)BQ2lp?oZDq%XmW^cpk(KV#)mAu zDC?FW`&$*Z6xpYRiJD&%eubO}R7i^FOF0V88`h??l`L%}1G`DDZA?(gt!0&=$!m9N zrlp~9!zY$^>th`*Z)}@6BPlX$fyFWpAi1)fNsd%TCx-5h*Fii34}_5-m#ml;q1bjE z;g%$x?f5`1-%a3mcw1q-Ih6IBTJn=C(Awmne*efiUWZdS_4qlWF!oShi|&ce=oQ|X z6OSm(-uL)qhEFOy>83twLv|r>Lpr>}b6->3#yiUvnux-ZCaad z89KY4IyrpO)vfMJx7KI&Q{O$i#r@cw+P}T09(vGBSJuin8~vP>HE8KPLUWdR?9$}<*Rsr0 z_Z!JxARbF!^}|@!E@4=jmcq;%7RFPDygJ(I4WSX;l8cFS-?N5AY z3y2P2lAk0z0Zic>SEBqGj-vb}g!l{eigIe~J%s*(aBAG0BMq<~gef${@i@VTagY%Z z;H0PQ0~3aEIPV(kC9m_OqVU0U=kL?5!gOPtO z5cz05@}I-JuRl$8;##bh9*wk!yBk?VX-r6ZL5$T&#&Fq92Za~*q~jh^6P*|Lq_glq zI)N;k7EhT+!utE2O)GdBREY6-kn{=RoaoOaKS&2u6yWCjlGWpAK-})nodP^qEmGR z!q8Pel`ec9Yh?2hvBaBe{QCl4_R%l;=-v0wBj`_lfP*1iZHDhfm+A|^ch}*&@kN%E zAbb>Gu2-u|e!Nq==v~`EU(d(h!=d|7yEweYQn!Qt`{>@qfVUXDj~=n?RlhD*w;SCm phC%fNS339FuwJjYIj)cKub+EK&NvX||B{Zda>ZDi?%*zB{{vqpr||#) diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ExternalTimeProtocol.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ExternalTimeProtocol.class deleted file mode 100644 index 453c2259220c14340e54bb2486bac538aef4a01a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1932 zcmbVM|5F=96#p!_aLM%wHKnvrs%Jz^C?=xC)&!A=X^V}4@hA?{@rUKI4Oj0==I)Y; zj{lRwOmXb!^k@Gl$G4kMqQqZvne5xQ@9VzzdHdJjzyAr~V|7`4k0Z}G?p z;<6tGZW2ai-syO*!xJ|Q%Jm--5e3}ab$ziDg-PgyUX>xG?DfaZN6qbTn+&?W`LOLw9T+37^WL; zAevqOKt#Lzz@rmgx!-=u@Tkyu#(TW%@t|F{lgJI))#BJ`=Nh5Iy*(beGR`2F7I2?p z<}Lw3&+$b28WO+&UO*cpgU3+fqQfX>I5GD$H zbhp9pS}uAObnt$=b9Rj^&Z;|Z%NlILOcy(Nd&I-B026(0r8 zVMN3Jqlm5NZgOaGD<*i81zn;iA}b6Wv1}<<|Kr2wN5g*lZv3v7xH53xO>FU?Wwk`) z_UI_29Gs9^9dyHPZ25x6gxR=6smDkDLFmQ#$`h48olt062hU6XyPr)w#1y5(44s@a(8&REN}F5B0gF^h$QKquWgJI5VywDS#-!N>M@JXmGBQ|3aiH0u63K7pCA9rq zCUuJJ2@J(t(iCGV=5kswQ^}qO_euZ& diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ServerStatus.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/monitor/application/ServerStatus.class deleted file mode 100644 index e31de08ca91a9aba225fcda836237be9ec180245..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1709 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 Dm6_MY diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BloodPulseWave$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BloodPulseWave$1.class deleted file mode 100644 index bb2ba103b28d1e89035b7a127c7a1a4cf635a096..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 291 zcmbVHL23d)5Uf_?>PE;uVGlVwh_{fF5+MhPAei&G+pHtww9KsgxE%6;JSx~8a?Qam zx{HSHD(dI=>l?rvj~TKIV?w@_ORRY1JQK==lTKPEVV6#`g%_ze7oYgkc04`W&Jv#9 zLggj7(5$&VNSz@kyh?0Lw6%>@Nak!)avhufpP2ba_IXB_yobPX>Gh8jp}092Z$o1~ k_D8N-!pr>zMF~PrL*J^efNldkC=W2yInvJchLll^uEDTWCIA2c diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BloodPulseWave$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1BloodPulseWave$Builder.class deleted file mode 100644 index 90f3c44fd4ad002c3cbef450d4ef60f0c6a57994..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6180 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 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Energy$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Energy$Builder.class deleted file mode 100644 index 7600246d8a4a5dee40df22f9e1bec0e1a311cb61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6050 zcmbtYX>43q75?sQ&oh0E*Se1F(j<0kdt5rT6Pm_TlEzzGaF)i#kTxvOGtc%*$1`RY z$7xzxC_6Ni(j{ri9%zw}Xc4s|Dz!xvv5S8!0t5&U5<)_h{9zH{ocr#~yY@UQ?L@Nf zd+*+JzI*O>wmbgO|GxbqfbIBN3|+8!nB`$EicZYO&<%%&qda$al!i;`x9v6t*>|~wdZh>HL-!x&5^HR zqXw&z3(FT7-BO5{0X z-YU48l8f&Yh^8{Om3L=$lNp!fqIz{AF9z$?5wsa)fH%`vF~OT_AtW~f)`V~K8luKC zIjcxKwa_L$!h3qhFY!DrWUCKwt2EeWp~KJWN^*7hndz!3a)lO+W6LRfk<*ic_5tF0jRy|Q9JNzLTKR~;u3A#4dq5^pVEG2J zy_Vn`Alpkd?Od)bwe8BOA6Om`Sg2+5WbK#v>*^gGUWKZsG}?GH}|&lQ<*L zu)frqcnY62@i~0nL@xvMAeiryL&I$~^{(@=ZEBLBFvj<(t zF@bKz(|O)YZaq}Wa%-=M@rj={F^MUGq1SIfxh*K`_1!KWKLXp z9Jy_5-`;MDgR0n`q$ppoDBnBWl+*22Yn+v;mFue)Kb5RPky*#ir0J#-9_JT;%hK`!r0Ak+$|zmgq-!Sa;&{fIBM*hhGsH>@w|I~8@`WHa%QpiLfG)jt zOY8!xSepYVtjx4MYn3u()WMBTsl2G0rQAp{-K!ZpHJ{HNFY-N67;N#e-oiqgrAd=2^wRx0<6Hm zDsG@R)0M*jc1Rg2u`Y(lBP?ZKjrXr25+{}5VE?yJcMj2Wh@D1%oaQcb=T~5=r4?NM zGB&NC{(0Jb1r5Q_6pMsdwXs??H0Y}GlBU|osv%c3%&JZ2(7bNfuu|nEsoJuFE1pLa ztA<_G2&=YMt45S6FKMc+tQrYTFp&^o{ zKBxFED*n$aA2N;716Nkl7*q%1C5^@^542UQmOa2rnrf8?HdoVF_5d$wG*)?_y;`;G z0bbHnH}b&GDPDhpcKi}a{0hVPHQt8bU-G5A7hZmzZ$#eLz`i za0Cape|@c?BCHu|C?J6mj4Jh=WF{XpD%FEianCAQFGM{I(V&4uD75{w?EWJ`2mljugXxCZUwT8ZywoF7}a`m+_PVk@B;>alg3KU*Om zwssL)LmG(3*6nzUqI{5^<=Em1=AF!CYeduc*m^4_l>QNN8CP;Qw!(v5GLbssU0Mb7 zFkQCx5nKC-tpmi?!427pOUw58vlXsl>#%01$JTy-w!%JarHHMx2I8@Gz?Us9+TO`r zwiYyfkFA3nuocnSDwiBB=3Taq5nIc|)^TF%o{O+`hd*19Dz+Zf4E5MLbhpmT* zt&Av#SvM^>^g#u<0g5S_}{iJ zX7P;X#jtB}1E~MsrIh&|z!@HnuOjGO;M~^ZD!au_DYGb!;GGZ>=3NSAlt8!%Mfe&Q z@W){)NkY-aZ%5=ch2P#yhyjWC9zR6!+7a1J6-3(6qOSmEkdn_d{qG&r^n!Hh?WEQl S#hvtxhC2Gc`eS$q(f}*J+ zRQuM}w)SOfUshYC+G-KxVRKH~-+GS!P0#7+k3Id|nc3N4vLO)nocX@*y`TH|-uvB8 z{`a@P19%A6W9URVj{9N9(SnLh=cPFxM=KU&v?$Hs zS{zB~f1%=+DqdIdD+P(HY3kNcK`WQ_vI2FmVifYarC>u@w+yW?rCVjAXr9atD^SK1 zG!GTcvaOl+lvb$dk$<0E`sB6$4tA1qa_F&m~ww_n8ZK7hz)|62;rVILjX%=nGrd&eWGJZ~**D?jooXyl| z$Sffg6M9ZJ=7q;SIu)5+99byoX5O$XmIxXpoMr1zRqiR_7y31Utz!)z2Y z!0J7pQRZc&^%F)}c`%HauJqw#pSWmdNxqq?dqXis%76HznEP%%%mt>cENKVF%e z)~yp7&7h#^h+!J`qY4^Q-BSuSju&%uiAKk8+dI=}pEYQv0}gvj%WGE7EN4n|DD9G& zHj48_v1DejI+`la^^G{TBG7CqXx?IleEV;^GFm8VcJPS1;KB=d%4J2j1h~0J6~t(r zs$m*9R4suqi_9&K%WBcjKmh-oNsXdNF!;LDc2Z(_7D{))0g~y?a5{EId-Q z&r0Gt@@X(Au-2kO|EI*>d|tB5$O1EssTG(HJx?p;1r=ZqO6mlMrQgQ~D*l?lWqhdOih}#XD!D1L>j}+b zEoMIR2FiafblQt0z4LG<3uw{GclLCe+MLYmIK$g4vmDC_%IK|X*6S6CUcX52aK4!1 zF*o}p^;$7a<~3VOvi#&K1@T&PdNJwKCG+~ck<)ug?R6$9Z=7tA3?-T}K zkV}}9GkjLemFTSG$rD4#RJpsi^J32}Osd&*HD7|!>nTu zC;2B+v`8j|bs1ML-QETB=iDbsGWFoTJ~70ZiwRuCM+$nvLE_)3N$+w6UM&)W*Y23c zeY_~xfA`U^VDGB9=sm{jpjKwqc;F6C^I3EEV7mGgY;x{2vt#ynARDZAgU@-oI&Z3B z=1a%XwI#k7RmZi*XXIHjT=#9zmKqJNyR}%32ObiWwq=;JPRf2{Ej6X9&!MfXiMCpk z*HQ~zxpQlg+rM^syH^bf1~#io+EOmaz=|c{%^e>Eaiyu ze`*Td9H;rWc^&p*n>-0PR^%XI1fQjpM>*ThUVe>Npj>9J;B#yR3HX0pVU`_WD-y_87z1Puj4UOp@r;nufT}RV3sOfEu&LCRj-cBf>0UK$; z1WnjR18zqTcGHL=@qo+KlSuxAIqIO;!@W^rl(mC6O8GK6#8D&nAM*{+%bBQEH9%0S zOhBtfU#l#}NFiFiL9QZUtm8elaO@$y$lA&80e%^NhteOR@g`!I*+;xyy@|NYqtY*7 z{ppQ~8)*IqPd7MxT+R0*$&g4n0dbIye3&*p6$LZrZ z?t%Rm84IwS2lf=l@~eW~$FammHr?}2w74F+MCkr3atYlsYjwSK2_3ar^b(qDN{Ihl zEp`wKXsaZ3>LvCg45u;Te~P%L86AV%O}emrO>&+lgo-EdB=r=XqG(Ds^B1E!6PWar z+Rt6_UbJdqj)NW?4|p)@d+-EKdh`R7EgpV{BOVZ#ue$S%dahD`1?ryz; zdxiVfkFl)*r^4*tM~m`7fPJgaz7=yYZ($!r(Jvrlp1spcXg_@e9UHe_$9-3!EMdoK zR-YT#c@=F-NV=0)obFPs+Vd-%0;Z#R2vh_Zln OG6%=F_9OflvHt^6468)| diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1GalvanicSkinResponse$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1GalvanicSkinResponse$1.class deleted file mode 100644 index 74790132cceb0720abd63d87926c2930d6e098e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 309 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 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1GalvanicSkinResponse.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1GalvanicSkinResponse.class deleted file mode 100644 index 10386bb514b650bb6393318dbe491f93961b728f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6052 zcmb_gYj+dp5q=h1UP;I{0pox%ARI$vVXQ(RG?=FG737+j+Q!69X}U;jdqG~QtCfLL zn%)a-nkK!ZO>b$^CM0Q-5(t=-bJ~9EX}|Xu^ndj9ncdZDk!8#|w$9OeopEHkR>)!x8fjbd&pcuttu%l=~Nu~?ZT!^9>7iDxwny@(2QvMkOkY}$AK_&cuSC%XJB*)5|5Ft|i(&_U zuHv;Q;?n;@#V=L7uHsh;VrkRVt%00YEb2uCYJbVdWpzuzhN5m6T5d|Wibmc%l^#@} zj3{Uv$eTr5GwmrYSJFe*{`KFh+Xvol<;jVG<3lI+J z&1=01>TP3QCnGY84(bI<&uF%uRj_ruWXjf*Q8dox^gh$f+nP#FCVB}MSnq8VdZ5g(1QMNih)Hk>S@wl#0lO%4M)on+^t{xP$CAyY~sOV@Q zFL0Yj4O4%%G=EmNCN=6rLBmnQH0-Ap)Fry66l@&LXJ{XdR^qltQ*X~1)LFm7-qNy~ zl`)H{073cRKtD!i;PA7tz&zC5r_kkpitHmY3%uj1=&D+nLW`z`TAg#>({bz!_4Xzh5sLzZL6aU zLq}!FdAJIW3-h&bXA$~GY2KFRoftlir&L^z;a$9^;{6!@gg?h{1XRHX_)x`PVz_~i zRNQ2it-hcetUFI?77GSOR&SvE=W>UAsi1cp>0p-6TiK584pW<#`HF_}NQgq{+6 z%D3+EQdy6m%1E5eXGk`#U5J;{d%VaRAZ~d@Ks>A2S`P`Gj8W`3^8Dp87AYaP;UUdB znaSsv)fbG69v2#xJo5!wEPiToAf708^>ke6zK=;coUg=;%8+`+TA6G4E;Y-UikKNm zx<2IDq7^4nx8{i_&X3K_-;cExS0}7Lh+{!2BwqQIKr->Lr|e@JRpSF45AxnIF1=Xo=1rpE$-VZG~uPI2uN zdV>t4j)^NvtYcNDycnC2>S(ZLiPDl74z9bYU&sUX%!F+j=ByLTkF7otb?$dKy}AaR z%H_c7Q>}~X+Uha&t`(NuE4mq<4%1YWCEAdg;co#()g#r(vYdt;RKZ+Ehw3*>&AQ~B zWl6Q8S|Vuz&y&Tflk^qr4?2feXV(%?W-Ud4z#QZ&a$r7H4b#i%wV1dly`v98Sq=#G zQa|wVJtW97=in>we>=2RtEBvsBUF$)#$XkcQhp~(uHpY?+qSf*@b_F}8l7#u57TySMS$G`!88@ToadqpaaWp-GBEVIM1q~=bWq!^9|Shj5JYWptRMdhQ?h70|<(T&t{r z;H^@DTh;rwN@Ij49Bp9bGbOcCB?C+bXm0bu?Bk zA@*}`v4dDZUB!8)9%4UAcN!u7=ZO0(y`!JIaTk_#j#bG766TNNC$CYqnaooNN&WknSd}&!YfjHqB>nh<~dmx+$Uci^V+wF4vj<&yt z4b#dZ9;uFhuP{=+0L>#m=mZWRD&$GhZxs5Vv%Ma`AEkR|xGx;C%W>FL&Ec&o4sICL zF+({LaE3j1ZMun;+0>lPjr$!CLzMdbhSm)5r>y?gQC*2E?EZKzgV-inl(;C9thbtQ& zt*cg?e*I1%Bg}lLbTB&;N*DFP#AsXA+Z#vUCyook>z8vJ7L8aq67uU2-56Kt?`_Rx hB1|7*=OYk0^5r$2Bq385&!S!Qr1zyV*&$Kn{R@S+P4fT% diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRate$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRate$Builder.class deleted file mode 100644 index 9a4c825d1f6846b8908e25f11c72c010598ab2f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6030 zcmbtYYit}>75?tN#=D)yj-9xPV`vh)wY@Ig+G$DSP1E`jHwEX>*cj4=$9Q*aZ@S(! zyR(kdw6sv(&`?SrNmJf|772+KQ9GhiTLcIwApY?XAV7eS5E7!~4-XN}xpQ~s+B;UN zjbz=Kx%Zs!p7Wh^&$;VY|M%^e0PMim66k=wakOJLfllOjIL34L#A(PUunu$l zS>U0Vz&zfYKnZ074zE>sdVxic^RSq}2AnW(FF#N6%zX@<=Ya&;vB<-HtaQJD_a*3K zhCd!K@SuVBC$JSC;O~bFe9*v$418E1;^gLR0Wl(A^6OzcW9Js^tU!F$wo1-n%i-lw zfhOXIIytKej_hmw`Q_-R`%hp{v?pT?7_FMDPd}2^wpicZWp2^qKz-92N+tOYBTw+b_2Fa4kjaZ}d%g@3_<%l+;Z188+dsg^!CLwt_A<(jdrqO)Sa)>39 zz%`+v?$OJ4!6frE%yrT>ZK6dt%sWXfx+VUsj^)j6TnXvTN2mBC3GAvj5X4BVWM_&c z0udDLjap{yUCh|?eC#Lz9~4-bb_b`9*%^mcJ|eKY&O_1JCyzyF@doms&P3`X4^Gy* zf3=Eow626#Z-CT&g71_*Q4^oRV+Niu@gzzfU7WgvG3EWgyQ8e)te3j~!kM5m7flh|h z2_K{oAFdR*fqP=?^fM;LF(GhET{cu3fI$E14KJNe0^3(B)usit!TKztQ)Y}0@7ue7 zuv1`DO}39y-p^T74Ys&PQRhmn$sSz0dTGaGnTk#4?0lAPDbZ1W5!lwkHK;C=n z2mmz!Giy&t2UoU%c@V_q3d;!g@8g*4; ztlCWn%ah?80|&8@@|5_C*iN9zOxZp+L z0!3gzkHC{ru}miwUEq-zr%zL?aB*q=CdekiCIy@p1MsBwJ#$rr+S{ zkFLR1L}$xOMjunMB|5N9bfQIEgEn!k#CK0z5L>qgvlXdfE2SCgv$Zdntw;b{yNIm; z4a8^b4!lKC-cQeJZgB|q^$6W7w!JJ*!5R9Qb~R-*_uTDh z0K{Wx5RcSJTZK-zf-~Hv7&W8qm{JWte(;4tzu?^qdBclL8EQV z>10G^@gcor={e2T^9r_%S4`QOG|I+wLGL%sqOIAKOGul>E@<;wrl6VUGqp2hmXH(U zdQLayg-2{w*DQOS3@KoQ3i$J9Dq6v?FA?L^c=q)0I58%dU^I%EAH%G!}_l&g-^gL|0V>?WwLMB5GzBEar)_b<8mJrz&&Px^-Hk+6tPE8m3`C zsh}a%HK}0zSTRQzXmkX(J(@;))}UDqJM1kjuUR>>oGHJVBZZ=72T9xo7h%9TE-M8O1-QAS^bQSFwM_%Z3O1&)T>-*V z(--udO?XW+hF-|iM@p9AHeqYI7fxy=Px*#Yg-17~vP(}2oThn+N}gT6be|rj+|y0~ zw$VFvfUD&y!Nxi^5&;oM0A1&?s)b*xceb{YAdPQ#1sm>?S+z@o#{xucLAfu8;!PqQQJ$F6lXA z#>i#*nf;IJEHIMh`x4lTo&-LJ{sex5-zJd3z61_R^ELo)%{yCLa&DG_W5RsZaVe7iD9yXlyqCad@Pvx1 z3H%A~tN0*+KjSY690B$I5Fe@dYXaBsv5M;o9tmsZrpC^vHH&4JdCVIq|GwN|Un=Px zM><$5i&nm)yTjDxWM1DT-hP?ISBNO4r>b9%S0Z}+5<%j8F-I~d0VTyrN!FWOr6BG~ zPG3s;q{+NKZ{+kI9&yrhx#P%lm#a{u4s*i;ns>^8&)Yqi6dJx8=1TNZ^33VMWUAcN z({ZKyE+*C7xe_zlLW;h%GS}H^-K(*jk!t3{3#jg-_GD_hG

    LpNE%X?}OEg?u#Rt z+PAk?n4P51 z_esr%%Bt{m_OfC+7na#Cdn$0%*SZ1byg!|X(h&2ZL%ahH%qPMyy&7AOiHp)ZdM}jKJKQMsT*1J7f~;~5hO_^k-V`=T^%)*1Nwr~q z2}-F3{1P?%KQCLC)_ZTSYZ5#8U-VJ1Y$MA5o+)&3oaSHQHQ0kKQvNwsr0#R2mt$Z* zzb397V6VtyV3{304wl*Bi=pmLyA)({ZI>F%z6~)P#W6~GlCy2><=1!}$~E?UT(T7; z;D2m|skfi4P-fW6Y9zggH6L@ZCP2Ca16)bC1Q^5+XL5L$tsH(04T!McEr-*4ZlU2O z8q?iQA4%`Mg{GTO(_0#yLA1ubolrmnHqwL%ny`%q+=g!Kq7g;nL6@s1k^BjB#6hu} zdn3dsYlm>0@?~_GqekwZ@D0$znW$AYKv1hpK&wVyt1L!&LbQ5|Tt&j@)(_aiv4`{` zYX`r__+|JVPJe>N+lXCbAMtwiHsUgmN`D7y&#q4_qWK@BZgBXxn(s%FA(3(d;t(DA zIBj~^LAA-1>}x)X&tr_ZPLhL)NK)mG)2DFC1N$#B7GOCK>=eiHtAgFjvBXC<-ThCr zxE{Jn=>9Bn65dXPaY$q1bR!QpAL+nQxPNT&CEOAdWItI9# zbYc0LM1%!(UffFFGh97G2tn-pS$9{Xw||T2R%3z@L<&U;Ax!k&i7Nc zcraFt$y(^eosBaTJQ*-}%!e7{x`dj7sk(3+M~C2?s|)AZW#L4^aApYS{0eZ+;tQU3 z`yF_$b)0w$!7=N?c@AIn&iB&caWbvTy=< z!gbawg!Ae>;l%JfzU*nY(}_F!{tniiRTlA3IRCxDO!+)CkNlvMIDoj2r%AtF=!3!b zW&nSj;hp2YaL6ymVMCb1J0T8k8r3mFIg)Tjyl`!~j<)ok+t~OiHZ>sR73EztEAIu& z(Bj8z3xj8tXbkd_GCBn&mwl*K-(Q8-O0`ycvvL61*ye3+lp4@ pZEREC=d8rNHF(i4oEGQ1`L%Oz7kjLWvVe6k2gkVfL;MJ_{{g&SlDq%_ diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRateVariability$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRateVariability$1.class deleted file mode 100644 index e4f9a9460d142899913d85455201a231a9e60745..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 309 zcmbtQL23d)5Ufs&tD8Xf2_7WJ4B`jGV2FnxD0uH(o6X2L6J{n0el3SQAdd>R2hSeT zMR(EAT?O^~_x%H4iu(dZfgz#Xgs<4ht93$nn%mHYY=hsX!{kjk<~3*8aJS>L`({s_AQC1D<7Ya;JBHa?k8PRVv+>WiegDn6bN9+uuqd~y0MiBO&W pjAP%LRlS!c6K4OlsYW2&Xbk7NRY12M?v#7z>l|p8dPB;n1}CyRTa*9* diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRateVariability$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRateVariability$Builder.class deleted file mode 100644 index 5e9343c51aa1193557e990503c51de90ded6b7ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6360 zcmb_hYit}>75?tN#=D)yj_um9V?q+UvAr(c+9{;*hS1oKlNLKkv&N7%JjT0Yd(!o; z*`0NqriDUz6=-Nn9|_@2phZHWMbwU{)D{8aE&lNkAc_DXAtXe}A08r{bLZ~P#5=20 ztR?I2%)RHFd(L;BBmd~X-+BSSPJA_nZkW8x@-i1i7v^K=fyK)S-n%`MXbJ{3a z#*CG<>{CQJF0k3}=#G-%P(=1vIm_NF5bW!prW;1{8M>iy!pfP4N((b)Vak}v(oXY4 zK5b+j;aO8{hU|H(D4>m$tZc?CkXE+!WTRo_UmyB$Q z{IAU$MMnh+lsg5Y=`6X+*_j}v*3r?8%33$N8Ho9@g;)9@X(lJf`6Z9Z%w{ zhI2YTh4TVUYa54-PvbK>K8w%k=wku>h_jT>(*WSo%HpWw3;3dr0VenoE(qLOZ^75` zWqgGSv3pS^-vxSDy4NH7C>)NKay;}@$k_g;bfhpPaIju=$}LY|Xzkrsk3xa%YniG; zh{l1sm89&|Qlkg=Pwwjx*i@A-DaxD$gKE!aC&j%8sxz(vyQ)vGZlkP^ky*>kW@xet zkMo1Tw!Z$mYN*j8Nk|z@ju3}usk-xU;yS!CzUWqQn�AEj(-Ntk%!bUWxRGP;G!G zk`O~K(5t$V*Y-J+rcx>+2b|wABBajov_RKdw|VcO)>M>$3UvAiRe%a~uNC5Roj^mz zG#5wni!_z*tz}=*$Fk}zfon2y@KbQnKsH8WtaMGvw8yi?9C;{2o*`6Pd2n$dFHbtL zSsr;@0rZ{Fu*5E)FNpuk0Tfnx#+)@u*|OB3T2?AAdeu^Hq?qpWC_6P@$e-lT4;g!H zYhiXAfNk`V)B}O*5ki0qA$`^bxSq*hDrxeUDi{53q7$m2M13Q@y@B2Y{WiqEfzT?# z&q~S!tuZiYecc~k%zU7StFq-Mk@$LYnZ-%ffopg7YX5)up8gT zt@sXA=I_GB_i!5D#~J(pU&jv#(;w6N6Z{1~#ozHWiEf*Nph6dTg*Emj%pao z9^fMnj8z`!tY$5HfR8+^wLI{1iq~JD6Td_fzrqN9jkn-8Si)~{AAX02@iLyp?{N`- zARqh@f5o5h5B%BVflCz+Tp|w)dp$6sJdkueAg~8-bUc6|@`sZ}PS`&~UJJ;$h{*lF z`D75)K)gxuAE&$x5>FRr3i+;ALcBTN>&XpQCdC8M{*xl^UueO<$=d&TEa<9O&_zMh zOE(DYBP5)BA5@xZ9KpezU%OIK5%wsmDM13G7*p)KNKH00D%pcmaaSu@FGM3W(c}>l ztq9rgix#J|D?_3sIz0Rh75?!WXob9JRf5r#DbW($*dTh)BCbcL*dgUR8Rv)A0e`eY zRcIwVin?eW^hYb?gVt_BYuF>iMe8=)t{@+x-*Rkm1#>NP&>HpdyJ)=`6N>*hxr{5h z6I@oosEgJif3(6rXr&3Q zj7Nxz)?r_?xM;hUIcP0-_+7M))IclZMXOwLJTdQ}b&}9pCbUiwTK8N9tvmeDid3QX zfJadmt)u>EMSReDh|oIY5#pjnUkgrbh|_Xj04_X_u4Ais&BTCH7S16Sr%Lt|T2w(= z!IpBfZkIHnoes^$G7Wc!3e6@-6IL|MWg2b+MB}vI4oMSHG;L)XuJ;w1&Vgqpp2yZ> zG*@hUQD(t8`i^@oMKt%^?PvhRV`vbM;|B2rj)*5=i?cW@h)VGH-g#;NR-$jfqtpqw zo}Wh)(|D_tc0pAa?y`AAFQcPUTNM1uVo diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRateVariability.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1HeartRateVariability.class deleted file mode 100644 index cf0f9cabf316e549133be19d37fa7a93a89785e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6207 zcmb_g`*#!95&qV;ypoV@Ld?q$vp9yx##k|dkYJj|Pmp6mVjB}TrRiE)<0bM+S*;9| z()5)!v}v03kv4s$Nt@85O-djjip9P9BNX}&AXD{|s{aeN=IuEQn#K&C&G>1*roBfPHSjX2uiMDY{pf2!hVakS&- zD&C4ill~VfeyQSZ6~9uDNL!X+59Rb?(I_fV2TNuyYuF0b7Y*CgbJK=hH1pPp^soYD zOhMC7-YPn}1tbjQdl*g8?NWNX?inzK1$z_Rj=?ocivZ5ltLFY2kBZk|t@DO%I}>C$trPjInKPa9lr^egTdl2UOS(s)o}5TejZ6@^wgkDE zPYvr%Y2l=8I)+W5>cq&v@Cw8ehE5fdxcRiR9pX{1euwgu(p<&!h<_w>v!I?LytU;H(t!H&RV--^cnw8o~ z&6@eeyy!DESRPFm7y6FY&=_H-lVO$TO9at>*Ok#+UU$MI-hu}TQ z>Z+`!dX5!rOs2a+gvV#k7#WA~8s|(Sm!-LsH2rbX(K9a|(+j>H>I)?v-IPo(Jt=S+ z7sYLPcEi$r8kcgXTn}xfp=tnEi)Dh1HFP8bBCY^h(Pvfh&ldk|Wo0vIYMDU6{db5j zt7tPh)TVC@qp2vreHj6P>$fk%F(8Or#@QewjQifZ8u#k-xzUbqC0FgN0XOeitr4(D z-kFyWIJS296uiFr+xD;NEt}3tOdC1JxMt}&#$exv81lTQcD&^9G4+dA*XP|=<)@a~Y%H#%mS7W@NS*0V|xhRC7*SWyW=;#fM(S*V|SQJ)Ft;kuN@(FWDJm)RcI* zd&MBuD{ohUr}A(nDi(~4IcH{41I$ZD45mIwK>Z2qMQ;L6VjzLv;I|2+@NfeArTHD+ zN#Fn;P2iw3zsI}Myr-bEI?D-5KaU0aU|bv2vzlpTjdQ~P4@|7pafQL6vgAHq1xJPX zTDY?a{i8JROY=bjkKu6@mlOCCK2-5h0)NI|5;z2^;A4EE;;#u@!KW&&DtMs!f?jy; zd`7of8!(pogSuBPbU5b=M#rHJCiJ|W?da*S^aYu(Xeghw$YMe0DY3VF>s~*3^#;j{ z#Myj?WNr}D#B|zXCD&_N-O)9s#!M+ER@G+DYr$D9Yb=@>qnA9~^ik|M^!$Y~OerL| z;a?)_rl~-fcTf`=7Cs9F8dEzlHKZkrUA-L_d+uOTj_oTkqn@N{u~+6gUn50VxX(%A z4UjIQ7B?gHYE$!urWXo1lbTsD9NWxjW>I6L)9ifS;gW7?#g|ID&HenGRxD*QhFd*o zS#xgAunmiIEje*)a&ov!C|qb-p_F6g*dynQB{@s=ESR~RS)?ym+2S2Ks&yMb*ZiNC zB2cN`wB*Bk`@{~XE+%jdpDF06_S)ddPx@~^RM5$rxPH%Pyt+=oldFB43ihmslCH$3 zG^iID@E*EHYSw?Nh1S`}>cb634D;#Zp+L6Idlzoq@0Oy&4E(MGR+d<6tFF5ppOgA+ zxMmU6nj8(Ud*zCdhbpc~`lof;%{@m}pEx`FTuyJU0jF~Lvij1%!*pr&nEKZW%dQpO zj8BJYHO{hf#LDp33bVkW>f~N78(dW3+)IZVG%eje@1JD}*j_D>G@<9oa@s9Y6!e9i z!~Z2vOF)^m6fFXCn6Jo%`FJ%d9F z%0G%C1=k^Gtsnva5@Afn09&Cs>zH z&G$j0OC()~I6y-_N}V2bQEl=h2R9$XQy3?%W8|PBqN)6F`ZSLFVE;wN0xaW$J;||r z%3$|$EdG)1?)fL0JqukX^k5dbj4qkAc-Fd%ZIxN{GMXxv5c_$zXeSm>R~qlsOYDc~ zPGiLX9C6RmI|jL{d9Z?;Wc-^DDxSf!yrT`?xFCi-JS}Uakq}E6c(O#R<or4Mxfrp!?+e z-M|6Fg}j^e8-zaWY;T9~$LZb~?hA+Pavbij=I~w>2QQ2on4=sCIHSJ1HeW?+_nuqW z_&GM!qsl7E`)E==2&tht@Y!ZM&pgqXtGCyaqY)=6S4mR Di)ucP diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1LedCurrent$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1LedCurrent$1.class deleted file mode 100644 index 09e7f7d4be7b4f81a4c20484c2924b2aff853f11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 279 zcmbV{!D<3Q42J(y?buatAD{;hJ$H~o=~=N*uy`nVA7{flGMy^;ZIdQ#+NNJ=6G*Zt-6l~AO$p6MQ>rP2CR9tS^0NDqY}oFG z&2A`^ieDfoLcuR8ekP}D3;;lCLZGcVV?N}H=pF@5#HopZiuuI z4{}4Rjl9~3M_ACOOgtK;k0O6OX5zSs$D?S*6a4*Y6Q42hSreZV2o%zXZ2>VL5aZ!K zJ87q9?36%No?9^}5FF3jc2>Yh=LJH!v9W2pK!fe+Y`V}xgspA+Nl5*a7|P|x z6L~9T<&)Xz#1u`FR*BJcZYEbq=dy{u(rEwm;f^6Y)nCl#?QEf03G5c=Z@p3(e5_!u zFv0pQ9xhnPJNH;q@&E*&KzF4ZbhF^=D%7rQzUDe6V|jNm&|^vKsDOh$QV}AFjI$qQOkgDiA^;5-XScTL=FSdWT3SDK0EkafYP9F6Zuq zX}8jlDAh13Y1K!NsCSdA1&LJlM8~};iFgztioNRkMTn|ACd$%yk)$qt1xNXU32dv_ zG>lZi=NYb9->qt&{T;Ot7+&emHCkwRld4U@$y(-Ne^0F95w$K?W zb*>IN!?B7rC`FXYcjxPF9O)1!R;onzm2DmwPLF4;LNQPF`-K!`Oj$n(1{zl>E@;@h9_}?M_=IPsTjV9FUJr^dkkN}S7Z1Zz8=Fj@J$oX#PBS>W#Zd0 zdaO*{AWHVdruc>gfngTod@h}F*J)X`FFe1ErkR~J5+j9sCzw4F&& zO%ojCfxw2=wuAGi(JV%;<%{7+352sZLs6c~{Pz9(!(_A4w+X;kI zwmsFKo4SV_bH4L+`<%=>C9o(ZOCtpr6)yu+)Jf9}+l9f5HBJ@^kYxy!Wn2)rke3RE z=onWHt^lfx!!v9Gt5BH%$gN^2d(0|kN>V%LJEgLsu9h+*`E;wM?8rnucQ+T>()a4; z!t59T8|W3#3V}9+U~tf*w~WEDOZF7LWKU5__7tdOPqB*nMxvznN!;(CuWRW`P#=yz zkHA?3PfN;oQX8ce;LkAe7oq}U4jr~)o1~#Y?8q<-1esP$#M{pz6rY7z)!F_6!sie< zhv*5k$7ybnGe3)%TAIb;A7jZZs?X5ov#6;Gj4(-nS(kcQ1Dy^lFKMhxnKj_B2AQ?? z9O~xm8dR*jBw3fuV)+@=GHcLb4KZuImo=nVc}ZifXV#FzYBK8zFRQ6oc}Zhk!K|jk z8fMm&Ue>T;t!u@1TSf<9*e|o{Lu<{(7H=g)J5xNf3yNV zXdNZA?$d<0Xzj%<3i3|soebs#fA?e#S`TRaE?T!z>~u2VAu<_dFXdao&L(-q*2kN) z4B^Uj(0Yu}I!7ex@q4g4>b)L|Ac>%QEyK8* z2d!TcTEEhSxM&^lMT_&edol;D-)Q_UTDQ-GmZ_svj{2@l2dxW))*lG1KN4DhS^%ws z{%DyVwEm_k>Y{bXA1%`dtv3j*H#H$HTJQ5ki%S>xWD+f-O5=CYdjC9Vg>|$_iB5~B z5-npfmKaM=XH=uXs96B55BQ@Mo{N^TN>kKD>kfak!d|qDCYVOECd5UHUg=KU5wBC0 z;<$71JQ@$2#fG7FC*_<#G)`IaS=6ayH;av>LV1;>33NF$OG`9d36*IYBu!A!)Rt(t zymT0(IDbuWLKQ(k7%?Idh zaMh1wr2ai#L6fRrtcU*w}jO3)QAX)zEIkyGB*8C^voUH~_Nu?F@_0+Tf1mkB>&WmE^iA&}`bXT;_!1)j1sv`M?f?J) diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1LedCurrent.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1LedCurrent.class deleted file mode 100644 index 7962bc594cbb53a77afeb9647480627c2f155907..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6426 zcmb_hYkL%D8NO$e%^uh!kU}IOtxFo(&5~wIsSPB612JyD^KMmk# zVMOus0DcihyY#;d;8y|sI)L9Oh>RMBW)7y+Tu#d=2n-bTbV@T7tj}qtuBN9nGpA>a zqoYF#ltT*Y2Qx-4uNwI&HC@pB|4d)q`R|KY&hh5t;KAX;{T&K6k7dl+gql^8C$)q+ zZ)Osc9L=eH3TpHEoJK+<79P^Frj}ImT1r97M8S})DLto8r?q~=$mG>L`4Up|*eP{h zO{7(0Hc`GqViCD9p(QnaUTD;q(kdeg{IjN}847$l-%*#DnaOE+0z5V`dSrN_LqT*I zKs}QfQuBqmW2T++p z_FQ3ZS~HKRd^3^m(G5Mnk1vUJPAO;_%Ooj(m0IAobEY#PMrJ6}2m&j6k z6hdNJ&&+2;Y>9#5Xeu|iV@yj87EDt!@&tQ2=9XusK-zuxT^UJd)V%x1Y8UKBxRhrz zQ?S9s&nBiIL>U&vSHrP_O|j8V*TM1WQ(96UP&cD%=@iwdjM5w@^J?<+VKwW>rzTtA z)#ljf@|yyuZeFaGcbk^)Q|aV;#4^y0RA2?*0UDBhU{eJt3Io5zfZBCPmCdu!xm#YT zWzlO6chpe^Ouz)twx2SuLs0=*dJsQ^f&| z*+_CiUjzv}8Nm>SBe;Tv2zKD92%eGVxA67MN{9c+rDCqE}AR+D~ znUXx{9Rq4Asv9ZotZ;gdSBr!J{iFxZUt~Vf;(6W;Li#k_CCuFnH|roCetgw2G-M_Tv`^9o#t?Ae1Usx;u zz6ayGZADX|(KCsKSyT-hN!IaS68 zDg+elaI4y>g)1>Al9s|iU=Gm}ESS5!Fr7SKiHMETxq3g8MOUtsnnJbKJ!r@jg6( z7O6lurtt9;S9Wp?Jk76;YoB1x7*=(M^+}aGELy7Uu#%~=!}6x$POB6TMA9nt0{hJf zVL$qbY=E;i_VQPI4a!ya3I^E5dJE%c`{Vus2-+mJ{H&7ezvU-2~iJPdqfk3>a)*1xkEq-edinr8RgK(K& zJA$OsjamYVQ1}}u`ZkJq8-?FZ(f3g7g5{vi&%r{@Ja@>#w~Hz{MD()OgJ+3MM!Pwx zwMM-h`K?hOM(_*=`HWF1&&!Q1IRuKP3vz z?~^oyT{MOLG=ziX@;pb!`7)7KvyH4It!a#NU%{ui7eXKwu>QC(fl22%{~`+!-DT%F z7dV!`;&a6M#g>G`OZ?{IT_0h+t@#B^mS_G249jeTZ3PSHDbIon=q%4d3)oVgg%?m? zezI7I{pQDrSo9yG^@*m3sKp8D@N+l}gW9;rx4lkS^6sepgwne&JMZSRa0Evw6@ec{ zFjjBYR=ZExV%_Hu&61H-4=1&Wf8%WMI6To=YBuAi$#Qr9wCpg352Z;mBv2p zQc$P_G=xuE=B(g_if}B0DN(ciS+5A^GgaaEy>Lvz$*lnAMSQj-9ott#I+opf;GC}r z=OyaNmTo^qP?CI1 za>zT>4>;5tuc1Y#x8BB<8XWVIA4Y?3#6`ZbM7|LP%-=&kh%=?+e#nt`drj>uJ;BOg5nHdLc?s?IIQM!7}Km&z03%1h+Zq+)x> iR8kP8|5(I*5NiB-6?IPV)IgK5ffo0WD`E~YA`U;-+*fn} diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1OxygenSaturation$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1OxygenSaturation$Builder.class deleted file mode 100644 index afcada28b600feae3fee06d55d556d5f993fca60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6120 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 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1PpgRaw$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1PpgRaw$Builder.class deleted file mode 100644 index 4ea63ccaa5bc71cf45ad4bb9ba138243642b7608..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7033 zcmbtZYjjjs75>i6%-qTJLP7!o!Yh!pNhXvbNi9NXXhH}@L!n8EQc!y{xk)BWGU+@5 zEv@y{`l>ChuVQ^`TOU=RmOx9F`a^%HKlGPt=`StnQWtA!?W(TUWpVFw&&)k!?yQs{ zE9;zd&)IvQeZIZV-uooKeCwqj1L(wy5i}#iO_rNnB^odrK?{y@bByQit)%9@2o~cw zf8Ni{0}*@>4@U4IeAvWCci1rN?7w zo3@HiXJRunO*+L!5~C5rtB;s6C$y4c}GkCHR>E9eWa+cRKp$8?z`RF5vHB;L!wl} zh@@2?L89J6ZWSa_*%KZ2rX-RhqUe(sj7_RWMCFcL6S(8x2wxt7o69l0XW#wUh3-vUbi# zi1K#jD{LHV7nmw%^RDtYtsF{>PutmCn(Xv5DaM|$;}cHIo=vA>nHeXZ7)!)sLux=* zgUqVV+G}T=a-wNhx2v$e)2N-bV^>HoQ?fv0D3wdco&E%;h!sB3d=m#b3mw?OO&2$v z7M{dO9({?Mr!0IKU$qcLn}x68>lVI&Z(8^kzHQIEy)oRo*6r+a}P& z@^r*|$iRcSY0k?9GCun`3pPdswq3mf`9QC<*LPdklLR)*SFzYBDAARn7TqgzXyJGnA5M!BP=R_Mp#`uT=L_-KP9Qw$I5Rs_GxrK~mpWgU z&&i6X1g;yEC5?iM3XeW2!lY@2oNRy69w!S0$TEb=Qcma|aJsvugmXr&_%Q0<8$a z;6O(&4uj*B>?vf)o+6X%DLBcV;uG}^L`gA|xNoAbo9RnXAC5kcz&QlZNXmCm8=)28 zuQ2g9q5>?J4qLEI(opbqWf%s6Oe-d$ZRZe*&cUqcXnO(S^Qb(J$Vs$CY3@3Aeh!ve zn!}=>V(}cR&eG;{sICYMGf9A1mlU%GI$Ty>(pZ-;YrtgtOB(BPW;I>bFte^GW(_M=UeZ`s zFl#t4%r>e3+h~xUfWSWq|5vdB|H4+hhFkGEhVXA>@gE$=8+a6N;uQXiIs6a5z+3n` zF5^`pL_iqgdQl-ZilEpbLgH>=ig8gXZC&TuQ`wp*|r3hW7O$-y=^b2g` zAEKv>to$LM{9#i06shfc#L8l`R;Z)$l00e&kEkzZ&3gndX{<#av8ov0yhreo25^x_ ztS)BFdjv0OtVJHNrkFMF5xk_a7J0;y;W4c|5S1BMJFZ zvo!g-XtNeOJef5_4bg?gVmoTZErdh2cLuD^pMggG6fxGF`M@B(z>4v@Q@@FE4=Bd;HM~6`}QWO;Hc6_xht1@ zebM4P?w!m<>vtNzht^#s&@y$j3Q^ya>7sR!(E1ah^=CrsFAJb`$R91U2(5o;ih5`r z_D9R~LF)}d>rG9Fht~Ui(c;p@JDEhwsL=R5wBBC=t+0+(KGA9MRH9`p!eV1FYKEGR%(iRXx;6PR=5}~qYnvkNY z%hPaeQ=nNbX-q}4JWs<#Oo3*NqzNmU6?q!2Rthw0+fEN$K+{2b8(jYr8L9t>SJ0>` z*eJa-U_=o%+OW~si2cTm$QqmQq!Gi*#%BD%XvZr?2QC_&63+(W3*+~Q%j)AIDlrO2 zO1-2qA=juUvFI{Z7Ag{9qUSQI3g1+__EZeL-ATib@+u}Tlc7n2Zf?e^d*}}|eDx0?S1-LqALDyf8G-by|DPcV8872dN=UNyxm%Xlir-6tE7ViHF{ z)gg&VDlvT|giEUsKi&*~ISe{c6y$_R4nGHYZi*z*%_E7^eiFsom&oO0K_cy#qAvq8 gxJUMBdfWi@G~bK{yps$+LErQqqJNh?jjy2c|7N@400000 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1PpgRaw.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1PpgRaw.class deleted file mode 100644 index 61a87809fa3df6c4a1279bae7b5e82494f69a848..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6522 zcmbtZ`*##~75_|<%|6&9Kmkdhbx1?ISwfZo7Dy;IZ$hEO1OixVo$LxXwm$3IHd?LnCjMT2R!}({_L+FKX+z!ci3zQq&a84@9({z`}p2_ z7ykagJ9h!>zz0#Z;6eoR>qrr%qE@8bty{3wQvxER5k z(*GokpT?l#XJPz2hGyx15ymgW_*EFcRuCUDP2KLzYWcjLR}k)*HnJJrR5{vceIa^O_j-FA_I5KU@)|inu#oJf`KkXT%9jOc0Im=PM)wzSHCg3yGm>!yM#gL2elH2XB+9UB=s(m&Fo zKwSXOuu^@RGd*?8HXPk1jED8aJ#NOO%%CDU8PQQys&(i4pA#fu2qTHEB(gZr6QR2C|ms1dlxEf+s-0Y#uWO zs{;HyVhWt)N9=5ONvNvOcMjV>bAAODnZJ zGa}yl$UWQ&8mZ+4cY95cm$xgdBD_B6xp;&}{b7i!Lv;8Mm!ub&`aIv~iZ_ax`kCSj z-{<@3!#Prmf1ma^pIC+?7VmqHWZBF^mNO}FYVU`^puk>^3|$`*d)*m{H2r58ZA>l8 z@aNl^fyi_A!_yAkxl4>)ZMlB!Ic50)hSC1BX+7tL$}rwyP_!ABN|e`^Qywx4gsTjO z$hBp3y=}VK-gMTFN3l_B+D_{OhD53L6+%n9ycY$YB77)Mal=uECoRXy7))1ccVDlX z=%%Y$6RKmWea3|0XjwIFnKNE_(5hxMM^jH)w#qErrn(8ZO&uChH8aCK`?Q*~Y}ZTG z#PIN-YLkszX>BKGH>~HIJDXK)3T?utZ|;( z+tjTcPwm*f<6g9`%I-(mJ+M65hJ8Q6w9>K=i&^hS*ERb?P=4W39Dl}L1#RW;p%_R; z{fH7M*W|Um|G;;=s!hT6hkxh_wk(N@?#5@?qvaVYpM1d6tmhscOiKrg2RD2%B@7)7 z1ilsCYjMkSx0vi>l5qXBw8R=Y?3OEsPfE4bSFz+-lNboDd*z2557bAaj%}C|Zl2n+ zoJ88v;ohBI*4;uOvYZ0I<2$t+zFo`bw|PmIpkp(Y##p-bn`wq#M*q(86kaF}TpYoC zOIPSIOwB&$-(`vRSUE?Y2|ONFi*6~Rpd)Bjzv8aMpg>wm6M@-Bk9T3x{sn*ZuKSfn zB_bY5|LXlv7M^R3R5c2E9uQ=Ka?pQ^zarL^tEBMbBb1YT%TN;JQtxFo1x$d#L$E!ws73WeVO;WkAUymrBK{t{0aJG@X{MB58a)rHuUbccB{Pzrn zk-49(oJ_Ho)lhN{RaZHv3LJeL16+xF2QY~JoXO=OwsQFnsu5b+vOQN+_r+sDoVr z9n=(ca0t)whUnlgQTD8h-b`^SY5jQZmImn=kemwj?v7t1J&7!U(vUrFm^AkiY_D|6J#L|7V;s|Z{861L1 zYh0vkuM(EXt$HF9<-Y98O|ftUN2wKoA44Qj=l(@0{1`3gSyUdjctfOMDUO34aXjD= zk)lT&#|i&_H@S;PL<=uMgzyN&+zpM+J{~Yov|ZIByZo+e^UFE5dPu zNg14XE5bRsD4amV_FVZU;mq9^P81WE^liV%eV2S0^H_aCnZqOHx#=z+`2-CA_)dmy zd5AGNp5*y8az6MJ{}#X>!zrBRzEH?6MqzC^g@2Y&@KW3qLrRq!-Us~0Tz?Jgl3Q-! zBe$`>8f8|gdKz_A`vPjHFTUt{SjZ90XNgRtvH9iU_|yk|>J8V>DAb#7V?#BLm6PvB zebqpKd_$3Z1Ew)^5BUhr6qEY_U*E}jY&=g_3?%f77RPDjWDv4=lUFDxE7DDGaPw;Evo@6?#jPO4}TF^=pY{U=oV?_TC D37;66 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1RespirationRate$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1RespirationRate$1.class deleted file mode 100644 index f24bebd47bf40e6677beb1e6fc3ef95ce746135d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 294 zcmbtP%ZkE45Ulocwul zi-N8y`gXru0eoQ?A&T%pNcQgRb6%T@36q6!jjN5bzu|wLaX1;TTbk*bXQgg5VZ5?= z<$|%rmg_%vjF1q1oG+BuN9}VP)Jcb68dis=n|kFtofAeIYuPU=5pp1;ZIr6CE!6H% ja$Xa@-$+P5LFmZeZFQv~tcSi}4+Gh;Od>ZVh%|lxQ%qIa diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1RespirationRate$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1RespirationRate$Builder.class deleted file mode 100644 index f4b1b6436cbba67296eb739d2958ceab33e7a18f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6210 zcmb_hYit}>75?tN#=D)yj_ta!V<3s$+FqA#?G(~v)3mW2#|7t6+ZfV@$9Q*aZ@S(! z`*575r7Z=@tD%%W62hB6i-bgrs2x$MEds<_{3{?pfB+#OBt*#{9wMA`=kCt+&X`ne zr0CAfz2}^J&Uc>c{O~{Dd;!3Ad?ki1*u2d0G8aWB=40qahL>Z!cUP2_Yz!N)z@Ir@ z@-Zyp-7yqUG*IHRGH)+2>2Y3`V`#+*19$WDB=6kAqO-gZK_`}ZxrdqVHSnGoea!L4 zeFp9~@IVY(@Lv9Y(7^i)yx+hF1VW|Ef-N9M1WbONuv2zs$xaJ27VP3;reKva`P_t6 zVxm!jwwm4B%T_j1Iw26*oylcNdjx{LebXd&IG-k##_>$fK3HCuu?thyOqO<<$MY#G zJ8cy*{H-=arTI)zz!)lLvT3_Oy4;q_*@fY(RV>)SR_d+;)}l0pkQKPKu3M5U z{pNb~Op@~n%sIO>C7s*a+c$p9TCx&ZD>s)I$(IRu0>da)2*!Fx`s%q*LpZ!-Wy|Dd zW8Nw{w^KaaArMVvZL8qy>?eILk3Sogjat+yqqH5RiMzA0s*AhVOpWEkgG#r|d;eYYOE11=fb|p_yZLszfIb2@KVhXx#%c)dI^mkTrD$ zmpaMIphk2uGncbU#pkJA`N>*acHT7O05Sz@G3n_av!>w)W|LQ{5 za|JeW9d`2a23}ro;)D1QzkQgOkC^xnF-N9yF?CZ2D6sCNU*2T!$u=CL}Oed+nuzO<-FslQ&$bE!U$T zWu-AWJhtz^-fn?So{X5J+*q)vl5BQTSI14Aadz+Uo?hBKS?D6O89SS%X(~L*FBGr6 zeRr;-Mz{L&M(rO zyJtQ7l0KGsw*;<8%K=QmMbps;4Uy6{lXht|Yt4~|LgX1jrIm*Y7xKyg5}V~o#1%ke zdBYOBKu+oZhXW|A%(Ojgm9rJ8gX>wTyr`?C+(gLQabgJ$_J0En=Mg=R*ctT4Y3~YWe+8yG zTEUesVZ#aNzwsYuI6pFl(EaHKJJgNMmhd)<|fI(F%gm+C{%Jffopg7YX5)uoK_Ht@t+8NhV@N*>b3k>0xcnf}oCHxxq;x~8%zs0lo9nRzTuh3xZ1i__Va zA<+`;8h=BTe{>zRLONR2V02|lv_uy+h;FoqYtSLCmGYg8^FwRDKUyIVS_w^27p*aW zv_d{;?Ig5zX+m7IZo``taD*D?pKVU6EK>&+Nf{71=UT*;l-3J-S4MA{th z(kh@U(?RP1p>>eZIz(t4UKg#n)a-yiT44`bM>IuUv<~{C74|_ZMQEipAud{ne9_{f z?ONubwV?64XdPY$t%#0RrQ~Qa@1S*@&{`(6P7qpmUjnV${n3he(0Wi))J1E;AFYTF zS`QOir!*lhTJ#&ii4Ad5&I`b~=h1m&6|WiZcgn&U#Nt%Ro<8G-`+_Q15)C<{3ME3FOl6;l}I;Q^cBDiQu3Lm{~G``y&w&} Voz!}xxP!jY)Ifjte;f}Z`d_dd!^!{v diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1RespirationRate.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1RespirationRate.class deleted file mode 100644 index de12569a26647ea547acbe2940a76d44f8bf0867..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5949 zcmb_g{dW}Q6@G?fGrP+s!5EMPge3;tEFo+7kV?=tpSWodO(2Mt+R5$&1~;?o>}-Hi zi*0SymbUi0*0xq#rPyi_D_MS#Ley!py6~9rC$eN~Z4HvX>SuZP4hbl%PuUiV%m37O|3e&n(Hj3u4?1%zo zTtV}2(Jb4VX-{i~iXPeX`P-;Gcg5t%so^I_4-a-L*f>$NPGz)`mOHIyw0WzTnc`?p z8&J?_8*@4tky(61FIjp{v-P}!j>(ECThm6_m?`LkrdhN#n{o+h!^9bFUdt3T^HipG zhRhOjVp7lP#=P)owe)hyu$*I)WJ@t)JRMqnrlJ)L`#kX;pUfT|oh07mBD_X1Gosm* zx#N~$>lQ_+lcR$pD-ciW8Wl(4mQ%XzDAc{Sg3eUWA`vx}3>Wjn+B#vF`csv;8QnUn zQ3VQ`4jQImKcS!@)ibT2ZK9Z?IW!uD+a67$ecGUk9(UMVT3)kqW;s)$F{zWxj8U8~ ziWW0N)zNf$u77f&o`^V`3hKC6p@4y9SH=oO%?^^d3og!pxm;EX?h9~pNfpGXrmBV- zI99MemF)=-9+^3#=WN1jnl$`c!Vm|&}+|ym+=p|dV)JPXh>tcDoj2k-c$k2pc=TLO zFFD~>#oG+57DHK$^TsgetXXBe#$e=MAL8q7D~KM<6}%7@pDI?YoIYkqVB5A_H0qN_ zsKC{6Fo%>&dd`?Na+yJ9ltVg`mZXk>1a_e>fiGb&f#2eH31sj{0(+(TJ>E%RA0AC$ zzchcqyVAU;pgWwOgr%2(d{r<&4QctLVdnL7!vBv z=6z{CNZ<>2OvU8{{){UsK1|>*_-g_Oz}tU>k5&9FfvfmL#We*FhVSNv*zTt_iwT|a z&>JZKxzJ^wFX>$ex|oHFR=%sZ%hcv%zMOeHsxp(ikWyG*^{#zh+UfJt4vF){9LWNK zEGcG7<~3VOGM(ir1+ijs=6upWmCWn&Mo#bJX(#TNyAC{mp^8mXJ~uq%c_+X4V%&pC zp<#(KSEBKf$BqssQ{|q%u9tfkFsTORm6%aEQeRjrbF~(x)f(ejNtQmyMY?eEM=~{2 znp=o6#LtV`cg^-Cx6nzZ9@*6|j8DFtz;%48pf~Ix{>z&3o>-vv5&ye!*Js=kNWs7= z-hhIgD*~kP=&?gunbG9oyQF57vLDt)D&m6HEQNqwKJR^2IbUFo@SQj?9}C0uQg}TkE=up{aww~>y-~^q1$4+-GF%2^ zm2=S9{ZfBJSS8h82$7N`Fh-)FlbPfO4)uzRTgtyl-jcxql{18|VAj%)gDfDoh z=I{13*oh9QD>zo9px{bB$G~oWOM+^t? zIHf$n*=F|g*LV%eRrU(L$X1Ym{}50ZqzBmwWrn@1M$)&i<`WLq1W31Hh${(~0K*vJ zOb(B-mBW|NfC&2?ayY&7CK_&_G2QF*k@T*cXu1J4-O=a_qBZWFgaRtCkt$43h3!<} zX7pk^l_(PTx?DYpdAxr&7GO&_v_qYvpt)>eKG^ULttpZ*k$w-LL_KH~N2ZNz0BmHrOao@h(l zLi0aJ-Qe(XZ@wEzxIqOb(kDfM3O51IDHC7Jh1;F zV*!@)z#ivV{;FViaV-9kP51s2Ev|(w6S_Z(Tt<(~T3u^h#-`dVdKt~NONjm4TWlc~ zP*+LbsgKwX(w)YM|5@Ump?3^%H|fIiZ<6zFLa2Be&+wjdrzo0|&HRh;I+K|4F14Gx zV!dcp!yE@KI1#X5)VJVK9P`c(QnpwyR`to6>&2aoV-!3cP_DUy8&1VGi$wIJjX{$1LSYz!~%0 zwdESx(>rft{b$(FfRI&`_tC6;5Ku#l@3Sp*p3_8Qke7tPGyGme!Q(DLQq0|Y4G#$S zjh~^T0msAaKSGQ0ae#fR&%PCNFc+|oqUa}(aZlgrJLo)d3!Bjnb diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Temperature$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Temperature$1.class deleted file mode 100644 index 7cbb25319bcdc09ce2d9acae8c1ba680c9884cc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 282 zcmbV{JqiLr4256(TU`bB0)mCLgII{IqF^Bwiv75Tb!459nRO3m;Q>697z;}q6Ou|8XD4@QnBoiD3azIUocT4 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Temperature$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Temperature$Builder.class deleted file mode 100644 index c81eae3755f15bed3ec8a99ef3c9267e8d49677b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6739 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 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Temperature.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/biovotion/BiovotionVsm1Temperature.class deleted file mode 100644 index 7435d879238e01e178ca1306751fcb0199626a0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6279 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 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Acceleration$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Acceleration$1.class deleted file mode 100644 index c95e8d59463383dcb2fbba2dd477b1b40a95b224..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 274 zcmbV{JqiLr4256(TU`aWx3REx5XD|(1q-q81mhUim2pO9Ru5<40X&o#!P3fvH|FFuW=)69)PDqN~#Ae6}!#EeCPljZgZf3H{s|>tpGP4Od5h zNRSfdJ`^hGgAT?;b}uy aP?H}&QI~|c2AZM`w4}GCQkfx9WbHR6eoPzy diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Acceleration$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Acceleration$Builder.class deleted file mode 100644 index da0d526abfa703be4cbd2715c57db511f210e846..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6460 zcmbtZdvH`&8ULNl?%rg%g%Bu@@UVpxLINxaSPDUGAPKF8f+WTA@NwC_NtSMQ!|o;p zYHd|&TOasVXnk9)k6OU7A=6fHe9WNEsQ=kIKHAz=?erg~>Zqf|-*@lby@%YJp|fOW z&$;)U@B7Yoe!uU0=ev`izxKpA0Bdn3f$NZ!W>}hB9Tp>>z%q_WOh-vx zN2M7{;0_#4;0TTyxKrldBg1!z=zFEPJAv7_$H4off4_`;K$>G>zbFl*7UOPdII$SV zMEza^A58EiColIIxZl772`s^f=R*_kmr&7s5m z_3(FuzoQEAO_^M#v{|91dBtujZq28uIHNa{vu_z4K42I6tpiz(H1y_ER(7{l$jG}l z7%dHDiVDV-(M&dN7r5BXxtv|tnzf2Wn-iOR^M%1=!Ae_&RIZpD;V`{O+QTDODU-62 z-QGj@y3SO}&e{bI=W|V-xekTS<}0%xTZ-jNL*m<2eI+Y(`*v%@ah_l)Y^ctBhnT&- zD$hE|AORb+OZ^T*vzu4+9<;`+WY)?JCcE;Z1eg0Zie-V$=B^c0t)!tC8?&;bcjQJoa)o5g@OI?~+YE0T+KA_ZKQgo8gg+LgrP~x{T>?%|HgA=P zO_WAC+1cE4#U4lL4Nb)z7x*CS?r~R;jn6T|M@+PcfmW;(E8pb(d2@1B*9T`Wzb_|4#RoEWHqFW+)*}xJ z*EX-%H-#HbjtHGGoa=AL0CTEbrarNi>(H(^-bh43<9RJ0=uZrRoS^Sea>iz#7e#t+r3KOOHj}EssXVbhGAc|4<=+hm^Zc?9G`Bvr7Q3 zW$nETBpxwDB-8P`AtDLO>6x>fo~g;{nVr}#qy&>Cwc7Z0J>L}j+LrGjdKR%Wj$}LA z1ZRL>!N9NiEdrRX9M)mIBg3rg+E7n8t3$17X+4X0%Q%dh_SWyCb^>)1NSs7#3&*Cp zD9=m0kI&xwUi9*<9XJSM$Zpr+!N<%ebx>|r)Y9SicB7Y0aH*Us|%(Io5iJutgLbtb4o9C$^ z$D(HKqmvw6ra5YOh7?cCHcx#$-IVlI=cw28xALFU&E`!!v!qJKb(Audv>ZA46aI~T!Xze9h z`!pjyTD{orLEg^Zy)oQm>+j4(E3N7KXx)Mxp8kGP#w6v%R;+!gbE+1#EY&iyZ_`C9 zN3`-pYlLVWni8#*j%Pc=(TWAoI;uJ9qxH6Mv|=G>9V1%zYDRptc7>uPmx#YJ7p>!( zzK>Sl6lleDv?{5~x9OsFf@qy2S`QMfhc1Iwe>ht409p@gj{0cb8je;x1g*!2)+x=1 zkJj!`wB+9Ocjlrsq3Qc*y?qL_3>~dZ7$M94#XRt*43BGnx?}Eq>d%CrM2(@5)KK@FW)RIg2;+wz^65BoZym`;TCjm%hhw zO}W&X=g36Yx-v7%GIA$ZWac|EF;AwUEF+gMW!&Pa(UFOJGIPo@a?4g^7C177Co{J! zBiCs~W?}2;-Y2nS4=cx|=bgOr1Ds=B>y}2#P{*6)kEm78Vx@WxJJs_jsXyU_dI3+V z7jaI#g!Agp4o=rlrRMm?x>bj5m^Fi|?qf<$pZBfX|@r|AsS- A8UO$Q diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Acceleration.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Acceleration.class deleted file mode 100644 index c263cec3b37b6458f0d72af63b13e297638879b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6061 zcmbtYX?GLn6@JE+Jd%)YAmD;ch%lzHg|Wg?HdEqF1``O>1`|Wlc96zqh%{10lCh!C zHQk$}Te>%C)7EXe5eOLKbJ~9HkLW*W&uP!;hxS8HpF1;>hOvyn=$v_%dEfWm=PvKP zcl6i)eefp$yRi_)R$Pvt12YjcV^*eDq`4ZwYJ5sY*QB{F&8KC{XJp~CDn1v&=Oc*X z3o2e!@kJG1ieL@CEX`M>`Kp}wS_EImH&)>_ye`u>Wctlj_!hpc;=2*FVJ3v{N&kHn zKZxKd{7}V@BG@ARk5&9c#ZOhdr64+Dnz}WZ(Fz5sGLQyk|<65Sq2Pe+VzY#c9`Ug*r4IWLN=tuqk2j=riF$w!)KV!ET1a`bar&)baIq{Vv7J7xx|oGEM?DHMp3s& zOC3%24=uBKRM)5(Zf=^=i?+rbxfHZ^b}eF2m3c6irp(R94O4%N~r}6|6m;OHtn%wa#UCPoQ|wpbqxh+XoJr|< zJMO7?n-R`p$f;7^;HNxdmI>DxCNGtbuCuHlbSRZ^Lrr8XSF%$2upt4ct#;Vxk;|dL z(Wf_z7xH?_m^4y}eg^d;I`f7^@7^eSkceUcgHikpKab)W?2O_g(!7ITM6nn9qS!CZ z0cn1TUr95kpu?Xhgsz(jDw<&Q7|_x&!%XWl!sORXP5#@RLm=Q(l3+~_&QE$7BecN zlsl;FxY}Nv&Fk$4+nEM)R=T~r-PE!&uWc50y}-OGo5-f8EMAYB5PHf9fqT=r6n8Pp zX|YKwmyPY-q0JbDnC9e%Tvn&Q#tOPw$XT(=M)6{7%F?C{C+ljNSjtWFv8k9=h?SVA zdPvlc&V}}a=dYHrN)G0ND@oeU0u}CQecDLrG1V9Oik3wU%HjOKfLgR{;#!J_t zxQlxVy8TX7xr$@%o%ED5;<6t+^cknBQLtwv_eH_>Ws%Xa^zH$zz=-qoL+)n9vl2KR zJDG9qNWj=Sa?%q+Rym$&7p-=|HNC#zO|8f^B0|Bz%Vsy);-JmXS1Ip_js-nYd$->E7<8Zuv@OyVo)Y6*ec=lAGVejzK^hA>*ug*eCC`TbmnZfumgf@4Jr3clIJv3ywr4SctUy&_e{ z5-Y4amRMmavcwAOlbS27lK;uCRZ>3t7NR|jXUV^hvrX*f7q|)K273klYy~6uK~Jk- zkZm7l3HI_f7@tSodmPkxwr;@?-$b1aNMe{XIedg|AII;YoQUGqc38OV1@SXD zYC}p;*GCCh-tEN*!N_PoM*(|ufTJLH9;@i3hcl73tQW7ayFJ1ND#AX8<2=#FGdDfWVYI|>>RqPv(OycsnZX8uAj&Ris+Q=rIRuMZl6PAO*lE#wfms8iv}@D8DeJ zJdHE1th=}@Rt}Y|z_HiTqc#i2twR+{kK?R+zMss+(&4g8R~Z*gollQ>+Q+C49W1ow}-a z@D^^pert5&4ecc~w7sW;!m2BE(39$M>h)=&OFXj1;`A>Ujf-;7sa z-A6uzLM0s@bM+lxK-p*Ddl4%SC=<`|n!jQnxT|G>$N@Ur$^!pf;bBB8k5Fphm~w)>;l hL|EK|F2*1{=#RJPX+ozy9##8z(mv42b%#_@46ZnBOg8`k diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BatteryLevel$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BatteryLevel$Builder.class deleted file mode 100644 index 33b9ac230bf3ff0a31ad3b89abd23a037cea4c4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5387 zcmbtYU2q%K75=WI^;*gj{}LR>O>trxSq>3)LgK`!!M_kt5{OLNgtV}h*7gQj64J_X zN-61o3oV868`{$Lp}+tGfdM-q9bno{r_+Z%)AqH`@Y<)Q=iI&0t|fVrQO2ITd+$Bx zyXSo8+;i{h@BjPgV*tDH`v`jRO>Q3I=HW29VMeeGv)rV3EFGrCieMw=xI53yLIgHW zNAL(TIu>~@%fmSq&2#f;1f3}8DDu-`REry$>*l#$lyodbsPiy)&gfXyaW;aj_!jpc z)A4N`kL&o3K*+HdEdenpVDRfPD`nYBR+_rArsG(Jvk7a-%8&(lJwy95(aPc;ZW7e`D|?47;}>%SI@OMA*FL%*Y^hM*9<|%_TFQF|+gW$y|xZ zCBOAzSzs(W+27DgJ{GklGgG1%>I-JkU6z7h%{Sl9>2 z{<96PUf$o0uFTsnuskU6Xk!M9T+hPcq&=TCol=2f_BRP+=FQZC6*rd(xp*;erR+I7 z6;G-cN@@zR@_5`VS_d0id}P!$+P_xXbjNn#0;Fnclqsm+1X`=> zo`L7_f`J$Dl7X)X^{$>p0^6#UYSV!ZsfG-rouwxy?w&e4 z)+f+aljBLs_C=HS{}y-q`I%C4yhHcZ&R*RwS(lpTY%7zd`-3*kF9N;M{s-4Fqfd&E zF}ghDj?Pgfn50XT3{BEeq78EI?IEM>~5L+g2|qUbkEg^_YP>N9p`p^!Vnms**7o2qGc13*{oUb@~>7!X8& z>l=Lx1h`DeCsitXcG3uyM3Ney-d^endN#-2M`#t=ds1>IwGo;D6(Ak2;#PVyTsiE* zpp>E7>SBl(G%33p8(2kCYz2C7Xy5}hUqtvKBIhv>qp=O{_zDa)wSpTy#l{u1d`OG0 zpfwnpVUZB4w$-YJhFn#i@~O75YRFa9Shf8kI;vLHlqye2)y@^%_#xU^RSV6q%R#Wq zyRd=UKae}Gp$o5LKi^VeS$!x6jYq zxMFTtGDjamIN&lznODwQH_a{(*#Q~CCXxXDQ72>R9*ToX{}e(La-fGZlQ`cYso5Oc z;mbu2vz?@Y&**FTpXk89$iaX69O$Vy(1WkiPNR!5MsbH)X;4|JbFu|@zg=bMe|(1O z3P@1Oj4AbfWF|Wlmg>Qom}ix{KR+kRzwm*CD4L&E%T}JnbRcuKNxQTuq zkr?gG*U_Q2*a~{e<$jZt3GH@e+R8Fqrz$cxNf}Maw3lVLl#`5Gz`F)6Brap?2|9JY z{E3WNiHgmaR59O5I|Jenn#DcXDelF6A^}Gnre8LW;EXsb{koZCn~}v4S$NJMjH9?u zBArwFfXnzv=vT10QjCO-;VWpV^r^fL2b0%27`Q@=5yb7>+}}Dzck^Q|mx$AoGfyK5 zZ>~x^JnIXD<{H-uI!tDi@_u@9Ahg&jg5D|a?r>MxJ*t#4i&A+$4k2N_reG!sgezkc zpXGu2ILsPJD2Dj$0eR%{+t&#(AQ4a0LloDJ$VWj1kyboOy#OA>Df#>cZlh;6jrUR; Tr^qF#kJe`T0rThhA;SL$DiiCg diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BatteryLevel.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BatteryLevel.class deleted file mode 100644 index a235e5685d61e4eb802f09cae250b26b87aa66f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5355 zcmbtYYgZfB72Ovh2FU^(jH%5dkqNGaASk3Xag0lONI1CIIDnxfb(=vNU~DmxM~*Ow-tOx!FLsWParaB7@9erRSN~JAfSvD^=w8n1r8Q8Q&+R|npx0u#>L5`fH*7A zFrG6CmTFk@YPP5a-~G?OUvG(>Jx|Tq@#j+KM!N-$Oy$g#gql~=t6D-`H*<+uKCP)k z0=1UDrV)r>;iQ%~wX|w!8G)lSMMF-_>jix&tBo2)&QdMfC8gG>%j&wC$g0LlqO3!( zh}4+T(we?5F(ON6*E=`xKbUdeBnObXAryHKO;Y~H8nrWku$TMJEcS2js(@|+Pk#ZkWgJV8Fkm|{p z-+{Rzk%!*%%|te*T0;&WpX(h>fk%AGj;KJ0?kIU8z-NKOvB@5v;PldEEp3ra-LkG_ zGmMCsWHQZKYWm7KHSaDpkS|iTH8#0hQ_`thmpMn>=H2s*AMMWB>D9tmR3WYuN&<(g zxI`KV+6EXX7pk0GO|Gu*4Q2eE7C5xSY{@lJbEjO3-+I~EVMDv-?Y^dy5F1mf-tMM``F6^72c0`Bel@;~537NAPR>M!|0*_#JLVa1zf(@O%70!5b0$ z5r0zfXMxVjMLC78`+{n+MY1Zn58}#=E^8yNb)D*BU(1=9uD&iqU6bSL!EombY?M-n zX8KFZ>vzk0f2q7vHj_(JDygmOX)WsZx@cB5yME5vWwp?C>ctx+qp~}4!ljh4%eM!U zabTnjyZKt4;fP+G8;`~cJ^fub`*whoYTjO8T(xY)W^_+fm%ZJo%c#q;?|2M%tT4K4 z=GLN5My*_Qfc!4qjNmW$t3Y36Y`i?4bragx<7MPGA6Um}^#X(YNjrhwJ(BzNwQSgfhfO{2PwNTPA|*8o~+tj zTVfOb_fA`r;=WEiYni&SVpq$d{gw3Y0b6@xpW3D7xW9(v*uJ_y+d~gy^Z1_W!8B)G z5A#ftGSWP3vM!yfY$>H?Wi#;?epZ_mo%7 zKnYqNvn0(Vv)`uqY$Z*%^Hl?JSh}k3#j><{Yh{-e7<)jHC1igldneb{N|%%lyurNe z1S~9mE2UiDwG8j0pnZ22cISHL`9*h(--`l|LqQu(Ajan&eofXO&Tl$4Wj+hpjrrzD zJ_7^%)$!d^ybIZ)?=!=eU3I2SwnXZ-$u7uyGeS6pA!428sDpR;S9=>`lXrm+@ha^B z2YKZQfmbP+;9b5A#y#=KV+KM2Bk5lFS1U-Qk`l*9{8sXcx1LPVZB)yfi4R_KzNz#(<29csk zfeCM={TxaDrIq^W_xkA9di2lWIciAyuMtb)4!6I-tNiwN{^YxM{vPMAH~u%&-b4K+ z??Lyj+(T${8{x&~16zpvlTrcOY0mokxuyiV8RtGmd5{qvp+u`=$y?trCUKTLKEk;= z)OIL}!qF7Yx!g918Q|RWF1Hk) z!=c+o!(j4sFmd8^=t(+df(yC8v9N`1+DeD+6X!ZzR}R=pRQ8O*x+qckm78Y(4KIf=sd#5C$@ZiFI^V?!Rx5a#T} z5x7{Djvd4bItx|l%-@$zu#(P8q@(UZX8|AeyyN7o^p2fN6?9gs(pkg{o_A`>-r2du z9PeBu9rM0)QiKWNMSRSKJ7&k3&fZ4TqS(U0%8IdJi(hiZ2f0&aY{ODKPWeZqyg$0H z`1ptMaeRXF(%?(?Lujr@!orAc^iiVsECSKM1y$2 z=Y~cvNg9zxhKL%m(og|_DQyXd$Bv5n3}*6S@idIyKL@t8A+-a)Ih?3D0ETek^K;vzc4 nC62P3tHGMrPz;Wb^Vi0?Zr*XQp8teA#*!OiEBY$FhS2{2k=8Lq diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BloodVolumePulse$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BloodVolumePulse$1.class deleted file mode 100644 index f48a3ffce532b41d3dc104e3e4f17d42c3a1403b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286 zcmbV{&uRie4936sZ*?nl-#`zZ9Yhb(qq2n_L_zRA&W3emoROJbAI^gh(1$9G&}%Oy zBp-o%zmV^r`vbrnZwZnF146p@O)&gfStg9~%T?Ev(fML!y)O>lHW%JCHuChWZ<_F) zJ7ayUT)E-;3)fS5QK;=ho@`DtX_CZsKEX>D(iB~@BE zPAMfo{|ht}`jh_9_MxRyGLSG}C!_;RVfxUAP9F<>?K8acM0(EMEA2*-CmESZ=I-vj z=Y02^@0@$imH+wK+wTC_i9bfrjj!|Y4IUm1qZ4KXTQI{zlIK!k8mtJ`W0pVXc$kmC z#;FJ%Lt4iIuVr{T%c40Rz8OI~@;VCqbQsm*fz~>Cts6xhixK*Gls``ESkiGOg3b6A ze?P9{+d7`m@g0GXV=q_&Vobo`*JD=FvKOtCK=VvGn@vq;)5QhrXfa)2sR@CGJ$A-+ zh6RGr-f7Yw&8BFjY0}PEhl>j{R({HyNz+X0WHxE0r_H?0-)b`C%-aP4eWYloQ&yh# z+@Hx<`O&mlC|I;GGMUZK#q(y$%qKI2c#fvYn7Fl&GaWl=#>dsm_}wEF#`P%3A%XGe z+ELgwE$hs)jkhEmGx^vdGbf!O?gZ|ye~Tf8-d(qaLljsdaL#h3WZ>GPy_2WRMKhi@ zGjs8=Y>~(&4)j7vU_3h3Tla20R<%VlU8K0`^Jc-_niAlIKscGU%)C1@M#g*&0c=v< zdAZo6-0{sQGrXCWvLW7F8zEI@ia^_SoK2*&rbCpq(H_;ZPKb~5H6{Whc77O^u2A28-&eU(n&{_=$C+xY5=@j!6%YRESGiN5} zt+=_E&&CTmD{0T#$#_D&&>^7EEAL0lf>nPEhK60^{rja%$BbXM$C~g3B8hA2BJnZt>6zE}8KkIub)W?b$Zq#KlcKP=PCUHpM!FtUo6?%bz$~|wKSpr)sm8#Q& znqJ+;(aF;jqYsTA+S?=0QI-1%It2?R)rs5O!oRlRy+-((GIn6<5RitZ=c z1iuJ$M|&Sx#f%;)LdNK_VIG;K%F8X-3vjtf8+KvZOxr0MxU=r8w$HU*LHZz6iRS(r zVyXqUsZQbdea@o06_td2?sJR;sjB}$psO-m{(Y!z6eOVnoi#uep#obgL27I#(3rBU z+-Np;Mqqd~|AuOKRy`%KE+wxwiY~f-jM3#xh9+S-6KQjfA{3&?5G(E6wmr&AJw7ta z&E5l``)uPPhro2|3jn2+k+NpZV!DJnu$q@Dihi?H7%8WtK4Yim^V!pUX_mRSv65yt z0CbJ-rk@ZL1_Tk{T1P)P0$j4>ld2Xy+i8Z%BT4nq*S+*5=-C*11ECdYm!#x&8Y8p< zDnvS7#+~$LxN_KmekntB*2NGpXi|11*0+L&*fR9sK;N5ayo~T=M9!lxMsw@j`DGYt zX&JY?hxN;7dW$w+MsqMU#UdeAZK+lb4Y;bj7p=5cReqdh35dMY{yn~1FE*9|~p1|L64)5ay566f0_HJf7Fe7WdhwvsgPANs}pA=>Z}Irv|n16^eYx^O?8G`d)07!RnO`jw?R zCtGmmg$hIe=QC7SK-96ZSE=tJGuffAR1Z$YJgeOE`7u%ci4P=P1{tZz79SrE!)5DJ zpMGOme{>bLLVmW&N#tQlwnPByMG$QwgifK|fUU9GY=tV>66<}2dTfo?W-C<9mgs;k zHu*q2wkEJoQO;G(t%zwAc!QUKe*yxU1~8Dy7V#RGz0H zB+OS7%ou@iWo+PH9;l7OtdWFbh~FNTEsx*6N{9i8c)S*(xOqfw1!Y9q@dSMZ@CZ)I d=htu-Jv(W>o5narE diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BloodVolumePulse.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4BloodVolumePulse.class deleted file mode 100644 index 1169ca04a4ac7fccd2056a40f44e359fa272ca06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5444 zcmb_g`*#~h75>Juyp|$AY9}Uf>_%}NA}g*%N}#D7Qa>c84o;ogiH%bNT}x|wQ)yRS ztsI+>LJO3ZLV1-}p}ZkbUT#8@6rTh9%uoCg{2d&=*%6y9(Y^@I8UpgkfmbSY9oaw32`_TGsP9%@SxWX_l_$XEm#&o5sb7w17A( z&@^TmC0jM@Sv6nQ!vFbq_{}|UzjcW#XU3k&oEzyC*gt7nODVOeW|y^;x?-8B8NLYgtWSkr=HDdDG0zn)z};J73P1q@Ho|nwy@ukeMd0_$FSunM$j6xiDwxwq_Ah zna+%)cMzV|R2qoF%}bi?7|z|EKxd+FlZx8b$IKilwM^=U_H?e zwHx2}dMLE|D~Vl4P!+|E@dqRlHtl7ZWkw&IkHCw&-__9nWj9S%Wdg~pGKm;!p6Sf< zDD#UO@Ka@*A?=){km8<;@>rp3%^Rx3KGPr>(@oA=U8bjB=OS#4aG$>-4aDPuq$9Rb(2{%l?pc`WB37n7{dTkF_u3*euTGTIDwDF@MHW$KHe7S4HgNB=9Ph}4VY0z)m&URa@wkd z{wdRZ@I>>N)`pzpBQPw%A0$MjvY*Mv&*kG6F?<}4EBIv$zrwE-{3eFq;zkT7@k9*2 z!|xTm6T=_yM+JWp=nihoO^ChcRf{E+*~@zotJiw$wW8KD*uy$#TDhM79z!k2{`OAs zWJ)ZqQjn?!D%%|J%E3UT98flAW+}xQr^Xj8vk)&Xo3>fZYxeS5sbDTyYH@jhVookD z^$b3Ht-?T-R!(^Qa!$^#;^njzJ*&l~46g!(BK;G;cwsD_DD@5WT<^aJq>?Ci0;36J z9k+Hy4VL*D@}ewQRhD^uY1xje3nkNX&Qm;L%t?NiugCCb{6(NY=%{L7&v+5;yBx?c zSikQz?j3zfv$zMs-8A*1Wa6 zfjk`4NEzQT6OZ@KwOsI(hp);IoS2G zEc5zupCl{D{^+h=g*$>KsobE$MOiYKbo^Q>@xN&s)n6J1HeQ|plAk408+z6)8pIr0&{1IPJo;Mikqg{%&@+1Inya?C)ak$a>=$0 z5e#C8Sf|+QVk^4I0p+4E~wBh8Vx6$w(lp1IU!W2HjB_Af}QS7Cix@f0i zjwW3oPYEGut+b=Ko7PE_mK-~Q3{?t@S9dzVp5$NIsh|EaAN~3&{WExqDeT3g*$-kohE*jU_hP_s~i^%#0qVsKg?jZILN`)Mwx%(U7o>J(g zpZn?M6ZG&fB|2P9)%~5u1kRGjCpp)E`YuIL*qg*TkJ~yiL!5iY^}r1@)!0gRxO6+I7z~~+22PR&JxQaCb0g;&9K)Q6y9BC~ zpYbS@6rRQusYvn)!d*>GO%d`w&k5JEk8x6ZrLkf?zWY5h?kI2rtFh{tY0P-*N2prv zG*StwS`bB@i77Nv-7rO5!$ztsBe>uMj=;q&={Qad(3#tk&g`~y!a+LEk&e0pojH7} zY8^LbrFEQG3eZ{JlFmFXRjpH3v(CLo%(c!7q+@MMCqtMBp2epr_$zyl1_kHXOA>b7;k0x=+XNKl#kTfHU91%5Q$=xjSyM$#A{fvj+auXdA z{X_3#e+Y9ycoofJ!3W<`g>Qk5EBC-R;`wUIJ?q&!xq$=ochK2(@HV<`L2RIVp85I? z9=?V44IFYi@muJSn%xxM?5u4;i@1m`ahbh5=ju?X78Ha1Bm8!9u9q!Z8~N|%VW!*& LOVQWxbwvILqB&MT diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4ElectroDermalActivity$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4ElectroDermalActivity$1.class deleted file mode 100644 index 44614b8b0a756da4dae944b37d39cb9d1a619944..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 301 zcmbtP!Ab)`41LkoZP!Bg6ME>`LF`pT>ldW7b6!z^M~^Mo-la}LDGv?s$@cQHZz_> nXI39uy@v4kFOOyh!j-;%j%!WmG{8`CfE(>2ty*_T5zXiqXoy!S diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4ElectroDermalActivity$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4ElectroDermalActivity$Builder.class deleted file mode 100644 index 93924e822b35f09bfb442f9e010aa68905774e42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5612 zcmb_gU2q#$75=WI^;*g{{!Qw*Can`gWI2s$r)|PXDVJnt+y3E5$3^vZi z@Dy@7R(UVa%LOJa^6=>xdg16O@zZ6g77w)7&wGO?>sX7?y$A?dmkm*8}gmlc?dFyz2bO50S^h(<={imxCs3CycR_lzH$FUn&RjE- zIWxbUOcl!H0D?p>RS4$dso~a+3?QwonYl7KTwgIu-uV<6X9S{|oMk%R%2CqjR(ZBV z+3AOChcYa%qIB_Bx~kgvYkefCVH^qcTnFK7u3)-^U>_aSgkdf|d+SW>BlVk{(=Y94 zvZ*a{UI|RL3OCu>=2)46L&604c3U8xX4W%S(X|VC3cGcI>x1pY;yJ1uwDX)ms>Re8 z8kNZrTEB-ZYB799$)Xop)u&QjTGoYgKD0h6@O+CZjo%VgqG@|MZ@OiNJpF-`Xco=P zij_3ioICELn$J(_(zWGb4Ct)^yF}bqBS6h(Ih|C_5Qz z*5(E^bc1HHk4vb5VcgHd7!L^p7w~z0`vMQo8~7r=Y+wi54KcB z4g46dQFZeVsAe+(!lHvtm?Za~Ea&-dP$gr#e_~)B#{_0t(xuWu1jcF)zH!J2?5bs| z4;gB#t!YRZs;8$PnK?E&M8&@@Gt!hJt0q;JJG?XwVyE^v(+|||-q=7{`r4LkE0?8v zkv7XO0)z44Cz_}+BuPjaUH0P>OH{SF&HJvdUIYxgbjr-xSsJ);@2}U-(_V=Th*0I7 z+k1rZ7TBX&P0;pbi|%w(FphZ76cJKK_^H4^tnakv%2ziE3>E&yH4|(O{ z5L@CKgfD>Z(d}#O0@MBf96(`ZWUVE$oU2G3Yi6bLVo)vRMvCcpK-q;Ar*NJx>oWGX z*TU>MfW9FH>HCG;fG|Q_`siyX#1%|Fsff|DmsY4+64eOJ?x&fcXM5r;L^h$lDJl2T z7^59fNz(Be?xr`xqr*OoN*XG=o(z$ICTTYlBb#VTY(Ni>jr!H0Kde;_!ZLlHC()bXYd=mgx}KNC2Zg= z3CniRbOj5rNuQUa1kAl8sSDw2Bp{^YKKcg^9U@}tSqitk3b!i?dp2Jpx4qu{u(E-- z0_N8tcY8f+1v%adu+|~h*Bm+Cx(Vd2P_Vp1U$<8=j^ASn@8WU1hc XYmKTfod-Sq1lnx6Np7$W;am-f1}U+zoQ2qkb(aQ7%)&ZU;qzNrqQJw6L?6S zG^#Y!IoQJc->6aap8-X6B}h=nOe*#Rq$V2_mF(e#gs+vCpZ_Ar{~Zt#tqPfHh!&@h zFT+FYKLP&sD*tp7v?4*YszKz-lxT?%wu&%%L|Gj>*!G_wt<04x!*2nBKtj>t_ls;sVdFwl15WB-4z-x zgC3L$=bT(&%Z`#4DqNr|T$Nfb9Pky}AkBAs}K jW+6O*v-0@~+(XZPS|6k_NuEp79G&g-3+;>e5~BYDMgB(c diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4ElectroDermalActivity.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4ElectroDermalActivity.class deleted file mode 100644 index e0c679418c924b958e11e7532f1d4627526cb702..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5640 zcmb_g`F9&v75<)Wc`QY?QztQwmv-Vh#Fkx)6hqTEq+TSa4oRGP#SMXurLjGUG*V|q zPC^KUmZcCVW#9KDP@tpGEL@(uW!yuYE~>k)L}O$FbG z;0byErh;!N__l)Y2t+4MQ@6%5nr-X0fHGDvGHKls*lX*Sp=IWE%QkZ6++;#PoEB&t z&zZKPna;eHDd?e*b8p)#7oz{>%9-)!lV?YJ1lrEztd+Qy*HWu`TwAkp@fkj4wPAre z$H?jgB3LA$=Pf;@IeJ>);B>*1Q}c#xEM@dj)66-VL%pQbdghY0ro}Uwxe_n0Ay`zd znATIeu_iGN=ovlbSh<95Wwp#`$}!dq=Ngqwkle!b$S&#Dtj7Hc)Soa+ z!#OEX+uJuU&~hf1qU|+$fYZKAowI7t9?!Y(mX_A6lxfHF^c)Qk*Ry$AETzSh{zGyo zS!yd7KGrW}oj|CQcq5@&srD&2`KGQ$FlYIffsijMF z7unP=8+s;9*N91m*Nmg3E}zx%{+?^|1ukvvo!q)o(y3pQQOLC|Tj%LW>Ya51Za<{uOn?GXeS4t;z z(vP(NI~00+C_3TI-rYr23CaupM?oo+b5>;{I`xQ{3B10`O%6Z0%{5+;*(Q0F8OPKz zOn|<>nT))HF;#FF`tF&l&ADg53*brtCeq~9l%98!rGoD=En3V?W#qO>1W|CHsd^7!*imtVOjOdu)2cOAP@0pxe~4 za=e3kd_kMlSxQsiU~$8PekmC&mJ-UQb16!(K5FW+mCLF;lB!>4S^rpPRn0H7s;!%L z&QkTOEbDA0(yC^wStDiTY(vj-PVN2Yy_vp2b&idOs;MhlW=%7Vlxkl#OqEOWtoFK( zGDy{KS+Kj0U$|b}nymMn@Hd`z%TI}8T3<6#x+-PZpJem&zB)HMuJ+n}gWWdZMvnyUbM_F>+)6H}_ITgqYd%UP|n^(8l zN-%-C-YLJ5{i0j;r*%IFV#cuybH&Z!iCvbSo}(_z&E3Kj zEB-EPs>kNFU9uT|BrFc^7*sNS(ao|wGgEB9nMjXUR>fkybtwhQ79(iPFg5F%zm`sZ zyiy}&0wpa?BHPDwMtGvm^Hwvwh_ysLqDEd8bL#j<$z>tv%K zF!qoni^##SFE#P4l_n|n{-L}qUCc{CEyaVeWgDd*N*!DK2Y;?_oS6=#JrsNDKI-p5DTB5mMB&3+@_vFI!G7AQlXe>6 z+n5LBDRL$iFKO5Wc;E$YRT$bwvM8san@)-u?!;r#O1( z=K*?oh#nrHM60K%w7-*>#A)*QDCg=?*QqE9M`v)>=XRTzwVZpw=a%HN{1my#=z1nL z@DDV4R=#r96-iz}sI#%LF-+d)IpJCMX--P7G!(7J=b&dMTm@cWHIzIvjTwLaC{@dy zhKoT}4x)%VF@*-I8=;72*l>wu7_)BR2+UQb<2tc|&O%i>^V`x1RnmEhbhI7lEZ}1$ z>v%CMt>ea01)bHZbQbYq$vQP<>uf$^o^@U(9cx=UNy3D20U!6_4!M4&u{Y4XDAuvJ zGGknG#V`8eLp-U{w-G5Gqx@r1KIq+71NV+K427Th3r#DLBe3YYqpEBWyP{OeqGG`b%wUC}=>*LTIb0V#0Een@D%M?K z%YL?Gf0i%5-#-A}@R%XX@Ic77?KxQaXq*t{<=2T*W4T;ZK1p~NPJczm?&ZiG6K18i zu8obaKP4U7eTJN{YC~-T?>Sf>&52`dIx%vCnSZFyuY{+{dkJf&YZ3`Xf5&OQ5yq+`Of*k5a-AVn6w@m#jZzi> diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4InterBeatInterval$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4InterBeatInterval$Builder.class deleted file mode 100644 index c282ffef6ffda123e5686ee7cd1b5b62abef6ede..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5512 zcmb_gTXY-M72Q|Tcr0azpBTruX`Hx3mP3RcAP)zFUxI*>(8#1Dq=m6GwkODvkVcMa zc%-G!H-#43rset3($%scu!@}!7OvY);dsHoV5xw=4^&$+NX0VGjrH1*!-;~L(YO-6wt>@b|!5VXw!Y! ztW}uEn8l(+3lr11!hF17rp-bsTa4#vnyiUii+R(rQ)YZhy-eLKjq+R9uP{dh649#w z!_H|rXMwG}Ch3@|hxeO#=?2j!FxtQ#BaA(=b{j`1x=Zwo2dmW zZY~va@nYUe*>iR(o>VV%ASeM80pn)T+PiiVMn+xp{TrrD$BbXJNn;xbM3T8uA!Q|O zZYZ0+r1)>=@@HTGxAHK|L(IS_e23q@%fnL!zK3TF^y6y=zK{lt$^xDS=G+`lVg?DMMzrm z`H5Wq(aKfIZ=nLK<5}&Lz`C@&@+i9KMlwlPHW`|vrZJVhu(ks($(xs7|2mz#cM zj=R4HK=<6{B@ThhNWv=r>D+k#aifGj?X7kUPPbX_9sLpsaMhAeDqQsJq#3G^BsEB1x6+rOXLIabgjS)wBPF-d7@-wV zDbn!@ZlpKEmBV%nNf|1&E{2Ffld`L^!BsTHR-gxm2mg%bvk0F>nED~bXwp!KDu&c^TKGil>4Y{fstG1s-N7b&HQspJ7+PQ*j z-$OgAYM~i+IS6)nJJ!+oJ96ju=*An^jX&TH{1Hj~2@c-GNxX$;@izTCgB83hY3XuZ zSF`}D^wV#Mh`E`N+7P@z00AAh(0^dh9ulTLrFh$>csr-KXZIy@UA689l@Gk+bH9eU z>uOcY%<+;>wT8LwOEbqySHRpkN|yKOm*;tm-~)`~L)?dtu!N8CI6lF1_!RHpFF1?O ze9WDzFn5la+v#U+TrsyxGDj^HdtBxy^U7K4rr8-HJ0L^YL=wPX>trl78|+p3#}J~B z1HGJ?#Q9c9&4$=kUoLu>?IaESjed&%9Ub@wIrvYX1HBaodT|?_G`eJC6t}CLhLoi` zCtGmGn^lJX%V(&rfatP~F{Qqf%w&hcQav~m^Q>~u=f8>a|M)<{6_D||Z1M5&FkH6& z>(g(p=ucdNt&pFsN)maPk}VOydJ#m22%$%4mtkwNK3kz`w#0g$p&naP_1Oy5vL(8q ziw!;ykF5mmRFrd7b1R}-OgzsdTVk_M-(%}8>{I&3WbG~ImNvXao}CS`Enda(MbTwz z8?kjGv9+DpieHkgsI=_v`fO=6Z0+(H>alfCeYUhZY>g9J6Fv}+ExK8{-ilE=8{8*O zok!1+Ra`$k=qCDUL}GL{-#~{tVk_t^m-{X$6WZa*w3TJJPE};ClQNo;X)nugDJL1X zfOij`nLdw=N2u$3^&=Ux5*3@TsA9g6P6ot2G>f~jP27Wf#WWnTpZDMNb zZAKOcWZ^l1Fb?8giF8Vx11{r7p?geX`~8+x>(Xkcda>A&M(U*-JNG{XM})$tss diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4InterBeatInterval.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4InterBeatInterval.class deleted file mode 100644 index fc2a4dd880c04c180a8a9e74d0ac2a8763c9915c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5634 zcmb_gYj+dZ72RW79!tnJF~$XBCxbCX7DfswO#oBsmrP6{CN`KlDQ(8m*dCB)l$nu% z(llw(N7}UM`~7~>rY`~wkg`_W)sOuR{SW;G?dm==BWaKgX5q+7Gxu@szWbhY?m0*P z*Z=rQyji_iHewh4^WTx-fB*A4TsbrLbnfIxzk+QiY-cg6m-PISk=0imJ3GVHvOc7s z$upM?0ud}RZj>A&uX{#8!S?C0B~!DeYt9#q5zDeY-Q&Kb)OF&#zM^M~y0w_Ctsz)a zR!kdt!(0)JM@-8zoKZvfCZ(~W7rD^{iJhIEJe`{+F>Mtw)6S0TUU~VfV{!>G)#=>G z_&UPVhE5GpxNXt!e9Z;tQ_!6nShYp%>|=I;XKz1YTE;Ww<$1$7t@Er3nva;4=^a(j zm>QT>&~d`fQ|~&p&*@O6$y+k1iybAxx0>F01^EaTiLa3UXwTEkKBb}64rEUdV?%KPepH41cL%1`_qo($RWn8S@$Xw`M z4`u%T5Qd6>J@xQjRD}r~eWO%jwznj~X6!v+q~Mhe9Bk;lIZ*3Gi6ps8j3$-@pzWbu z8E68>pDKHFZU0U++P;qm4q7k30GYd#H%fjGRKWn7bQpJP$lL0XC#?!_gK6>F)!_!y z3R;fji($M;%-CfoZ%mjHg|z#`j*Q$P1%Y~_f!!?`d2_+cXGa+3j~UD)63>T{7{tCL zj^e{fd>7wKB7_@jc}`jZ8rvHz6rFugL4g^h+?SNgomC8O_fA9JGZ6#54HEPYw}_c2Q- z~k~=89P;>qS>vGIYn|jPALbamjP^ zJWZ)BIQFu}OR9~|p3+=%kzSqA=IpYT*DWn?FVp7?e?C|)_SbY*OFj9xmetI8b0EW= z{YdZj9e(~wXrqh#K^Qay%>Sk@UV%lZbH;5ej+)GLP34c~FSnpHSOE?qW#z;vc9((P9*94V~ zfpBl_0`pda1zOI^v;1brJzSqRD;e2WMl`w6TSiSwcP@u(Svoyh zzawQLw~ck9pZ^u?k6Jz~dDq&Y0xdPC&>ZL8@M#{Zrx~XAwLk)v;nMrDtlaM=DJ2w) zJ|M{oa@57EWqen?N-EWVtRzW}u_wAqBbxZ`mBs13H_`YGn$m;*JC@#e6V2~Ht$}tSM&aFD@_vHuK_~UpLp=?1G#vni zn-G%P8uvHurFO{}`U;3Zefdu>|+%j<@)f ze~APi8Qa0{E`Il>|AMC5Xt~CBEPSiC5x;f^iMftVw~+ihr5b&u1?S7~Oj-2P&V#h_ z0a|#N5?#Sg)$<+2B#x8EM>yAvrXE#Q**k%gA-8M9Y~r=;}xf> zIZ?u&m_iG;8>UF0*m#v?9H)K9QE+BWI=&I>=$u`X&g?zu#Omq1Ksx$5bk5?VRqX^m zE86jWsgBOlnsnyyTva;_HSOGe#RBcTNIK3v>Es9#$Mg7D2)EO>GnIV@?Q_a4Y_5+O zmwoYbq4)vbRIzPB#M6|2MC7B^eKo>Afsf-8oRxEDf4J;EDx2%|($sNs3;BR6*< z^pCdd*pl9R8=dcBYa{BcqRgRHc`l-cwyKk~A&&wP4Pwb@7WiGnQiy&mL~p;2Eb@T)sTBU)OY$0w$I%{cgK#K=(z#q4tnPpuW#Ye z8`yFOj|Cm=2D)VDAcVL1YunMToI#Irj=du18n9eVC>Hy>`R(RhKi}Bg!vD?gWXO#( K6@3X`M*ROh8JG9~ diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4SensorStatus$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4SensorStatus$1.class deleted file mode 100644 index 03ea232c111bae2a23800f37e8285a9a8aa9b5e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 274 zcmbV{L2AQ53`M^ZCr;f!z3--rt}~RHT%b6RMd`vPP$t54aA(5I*oVs^2gsp96zH<6 zN=P4p{u8=fPiFw{c+8RKcpwywAA*%l*9+mf{yB2$EZ0>dF8a_UPD5NBcx1v;?QHL3 z=h{z6-+rH?Agq08P2fET>!LYwjNK?kemUlE;OiSc4z703TA?e1vT6G@ikOBNw^P?W# zT&L)b?4cu97_1hvsvrkj%rZhF#)V*HWyOhLEKW;aMkriLsFJ{On)XGGbcYxki7Q@B zoSymV>S$1o~T))Dp z`WzU%l8NJ~>|~y$w#cx(p$$3HPI}5sIvNY|cvlH2LGG$)42N-3u;(boZ-Bs7* zgS$Pa!*gYvvXi{Te%-be5~;#WG3_46%Gt1?b{)S#&K(=Q*eT66Y5Hv3j|b%K)6#s# z#%J-MjV^4q@p(LC<6%5v<57IU!s9lcz*!4V+IR|2E3^ium{%rkoWnCVp2c%Et`h@W z(0z%RR|#zNpxegtIIpn1o(gBT4WH}yg~g82*R!{SJ;i5J?{^Sc zMD*KQ@*Qjw`~ob%!Xj?qo9)RViLF|ORnxPf?m|?{zSY~eh*&RG8n^a+7fmlC{xTBh z(AUec72fy)Z1ZUWSG|tr1+=`x$rsSt7#S0hh^VftR*h`+ROM4hb)~3AJk_YEw&^K1 zSEh^_y*911>Ls*^M%2@YiAMVpjhNAB_chu@BNiDGHjNNAH}hu`@G95+8hO5s0sH`a z@I$2VBb4!DoWW1K4xc)p22{1*H0d%Pciz%2fVdr0;nQv5ppjBnvDjLKi} zJN%8kzlV5VsPMi(-ZzDL?=!pyJl={C9`txKF8&VjQu;;4s6l5zj1s^WCK_2a8;R=@Jp&AM)M=Pjq!+VVKF~+Nb%IkGvvG^_U zwJ%iQ0)rl>gIJ*sp;e7ytvVdywB8t}DP~o-_UXN~IYp~D9SeCGa2ly_+GDb+xmWqF zT>`6_-=Wfostj!9hO9ML)_kxgu=Zem91%3G5L9do*M%0LI(Amn3vwZUn&jSI}{65gSJO zyy9>U3FchW3s_~!(gHgD<9M}}iEQ&^R{An>B2;A7Xql*yX?p>!CJVI;kJ+_aAZ7&G zeE})?N7VnLBSok6Rg%W^C4qqm`3Cvipe#tp|%~tNr_59h|!K* zOl0iCwAi36ex#N~_5WLxqqky_Gv38s100O&XBz!{c5r+n+Z!3uW9*}~iT}8M44*^% Ee^=T-RsaA1 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4SensorStatus.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4SensorStatus.class deleted file mode 100644 index f79fb29e25639b415c92814cd0167b39829403fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5710 zcmb_g`*#z^75>(iw3d)0m!x@Fnpb4; z*AnpRnediFWU13tE^#l#VXt8{IpfB*hS~)SWbg>KttI z%PgL-Od5=f+vcpQYe-LB4V^u`cZsN*Vx(B0DcTR(j&*o(;gnULGO0S5?y()ax>rMU zPw%v7Q_Ry1CY`})wI)(MZBv(BE_~T6nB}}v$(HCu+9GQ$lxV!XnH^Pw(f&!-Hj}Om zNcGvCfQ@p+MIsN}_lvS)V2%3XQ4Dy<1Je+vHEM=v=2*kJp0VBl!1$>%R=z5(nYFF? z0v)1_F}}z#|KcIDq%>_VEpqGnp0T@kis;yqgdz6^o$e#+lsn}{+*-P#0ZF}5Td=Ny zMMOZ<6+k~JsCvA$tG)FvuF5J1?-b~VVVs*hUx+;dlmg~-VN|rb>(w~nSm*rXIjCam ze|3JhLZIDW>RD0v_y}HbKLmkjv3gok&EALOpuV^7AU6BqocC<-E1emMpWeac;=SA<^L3Gnm3FB`a^w+WG7d6Z(FOHA6D@KoWgO zC$Se_NaAPsc@o=@Nn(dIJJFxSlhRzqFEn(Ai-G{DwC}6Vv@vWJ4BIJK=LL0!btrsn z@A%{$8x4B|eWjr&l71=8ucY~P61(t}j^8BlTl`MP?~`~N?q*b5~($T&JRV)RscGhLU`cYxH=;c{R!gB0%a@~B>2_wjr~R@~ao z?{dd*12>~S(GuR=rJ7|t3`0ylU=$t8D9#$g(?`h27F*GugHl{`o9m(9Gj%UaJ zi(n7R7kzkq>g4$0le~&dPNj|dD97stDV(^J#Cv#OLpmH@{xO_X=P__!k>LHy1Ml&! zEgJe)a&k2EEz697!0;P3E6g@qA8<9VG%KOgyMwR2G z&MoQVvr>U`4X*_QE2}5n+ucNeVTHSEm3d{=(35?3WwHkzM&=XCI+sDpqLSbhYShW| z+RMbaJ6z9dmC|JrtUPq-ui!cnw*T{F4P9tKCq9F%9QW{NZWDU3L2d*bYjPFfmn_G?XZghV zZ998S?g#gn;icgoGrUPOoavNmP1H^)(CpXpm-B86P|6;@ZDKEfk!#Sdve)o=w!#Eh z&6XDzwz4wIUcN?CH_`NW4w?c>w_uQ8lHLLgVVG~Sd4#QOeihA#vNvRNs_#QI-#{dl zcKc{*+YQ808zMKL*Ks>Z0yJ8LCQBkk+I=)#8e3?#LC*AhcuE$L`8`KzGTOmWlRFY~ zHM=7*PlWTMzUmpi$@-e=L4C3TeImX-`>>xoM4!t<6$!bG@3DnzSm{O97Cu|~h-3Rx zA0YA(TCTE>sy-$!`qf*A&#Xz@#HxRCU9)RTPv;%fU?(;2XHY!Jf4k_er(8bkJ(<4F zIXr_gGCDv69Z^HqBckH7IH+j;o4`WpgrfNz$MRRBxsBriKKoMXe*6EASJpP->0`$7UpvjQ&9x~m}SeRfO9H-?6Ics=?d>u|G9Y_*~ zaF`m3HZ6!5t*wbfoQjO&h*D<?@(G;8muWFUFz7D1DY$WILh=Z_ z_d#Co#}mL3{QyCL9w9swcc;xJ%MD=^UvFGyn&Z`x)A@xfCJbY%^TKB~-I?-SBmqLg ztZ=DvoUqf@s~dZtRYsX_T>Wq+3&LP)t#RvIjK&k98m)4+soI||Mwf)?AH--3LPH*@ Wt0@h+T4;;5(2?Dh3B^OAh`JvJJwW#W diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Tag$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Tag$Builder.class deleted file mode 100644 index f74a2a7fdfaac56ee33a33a2c756953e64ce3fbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4420 zcmbVQTW}Lq82(N!-6kxyP(dwK5v#PR5=ue9Ua&+upY_T5{kx~h(xijwz??mo|N8y^`F7Kv{{7}V z00VeAiZ0wH!f(3`b<|jtGZ4qc{&oWqFqjcSmsy_e60o?lW+|oLRCx zA)+a;K=&8fd>p^4NNP9%FeW{poSGpnU2{h+nKS` z3N3q_oKqfD2=??Iq2N$HO~JNNCuiSMnVztV(o1yZQQ&KSY zSDb9xF4Fjoxtv`b%37t8&4V4I`C=wsw9-~Fl`F*y+@{yKJzcQMPRfdp=*h_TaVyiU ztt1q7^{hxy5(wwZQxeJQWZ6nRaL6jSp%My(txZ`?h_$Pmi6g;k5R8mn9(U0`zo&Qf zxHV(NvsNw>AI?_@9FsFjivqiPhI^ZF;6o@pV`VGiZOSTn-dMl86e6jtZ56$po%Fvl z{M&R6wKi$fLHl;J=i1Jis_)ufctTo3A>LdpgsG)yr}9OrDyF&42js|!lwBx0`5f`i zD4dP*;fdpRs?3v|!nUUB-QDk2JaA$wqiqVeeny*V&evkAH|a-OGH{|_;l8HaC05`j zl5{dTt6V7({W(|PDp;v0J8sPs^YK!_PC1iKDxTC6R-DDsY3;X4_MT>ZCI-C_{Vvj0 z*@~ZKwpo)3(PX|-OxXt9D3hCUfCH<3p{W)I3xG*Lpu#HHA1Vg?VH zIDv;voWv;ukC>RnqXr%`@i?APXkU8IO+1OGOgxQeOk5@gp2c$teN9|P6VKxXg^rr# zYU3+(iy=Q+`&gB+N=~@FDke$1XySV8RTyZ(^CHdg1}$}S?z$^%TB=lENfK)_@vz~I zta!z;sGStgMsfAXGk3AD7wkNGhwyd4$ zSBW28KV}JkeRXlzsXe|d#;1z;hvd`A?Wpxj!Sk$ zB{l~mxUKI?w4Ooa45DwLFUGx9-u@g+eKd#FKj6GMw0%YAb7&8S#ziC~s%z?1L)$!6 zIr6El5!Fy=T;dM8ac@E^=Pxm)mvJFp!EU^Yy?6~typA&7z$v`x=Cj_5S?2?s##PLW zltOJ{v_PeRfi3(GTuWI}yw3Meo$sv1%*%{nudNR|sKb^cU)XgSchsvcW-LcO)#WmN zo0WP8op=`syoddGAGhNJzHmOoBlyUd@oY8YS!TS|pYeX3ald3t+UAcBuS>Quf3Hit zvVP`vfOJWVyZ>o}4pG>S9a{ewLaYwZC7rsOzCYgK>GGH8YTXe}1s7ng_DZ$#^NqV)&S`tuxU zUDp_`P#s!-`2ww>HP{%fPy@97CR+dajMUKL*MtYTBH6k(@z}RmcXS@>NBg|ey@hCu z-S#m$bkoe?f&k=%Jef6%GIC?8G97)Njed)Zj*^o)zjupz8^*{89!qqxbAf-! z6$`kE6~C2njHv*UD(J?$k#eoL3H#g|l0<|zYRI*6Ojk^JVg%s@{!aFIq94jY{{q^o zYwq_4lZ`ePm^7ug$S~Z#j~`bf9vm*oNC$?A!iJ@tbJB-p*o&hbWTqRm@@_tbwZpM_ z1ceekD)-vXQ}$?2D~l)&;zlUf%uU+NF!kiRwg{mI8ruUo!QRJqQ=@Z zz2EQmHtmmjp7xhi+mMv!Y5Q~kqyEzN{bpu&hXtc34|C3$bH4X`zwdmP!GHhv@BaXB z3V%%C5b{YJhM7bXtFl~^$GR*n4L4hHD+vt+4Mh!h5^ZqgQIf|O<)oX02fqzvY{>Gq zEbp}8F5cAer6jsxw&Ke&zNO(SNgTx68oruDpNwDA@O2H}(C|%#RMxglcdB4`p6MxQ zlVz)rH(iB&p6OafVaaqo%dxLzrxny?h4v}O_I$(kmyAN$Z2sSw1>9fC{E3naQ!me4 znHW?!FzdK$8KY$6*3FEu;X0WG&WgskLX&S5O#%@tIc=6)GiUf_Ug6+;*_N#(%d=Jr z=7eoKzTs0ZDfP_WG&YP(!LZjdH5r1XL}K2|nbwA2XxHbni!<{ipzk1HIhkq0FBh-7 zmT$V0)#hg=rXO>7-Zbb59`0B({lG(^9SXfe!#h;eY@BlPw6Sy6vdve@#TC&dAI} zlbO?t#u^zO8;U#0DHCvf=bKP#%$wmsg#-<(*w)CoLibR1I0i7ca?{NDRMfI+nT0%k ztg?)S1>eZsx?+?f@{Of3MSF&_J0(SR%Z7vuWxICn^G2w5F^G=+^zJSsHLr4@dlzd( zL35yhu8*K{B=pr=buWe zLVizl$DfvF`)$dynLEri+bA%-qYGmihLJQ^_8BYVa%qiD5H#V9*B@Y+n7NZPOF=2n z@GU02%dD&+AE-yp+7;ji%Vr$c;fC7^t><%vC>xUtPT9?w7cI%ru5Fn$CSj-$IxSw% zypox-R;^rSg5~X!$qFiUY&?Y_45#oS&Zh8fd?$r8MpDSg8G*SP#H{jnbnFHqrSlk^qKQKCA8%0@f z^KA6mW0R0QqK{RK8H=jjSf$$WY~INU!iH)4deLxi>4bJoujJTy%U;ucM>q7+`dyE; zv7oP%ec!Qlb{EgnIbq7^d2_?cnd8CSBOhIQhi-V`3-+3_r_atz>z1dlTCV5oR-sTX zTDDy4n7&AaK!DrcT|2k#I=1zunb&Vy{yJ~U^4TfF6V7S~N!@H;a*O0d5YB=P*DM6f zyx|*ERWPa0b&A2>cB9yj1!9cm2SwK#ICtY-#hJo}8kCbYzEJR5Y>%>>7})4L{bg%EwfNS!o17Jy@qr5~PVkKO}|!4nG421(2cmz|5{dRusR!PivqWiZWF z81%8ZRcXW1yY|9u9dN;SnFK*GJ-Mg)K6oM!THBjYrTOit1%;a4*psI5r_k`+W3P|V z$C94pC&G-K zmFP>Dpo9>8o0=Lpp6UBDpP*00(C}X$2f;m>{wtb3K+Ag^n`PXBw%paaiNrs-+Zebd zv?NXcj?j)#{u~c9_k`$GOU_^tQ$(GnWHTE3HI0iIT#V?vLpbrJj`pgfM59aGiQ26)r{> z((wSD>5&hx??XJ(h`L)*?PymWF*kHnZ>0mD#WLBvMl7-B27fO0B>oTGwZ|F& diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Temperature$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Temperature$1.class deleted file mode 100644 index beeca35ed1caeba9bb421927559484fe66a82851..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 271 zcmbV{Ps+kT48>pkSM4X*wJR5{9Yj6BM+Fz+LN5@W~zsC;Q>697+t$EA$bJy zej$(N?G9juzX(x;9wFYA7jI>m7eW}O=ZfpxaysA1xf0Ly#mnTxS0)TnXNxlAE?Y}| zEDsT4!lLw<@qA!!T`(1gkYB~9_k%HCdE+Uezj99ef1w5mgyem~6znpy*`LJLgxL?| dWCTJ(AACns6FRlfR&Al9y{i@L4yhvPz5qkgOJx86 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Temperature$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/empatica/EmpaticaE4Temperature$Builder.class deleted file mode 100644 index dc044914f6411a8bfd56d1edbcfa06ce626e2d84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5362 zcmbtYTXY-M72Q|Tcr0b`o8TBX;KVet93pHJV&Y&DzsSQ$Xk-Ejp=B(M?Fq7^N+a8p zQquD3lajVP0+hBNZCEs`4Xk1(qzhPW7ax4|yN};~x4->rdd{6I%|wz{vXqsqJ2Us5 zv+p_koO{ldzxdzBp8y!buOjHdS9$mv4^M{C1v7#znB^hKbEz;5Rs>C$79y~5 zI)bN=*0IQI8J^CvXpV=kN6>-1jsia&MzwgLwJu)kK~cw2gg&0+k7XSzI-ZVTGrqy! z&*=E3j%RgzOCaRfi6wLCoj>Ol@q=h zWq~)-TDHNPYholX7X;d`A!#a|H67xpiQ)ZXd!th~>qHY9=*Mhv?ekA*vz+MyyXvEi zEN{qL$!wk=1V!amU;HOml2*>Kvl&X06@hD$Q=?B6P7I%fPD_>CwTkc#E=&gc za32qYJj4u~!MFMCJ3KsZ;03&7pci);cp2X{@I8Frzz^_49j_SpF<#Yi*1%8jQ-PMs zGH2jtc+J4;c*DS#8DJZtjPfS69#2-Db_3_|mVvkNj=)eIWy-+M@h;U754L>L1bP|J zPxC$s>#<^nyJlI8z5RuOX&e?9sl$R&ITjeK-0u1bB(SAYsX7&?A=P6SohUsqzJK!Y zzFvXOs_afso-dko>Th?Cou4PQ#wT-E_3HKAlEtWD&bHDix+iE;{36g3?R$J3GkT>6 z8KcXNc65%aC$~p0tmOu3*oEU}+D_5Ht#7E>KG%8$>4Q*ZmK$V=UxlHTR&mQ`Xj(<{N3{7W zT7sb&774LxYqe@<&{gFnpK2?shFn#RRogD1y<%5Qsq&Ik?O4UFAEAv^wa^T^90a?( z0~=`kHM#Q}bmBbj$9vd|_mRMF;ot(E!SC=2eoy}{Vig}sS~j|_D_Vdx`jIt2#N10r ztq5KvfPjvj^dH#0n}n$=Dc-g#-YzTd*?q~}#%lM2$_HNZxnITHZPltJ=6K1cTE$%F z`pogt4KR0^lI3Iijdukj_#?*f2_C_xSi)y`7JtI4_%lAhUvLSZ`Z6po+jehk09qsrBIrvYX1Kni@y72&=G`bvP6c4JM29%{bCtGmnLWQCK@)@ct zAo}HqeM)^7naK`?rFw8C=2_*Q&wmr;|M7u@%OGPl+2Z5lVYqDl*QeiD)*oMot&pFs zauRu%k}VNHlL(?+gwQ3l>##LZo2^hKTcXKlsK?f1ZMH(yY>7_jVv`TVV`~ZzDayI3 zxfRhZCZ1=KEwRO?@3FNX2bBIPS$j*lr44SCXJ=Dvt5% zm6jc>&6ZZh*09e|kF7(s+0tsTHAZZW`#?Ol=r-wkD@N&TaGyAH1zjiBaQk$>o9O2d ziP70Sk9Kv$R?%H5_Zy{5XvmdmEy-}5D$Cp^Wi%zzR+8aTPBLx*@9e)geFd9OP}jNR zQyH@&6`L=qV!oM92E+k0ii6lL4&h-j4M!ZNzhWH0vN$UJx|3uZk--sJc$N{yQ9LY> z&Zu+1W&9-ctJqX7MncE%RWz5ssk{#d6E`{;xJrx>#7-W*(z1_k=Eqzv5vM0-o<kEYD8rK49CNoO;etL2swAdPgUKe*yxU1~8Dy7V#RGyDRNSH?z%mjgOWo+PH z9;l7OtdWFbh~FNOEsx(GBgBA2JW&f#+&Ch)f-)lQc#^&XcpRtX^9kHT&n}wpp)pR8 ROVBr38tLzpKf;R${~zS*y|ckg$1-*Q030 zr{(1pdHIag_-quf;&To7JiZ`@UzEcyHQ>wmih|doID$ewzAo>tEBHnfUHGPgZ$@KoMhNvQ=jv#O=kbu*uu<{KvnaR2I3@OETQPT6Naf+@jn7XZ*L{nzcBjbAr&uA)r zL*b?s&31g|u1ugk(Ywn;dDUb2EGacl>4x@9acxO6=TxpzpzgG8==K?bP@;EUpk*qb zp~qGFoztF7t-Y$#3y(YSrkYjFjA5k;j2D-k;*#m7jG9V&59z_VvKz?sWFqLke38II z@B3yVmsjl}mrlU(uBN~P0cBTIAVP1H91-HPz@fxsZ$NN*>9Urw$);{u*K%0~L`*W3 zW^Fa|;(4{;tu$09Qnf8Hxm#1xsauyBN8Og)^9&#D&N<1|%1~4xu2?03LseWN4TK#7 zjFSgdPOWB7xBNyXK)}%g2X|O4d8SD!mg6DN8nj(@b=1(V_&e_@FPHw$VE1?cbo0xJ z{bY*|;HL8a&4=^$sw^QNxi1z1_P&-ebiec)ugIE^-e6rY)EtYG7c-U&H<71{HdEEv zBcZ&Lvu?sw3b4qfH!@nmDP#)XWXUpFLCVO7E0HIS5^#-fa2r+Ny3+#nr!zUPaztnI zMKhyK=(3))SFHjAayJOL&J31itDt4{Wj&J`VUa$ou@A^JFoo8 z*&6~w5`3STDDC`AUVbhwzlh<(ctXK1WB3(*t>8B?{1!K2IEg1?_#J+);H?<`fIlku zlR#JHn%wf%b3rxP7FmnD2l3{$Zu@FM>ps=ZUY0kr-TmE$x+cd}L*Y$Z?2S@}Rt8Fo z8}Lf{0Lz6_(kYwGXDG!!rN)=d{8~KF;o_ENSa~z9ZLo{7cW2{SZN=0yE1oyv+m`= z89(c#e&7rslVtOrb=;$Xz+?MJP=UTZiP4!%r%~17wmyE3(mW;XgH6u~b}wh+v3^ZX z2exd3n+(oL&pD%vv!XffFTawP|%L!NbtFrzcOo(V4Pgo&qsj*f zdK|6vQz!j2%(qDw$TLDndTZP<+(qwtu#o#FF?Q6r+*et zQ$x~!omdk0OvhWi%Krr1k9^m`@5B7|CI5=rJE-5}J?!0;JBVyM4ZUPY5w3cxq}@XgS1c?WzwUi3@uInUq8Z5&zLLVHWcZFJs( z*hbeP>-82MyoH0?c*q^ZZ=p?Ec1w7ZquY#TaS@&35=S}C)nLtUC8p#G$0V-Onh Y)@Pcskkmq3yoHY3t|*lbi6iU20Y#lg_y7O^ diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2Acceleration$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2Acceleration$Builder.class deleted file mode 100644 index 870cf72c316da3bb7f37ea2880e9d6b96a7892d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6362 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 ZA#Z)ADGNz0w8dNK$nA5w?0?i*GGM-u=5 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2BatteryLevel$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2BatteryLevel$Builder.class deleted file mode 100644 index 4658ea1548da95a60ddae92f167508214789d6c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6746 zcmbtZYjjjs75>g-W^OXvk|&WS&_W3?On@Ot1tF1=2cc*vNKzE2kDHmB$N0 zorm{^@IJghggfv710UqI5ApPeS@akW$3tkqM+|(FpLg=iT_G&S-3C6!&yVxWJ-pdb z9!O<5j`MIA5BIRG69zsJqL)0s+-u-I1D_0GB|gRPpEmFr1D`eUIRSq@dDs>ZeF7%` z+-t||`JDS z`K7#?ray7)_JU(J_0NY()3SM|+Rvev7iyDbN+3 zw=y3jkjam-M^_Byt=P@GtTE{_0V;59*_J!mVq3ZXbP~4&PQuO)N$wiLYX%Nk6IL{3 zr4!M<%s7ES2Q_j9fv#}hnsPVM5DQFLsd1vp7`1ZFj>IXkUKLB(R@Ry6Bp>F_NwqqQ z8+_Hud2L4R?#|Q}_jl*ml1{up{S0*aQyD8y;IRFfa$Vv6*L4JPZ>B-Vy_s_ju6ue8 zEt=tDPbNdarpe0&*GpZzD}3PfxZ2>ls#|T8a4LWGg?ioTVuIJ}zPYoy?c(gBnWl^L zfniQ?fsXQ{htLUT?N}yD>VkrEk(L76kHqY;d@_@!Ou3IxoPqA{;X`&TPb>EeY%Dut zTiRsK`i^WMugi}3Hu5@C{+@;6HIMzc!1#`|2_(wiwsW4_RShN+X)8aTB~~s-8`hW= z8?~d>L^c!6joGo}NHP{3R6i(pi9~h89xG>emAh}}R>xI+o4A#?qBBg-$E-kTFf*Qw z+5Jhrs}_6QEbF=Qn$!zy+u z9yak!e9OSMO?(HB&_z1Cj+^){9yRe8PMKK82G%3WR!&n1b7f^!Gx0dSXJP}|Sl|h| ztz7|CQcRq|P801cGKndHXqh$J#5BH7HPy9T%r$`)Hl~x%O@!|qPjg#Q6k|lrns^T^ zflX!ZUbvG4+GlTd`LGhWX0}pkkkD;hu1}O(#$fOD+jn)hP=u7k`yfUBVT-8gNvD ztlBt@H_TEEDpg*Rs*5LaIB}^`zn@L`hs&g=TRVf_>CV5GtqlC$;OH~U@@{*=H7n840%KRNo z_y-~XPxRnlxDo%x1pY(+Xz^d%i~r#?Ud1$J-7kc|%fg3OgkJt_UFZvuNsX-}ZwUdUYh<=|8wjfDB)OcjHz;+5nrz+e8KLsb%3eH@L zfz^_#Ws%iduDUksNE)IE3q>>P#S%1$rS1`^-Z&M5E6)z9O!T>d>#DiDsT7eR@Zqpof(Ynzat$+tw#|W+Cnh_VReR#V%t&SF7BJRl?v`%RH zE?V!veowT5?No261}%#;YnPB~(?RQgLhB@<^#Gyu;GAf+Nwf}lqZKSc>mkii7p;Td zXazmcdX&(5Of%x5b(1Grd~doZbI_XB^j);xIR{#Xj#i;sYZbyl>qmsvj|r`x5L!RI z3|jBzA6NE?V#QM$7O(>nTF(Y0Zd>7Jd0Su_30Z?s6tQc@E3>PvM$@R;P%b zL?}Xa|6$at@;!+ag;uLs%J@4Rnc9L3-^oRpB~m7!WaD4C{$3}2^3nX6k*4V=Tu{nRa zJ>og!#h>V(o}R~f@d7T07jaSiS>m*ebSkMq8kX1OMbeBRE-gN(YBo1P$FSfMt}I@i z!a&a@R2Sc=IqInxe65o{FG=A!d5O59&939YuIZ-l_YsFh>d~Eg8X)pk&kA^4)IuQO z9HWN+<78ARZ>A@QKp--O3b%Kc*`kzXOGuqv;T8@ci9_51keQp6nLaYY_kEB%c%Qc& z#+M|Dc7kMwTT7lxkwu@hc-YILc#Q*>R diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2BatteryLevel.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2BatteryLevel.class deleted file mode 100644 index 62f702fe811dcc025325317f02068215f7daf9fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6281 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 E18Ir{`2YX_ diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2HeartRate$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2HeartRate$1.class deleted file mode 100644 index 409967dd22371a0c66a8c3a81d0d6cb5f301449f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 252 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 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2HeartRateFiltered$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2HeartRateFiltered$1.class deleted file mode 100644 index d45b433adc3e0c76b65a0681fda9781cd1ca9c33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 276 zcmbV{!A=4}42J(IIIxniFF@kKvlD^%0tBK51JNhw&Nl0k$t;-}csLI}01rj%a`$4J z_D`GkYkIzX{{UFv-oO})3B_l3j7~PK7s6~ORpn*=Djf3%=f0gKO8vCw6BDNE;Cz?b z(7a3j>S}|6@Y2P`My@%!knDj|YENPhSCah;`1nkiyoDff<#j_6q3my1&!Mr~YA-Gm gmj6MQ4OhmS+^24y3c`;oXsVz%tV-0W~RYv-pj zR-s^XVSF~1UySFil$B3r3-M)6(~9`AJx`4Ias3!MR5oZPohjORJ2l|KjVVk-Zx2CS z3g?PTV%r^wqLqB|h_$SZCs_*n8iOAb*gXwdHpU2&utmE#rz6xI9h^ODtyuAlm0gTa z=Sn1oejA0dz(jOXeNRCW``-CQ%5N$Y%&t=cr-M0j2jU179A zvS@Wv-cIK7#83>#oxa!~Tus``#dI#q6j@ccF)@zKpS6=kt~{$S)>zUG4C}NFtlm%i z8w>R??Z43A?&UMx=+1KF0;|IcPc>%1*zIiGl1MLRtzs$9nEh1)S<6;($&Onq`CPoP zY$wwT>0~_NzA%v)V%OtIt6(2!X!Egg$7ugvDXVD3Z@_ODTOpFjmGViOb(enKvr#$T zCH2X~Aoj>GB16o?MSMZtz9_?&One#7n;5`{O?(AkHSslk-NZNWO#?5O_%>cN@REs_ z@rpuwb+t3`9emfs_waoa9}$2ZhziON*o8bs#Khg7nwZ5Ag#(S4P%g^~Bh~xeJdYH%RV&pd1Y1)>hVg6} ziK#;ek4y|G^weZ|g86>VVgnq+%-9)duvy3?w77iO$%u|lj5x*JR>g({n5e4 zH!x#Bi_jQDx3*&otfkT@y}(vlshKXEv@+=w2kC*kYwdHacOiWcZqb!a84{WmcDQxl z@B5<78xIfv!_IS>f~?a&Q|PM>m46>Lf`TSgp|=jGOQ^#3YLGhHDKw{SdwD9ie1TW4 zjr<#{<5}&L!lsnIgt&C^qA<;?lMYS7F3x1EMMfyZ$dHw8X}KQd<;EOYkPhtu@Rr%U zA|cS1&ISU&v@%onf>p|tQAalN(v70uEH{kI>8Q`xxutyWyj*2;IH)?frjhJKIcD`>fb$R!NLIJe1}UxVo`t>KRM(7J}U zx48Kl+Jm7v5ebQEN3CjT#8H(cpK6Dwh8)$fsCHgKSJkdzS5=m@YWEuMd<&hT8V=2g z%Rz|CyReDlFX+xM(Sz5p55K}g_%#yv4T^XjPvf_E0l(wF%UHvknwHIu>n<(8I)88t zlb8pH)Pdl20t5^^$p66p{S;)*_b(5x&`L0GFjf{@4agn!yhn-ckmeA#R}fTGx#H3#Gmj6{){X5i;uah73Qvz zxxIeoCSB%6HFNy=gZ&P3%)D~eI%#&9WCwHznmCX}l_993OLc8g?x;B-w(yU#~Ls zKR!bZ7f3N>CS3KsG*cXE(dxmum}ix9KL1O~-}iyER6r){vL(mI!*JO8z^C6_(VyCY zt&pFsN)maPnk^MTs|un^h0v?QH(_hKK3kz`wp6RnP>-#H_1Oy5vZZ=ps4YGakF6Oz z>{2dO&8dh^G4VXpY^iNNeUGg}IPB`5(Y3dnTj7!I`s{3pZTBjUFNzLZJIU64WNR1M zif_nPR9p5)eYV0iY>oO1_1Jo}K3m~BY)z7_DIbW(7Vndew`!bcL;A$UYv?_-j=N`v zoJ7BbNQ`ImHFUX0Yz=+oa=%&2gmybJ9c3A*Qx%!Jv`pBQ=`71gDW{B6zHi}`1g#XIIoUrzwV`MGqO0U3(tA9 z;24f;q>Ju3kTQN6#&v9|6eDF|^g7xq-z@K=!Njdj2CkDaLOdwL$J-}(H$UNUi8!B< zd0|p`Z&ljiC0`)Ij&bc^GnsRh_wgx#2*=hD^t!ln!X0I&Rk_L{%JO^?O2d4@g_$OZ zRK_Oh<$?M*!Wt!9hUD!r-SXt^lSB+?#8dSU)vY5+E2toH$J6`@;BlPM&rjigK6^Re V&oR!(CHRf@X8z6cTX+sF{|9dT<81%{ diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2HeartRateFiltered.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/pebble/Pebble2HeartRateFiltered.class deleted file mode 100644 index 8e1d0b7e8bdb69c300fc3cfde4af15682b5a2bdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5446 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 uq09Vwd? z5u?%g*&k(`-If=DFTJKWJ3G(L%sw-7fBt^|1>hE*rJ&)aL95$3&g!^h;1ur4*F9;u zpG2=gQYjCT=$D%lNt~84uj8SC9!w`ukn*vP8HU*GVwvH3$qy=az}I=;c%fbAVdyr6 zUElCMVV8V|N3QQJ27c3B7eSsue_339y|DD0A-=FYS6rf<^2}WEMPZoXjPk|n+}RK| zZw9_yrd5s0W5X+j(yJl`%)RL_Vxq~b4G}Wj$YeV`tIhc9f}yA6dg5iHwkCpQzE-6j zT{&HN$56U189o4VUhmD!UbrM~#3y#WK>+T@letmCDrOmSHf{O7}?Klao%h9qQ4(M2cRc zHrdf7r>KZV*>41ncMIMAApz7=_%z2M8Qf!M*`phykKU&d;y09iJK_psZmMk-A2kB^ALYf9?rjWUv zDa*B|ET^W7fZ>PQnqLjAi8mGvC2h2aj8hBSpvl_r&;m%3oj zwy^eII1!cX&i?*V7s>B~?Y8^gN$Hi&^&d?U#j8t_7{>NH-t}|zsr>XfeT7cZcPu_V zAnO5;q>?B}RUylOEEaHLP*z?dk-`wpf#E!97D@RSn_yqj^&7Fzq%mBecS6~8!e7Lt zHvTrc)UJ`%M!q5b8=Ay-{fD<`$84c+8N

    T|+1taU3!F0s6@3&^8iZlzA^)ic;D+ zuH%}zLPlY-l*kB1+ldUR0D!g${b0%_k{Cm_jjR(z@>%==Z8e>YZ6mb>Ln+5JrI<=N z9#=|t;wRx^n>3WGYY)iI4@6t9)> ab>s-s1sgX=N;=0$KBB)t>mE#E3aNh$e3dr< diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneAcceleration$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneAcceleration$1.class deleted file mode 100644 index bc893cef7a10dd1786eafeaf4e152dd22d94d32e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 253 zcmb7PY~l!TS6j9^>8jcfQJ&NYgf+j=JDY1 z!Ms1u7l0)O36cbTLU!`^V0c?vCXA0)?|5YlTMoJ|y_;A1p$VgnGuFq_6??9){*oXg z%zY?S&=(zyi|VFhEFY|H4MP2ZrVGMw=NyN%l_p0*-msO`u26?_#il0A{z2vw5L)t1 WGi_N&>Yyv$K~HWf%A`Z$$kQ+BY(&Zc diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneAcceleration$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneAcceleration$Builder.class deleted file mode 100644 index aba00674f8bcd5fc2bb85e141a08fe02bd57fd4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6303 zcmbVRdvH`&8ULNl?%rg%h45&A0I`J>LINxawKN1#AcR&!L6Ty5__*1Fy>C z)LON)))&4NTHjXdqZV*%$g~w4A2U^F)cpc5{m%KmZ-<}1`q+5@8*ny(Ymk-Zh%~u6G$EhBN{mQzo6HsJ*c20(jgkyU zr5Q`$c8n)*6vqtQA#3lJ={rUAJ<{BjzyiG2!26_szs%e%&2h0`l!j7GxJw!?G~u|Y z-(%q31P3`8e89kc20oa;a(qa}A2#q210OYTLLpkp9I+Ktw}L63d+n5+8MD)z8s}dR z|BmwSm_mGWCYLE~QK)HIy^o69^Jyy1>CNQqn?{ce*oA&;Aj_F~z4?@t-DedtGS-vP z(r~7zU~C)BWYczmo86ep*@f*{t5~$Ta9wY{FqAAJrWeVP;e5_c?vZwD zDrINwf>p}obIsaJmqKUD%rxZ)v3zM*e7T~pWTkH1WsNw_5*&s0>dbbDxph@}(nW>{ z$dFy?cNkdEvby)MHD)EVR&FTSogXE5JfBf43v{-0udZqbA4;(?D?3VVjA5(jZbuRi zDAc90wpDOvuBQVtBw>y|g?D-8Xt#YcdTVcHZe??CE=o(cD9pbEjGk=XDiMn)jdHQG zrDw*TM(G7j#GS4AA^YujElbB$cJ8W-xk{8|U+K8Y&Ryk4Y(Orv!ul$K<4NKLJC!fU zBO@tS`gq?lp0Y>eit~Ehr*P?|*gbIAPL;UwF@+7)UC`!s=ZZ$g*VEtXXl|#!nJRZH zzt3uSl4ledZ&$FY+pudU8`bq?hH_SEv_K9f9Rt>gl^V8_)>t8*ERNWz%wQ&!?9(5- zq@+xrY@1cIH&?Z3*A~}F{~l?pWF;@LTeVGvL|=Zikg|I+5_}s1v2vXR6%$EpmgahC z)|>b^J|SP9l;%?=K8??sXu)a|pTkKLr*OZC2k?0VUo`P0eA&QPOnenzQ>dRBqD(x9 zubcP=9x~A?2HLPjtbCKH!IO1fu!(Qs+a}hEz&dHZgNGH?R14-}Jb0EX4@RL` zEcxNxN*?!)<|M6E#N@!IO&q{Mg=?$Xx*SavI;QS(`KzL^e5z8AduEWT9O5%E`nKP& zW7pPZg++l2+{deY#Ny*!;=Uz6GI~v(+s5GP<mbWWG;t@kc zA{tBchy*65XKZqMh9IYB6k@-W5)6veYUk)WjuiXa*6$&D4zaV2WCz;>SAbu^z^_^E z1Ewp7Yq8OhVRUtEsK=b$q1LvxokP5J0!B?o+xJmBiMmN7PNA)pbFAlZ`=4%S_6W57PjXOMxJ2e>jU*G09i=3#IU~ir^I$RdE$ltJtnnwLT`36(*Bp@(q3_ zw`nG~XeJfjNOs*<-BEef?lU|?`XkO|i&FxsKIBC!Y^AfV{vkwpITKXvIR%I!?6i@fq>Z+8c_NBoXgqE?Osi`W{++)1Vdi zqg4rAo=q36lSJzj(Yl{#J#ZPc`oqzR2he)Z=ctF)&EaUpL(qDJXr1;M@zB~Aik9R} z?_@4olRkY9t+!2smf=UM9Ibs3!bR&xMC->y>nB9(rB+~@wErAl*W2a>(NjpYGVVWw`8s@0;Hq+|waAf) zZg6GhmSrR-S7a7DGBGVPuPh_Umojeg)ab~>wM;`zcL>)8BA5p8G!5Z}}_NeDjQh&lp^*o+XFW|g-5f{{- z9h|PBPAvx$wB)y8rqgBFNyd)8ES9D`06=!{0qkcs)6`I7WRf|5M=$_zdd)55NaiqW}N^ diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneAcceleration.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneAcceleration.class deleted file mode 100644 index 8b02b5a3b64272c4322cbc45fe068091f29c2455..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5928 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 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneCall$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneCall$1.class deleted file mode 100644 index f918287cbd8121328aa5bdfaf8d2c8a190bd86ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 229 zcma)$O$x$54255`+FC_>1Q*4ngLs6Z;6fBU!PpM{VVEg1wTE-z0X&qLZd{v?JOb~1 z7h< zNS7NgTIqe=E71;7@dKng!s29%a+zj_@`Pky3N1}3F84;|9U=V(m8?M+@!Lai6%-osDB~J(;ya|wGLK!A0poC&cLQ*t5lcGF)TqZZk&|xN>Oj3~6 z`e@bqXlWIdVy&;1s?|a*fkJKTqgCq<7RF3`NynG@`4#RtuH!*|p3w1Cem!n4Vvb7ZC=dcIrO|aT&GM2)?x5(?gehDDGP*OHTU@esr^iVgnuk7?Gl(^Jx0J-} zQo%oACdWy0eZ(BIhoRu?5eUU8Xc@a_6%AalpIDaCHcE1ucRwm%*shx zkS}WTg1U^ml(JK7ui3krysj?lnJ$4{-TwWYas--7)R{9~#)_vigb}p0RH~H@Z#opW zMmZhR=6;aQ0y+jLtqV-u+uQaZu;N)V`HnzqX+c^VlbJ<3w2B-pZMVkA(cLB5=F(=V z%$()4LotCJr47(=EySVz#Bj>Yj%P^R$0X1kHRB^z)SSqqqhq61JTa7rNBh+e$|V#F zHG@ub%vxX4U>zH5r`+6wX4Z^O;VYR-Al#oG&%~{s1fOvg`9pLiAH)XUflb_O+>NscMX`I(_!N4>4kwBF^*5z8WPY46g z;yDA)1p!`;234dweAgBgfQOc0Hb4;L( z&E5Q0Ut9u93PHuIhDv~v9H9-Q_jld2Y0Ji?0`)~py`L8SL6f%eTzi+fJyqX$Bd#s} zdi8n8bP^a!Sjj=EuKYdxLtt@p%id|+SSn4(8C{kX+lDCfaY5olKVPyKiLqT~GBHRE z*BI!AH1AxVJ_h|)fWdxvcPNb`x#;Hv{DZ9xhB{BJ=j3u9xiRihA zEGfMbdL6y3p*KO#VB|^o&cc6MT6RzyrZ2#2(D6Ff(=Wre!wtBR-k4*f%^_ZepKZmK zNb6YyB9qX|+FGAN@Ek(t5I&C92=$fQ{gW`%r%B9s9ua{z$QM1Ru@Bk zZ8nrYxuDey_1REALu<~VwqR7hg7PN`ojHkFXHdgXzYPsAv`*rd<-H9kT%82XK7%?& z1Z;%Pi24GAt`PMSG3N~G8KK*VAR`(I5J81#kchcw(7=eGZ-4_)1`fndxI0y{f$EKcl6^Q$l{+kf`8*)T*ec43zPUSUc}q@1FqmTA@DDuiCR%68iZd&L_lm3 zy66)j8PGaAXeyu-K6DbVKo^ZR6M-xAqUq?Sf55tRu~niBm)WRXR?Xb@) zj$N6WB!80goF?q^i=nx&^CuUyDC`TS4?BO7&}qWHuplJ4urHJ#udpvFK;*){NFuz# zzPJF93;SY;m_F>H3c9F9gQ!7=s70rkg_}hkCd6#qA?DzyXuxSP7w5!$Di9Xnl30kp zh{d=pmWWxRQOpy|#0s%o^ol02RkXOmzAYd2Z4~w%ci1~s*n4wf7q|(V?XXi}l*sFVej#>lWYWY0WIznpQ?jmv2x*5Bahezss2U0_GBI0iihqr+bbmOtPfLR+vu zl3;%#!TwBwy*jO6tEFI;w_tjaU~jm*bOamn7R+|dL$J#v*jpsne_U*iV8a;k5UjzO zpA<~6$(jce|8gd3)s*nNID2rQ9^<6;IZmRN|pQ9-QzsDkkw*1rnO;GYsc@j>+y=V8W*)SQpQDu3*u#@W%Y3pA&lZy$$Cj` z-Y#N&7&ER=YOxE^UI-n%S5TRMr~clu{!%+N+tQc<*OBq=9`o+bUZE(HAKl!HS8b#} zs!Z7Nrwf>UfcYuxEd?6}zjZAhwPC72x2Qu3%r`P#JpRa8lsVThx!V+2R_s)F+gC6$ z#bJCHR3j425k=EYBxOVs;LDii&BM}@MV==>JY4y6-|fUm`;Zv#@M09DGxoR{X~d5Z kzlJ;UQThBB-bK#_>W`oi8z}s@(K}sz=>HYZ(p@I>KmWl^-v9sr diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneCall.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneCall.class deleted file mode 100644 index 37a2781d45a1d48a32ba744b6cadbd1a4ebf23fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6931 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 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneCallType.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneCallType.class deleted file mode 100644 index 7c7322c5f19ce221450d44396af5464f9e94b0b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1787 zcmb7EYjYY^7=BJz*k!w>k<>J#iP|+*aw%(V>m^_eQkr53#BPGabo_8aHe@@?!t5^0 zbR7SKpZpz4W*WziPCxsj9N%*wAu;*Tz;NFC{eAi8-#`Bba39Z-Q1GRWudt@#wu+pN zo5+jjYav!;CCvXGHB&$v9?vN zZZa%aIzh_{_&yJserR=h7`lDO>K=A{$J!Qek$c|G%dV3nyV~x~W=+~9w#v3$dc=^d z*UH7xR-s&BP#9U;Ul>vB{HxC_)_k)gQ6V~SBPF<`QD!V0{VdeQ% z(n$2V*K$}l9!^|b2%S&|zB|3De+NABad>-`z z@)XMm!DP#ciXM$@*iweM%rMtW+pXoB-Y8W5Od=(}*UrCvh3hmp-R|^)rt{bpy-S_j zlC0<+L;6|IkKDFXcSD!jQ1Jau#3Q%kQyrNL8xeM$rhDKvtpe@GrsF#SkDUFSfe*$0 z-!@Re7TLY+rW&||s(}@(8h9Tc7??%cz?^t)iDzCs3rMS|F)RqL7yGri&4bVhXgnu~ zQT8b@*={Ek-Yte-eljCE4Rg(OsEg*RDdtSnxt5IBA)SDbQM~NQy=6!DmX-HLis8%l zUdIc~wddx^jS~0d>)_IdUVPRH)uh|vfADY zry0>eAD&%3Sz_*t+UXgLErnOIo4LGs6t64V$FO?V@u{E7t#TXp=pXAQ{RgTWX)!Z^ zAdO8znw*3*JPB!jq?r~22Bzl3st_GV5+*(Z!y-{8LGjTCV6QOo2C?6WV)&Tegp{eI ze+Qq8^dDeCa`lw5{0HK1pa}hmbNU(L7(*>AVOh#)(@0B1yoVTlseb+N(If5$c8@6*&maU@z6$iLRSqfLMEOtP0=L^6R{RmNn9w9!tn>W14OD2qtnX|loco&STcwXqcCJfislrH2p-Sahbmk2Ro z=6tHWzG!c3P?ZiLzq6|9y!xd~7KFjhTK20_Y#azl4OXSLsXCksHdn&*Z(cG6p&?(? W)s%)@Ewn{j=*aHM#Nr`QB;7CZ9YK@; diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneGyroscope$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneGyroscope$Builder.class deleted file mode 100644 index eb60e55e272eda4a98fdbd3f2a7e0504382e6503..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6243 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 An*aa+ diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneInteractionState.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneInteractionState.class deleted file mode 100644 index e524b6a8b132825ef870803a6364294a22618fb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1787 zcmbVN-A@}w5dSUyIQw!X;3fpSByBIWHN^4d1JV{#im^?gaqOrEL{^lC<=B{u?6Y-u zMvAIF^|gOYYot&$YL(~wQB`NxCZ@$N;Vkd$%+AioZ)Wb^{qyJF0PdrfL=?+99^h*Y zH#B^s<0`(D%ZfZHBru~BRm^Gvvr_n70%=Lt639sUy@sNWX_OPFNV=)vA%kY`6l>*; z2E)B-$8TCbKj6OO1y+{_fqNvZ?qSCh))TpId!g{T6S^JG4tXdF42j)ZwO)EuDbv>8 z+TAJFpVk=S8}<5*lxcQptMa%w&oHa3^DcJ|g~gBjj%CxX&B=x~zgMj8R&0j*&n^-} z{D`-DB4Aj~E?me!wA48e4412}Cu+U+zVLVWev2fUvRr?`u$isCZ6CkqoxeSLBYUvIU6?& zY+;+>&WE2%WebUJA}m`?Ng&jzY^OnowHZCP!GnA4(hXShQBGCHg8zZ6bLbzMH& zi7LIq8MXJ*F}f+O(!H7Sz>&YMgpMJ1*6@2f<8Kw#@6t={D!m@#>uFgkfGAZlIq$NGxMTCBUws>pq1o7Y1@yJ~gqw5+LRSLJ1 zPL2Y(jr=f>IpqL|_M!bhWCICU$PG1rA*kfzyg{^)N<>bOJch2AOHsubiuov}m`TN4 zjw@zL`-?6``ZUfB@?_YJSRa#iBi_f9eGK*n(~T3PQXjv@m1Af!nE`f_Dn}hl&|u>d eg)m6s4&^WLxW1Q&`sgLni{5EKPZ5Yv#hgrp?Z!@2MP9!i|9+&aU|XNEtI zd4HZS02_=sILC+~yZU=jdS6-1Fuj!C>0@Qec2&!Vq|MGL>tp52Nw=jhI5LK%4@Lx8 z$e>&ljf}B+Xwh`H;zyXT872qkbl6(5=*W$iqmHr(dEnJU;*c diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneLight$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneLight$Builder.class deleted file mode 100644 index a83063915dc65ae25276d04ced1cde575dde4025..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5055 zcmbVQU344O5&o{E^-9VT{}LSI2Amio%T9!yLPDInjqMl$$`6qV$7$Xx@N$twOFVotjvkbCRQTyIs>K8C_3_>Ssyde9GQK4+Ebp#6n{Ri4V5m5N0h zsdTZtkSd!wvz#qdQYBg@3sR-UV!=us<}uBd3@ZI`fw9Cjs<6>o(OKlvugf@Q_K^c- zNt#Dg2qXjIjWf>HU}uk01jy+H%bAr7_auhWr_3cYl{X6usp(>s2qIVXN=;xaF+CIv z+Q)>pWag_xyuN5w+;b>G#|2{9yk(Z%l~FqRS{ZIvc6;g2t_=09s58Bl&ibj|T9lAv z`~Gi&N z?OV=TCC4rnD6Go@R|fOY+$k&T(9RPABLP!sa8xE!X!$m>FkpB_$-)ys@oTpwFgE9Q zXn9m16Yz-fYl4nt?1h5qRLjKd+fvgknb}1vWiFMAsY=Pp+Vgfcl~FI0Kokh&#H3lV z_5?d^e8M%$51um}Gj#=Ea4>;*rdTa!tr?pOT)S6~w)1T^FoZjJ7~>&n;4Hq&Z{OqL zNdw=<4-E|B76U)Rj}80;PZ@X`Kh^P!fuG}99nTr~1%4^e(O4S{{0h$-cmcmQa4Q3B zMS@X&Lq>SA@)8+1hu<3b9bOc;CD2Vb@Dg683+VyX6I@`BA^iO9r3f9V7Pvjs#n``B z45V>DU|XOwYgLQNcjEz9kG{a>My2McQf&@q2_?CnnYw%5fxUwQy-mrOp|m`0(q+5R zy$OCU)E-}!oz1&fcSPR$wt3si=cx5*GyEbjkQh3#h8crWgpAQ;sXsJNg^4?b7rJ^c zG3?4wGjHc;;GVFf**@2L1?huO6^uJagn1<E^uLYjBTjVUOG*v7;DloB@f8#AYYhDsqmy=ys(M64On!XNX zXfl>FlQ$PALJ^7#vC_kx$)mj1yW;cQ#5@4{REjQf2u$by3jn2+k+bH_YQBc5zIFU@ z@UuJaH%o<)aysENc6PB`Jj35(GWRw#((IzqXW;;Sl2RBDMu?SM**j+e2G-V9d`+c7F-s9d@jA_+~(t|o_9 z(Ux3+9v&P11ELoYyMXvP3@2%Aox8pQLv5|#x=*ow1??Zw;Vb9}M`l?h!m6Fks*y2Q zmA8DVova#hRW(-ax`6J6Q#GZ^TT-=W1=oLwE>_hdv+Qyh?DBT3qw#fe=MD7YP27pM z@HM=R4Bml*ckvkB!!!6j{X35pd?0Dr;JU780aoc3!zdB+WkTvi_%Z>6blgt=f!(`F zn0k%kZA9^QQE|`iOXfB-yB}6Q@Rra0CgyHvR;@9|TRzn$=6cs=j<*6Zcaf6iBl^K| z3FG)9Ch;-u$0u0Ar+6HH!n61@-p5~X0e|%|cd^dgMPhEJpSelJ+%CzSpm6MVnWN0B zWv!cL=ZWl)3}G8d0H3$WSV2bZQTitlp^yXpoSDS=R!PmqlTl-qG6=`Nm^g7SIfx0YMl*cN$rHYT@t6~`Avm#qzZ${T$*+x|?sJTV1gg^w-M$ z1}PKS;mUN@WVlY%Wp0o%nv&_N$#5wr8MlD<4xdk7!lq-?b#D4Z#;i)k=1Z!WZ=#z4 zu^&-!4@ShjI4sg|!~yz2e-LNHA?er6BpXEm2W8kxo2Lvk*?;qm^ diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneLight.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneLight.class deleted file mode 100644 index 3eec3ad2d218bba1d19941179ff980b10a5587b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5103 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 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneMagneticField.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneMagneticField.class deleted file mode 100644 index 8628c2732a5ca5c96d51e5b77112fb041ae5a7bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5915 zcmbVQ*>@Xf75|Mbdn84+v$~0$ri$ZGTXC#rX*P#8UK6KD6Kuz+lNOjrV|x;5B&3mJ zC#006?6gpzP_`Bd7|NC=O`Oym;JFX{2|V%2;lMdOzyt8RGb3p-mg6WoXTD{=``!Dy z%XjZL`ryCs{{g@rEQYWRm&0hsY#2?Llj#*{u7YxrJ2^amMZ9VFa7n6(;xhO-D})A+J9{DWN*8IjVCg>skoNa z64QEIo5^M3qa3BR9t8o*Nb6)oX5j%no6{4Tr6(0^8Y!5vG;ZXL3n{(VG&7cFQ7$1h zpSY;aXz`S0PQ}Z6$Sfi|M)ZVk%m@!)fA7Qs<@iNjmL8V`GCuYwRQRWwp9 z#|k!d40n16PhGgECoJNvpA_J9mNLvB8@05=rIT9LwL)#Sz^%<4!%KGxocbAwMebd@ zbe*oH+%Y@s*3(TDfUEf;!G;P(69IL$0Q%5nRSvo)cW?PkfHco3Sa*-CqCEm6=i+*= z9A{0$$kqvVB$AG^bIy!i*winV&gMZk-X1t0+TE=*bhe|qSSoFGLi}Mw)@7_|Nh$ju zQnG^SDna)=JlKZIk`o4JnHNkg#nj~biYdbh)>8$G;n*V%tIgPP=>(OZfIb_XP3T!W zjj4Ex2`k48Qs%tT&w1D^GOjU99u*&7XIVk;a3bYqj__!vkW1)8hUAk+mL`I333mmK z^}HE5pVbq_q>+gCGCv>HSpp;x_e9W*cm#dukKo7nNd!+|R|HQ=^EQ4O!9MJd;D9s- zrTH0tF3r4xc7MtjzHU-4S%LYWPfJD(GpWytkYBLM_|GE`S^1THG!#53%&QJOk?>1t z-jU{45gbB~ieE?Y8~j$q?;^O4cOy8A4@YnVH&whB!7bcYv7q2lzcx+|Yd@{!SQVLY z+=24Ht8La?R&P7h#!{BaCEL2%Of4<*rM__2@~n$OKoQ+Vox0tG-fbsz5+*YVlCVT+ z(aBsU9p(9n?%Ao$8u@72PV||y&H(Kushv0TZHLZZEsB=1$ORWz($3E%o=JViNa#_a zVHr5b@_vHoaBzO%dSTGu^Hib-uHX4GA3aBgL;vt?G3Qg2GI9IcE*)K*78iORE% z${m0H{n)+e=Bnc}w;Z1<)$zGm14s@;gwPhJH=x2L`vp9QsTNhhE&AS}bcu2QmfNvrW0R}O| znQT7F_6Wysqn1p`L^j8E+(zv!1Y%uwUl-eX8}+xK#x@1)K`^$d&K`uyVzxl#_8kb& zwh`>adfIn0F>R-PyJ<%e|CA%b6)%XNz%d(AoVGqj!18V%h6zSS2RI7Yqk|mPk@9%S zF5R4owne*mmEGe}Hc(Rb8JysbBiwVH{6*Gy>pN_LXY7`|*l*(_F(Q#5Ug?j$hrk_# zud}and-V=h$vo)xA?X(pnONJffW|*^SFLS&$0qw2gZpWf1B|MJ^zk90>mioIHp*rP zNy#STIEiP8^Ax!RQQxl0kMq;`h>QL&j1Gc1K!Bvn7U<9L7UsMf2ZEuiYh+2-}jH~NzE{m6gMK5sd_4J4>!U^kO$+bKRaPf4g7}Di{4ciOnsm1diM}$f^LwL>(P6ZPc;n>08gOjKT=iIVz>ilq0gp*zY z&UpfM;&?avqIK+;^ue(z!g&E7Em^0gY#lk^emK_%=f!2=4BO&ARuPVUG< diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneRelativeLocation$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneRelativeLocation$1.class deleted file mode 100644 index 8f7e52c1e00f7e50e0a211c4d26e21c734a11cbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 265 zcmb7(3EHK~NMuL9JmNDXp}lhjZZpJd~K(yD=eo1m61~ z@6YoEV2*BrBteIe9{oKSUKN%JgZ;%jKCsng@!*X&qTY?K`k@K^r8CyY!sS~oFaDe$ zCCq%tRnTW0jEm}~W0at}RT%XXHkuN8Yv(vDthhN6vWl;)cDdS}u53!ezy1feFc XRaKXUTn#iu8)(UH%cSBVQDp5eeauPM diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneRelativeLocation$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneRelativeLocation$Builder.class deleted file mode 100644 index 25447a473e027f273b1586981ba3dc48e82b0d0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9147 zcmbtaeRNdC6~FgwcHd@sgph=88wtsmly?18bn@RRD zyq!1qcki9w+_`h-oxJ(U3oin|eE59=&VswS`3g7p6hke1H35xqFE?M~cV922W^V#Y z;6Co&&&@Xy@J)Ci0pEfLZFq>s9_H8kSo9HY9<|{yetw&q?{M>Y0w%+EZFqv8`}xh2 z+))W36^m+f%3rRhx>n@?{f z6!+E3qFi^XkF+iCPo>2KoYg%&UUo&A9QSBo(Ma=I$Ftht@e~F;e{wZS6-}+_+A0j@0Xd6Rz{Vqak#8u6MevwkCUN^a!bY5~=$RBlS*p7;1DGtGgw_tnq^FE(`X4`H)y^O=sMk;!Mjl z*R_6T9<(+&8{HTF1j&baSf+b47u{3HU^GrMX_vVwPB8x`Vbsrrn7iL0>E(V#OOU+o z5F+R}0uywj+c<3@oHKIVg>DBTGM4p{nJnRvw%Y__SFhZi^m;i{)8>DSjs%3EyMFDq z9bPg=gNG5$8!=`>P1np7xyagmHo1QC`*<$7zUvgM`ic2eEOPF&cF!Gci-u0O=~N9C zx2L*#++2T_mgl%o;`X}9Zm-cD$YvV*dc9<7dn(yTAtZiKR-)BZvs~`>d5cflaMKd$ ztZApy&AE+3bf1!5ghYF$Kb!PgQ+yg%hEjDFpDYeE!-d?matz?<-v13!mfI8?Ebf^*

    75v(PMJ&+7&0=oehIbIo9>G{BB@X-s z-bE$5&=&_=Y|SFBpOW?2owOKGA?rU{cFHO3oSr7m-H^f`&t72BTj z(w$TvMqBv@!pyokn+v#6BSgpex)M*y zSoA!DG*AjAt)HXb0_q_>@ilkq_)jTCjT zND)KF=R=F;Nhl8)(D4i{lF%qa%Y@0<@hD6h#!g&8c}PGf55kngFp;5g2`v>KSNhm9gK5%$ z0CWA-oh1;3j+rFT?k63;qKyw@PuVH5soE0X$I#sS02USGa&e z8DSOqH3^DOkb{;DtLYD5(cDFg7Bx3F6NCyE73c4(IImKBg{CJXeQJIfMAUNdkf5YM zq)*F-`jO5<1~f0yrx%Fy=>ilM=`-?;`C-FDhOxXzpP3K!V}^$eXkMhB=0}Xq1Af5p zkboA7^jSVOB+_}z0Ea|+O$gfen#T-uNTkmWLHmyLn1L=B>0OjQyP*eWp@I$=aD#JUhO1#U6^r|4zt0>YxZ$|oZ73pn8q$8|>i)5tJ zIpUuRGL0XgEn^`YSMvOOju!B+p`%`U@ z#MYa{)?1^nb!j+TMR{z!YdEUe+7!-KQ3zXqBDVf)DA8UhG#MW(w63tdmC|g`->zPTm?lth5txUkyR>jsdk-ey7H|Wyki`FXndJx804?%_X zFjQOn48EoXDQp_0Fv(YMz?VM4#RVXbu>GOF?g|K7sB&0>PsY-)-FOh<)*(YnBFJ6Y zP{#Ofq30$UJ7(ZDV||4fvrWcy$)>eR#$F-DUM0p}BgS4Ig|S=##_~7h+o8Vp7ho)G zNB)5rd*9Ha85;;?jPFx=Zj!OT8FH>^~?8-)7G$9jJGG+UrR23aUhVEC>g+NRRRQO8xN);%X zA!KYNGr^bPTSy=?Q^>@X%tT*??;0c{uSTZ{nNr_a<$kE}lZYWTOG^3XssbrxPwJ|X zQoh0JKx&A^*$oHUjzPmF`lfTnOGGu$wR=6(Q(9O`1=s=@OLuyQmS-%S5h;Onk#Vpq zQVRD)#>4ZGGWcVp93znmoD-RVYaaW!1amlE7S-?sL^b;81C zl|uMR{vMQ{pyEtk$=d*JXgdMpf9d_mX4gK*}s-Hug8?5ldX6zG%0mlc?^KG(z1`Xdn0-|j@JP+;-d zgT7qI?{*{#H^I$-Ld`8oO$#aE`&x{@;L(N}dfSsu@T!qSpeIIp`11+ByOlIrLgQ^= x8u8O>-sYNHdlVr+fW;-*R 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 P4lrbl_+r)&Gm_{FyRA9u diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneSms$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneSms$Builder.class deleted file mode 100644 index 94859dcb676260c0a0e765ebe8ce9948095e1ec4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8680 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 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneSms.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneSms.class deleted file mode 100644 index 569287344017502bf4a3a918821ecfc9afdcc33a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7810 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 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneSmsUnread$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneSmsUnread$Builder.class deleted file mode 100644 index fa3bb62595be3de7466068bbdb89f255215d9e66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5159 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 Lu@rp;ZzA@8)NTTU diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneStepCount$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneStepCount$1.class deleted file mode 100644 index 9d9e5d661e8803e83e8ad9a4e659cde686e5b0b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244 zcma)%O$x$54256(YpsF>FW|zB2oB;AM8Sn9^aNuY`a_v1Gu6Yn@Bki4OqcFVNFIUr zKFIs?d;!>D5+DdLCPaz7yOfV*&4l^2u!fVCo4vi8c2ntxCd>{dt*tLje&)8YS%8SJ zwk}srXWFI4t44cYK3FwfUj0&*Tf+2Y47+_THui+L1FKq_TwQJzr!8UiH!og*(33B^ W>Pthe0fwRjjAVy0k$6ZHargz!-9b_S diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneStepCount$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneStepCount$Builder.class deleted file mode 100644 index 18daa5334bc469f877509077a30efcaa7d5b7079..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5139 zcmbVQTXb8+72PB0`bx?rekI0n+<;TJk>$jS?ZydlY8u-K7@S8V6PiaU*V46pgCeQY zm19aNp}hK}(0BTv?MF*j%Yu*vc0#&<1zr8<2j6}C_8Wft)%2XXBi$QGUXikrHFIa? zoIU64bLPy*fB)Y*?*bUb@1p3#Biww2n@1z)ff>bi%yX0CxpagYD~gR+;Nc=SOHtT3 z7sX@9=s3@7S)R_ZXr7y|MzIM69YyXPMzy%1wH{vULrKSSlm?IT;DU}79gjz`4PWE& z6FR=G<4GOg5C}Q;c}qY{3mE))!b(~8vXvIlijI{p($b7T%KqG0GtX3^b?qIOy!lFC?S!JXMdyWbA$t;&8cO%w!#F(JBxZVS-j7W3idrGdN7fD2%AILJhQe&PIV<%@9F0wG^yW zu0V={7~brQ;Gvb2m3Qo1mIA#ZaC3N%&7ZSU4y`;Tu)B#Q>mQbB7FgL$mNpTvVX`#U z%s%CF)zlt*0s7+ zgHntFq#T+wi`Ie0cO0K^>=NHXSo@6KHdQ0?}lyR7hEeZ7z|WH&?VFt^o!HFviUY zH*o_O@ic#ZlbdG@Jd5WI^y4!IUck2ud>h{}@LhaQ$BPDjfR}WU-nX&@s@HQ}-V_aGh?Tz;X7rt);`yI1?huOHIHwe5OXWAL)BWp?~4{a1?cqN z=l0ViNM-W30=?Do@$W-*xF`t~=&1v$2o?BrHAtQ9=$=Vi{JzLPE-Du2!$vz#7Y<6X&&Xid(X}~9soVR!pj^2)49C>P+A#j zYr!mK%BUmjd8wl4H%o<)aysTSc5bPVyTETenR{K;G`j(yr)D2Lb14i6BESWV9>oE! zL$aq*MExe3p_)fhgEShWk)S>tzk<*jv^S;XPHLmH0xC5+UcoN`=2#@e zs_nI^p%GV=mwc-2tQvAvHCFAoiq5KCHKoc+QgzcRHouJyR@Fjt>~aw7@(?yq`+IWd z59r3LxCej47w{(}@n<-A4Nu^8yofjG-({@giln8>bzRW{tkJKKVIt;pgw&4U4FU-0 z*hBw;{rgFnZXU(kPQ}|b#XY+(nd_=`Kd5}*C7=5>%-vb5T4s)ye5y6fb+6AHFEzm2 zHAnu#JhM1?_nA5<4Jsgm+&Fp#9wh0fAcYSt-{nby z{DXcK{u7<}7diNEp98%W2YT^&I%)J$#RTqEI}IyKbxyY6=xbGm{>Nviu7Cuk%t58T zm&{~`B2qm#7x%1k&*#TP`6oV*NCjlFE?azjJPenu|N8X975%Ao*b4dCsw9zzDcKSM zY!pFsiV%8)b_=$q>$4TAW=m}J8S1fhs6JbvTDC+tbg{(;;<0rY_bJM`s<{=>Ehe64 zk}a{_r|+?KKW3EvSy_9_xuuP4m1k#5e5+S+d{K1S+DUBfBDRKzt;D))#iV5q)Mrbp zVQZhyP>-z#>$9cRVQZ4un(~2oY|+cn^;S&K+2DKP;&t?#TEo`aK{wGaAsVN%`6@cq z5nDxXx!iY2nb4>!(_WV0I#rRmQ_5&crlTywrJQ8k0^U7%dGfjN>pq< zrHc7BIvMo06okbC*eM>waWM-=9HBo79K{83O!{><$%c`|QCWB{AcA8!E|D&(bHHW% zH1r$TQYl74$G#hAt&FL>?+YdyofJ2SF@o5`%@^Aa(kuLg%Ow)jbLMG8;oVhfhnIbU z&|Kr%K$pp!Qoe_J4ulq8L(sd$-4pIAyH}M`W>G57Cm|%v!wP1aK)5ot@Le9LkHf5y zgkp%l9+Foce|?D%0}}C6Jw(wsB3}g+MB4E*jRH7>v$Fp(c2nO&^L^ANC~`>}qb*E- K$ooE?L*)M*1CS*E diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneStepCount.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneStepCount.class deleted file mode 100644 index 2b9d857df7af281b51259e619e9aa35513ea8c4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5186 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 B^wR(U diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUsageEvent$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUsageEvent$1.class deleted file mode 100644 index 7d1653160f0bf8532f46c169f6535ed331573bbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 247 zcma)%OA5k35Jao}O^kwBcmNl!L>$B;h=L1I5DzdWO^k#YnTa`^3lHF-#Lm{0-BcF^ z#e;r-o-Y6^3>1_?pAeti!>7D0N+yhtS7-SgOwOB{ZMC?W+7Lz?o0cvVHs5n~b(um; zm^+_qZ!+Uk8}!|TP}HpN4M6{3rc1(bXD$16DLoE^q#^6l*jyhjH%=?U?0;Y~0ih+2 XG}D%aqz<~`9rWZzqF6d4jwJd5y$C`} diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUsageEvent$Builder.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUsageEvent$Builder.class deleted file mode 100644 index a6461b1fd553bedfaa2a99d91700662a1a80938b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7328 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 M`c?6}_$JE#57~TI*8l(j diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUsageEvent.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUsageEvent.class deleted file mode 100644 index 87234a8f605650d985efd9b2b5bd7d83a8bc6482..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6900 zcmbVR>30*?6~AN49!ZvMLV(zYgh80ZmK`Zj0>LJ<-Vp(d+Qx)XnvSKhJw%>SMGuM~(we3i19`bvREh$L{UtS@Qw)K&6%|93 z^OK5ERCVoKdQc$Ylt7IGx>hu0&773;C8h3PFTAtzpPQe&ft}+6Cx_1TwF}g8S~q4= zazW0{Dk*v1&{N~+&B?t2g-mr$0V6Pr4k`sh$;zgZ6R35pr18?ET2!a^9t{xql02h~$}D2LZ`ZhKsM-wgU~x0Lv0&5e z^bdy>GdnwB!SnAO)Jp(_y%A+z(aed30+@GM8X9s=HnLhVRexCq2eGm2@s&Ni?>Z5^F! zM3jv`pyvR-`LwDjqouhi#h8$xn?Uu)RZTTd2vpnAImxEevv9l&_hZ?i37NAhoYB3W z=4V;|vibn{T8GaKjw#ojaa`r2Sv%wM;V9dj4_K=RY~`A%7JY$scBDIff-+N=m8=QS z_0y`7&%s?n8u31EBCO8H1;-Axg%Y;z>PWBM$x`a)`B-4DKZZQcBIMd3wgZmxg|!=G zV$mhoS;2BFpw1EiFFLHs@!#z1EzfXxob?}y)l$7<(S)6==vE1L$XGZF9awdQSm^4R zmH>_KT(tyRy^3IGvPdahDIrrjVgR^gYvSYn4Ek`Jy=3Z7Tswr2z%y(pc;ejY` zclIH0F0U)L+CKZlR?)QDCIo_R&T^hUyq>Dnw@+;aYw!PwvGEG0wV|s>ZJL}%nsVCD zLo^(t_h>OjPtm~`J2xX3p>=2jhH=B6vAoaCpSbyRjGm2S7OsMN|a53jRs=d?lUBI$7Y$3WPa53lb}NNYlC@W%GIw)q;esUQjgd%9 z3P})KH$ySrbMd+>nQIU%IJk0FBKNrFlzBC)NKAv8X|4dbN#`a8q>f@|GJd0b6%#jY zZ^R6$bHQV5%+*&9c}zVE7Ok2H^IV`=(VcXrdg6A-0H9+Whmpj_mh@=}iAT!IB@ICJH*-COznt}eBG__y>Ddgn^sc7nk(k-zN zNu8GDGPzomP)kaAwTNTMPAzF%)kvl;O)1he7kx^OU7J&;j}K?YhDOFR=SBxH-`_XzoHrQAj1H$qFgt!SGd3}BZUWu( zDC*q4fr)fx6r<71=urHU7ez1t-&mGv7B*?h&`UG3CWnxvK72TXDb4cJ6bhH}NK;ha zyvk9wfE$-?#OMKigxWNiN4(rT?j&hnsm)nxWz&1?id&$><`W~{5;nwxGmkXZFBfs+ zJh4e?2eX^c0xutdMA&{%pogvN0XJ$ota{7w8yQcwo=vDaxQH}PVd(FAK1`A2rtwKQ7&b*EZ((ncl8A861U>9M?g1Pl3z5Dl4b~ ztE`|ftg?b?vC0Zc$cig%T!aBh8`oWUworuns2|7%FxrDBe?qrOxP_-cgJ>B&(KfWG zUC}aS3QwM`ODt2(hv?M!NcYnSW@0u0ouo8Iy!jMb-uwa8l89$FZ%%aGquM13CAzI= zUE;|ls!z0rmPkyr)-6#u(OSPmk+O_9g|RnDA%Nf_dIwC}3S;kusSm)+T`)4sKWWQw zam$aR*%hEXZ6^Otp0PJiINzx;;xDOdLQ-a9rE-(O=qx! z^9NZX&l$;kPI>w`BczcnO zPFGx{{T2=UzDO|Sj&|i_aF^;iZ}?4f&4;DVGtKAeMQ8H~P_t?36I}>}AdpuOS+Dwl)O&WRhh2_Z zcKJd@AYu^6>lJ~>m4S#sAa4T5TN?nG@*L#1NH_@O?TSFMo_AJRBpd|tE`YpO6^I=v zIfQ>OPjjvaxaMX>Ak#Ec$u+(VY=`VU09mdIu(M{NH`xqx2HxLCpf^s&Uv6~gHGR}r)9*7wlNX^)NI+i%8Us66n3ooVnwn}(`Pesm?3-zxuB>7ormNlseaf+SVuf~JSf)MOAH7G9-63Ix z_Flm4zD&{`+POme>_PkvwXkH{Ax+laW@@f^miE*PVYFZ=ea$Oou4BwMRvXqH$CI{& T@h{YVWa0?^U-}vSf+GI|=1#8k diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUserInteraction$1.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/PhoneUserInteraction$1.class deleted file mode 100644 index 18b65aaeb693137521f35ef259db26c21a87c54f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262 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 JU&2=q|1X<`gDwC7 diff --git a/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/UsageEventType.class b/java-sdk/radar-schemas-commons/out/production/classes/org/radarcns/passive/phone/UsageEventType.class deleted file mode 100644 index 4f5cba8ff08a10c309b0d2287c18f6aac13a4a18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1864 zcmb7EZBrUo6n?I}?6Pi+C2E7wB;C>$)Iv2$U&I&*L8T#(vcL?J>4z0>a5JzlyNfev zr+=V-qTli2~5d@LZu!RQ- z;tIAk#PCooJK`p*Vo@V0!6Ow*;xMOTS;)sKZV8!Jaa+h;6?cT(Q&7+_kD`jFLY5Si z8MNJUCBIiG*Gi8WR*PM?m3FN|%WXPdx@UQweazFnqpri#HP34C{4sa@>Z=~lkm;jr z?#Y>HI9D$17WNoabH7}v=4w@j=|ZWRuVi!8Lb=2cER{=n2F1+n=bvWd3^!ynt7kQj zc-lI4yJ?el9gAEm@p`sc%bN^q&##nI_}FUqxyO)7B(G)}%ykbr!?mLA@KV2Xz}>2K z(54ebx-7q7c$g@@w2rNG+j3fI(|2vBl}TPHy=bx9wAyvcwT16dfS_Y_C{FaEbB6Gi z?b!Y{!@?!83&}c_)jzW7y%E!HIhNmd$x|R9E@oQX&$X$A!>TeYCWgsgT5)x&*&c;@ zFp)^!>36oS@WgE~7iPEbHub_H*k#(G|Z~1oDp_e2s zjD^?ZP5Xu2OlN6G_PE1c%jbs~9Ulp9#C1Hww+zYuJ-a%RsOU%`t>Z%&Iu>zL$C6l< z#d1q5x5aV?HxlS}zxgK|^O=lau;81$9?A#L}HW+^X!SIPO#-_okn#P(T z`c3G3Wk%;7(Lr2Nz|xiO|MosS7gU`R;XoDq_?6NDrr z2x)xxqmC+SG%w@X7F}luHQU5{hB=y>@m=}gC2#uF=KGTqDPNqKP Date: Wed, 13 Sep 2017 17:02:21 +0200 Subject: [PATCH 061/112] Allow multiple validation exceptions per schema --- .../schema/validation/AvroValidator.java | 67 ++------ .../schema/validation/SchemaValidator.java | 13 +- ...idResult.java => ValidationException.java} | 31 ++-- .../schema/validation/ValidationResult.java | 47 ------ .../schema/validation/ValidationSupport.java | 43 +---- .../schema/validation/roles/TopicRoles.java | 11 +- .../schema/validation/roles/Validator.java | 21 ++- .../schema/validation/ActiveValidation.java | 6 +- .../schema/validation/AvroValidatorTest.java | 74 +++++++++ .../schema/validation/MonitorValidation.java | 2 +- .../schema/validation/PassiveValidation.java | 12 +- .../validation/SchemaValidatorTest.java | 7 +- .../roles/SchemaValidationRolesTest.java | 157 ++++++++---------- 13 files changed, 204 insertions(+), 287 deletions(-) rename java-sdk/radar-schemas-validator/src/{test => main}/java/org/radarcns/schema/validation/AvroValidator.java (62%) rename java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/{InvalidResult.java => ValidationException.java} (58%) delete mode 100644 java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationResult.java create mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/AvroValidatorTest.java diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/AvroValidator.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/AvroValidator.java similarity index 62% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/AvroValidator.java rename to java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/AvroValidator.java index 086f01b6..3e33eda3 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/AvroValidator.java +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/AvroValidator.java @@ -1,5 +1,3 @@ -package org.radarcns.schema.validation; - /* * Copyright 2017 King's College London and The Hyve * @@ -16,53 +14,29 @@ * limitations under the License. */ +package org.radarcns.schema.validation; + import org.apache.avro.Schema; import org.apache.avro.Schema.Parser; -import org.junit.Before; -import org.junit.Test; import org.radarcns.schema.Scope; import org.radarcns.schema.validation.config.ExcludeConfig; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Collection; +import java.util.List; import java.util.stream.Collectors; +import java.util.stream.Stream; -import static org.junit.Assert.fail; import static org.radarcns.schema.validation.SchemaRepository.COMMONS_PATH; public final class AvroValidator { public static final String AVRO_EXTENSION = "avsc"; private ExcludeConfig config; - @Before - public void setUp() { - config = ExcludeConfig.load(); - } - - @Test - public void active() throws IOException { - analyseFiles(Scope.ACTIVE); - } - - @Test - public void monitor() throws IOException { - analyseFiles(Scope.MONITOR); - } - - @Test - public void passive() throws IOException { - analyseFiles(Scope.PASSIVE); - } - - @Test - public void kafka() throws IOException { - analyseFiles(Scope.KAFKA); - } - - @Test - public void catalogue() throws IOException { - analyseFiles(Scope.CATALOGUE); + public AvroValidator(ExcludeConfig config) { + this.config = config; } /** @@ -70,17 +44,17 @@ public void catalogue() throws IOException { * @param scope TODO. * @throws IOException TODO. */ - public void analyseFiles(Scope scope) + public Collection analyseFiles(Scope scope) throws IOException { Parser parser = new Parser(); - String errors = Files.walk(scope.getPath(COMMONS_PATH)) + return Files.walk(scope.getPath(COMMONS_PATH)) .filter(Files::isRegularFile) .filter(p -> !config.skipFile(p)) - .map(p -> { + .flatMap(p -> { if (!isAvscFile(p)) { - return new InvalidResult(scope.getLower() + " should contain only " - + AVRO_EXTENSION + " files. " + p.toAbsolutePath() - + " is invalid."); + return Stream.of(new ValidationException( + p.toAbsolutePath() + " is invalid. " + scope.getLower() + + " should contain only " + AVRO_EXTENSION + " files.")); } try { @@ -89,21 +63,16 @@ public void analyseFiles(Scope scope) if (config.contains(schema)) { return SchemaValidator.validate(schema, p, scope, config.isNameRecordEnable(schema), - config.skippedNameFieldCheck(schema)); + config.skippedNameFieldCheck(schema)).stream(); } else { - return SchemaValidator.validate(schema, p, scope); + return SchemaValidator.validate(schema, p, scope).stream(); } } catch (IOException e) { - return new InvalidResult("Cannot parse file: " + e); + return Stream.of(new ValidationException( + "Cannot parse file " + p.toAbsolutePath(), e)); } }) - .filter(r -> !r.isValid()) - .map(r -> "\nValidation FAILED:\n" + r.getReason().orElse("") + "\n") - .collect(Collectors.joining()); - - if (!errors.isEmpty()) { - fail(errors); - } + .collect(Collectors.toList()); } /** diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SchemaValidator.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SchemaValidator.java index 1d319275..55123785 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SchemaValidator.java +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SchemaValidator.java @@ -24,8 +24,7 @@ import org.slf4j.LoggerFactory; import java.nio.file.Path; -import java.util.HashMap; -import java.util.Map; +import java.util.Collection; import java.util.Objects; import java.util.Set; @@ -39,26 +38,22 @@ final class SchemaValidator { private static final Logger LOGGER = LoggerFactory.getLogger(SchemaValidator.class); - private static final Map CACHE = new HashMap<>(); - private SchemaValidator() { //Static class } - public static ValidationResult validate(Schema schema, Path pathToSchema, Scope root) { + public static Collection validate(Schema schema, Path pathToSchema, Scope root) { return validate(schema, pathToSchema, root, false, null); } - public static ValidationResult validate(Schema schema, Path pathToSchema, Scope root, + public static Collection validate(Schema schema, Path pathToSchema, Scope root, boolean skipRecordName, Set skipFieldName) { Objects.requireNonNull(schema); Objects.requireNonNull(pathToSchema); Objects.requireNonNull(root); - CACHE.put(schema.getFullName(), schema); - - ValidationResult result; + Collection result; if (schema.getType().equals(Type.ENUM)) { result = getGeneralEnumValidator(pathToSchema, root, diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/InvalidResult.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationException.java similarity index 58% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/InvalidResult.java rename to java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationException.java index 6c71e616..2871cc34 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/InvalidResult.java +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationException.java @@ -17,41 +17,34 @@ */ import java.util.Objects; -import java.util.Optional; /** * TODO. */ -public class InvalidResult implements ValidationResult { - - private final String reason; - - public InvalidResult(String reason) { - this.reason = reason; - } - - public boolean isValid() { - return false; +public class ValidationException extends RuntimeException { + public ValidationException(String message) { + super(message); } - public Optional getReason() { - return Optional.of(reason); + public ValidationException(String message, Throwable exception) { + super(message, exception); } @Override - public boolean equals(Object o) { - if (this == o) { + public boolean equals(Object obj) { + if (obj == this) { return true; } - if (o == null || getClass() != o.getClass()) { + if (obj == null || getClass() != obj.getClass()) { return false; } - InvalidResult invalid = (InvalidResult) o; - return Objects.equals(reason, invalid.reason); + ValidationException ex = (ValidationException) obj; + return Objects.equals(getMessage(), ex.getMessage()) + && Objects.equals(getCause(), ex.getCause()); } @Override public int hashCode() { - return Objects.hash(reason); + return Objects.hash(getMessage(), getCause()); } } diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationResult.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationResult.java deleted file mode 100644 index 18fbbe14..00000000 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationResult.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.radarcns.schema.validation; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.util.Optional; - -/** - * TODO. - */ -public interface ValidationResult { - - ValidationResult VALID = new ValidationResult() { - public boolean isValid() { - return true; - } - - public Optional getReason() { - return Optional.empty(); - } - }; - - static ValidationResult valid() { - return VALID; - } - - static ValidationResult invalid(String reason) { - return new InvalidResult(reason); - } - - boolean isValid(); - - Optional getReason(); -} diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationSupport.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationSupport.java index d995b320..966a172f 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationSupport.java +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationSupport.java @@ -255,7 +255,7 @@ public static boolean validateDefault(Schema input) { } for (Field field : input.getFields()) { - boolean flag = true; + boolean flag; switch (field.schema().getType()) { case RECORD: flag = validateDefault(field.schema()); @@ -280,47 +280,6 @@ public static boolean validateDefault(Schema input) { return true; } - /** - * TODO. - * @param defaultVal TODO - * @param type TODO - * @return TODO - */ - //TODO analyse schemas and redesign - /*private static boolean basicValidateDefault(Object defaultVal, Type type) { - switch (type) { - case INT: - return defaultVal.equals(Integer.MIN_VALUE) || defaultVal.equals(Integer.MAX_VALUE); - case LONG: - return defaultVal.equals(Long.MIN_VALUE) || defaultVal.equals(Long.MAX_VALUE); - case DOUBLE: - return defaultVal.equals("NaN"); - case FLOAT: - return defaultVal.equals("NaN"); - case BOOLEAN: - return defaultVal instanceof Boolean; - case BYTES: - //TODO check if there is better way - return defaultVal instanceof String; - default: - return defaultVal.equals(JsonProperties.NULL_VALUE); - } - }*/ - - /** - * TODO. - * @param path TODO - * @return TODO - */ - public static String getMessage(Path path, ValidationResult result) { - if (result.isValid()) { - return ""; - } - - return result.getReason().orElse("INVALID") - + ' ' + path.toAbsolutePath() + " is invalid."; - } - /** * TODO. * @param file TODO. diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/TopicRoles.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/TopicRoles.java index d2ab5ccb..ea54acaf 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/TopicRoles.java +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/TopicRoles.java @@ -18,15 +18,13 @@ import org.radarcns.schema.specification.source.Topic; import org.radarcns.schema.specification.util.Utils; -import org.radarcns.schema.validation.InvalidResult; +import org.radarcns.schema.validation.ValidationException; import org.radarcns.schema.validation.ValidationSupport; import java.util.Collection; -import java.util.List; import java.util.Objects; import java.util.stream.Collectors; -import static org.radarcns.schema.validation.ValidationResult.VALID; import static org.radarcns.schema.validation.ValidationSupport.isValidClass; import static org.radarcns.schema.validation.ValidationSupport.isValidTopic; import static org.radarcns.schema.validation.roles.Validator.validate; @@ -80,12 +78,9 @@ static Validator validateTopic() { } static Validator> validateTopics() { - return topics -> { - List invalidTopics = topics.stream() + return topics -> topics.stream() .filter(topic -> !isValidTopic(topic)) + .map(topic -> new ValidationException(TOPIC + ValidationSupport.isValidTopicVerbose(topic))) .collect(Collectors.toList()); - return invalidTopics.isEmpty() ? VALID - : new InvalidResult(TOPIC + ValidationSupport.isValidTopicsVerbose(topics)); - }; } } diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/Validator.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/Validator.java index fa539806..a27e810b 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/Validator.java +++ b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/Validator.java @@ -17,10 +17,12 @@ package org.radarcns.schema.validation.roles; -import org.radarcns.schema.validation.InvalidResult; -import org.radarcns.schema.validation.ValidationResult; +import org.radarcns.schema.validation.ValidationException; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; +import java.util.List; import java.util.function.Function; import java.util.function.Predicate; import java.util.regex.Pattern; @@ -28,7 +30,7 @@ /** * TODO. */ -public interface Validator extends Function { +public interface Validator extends Function> { /** * TODO. * @param predicate TODO @@ -36,8 +38,8 @@ public interface Validator extends Function { * @return TODO */ static Validator validate(Predicate predicate, String message) { - return object -> predicate.test(object) ? ValidationResult.VALID - : new InvalidResult(message); + return object -> predicate.test(object) ? Collections.emptySet() + : Collections.singleton(new ValidationException(message)); } /** @@ -48,8 +50,8 @@ static Validator validate(Predicate predicate, String message) { */ static Validator validate(Predicate predicate, Function message) { return object -> predicate.test(object) - ? ValidationResult.VALID - : new InvalidResult(message.apply(object)); + ? Collections.emptySet() + : Collections.singleton(new ValidationException(message.apply(object))); } /** @@ -158,8 +160,9 @@ static Validator validateOrNull(Function property, Predicate */ default Validator and(Validator other) { return object -> { - final ValidationResult result = this.apply(object); - return result.isValid() ? other.apply(object) : result; + List exceptionList = new ArrayList<>(this.apply(object)); + exceptionList.addAll(other.apply(object)); + return exceptionList; }; } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/ActiveValidation.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/ActiveValidation.java index 55cfca3e..262ab197 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/ActiveValidation.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/ActiveValidation.java @@ -40,15 +40,15 @@ public void validate() throws IOException { QuestionnaireSource.class); ValidationResult result = Validator.validateQuestionnaire(source, file); - assertTrue(getMessage(file, result), result.isValid()); + assertTrue(getMessage(file, result), result.isEmpty()); for (Question question : source.getQuestions()) { result = Validator.validateQuestion(question); - assertTrue(getMessage(file, result), result.isValid()); + assertTrue(getMessage(file, result), result.isEmpty()); for (Response response : question.getResponses()) { result = Validator.validateResponse(response); - assertTrue(getMessage(file, result), result.isValid()); + assertTrue(getMessage(file, result), result.isEmpty()); } } }*/ diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/AvroValidatorTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/AvroValidatorTest.java new file mode 100644 index 00000000..6ff8e496 --- /dev/null +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/AvroValidatorTest.java @@ -0,0 +1,74 @@ +package org.radarcns.schema.validation; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import org.junit.Before; +import org.junit.Test; +import org.radarcns.schema.Scope; +import org.radarcns.schema.validation.config.ExcludeConfig; + +import java.io.IOException; +import java.util.Collection; +import java.util.stream.Collectors; + +import static org.junit.Assert.fail; + +public class AvroValidatorTest { + private AvroValidator validator; + + @Before + public void setUp() { + ExcludeConfig config = ExcludeConfig.load(); + validator = new AvroValidator(config); + } + + @Test + public void active() throws IOException { + testScope(Scope.ACTIVE); + } + + @Test + public void monitor() throws IOException { + testScope(Scope.MONITOR); + } + + @Test + public void passive() throws IOException { + testScope(Scope.PASSIVE); + } + + @Test + public void kafka() throws IOException { + testScope(Scope.KAFKA); + } + + @Test + public void catalogue() throws IOException { + testScope(Scope.CATALOGUE); + } + + private void testScope(Scope scope) throws IOException { + Collection results = validator.analyseFiles(scope); + if (!results.isEmpty()) { + String resultString = results.stream() + .map(r -> "\nValidation FAILED:\n" + r.getMessage() + "\n") + .collect(Collectors.joining()); + + fail(resultString); + } + } +} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/MonitorValidation.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/MonitorValidation.java index 61c859a0..85114b75 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/MonitorValidation.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/MonitorValidation.java @@ -39,7 +39,7 @@ public void validate() throws IOException { MonitorSource source = new YamlConfigLoader().load(file, MonitorSource.class); ValidationResult result = Validator.validateMonitor(source, file); - assertTrue(getMessage(file, result), result.isValid()); + assertTrue(getMessage(file, result), result.isEmpty()); }*/ } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/PassiveValidation.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/PassiveValidation.java index 29115211..41fd4e3d 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/PassiveValidation.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/PassiveValidation.java @@ -1,5 +1,3 @@ -package org.radarcns.schema.validation; - /* * Copyright 2017 King's College London and The Hyve * @@ -16,6 +14,8 @@ * limitations under the License. */ +package org.radarcns.schema.validation; + import org.junit.BeforeClass; import org.junit.Test; import org.radarcns.schema.specification.source.passive.PassiveSource; @@ -59,18 +59,18 @@ public void validate() throws IOException { PassiveSource source = new YamlConfigLoader().load(file, PassiveSource.class); - ValidationResult result = Validator.validatePassive(source, file); - assertTrue(getMessage(file, result), result.isValid()); + Collection result =Validator.validatePassive(source, file); + assertTrue(getMessage(file, result), result.isEmpty()); for (Sensor sensor : source.getSensors()) { result = Validator.validateSensor(converter.get(type), sensor); - assertTrue(getMessage(file, result), result.isValid()); + assertTrue(getMessage(file, result), result.isEmpty()); } for (Processor processor : source.getProcessors()) { result = Validator.validateProcessor(converter.get(type), processor); - assertTrue(getMessage(file, result), result.isValid()); + assertTrue(getMessage(file, result), result.isEmpty()); } }*/ diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java index a158a749..536987c9 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java @@ -22,6 +22,7 @@ import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Collection; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -58,9 +59,9 @@ public void testEnumerator() { .doc(documentation) .symbols("CONNECTED", "DISCONNECTED", "UNKNOWN"); - ValidationResult result = validate(schema, schemaPath, MONITOR); + Collection result =validate(schema, schemaPath, MONITOR); - assertTrue(result.isValid()); + assertTrue(result.isEmpty()); schema = SchemaBuilder .enumeration(name) @@ -69,7 +70,7 @@ public void testEnumerator() { result = validate(schema, schemaPath, MONITOR); - assertFalse(result.isValid()); + assertFalse(result.isEmpty()); } } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/roles/SchemaValidationRolesTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/roles/SchemaValidationRolesTest.java index 679c9194..72dd14d0 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/roles/SchemaValidationRolesTest.java +++ b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/roles/SchemaValidationRolesTest.java @@ -20,11 +20,12 @@ import org.apache.avro.Schema.Parser; import org.apache.avro.SchemaBuilder; import org.junit.Test; -import org.radarcns.schema.validation.ValidationResult; +import org.radarcns.schema.validation.ValidationException; import org.radarcns.schema.validation.ValidationSupport; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Collection; import java.util.Collections; import java.util.Optional; @@ -132,9 +133,9 @@ public void nameSpaceTest() { assertNotNull(root); Path path = root.resolve("questionnaire/questionnaire.avsc"); - ValidationResult result = validateNameSpace(path, ACTIVE).apply(schema); + Collection result =validateNameSpace(path, ACTIVE).apply(schema); - assertTrue(result.isValid()); + assertTrue(result.isEmpty()); } @Test @@ -148,15 +149,10 @@ public void nameSpaceInvalidDashTest() { Path root = MONITOR.getPath(COMMONS_PATH); assertNotNull(root); Path path = root.resolve("test/record_name.avsc"); - ValidationResult result = validateNameSpace(path, MONITOR).apply(schema); + Collection result =validateNameSpace(path, MONITOR).apply(schema); - assertFalse(result.isValid()); + assertFalse(result.isEmpty()); - assertEquals(Optional.of("Namespace cannot be null and must fully lowercase dot " - + "separated without numeric. In this case the expected value is " - + "\"org.radarcns.monitor.test\". org.radar-cns.monitors.test." - + RECORD_NAME_MOCK + INVALID_TEXT), - result.getReason()); } @Test @@ -170,15 +166,9 @@ public void nameSpaceInvalidPlural() { Path root = MONITOR.getPath(COMMONS_PATH); assertNotNull(root); Path path = root.resolve("test/record_name.avsc"); - ValidationResult result = validateNameSpace(path, MONITOR).apply(schema); + Collection result =validateNameSpace(path, MONITOR).apply(schema); - assertFalse(result.isValid()); - - assertEquals(Optional.of("Namespace cannot be null and must fully lowercase dot " - + "separated without numeric. In this case the expected value is " - + "\"org.radarcns.monitor.test\". org.radarcns.monitors.test." - + RECORD_NAME_MOCK + INVALID_TEXT), - result.getReason()); + assertFalse(result.isEmpty()); } @Test @@ -193,32 +183,23 @@ public void nameSpaceInvalidLastPartPlural() { Path root = MONITOR.getPath(COMMONS_PATH); assertNotNull(root); Path path = root.resolve("test/record_name.avsc"); - ValidationResult result = validateNameSpace(path, MONITOR).apply(schema); - - assertFalse(result.isValid()); + Collection result =validateNameSpace(path, MONITOR).apply(schema); - assertEquals(Optional.of("Namespace cannot be null and must fully lowercase dot " - + "separated without numeric. In this case the expected value is " - + "\"org.radarcns.monitor.test\". org.radarcns.monitor.tests." - + RECORD_NAME_MOCK + INVALID_TEXT), - result.getReason()); + assertFalse(result.isEmpty()); } @Test public void recordNameTest() { - Schema schema; - ValidationResult result; - - schema = SchemaBuilder + Schema schema = SchemaBuilder .builder("org.radarcns.active.testactive") .record("Schema") .fields() .endRecord(); - result = SchemaValidationRoles.validateRecordName( + Collection result = SchemaValidationRoles.validateRecordName( Paths.get("/path/to/schema.avsc")).apply(schema); - assertTrue(result.isValid()); + assertTrue(result.isEmpty()); String fieldName = "EmpaticaE4Aceleration"; Path filePath = Paths.get("/path/to/empatica_e4_acceleration.avsc"); @@ -231,23 +212,17 @@ public void recordNameTest() { result = SchemaValidationRoles.validateRecordName(filePath).apply(schema); - assertFalse(result.isValid()); - - assertEquals(Optional.of("Record name must be the conversion of the .avsc file name in " - + "UpperCamelCase and must explicitly contain the device name. " - + "The expected value is \"EmpaticaE4Acceleration\". org.radarcns.passive.empatica." - + fieldName + INVALID_TEXT), - result.getReason()); + assertFalse(result.isEmpty()); result = SchemaValidationRoles.validateRecordName(filePath, true).apply(schema); - assertTrue(result.isValid()); + assertTrue(result.isEmpty()); } @Test public void fieldsTest() { Schema schema; - ValidationResult result; + Collection result; schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) @@ -257,7 +232,7 @@ public void fieldsTest() { result = SchemaValidationRoles.validateFields().apply(schema); - assertFalse(result.isValid()); + assertFalse(result.isEmpty()); schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) @@ -268,13 +243,13 @@ public void fieldsTest() { result = SchemaValidationRoles.validateFields().apply(schema); - assertTrue(result.isValid()); + assertTrue(result.isEmpty()); } @Test public void timeTest() { Schema schema; - ValidationResult result; + Collection result; schema = SchemaBuilder .builder("org.radarcns.time.test") @@ -285,7 +260,7 @@ public void timeTest() { result = SchemaValidationRoles.validateTime().apply(schema); - assertFalse(result.isValid()); + assertFalse(result.isEmpty()); schema = SchemaBuilder .builder("org.radarcns.time.test") @@ -296,13 +271,13 @@ public void timeTest() { result = SchemaValidationRoles.validateTime().apply(schema); - assertTrue(result.isValid()); + assertTrue(result.isEmpty()); } @Test public void timeCompletedTest() { Schema schema; - ValidationResult result; + Collection result; schema = SchemaBuilder .builder(ACTIVE_NAME_SPACE_MOCK) @@ -312,10 +287,10 @@ public void timeCompletedTest() { .endRecord(); result = SchemaValidationRoles.validateTimeCompleted().apply(schema); - assertFalse(result.isValid()); + assertFalse(result.isEmpty()); result = SchemaValidationRoles.validateNotTimeCompleted().apply(schema); - assertTrue(result.isValid()); + assertTrue(result.isEmpty()); schema = SchemaBuilder .builder(ACTIVE_NAME_SPACE_MOCK) @@ -325,16 +300,16 @@ public void timeCompletedTest() { .endRecord(); result = SchemaValidationRoles.validateTimeCompleted().apply(schema); - assertTrue(result.isValid()); + assertTrue(result.isEmpty()); result = SchemaValidationRoles.validateNotTimeCompleted().apply(schema); - assertFalse(result.isValid()); + assertFalse(result.isEmpty()); } @Test public void timeReceivedTest() { Schema schema; - ValidationResult result; + Collection result; schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) @@ -344,10 +319,10 @@ public void timeReceivedTest() { .endRecord(); result = SchemaValidationRoles.validateTimeReceived().apply(schema); - assertFalse(result.isValid()); + assertFalse(result.isEmpty()); result = SchemaValidationRoles.validateNotTimeReceived().apply(schema); - assertTrue(result.isValid()); + assertTrue(result.isEmpty()); schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) @@ -357,16 +332,16 @@ public void timeReceivedTest() { .endRecord(); result = SchemaValidationRoles.validateTimeReceived().apply(schema); - assertTrue(result.isValid()); + assertTrue(result.isEmpty()); result = SchemaValidationRoles.validateNotTimeReceived().apply(schema); - assertFalse(result.isValid()); + assertFalse(result.isEmpty()); } @Test public void fieldNameTest() { Schema schema; - ValidationResult result; + Collection result; schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) @@ -376,7 +351,7 @@ public void fieldNameTest() { .endRecord(); result = SchemaValidationRoles.validateFieldName().apply(schema); - assertFalse(result.isValid()); + assertFalse(result.isEmpty()); schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) @@ -386,7 +361,7 @@ public void fieldNameTest() { .endRecord(); result = SchemaValidationRoles.validateFieldName().apply(schema); - assertFalse(result.isValid()); + assertFalse(result.isEmpty()); schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) @@ -398,7 +373,7 @@ public void fieldNameTest() { result = SchemaValidationRoles.validateFieldName( Collections.singleton(SchemaValidationRoles.TIME)).apply(schema); - assertFalse(result.isValid()); + assertFalse(result.isEmpty()); schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) @@ -408,7 +383,7 @@ public void fieldNameTest() { .endRecord(); result = SchemaValidationRoles.validateFieldName().apply(schema); - assertTrue(result.isValid()); + assertTrue(result.isEmpty()); schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) @@ -420,13 +395,13 @@ public void fieldNameTest() { result = SchemaValidationRoles.validateFieldName( Collections.singleton(FIELD_NUMBER_MOCK)).apply(schema); - assertTrue(result.isValid()); + assertTrue(result.isEmpty()); } @Test public void filedDocumentationTest() { Schema schema; - ValidationResult result; + Collection result; schema = new Parser().parse("{\"namespace\": \"org.radarcns.kafka.key\", " + "\"type\": \"record\"," @@ -436,20 +411,20 @@ public void filedDocumentationTest() { result = SchemaValidationRoles.validateFieldDocumentation().apply(schema); - assertFalse(result.isValid()); + assertFalse(result.isEmpty()); schema = new Parser().parse("{\"namespace\": \"org.radarcns.kafka.key\", " + "\"type\": \"record\", \"name\": \"key\", \"type\": \"record\", \"fields\": [" + "{\"name\": \"userId\", \"type\": \"string\" , \"doc\": \"Documentation.\"}]}"); result = SchemaValidationRoles.validateFieldDocumentation().apply(schema); - assertTrue(result.isValid()); + assertTrue(result.isEmpty()); } @Test public void schemaDocumentationTest() { Schema schema; - ValidationResult result; + Collection result; schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) @@ -459,7 +434,7 @@ public void schemaDocumentationTest() { result = SchemaValidationRoles.validateSchemaDocumentation().apply(schema); - assertFalse(result.isValid()); + assertFalse(result.isEmpty()); schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) @@ -470,32 +445,32 @@ public void schemaDocumentationTest() { result = SchemaValidationRoles.validateSchemaDocumentation().apply(schema); - assertTrue(result.isValid()); + assertTrue(result.isEmpty()); } @Test public void enumerationSymbolsTest() { Schema schema; - ValidationResult result; + Collection result; schema = SchemaBuilder.enumeration(ENUMERATOR_NAME_SPACE_MOCK) .symbols("TEST", UNKNOWN_MOCK); result = SchemaValidationRoles.validateSymbols().apply(schema); - assertTrue(result.isValid()); + assertTrue(result.isEmpty()); schema = SchemaBuilder.enumeration(ENUMERATOR_NAME_SPACE_MOCK).symbols(); result = SchemaValidationRoles.validateSymbols().apply(schema); - assertFalse(result.isValid()); + assertFalse(result.isEmpty()); } @Test public void enumerationSymbolTest() { Schema schema; - ValidationResult result; + Collection result; String enumName = "org.radarcns.monitor.application.ApplicationServerStatus"; String connected = "CONNECTED"; @@ -506,7 +481,7 @@ public void enumerationSymbolTest() { result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); - assertTrue(result.isValid()); + assertTrue(result.isEmpty()); String schemaTxtInit = "{\"namespace\": \"org.radarcns.monitor.application\", " + "\"type\": \"record\", \"name\": \"ApplicationServerStatus\", \"fields\": " @@ -520,7 +495,7 @@ public void enumerationSymbolTest() { result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); - assertTrue(result.isValid()); + assertTrue(result.isEmpty()); schema = SchemaBuilder .enumeration(enumName) @@ -528,7 +503,7 @@ public void enumerationSymbolTest() { result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); - assertFalse(result.isValid()); + assertFalse(result.isEmpty()); schema = SchemaBuilder .enumeration(enumName) @@ -536,7 +511,7 @@ public void enumerationSymbolTest() { result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); - assertFalse(result.isValid()); + assertFalse(result.isEmpty()); schema = SchemaBuilder .enumeration(enumName) @@ -544,41 +519,41 @@ public void enumerationSymbolTest() { result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); - assertFalse(result.isValid()); + assertFalse(result.isEmpty()); schema = new Parser().parse(schemaTxtInit + "\"CONNECTED\", \"Not_Connected\", \"" + UNKNOWN_MOCK + "\"" + schemaTxtEnd); result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); - assertFalse(result.isValid()); + assertFalse(result.isEmpty()); schema = new Parser().parse(schemaTxtInit + "\"Connected\", \"NotConnected\", \"" + UNKNOWN_MOCK + "\"" + schemaTxtEnd); result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); - assertFalse(result.isValid()); + assertFalse(result.isEmpty()); } @Test public void unknownSymbolTest() { Schema schema; - ValidationResult result; + Collection result; schema = SchemaBuilder.enumeration(ENUMERATOR_NAME_SPACE_MOCK) .symbols("VALUE", UNKNOWN_MOCK); result = SchemaValidationRoles.validateUnknownSymbol().apply(schema); - assertTrue(result.isValid()); + assertTrue(result.isEmpty()); schema = SchemaBuilder.enumeration(ENUMERATOR_NAME_SPACE_MOCK) .symbols("FIELD", "UN_KNOWN"); result = SchemaValidationRoles.validateUnknownSymbol().apply(schema); - assertFalse(result.isValid()); + assertFalse(result.isEmpty()); } @Test(expected = IllegalArgumentException.class) @@ -596,7 +571,7 @@ public void defaultValueTest() { //String recordName = "TestRecord"; Schema schema; - ValidationResult result; + Collection result; /*schema = SchemaBuilder .builder(namespace) @@ -615,7 +590,7 @@ public void defaultValueTest() { result = SchemaValidationRoles.validateDefault().apply(schema); - assertTrue(result.isValid());*/ + assertTrue(result.isEmpty());*/ String scemaTxtInit = "{\"namespace\": \"org.radarcns.test\", " + "\"type\": \"record\", \"name\": \"TestRecord\", \"fields\": "; @@ -626,7 +601,7 @@ public void defaultValueTest() { result = SchemaValidationRoles.validateDefault().apply(schema); - assertTrue(result.isValid()); + assertTrue(result.isEmpty()); schema = SchemaBuilder .builder(namespace) @@ -637,7 +612,7 @@ public void defaultValueTest() { result = SchemaValidationRoles.validateDefault().apply(schema);*/ - /*assertFalse(result.isValid()); + /*assertFalse(result.isEmpty()); assertEquals(Optional.of(invalidMessage), result.getReason()); schema = SchemaBuilder @@ -649,7 +624,7 @@ public void defaultValueTest() { result = SchemaValidationRoles.validateDefault().apply(schema); - assertFalse(result.isValid()); + assertFalse(result.isEmpty()); assertEquals(Optional.of(invalidMessage), result.getReason()); schema = SchemaBuilder @@ -661,7 +636,7 @@ public void defaultValueTest() { result = SchemaValidationRoles.validateDefault().apply(schema); - assertFalse(result.isValid()); + assertFalse(result.isEmpty()); assertEquals(Optional.of(invalidMessage), result.getReason());*/ schema = new Parser().parse(scemaTxtInit @@ -671,7 +646,7 @@ public void defaultValueTest() { result = SchemaValidationRoles.validateDefault().apply(schema); - assertTrue(result.isValid()); + assertTrue(result.isEmpty()); schema = new Parser().parse(scemaTxtInit + "[ {\"name\": \"serverStatus\", \"type\": {\"name\": \"ServerStatus\", \"type\": " @@ -680,7 +655,7 @@ public void defaultValueTest() { result = SchemaValidationRoles.validateDefault().apply(schema); - assertFalse(result.isValid()); + assertFalse(result.isEmpty()); /*schema = new Parser().parse(scemaTxtInit + "[ {\"name\": \"nullableBoolean\", \"type\": [ \"null\", \"boolean\"], " @@ -688,7 +663,7 @@ public void defaultValueTest() { result = SchemaValidationRoles.validateDefault().apply(schema); - assertFalse(result.isValid()); + assertFalse(result.isEmpty()); assertEquals(Optional.of(invalidMessage), result.getReason());*/ } } From d5165e0bed320c3bb9dc2f88bcfa0b3e618b6a57 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Thu, 14 Sep 2017 10:20:30 +0200 Subject: [PATCH 062/112] Consolidated specifications and validator packages --- .../radar-schemas-specifications/build.gradle | 146 ----- .../src/main/resources/logback.xml | 17 - .../README.md | 0 .../build.gradle | 4 +- .../config/checkstyle/checkstyle.xml | 0 .../config/intellij-java-google-style.xml | 0 .../config/pmd/ruleset.xml | 0 .../org/radarcns/schema}/CommandLineApp.java | 26 +- .../schema/specification}/Aggregatable.java | 2 +- .../schema/specification}/KafkaActor.java | 23 +- .../schema/specification}/Labels.java | 2 +- .../schema/specification}/MonitorSource.java | 7 +- .../schema/specification}/Source.java | 18 +- .../schema/specification/SourceCatalogue.java | 46 +- .../radarcns/schema/specification}/Topic.java | 55 +- .../radarcns/schema/specification}/Utils.java | 42 +- .../specification}/active/ActiveSource.java | 22 +- .../active/questionnaire/Question.java | 4 +- .../questionnaire/QuestionnaireSource.java | 24 +- .../active/questionnaire/Response.java | 6 +- .../specification}/passive/PassiveSource.java | 27 +- .../specification}/passive/Processor.java | 9 +- .../schema/specification}/passive/Sensor.java | 22 +- .../schema/validation/SchemaRepository.java | 0 .../schema/validation/SchemaValidator.java | 65 +- .../validation/SpecificationsValidator.java | 0 .../validation/ValidationException.java | 0 .../schema/validation/ValidationSupport.java | 2 +- .../schema/validation/config/ConfigItem.java | 0 .../validation/config/ExcludeConfig.java | 2 +- .../validation/roles/ActiveSourceRoles.java | 4 +- .../validation/roles/AggregatableRoles.java | 4 +- .../schema/validation/roles/MonitorRoles.java | 4 +- .../validation/roles/PassiveSourceRoles.java | 4 +- .../validation/roles/ProcessorRoles.java | 2 +- .../validation/roles/QuestionRoles.java | 2 +- .../validation/roles/QuestionnaireRoles.java | 2 +- .../validation/roles/ResponseRoles.java | 2 +- .../roles/SchemaValidationRoles.java | 0 .../schema/validation/roles/SensorRoles.java | 2 +- .../schema/validation/roles/TopicRoles.java | 7 +- .../schema/validation/roles/Validator.java | 0 .../schema/validation/ActiveValidation.java | 0 .../schema/validation/ExcludeConfigTest.java | 0 .../schema/validation/MonitorValidation.java | 0 .../schema/validation/PassiveValidation.java | 2 +- .../validation/SchemaValidatorTest.java | 55 +- .../validation/SourceCatalogueValidation.java | 8 +- .../SpecificationsValidatorTest.java | 0 .../roles/SchemaValidationRolesTest.java | 11 +- .../schema/validation/util/TopicTest.java | 2 +- .../schema/validation/util/UtilsTest.java | 2 +- .../test/resources/key_measurement_test.avsc | 0 .../src/test/resources/key_windowed_test.avsc | 0 .../src/test/resources/logback.xml | 0 .../src/test/resources/schema.yml} | 0 .../config/checkstyle/checkstyle.xml | 216 ------- .../config/intellij-java-google-style.xml | 596 ------------------ .../config/pmd/ruleset.xml | 89 --- .../schema/validation/AvroValidator.java | 86 --- .../schema/validation/AvroValidatorTest.java | 74 --- java-sdk/settings.gradle | 3 +- 62 files changed, 329 insertions(+), 1419 deletions(-) delete mode 100644 java-sdk/radar-schemas-specifications/build.gradle delete mode 100644 java-sdk/radar-schemas-specifications/src/main/resources/logback.xml rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/README.md (100%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/build.gradle (94%) rename java-sdk/{radar-schemas-specifications => radar-schemas-tools}/config/checkstyle/checkstyle.xml (100%) rename java-sdk/{radar-schemas-specifications => radar-schemas-tools}/config/intellij-java-google-style.xml (100%) rename java-sdk/{radar-schemas-specifications => radar-schemas-tools}/config/pmd/ruleset.xml (100%) rename java-sdk/{radar-schemas-specifications/src/main/java/org/radarcns/schema/specification => radar-schemas-tools/src/main/java/org/radarcns/schema}/CommandLineApp.java (88%) rename java-sdk/{radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source => radar-schemas-tools/src/main/java/org/radarcns/schema/specification}/Aggregatable.java (94%) rename java-sdk/{radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source => radar-schemas-tools/src/main/java/org/radarcns/schema/specification}/KafkaActor.java (77%) rename java-sdk/{radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/util => radar-schemas-tools/src/main/java/org/radarcns/schema/specification}/Labels.java (97%) rename java-sdk/{radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source => radar-schemas-tools/src/main/java/org/radarcns/schema/specification}/MonitorSource.java (92%) rename java-sdk/{radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source => radar-schemas-tools/src/main/java/org/radarcns/schema/specification}/Source.java (76%) rename java-sdk/{radar-schemas-specifications => radar-schemas-tools}/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java (94%) rename java-sdk/{radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source => radar-schemas-tools/src/main/java/org/radarcns/schema/specification}/Topic.java (82%) rename java-sdk/{radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/util => radar-schemas-tools/src/main/java/org/radarcns/schema/specification}/Utils.java (68%) rename java-sdk/{radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source => radar-schemas-tools/src/main/java/org/radarcns/schema/specification}/active/ActiveSource.java (78%) rename java-sdk/{radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source => radar-schemas-tools/src/main/java/org/radarcns/schema/specification}/active/questionnaire/Question.java (94%) rename java-sdk/{radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source => radar-schemas-tools/src/main/java/org/radarcns/schema/specification}/active/questionnaire/QuestionnaireSource.java (72%) rename java-sdk/{radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source => radar-schemas-tools/src/main/java/org/radarcns/schema/specification}/active/questionnaire/Response.java (86%) rename java-sdk/{radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source => radar-schemas-tools/src/main/java/org/radarcns/schema/specification}/passive/PassiveSource.java (82%) rename java-sdk/{radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source => radar-schemas-tools/src/main/java/org/radarcns/schema/specification}/passive/Processor.java (89%) rename java-sdk/{radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source => radar-schemas-tools/src/main/java/org/radarcns/schema/specification}/passive/Sensor.java (80%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/main/java/org/radarcns/schema/validation/SchemaRepository.java (100%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/main/java/org/radarcns/schema/validation/SchemaValidator.java (62%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/main/java/org/radarcns/schema/validation/SpecificationsValidator.java (100%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/main/java/org/radarcns/schema/validation/ValidationException.java (100%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/main/java/org/radarcns/schema/validation/ValidationSupport.java (99%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/main/java/org/radarcns/schema/validation/config/ConfigItem.java (100%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/main/java/org/radarcns/schema/validation/config/ExcludeConfig.java (99%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/main/java/org/radarcns/schema/validation/roles/ActiveSourceRoles.java (91%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/main/java/org/radarcns/schema/validation/roles/AggregatableRoles.java (94%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/main/java/org/radarcns/schema/validation/roles/MonitorRoles.java (94%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/main/java/org/radarcns/schema/validation/roles/PassiveSourceRoles.java (96%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/main/java/org/radarcns/schema/validation/roles/ProcessorRoles.java (96%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/main/java/org/radarcns/schema/validation/roles/QuestionRoles.java (96%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/main/java/org/radarcns/schema/validation/roles/QuestionnaireRoles.java (95%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/main/java/org/radarcns/schema/validation/roles/ResponseRoles.java (94%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/main/java/org/radarcns/schema/validation/roles/SchemaValidationRoles.java (100%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/main/java/org/radarcns/schema/validation/roles/SensorRoles.java (97%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/main/java/org/radarcns/schema/validation/roles/TopicRoles.java (92%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/main/java/org/radarcns/schema/validation/roles/Validator.java (100%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/test/java/org/radarcns/schema/validation/ActiveValidation.java (100%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/test/java/org/radarcns/schema/validation/ExcludeConfigTest.java (100%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/test/java/org/radarcns/schema/validation/MonitorValidation.java (100%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/test/java/org/radarcns/schema/validation/PassiveValidation.java (97%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java (59%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/test/java/org/radarcns/schema/validation/SourceCatalogueValidation.java (92%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/test/java/org/radarcns/schema/validation/SpecificationsValidatorTest.java (100%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/test/java/org/radarcns/schema/validation/roles/SchemaValidationRolesTest.java (98%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/test/java/org/radarcns/schema/validation/util/TopicTest.java (98%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/test/java/org/radarcns/schema/validation/util/UtilsTest.java (96%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/test/resources/key_measurement_test.avsc (100%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/test/resources/key_windowed_test.avsc (100%) rename java-sdk/{radar-schemas-validator => radar-schemas-tools}/src/test/resources/logback.xml (100%) rename java-sdk/{radar-schemas-validator/src/test/resources/skip.yml => radar-schemas-tools/src/test/resources/schema.yml} (100%) delete mode 100644 java-sdk/radar-schemas-validator/config/checkstyle/checkstyle.xml delete mode 100644 java-sdk/radar-schemas-validator/config/intellij-java-google-style.xml delete mode 100644 java-sdk/radar-schemas-validator/config/pmd/ruleset.xml delete mode 100644 java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/AvroValidator.java delete mode 100644 java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/AvroValidatorTest.java diff --git a/java-sdk/radar-schemas-specifications/build.gradle b/java-sdk/radar-schemas-specifications/build.gradle deleted file mode 100644 index d96335a7..00000000 --- a/java-sdk/radar-schemas-specifications/build.gradle +++ /dev/null @@ -1,146 +0,0 @@ -plugins { - id 'idea' - id 'checkstyle' - id 'pmd' -} - -ext.artifactName = 'radar-schemas-specification' -ext.description = 'RADAR Schemas Specification SDK' - -targetCompatibility = '1.8' -sourceCompatibility = '1.8' - -idea { - module { - downloadSources = true - } -} - -ext.kafkaVersion = '0.10.2.1' -ext.jacksonModuleParameterNamesVersion = '2.9.0' -ext.junitVersion = '4.12' -ext.radarCommonsVersion = '0.4.2' -ext.slf4jVersion = '1.7.25' - -dependencies { - implementation project(':radar-schemas-commons') - - implementation group: 'org.radarcns', name: 'radar-commons', version: radarCommonsVersion - - testCompile group: 'junit', name: 'junit', version: junitVersion - testCompile group: 'org.slf4j', name: 'slf4j-simple', version: slf4jVersion -} - -//---------------------------------------------------------------------------// -// Exchange configuration with Java code // -//---------------------------------------------------------------------------// -ext.exchnageConfigMainPath = 'src/main/resources/exchange.properties' -task exchangeConfig() { - doLast { - if (!file(exchnageConfigMainPath).exists() || file(exchnageConfigMainPath).delete()) { - file(exchnageConfigMainPath).createNewFile() - file(exchnageConfigMainPath).write("project.group=${project.group}") - } else { - throw new GradleException("Error while creating file at ${exchnageConfigMainPath}") - } - } -} -compileJava.dependsOn exchangeConfig - -task cleanExchangeConfig() { - doLast { - if (file(exchnageConfigMainPath).exists()) { - if (!file(exchnageConfigMainPath).delete()) { - throw new GradleException("File at ${exchnageConfigMainPath} cannot be delated.") - } - } - } -} -clean.dependsOn cleanExchangeConfig - -//---------------------------------------------------------------------------// -// Test definition // -//---------------------------------------------------------------------------// -test { - testLogging { - events "skipped", "failed" - exceptionFormat "full" - showExceptions = true - showCauses = true - showStackTraces = true - showStandardStreams = true - } -} - -//---------------------------------------------------------------------------// -// Style checking // -//---------------------------------------------------------------------------// -checkstyle { - // codacy version - toolVersion '6.16' - //ignoreFailures = false TODO set back - ignoreFailures = true - - configFile = file("$projectDir/config/checkstyle/checkstyle.xml") -} - -pmd { - // pmd version - toolVersion = '5.5.2' - //ignoreFailures = false TODO set back - ignoreFailures = true - - consoleOutput = true - - ruleSets = [] - - ruleSetFiles = files("$projectDir/config/pmd/ruleset.xml") -} - -//---------------------------------------------------------------------------// -// Publishing // -//---------------------------------------------------------------------------// - -publishing { - publications { - RadarQuestionnairePublication(MavenPublication) { - from components.java - artifact sourcesJar - artifact javadocJar - groupId project.group - artifactId artifactName - version project.version - pom.withXml { - def root = asNode() - root.appendNode('description', description) - root.appendNode('name', artifactName) - root.appendNode('url', githubUrl) - root.children().last() + pomConfig - } - } - } -} - -bintray { - user = project.hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER') - key = project.hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') - override = false - publications = ['RadarQuestionnairePublication'] - pkg { - repo = project.group - name = artifactName - userOrg = 'radar-cns' - licenses = ['Apache-2.0'] - websiteUrl = website - issueTrackerUrl = issueUrl - vcsUrl = githubUrl - githubRepo = githubRepoName - githubReleaseNotesFile = 'README.md' - version { - name = project.version - desc = description - vcsTag = System.getenv('TRAVIS_TAG') - released = new Date() - } - } -} diff --git a/java-sdk/radar-schemas-specifications/src/main/resources/logback.xml b/java-sdk/radar-schemas-specifications/src/main/resources/logback.xml deleted file mode 100644 index 437ccb34..00000000 --- a/java-sdk/radar-schemas-specifications/src/main/resources/logback.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - %date{yyyy-MM-dd HH:mm:ss,UTC} UTC %-5level - %msg [%logger:%line] %n - - - - - - - - - - - diff --git a/java-sdk/radar-schemas-validator/README.md b/java-sdk/radar-schemas-tools/README.md similarity index 100% rename from java-sdk/radar-schemas-validator/README.md rename to java-sdk/radar-schemas-tools/README.md diff --git a/java-sdk/radar-schemas-validator/build.gradle b/java-sdk/radar-schemas-tools/build.gradle similarity index 94% rename from java-sdk/radar-schemas-validator/build.gradle rename to java-sdk/radar-schemas-tools/build.gradle index b12260f3..3d31f742 100644 --- a/java-sdk/radar-schemas-validator/build.gradle +++ b/java-sdk/radar-schemas-tools/build.gradle @@ -2,6 +2,7 @@ plugins { id 'idea' id 'checkstyle' id 'pmd' + id 'application' } ext.artifactName = 'radar-schemas-validation' @@ -9,6 +10,7 @@ ext.description = 'RADAR Schemas Validator. JUnit tests to check schema acceptan targetCompatibility = '1.8' sourceCompatibility = '1.8' +mainClassName = 'org.radarcns.schema.CommandLineApp' sourceSets { test { @@ -22,9 +24,9 @@ ext.slf4jVersion = '1.7.25' dependencies { api group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.8.10' - api project(':radar-schemas-specifications') implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.8.10' implementation project(':radar-schemas-commons') + implementation group: 'org.radarcns', name: 'radar-commons', version: '0.5' testCompile group: 'junit', name: 'junit', version: junitVersion testCompile group: 'org.slf4j', name: 'slf4j-simple', version: slf4jVersion diff --git a/java-sdk/radar-schemas-specifications/config/checkstyle/checkstyle.xml b/java-sdk/radar-schemas-tools/config/checkstyle/checkstyle.xml similarity index 100% rename from java-sdk/radar-schemas-specifications/config/checkstyle/checkstyle.xml rename to java-sdk/radar-schemas-tools/config/checkstyle/checkstyle.xml diff --git a/java-sdk/radar-schemas-specifications/config/intellij-java-google-style.xml b/java-sdk/radar-schemas-tools/config/intellij-java-google-style.xml similarity index 100% rename from java-sdk/radar-schemas-specifications/config/intellij-java-google-style.xml rename to java-sdk/radar-schemas-tools/config/intellij-java-google-style.xml diff --git a/java-sdk/radar-schemas-specifications/config/pmd/ruleset.xml b/java-sdk/radar-schemas-tools/config/pmd/ruleset.xml similarity index 100% rename from java-sdk/radar-schemas-specifications/config/pmd/ruleset.xml rename to java-sdk/radar-schemas-tools/config/pmd/ruleset.xml diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/CommandLineApp.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java similarity index 88% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/CommandLineApp.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java index 6ee73037..d238f266 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/CommandLineApp.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java @@ -1,4 +1,4 @@ -package org.radarcns.schema.specification; +package org.radarcns.schema; /* * Copyright 2017 King's College London and The Hyve @@ -28,15 +28,15 @@ import java.util.Objects; import java.util.Set; -import org.radarcns.schema.Scope; -import org.radarcns.schema.specification.source.KafkaActor; -import org.radarcns.schema.specification.source.Topic; -import org.radarcns.schema.specification.source.active.ActiveSource; -import org.radarcns.schema.specification.source.active.questionnaire.QuestionnaireSource; -import org.radarcns.schema.specification.source.passive.Processor; -import org.radarcns.schema.specification.source.passive.Sensor; -import org.radarcns.schema.specification.source.MonitorSource; -import org.radarcns.schema.specification.source.passive.PassiveSource; +import org.radarcns.schema.specification.KafkaActor; +import org.radarcns.schema.specification.MonitorSource; +import org.radarcns.schema.specification.SourceCatalogue; +import org.radarcns.schema.specification.Topic; +import org.radarcns.schema.specification.active.ActiveSource; +import org.radarcns.schema.specification.active.questionnaire.QuestionnaireSource; +import org.radarcns.schema.specification.passive.Processor; +import org.radarcns.schema.specification.passive.Sensor; +import org.radarcns.schema.specification.passive.PassiveSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -153,8 +153,8 @@ public String getTopicsVerbose(boolean reduced, String source) { Collections.sort(firstLevelKeys); for (String details : firstLevelKeys) { - result.append('\t').append(details).append('\n'); - result.append("\t\t").append(map.get(key).get(details)); + result.append('\t').append(details); + result.append("\n\t\t").append(map.get(key).get(details)); } result.append('\n'); } @@ -202,7 +202,7 @@ private Map> getTopicsInfoVerbose(boolean reduced) { return map; } - + @SuppressWarnings("PMD.SystemPrintln") public static void main(String... args) { if (args.length < 1) { System.err.println("Usage: app ROOT_DIRECTORY"); diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/Aggregatable.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Aggregatable.java similarity index 94% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/Aggregatable.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Aggregatable.java index d5f4b49c..885280bd 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/Aggregatable.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Aggregatable.java @@ -1,4 +1,4 @@ -package org.radarcns.schema.specification.source; +package org.radarcns.schema.specification; /* * Copyright 2017 King's College London and The Hyve diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/KafkaActor.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/KafkaActor.java similarity index 77% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/KafkaActor.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/KafkaActor.java index 68752d64..f7682b1a 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/KafkaActor.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/KafkaActor.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.radarcns.schema.specification.source; +package org.radarcns.schema.specification; import org.radarcns.catalogue.ProcessingState; @@ -32,7 +32,8 @@ public class KafkaActor { private final Topic topic; - public KafkaActor(String doc, double sampleRate, String unit, ProcessingState dataType, Topic topic) { + public KafkaActor(String doc, double sampleRate, String unit, ProcessingState dataType, + Topic topic) { Objects.requireNonNull(dataType); Objects.requireNonNull(topic); Objects.requireNonNull(unit); @@ -66,14 +67,18 @@ public Topic getTopic() { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } KafkaActor that = (KafkaActor) o; - return Double.compare(that.sampleRate, sampleRate) == 0 && - Objects.equals(doc, that.doc) && - Objects.equals(unit, that.unit) && - dataType == that.dataType && - Objects.equals(topic, that.topic); + return Double.compare(that.sampleRate, sampleRate) == 0 + && Objects.equals(doc, that.doc) + && Objects.equals(unit, that.unit) + && dataType == that.dataType + && Objects.equals(topic, that.topic); } @Override diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/util/Labels.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Labels.java similarity index 97% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/util/Labels.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Labels.java index b07c7b46..3bd43ad9 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/util/Labels.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Labels.java @@ -1,4 +1,4 @@ -package org.radarcns.schema.specification.util; +package org.radarcns.schema.specification; /* * Copyright 2017 King's College London and The Hyve diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/MonitorSource.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/MonitorSource.java similarity index 92% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/MonitorSource.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/MonitorSource.java index 1cd4a511..9a2511c7 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/MonitorSource.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/MonitorSource.java @@ -1,4 +1,4 @@ -package org.radarcns.schema.specification.source; +package org.radarcns.schema.specification; /* * Copyright 2017 King's College London and The Hyve @@ -21,8 +21,6 @@ import java.util.Objects; import java.util.Set; import org.radarcns.catalogue.ProcessingState; -import org.radarcns.schema.specification.util.Labels; -import org.radarcns.schema.specification.util.Utils; /** * TODO. @@ -51,6 +49,7 @@ public enum RadarSourceTypes { * @param aggregator TODO */ @JsonCreator + @SuppressWarnings("PMD.ExcessiveParameterList") public MonitorSource( @JsonProperty(Labels.NAME) String name, @JsonProperty(Labels.APP_PROVIDER) String appProvider, @@ -67,7 +66,7 @@ public MonitorSource( Objects.requireNonNull(appProvider); this.type = name; - this.appProvider = Utils.getProjectGroup() + appProvider; + this.appProvider = deduceProjectClass(appProvider); this.kafkaActor = new KafkaActor(doc, sampleRate, unit, dataType, new Topic(topic, key, value, aggregator, null)); diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/Source.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Source.java similarity index 76% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/Source.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Source.java index ecb0bf8b..bfb287e8 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/Source.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Source.java @@ -1,4 +1,4 @@ -package org.radarcns.schema.specification.source; +package org.radarcns.schema.specification; /* * Copyright 2017 King's College London and The Hyve @@ -19,8 +19,6 @@ import java.util.Objects; import java.util.Set; -import static org.radarcns.schema.specification.util.Labels.NAME; - /** * TODO. */ @@ -62,12 +60,22 @@ public boolean equals(Object o) { return false; } Source source = (Source) o; - return Objects.equals(name, source.name) && - Objects.equals(doc, source.doc); + return Objects.equals(name, source.name) + && Objects.equals(doc, source.doc); } @Override public int hashCode() { return Objects.hash(name, doc); } + + public static String deduceProjectClass(String appProvider) { + if (appProvider == null || appProvider.isEmpty()) { + return null; + } else if (appProvider.charAt(0) == '.') { + return Utils.getProjectGroup() + appProvider; + } else { + return appProvider; + } + } } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java similarity index 94% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java index 8eda4a10..42300699 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java @@ -18,11 +18,9 @@ import org.radarcns.config.YamlConfigLoader; import org.radarcns.schema.Scope; -import org.radarcns.schema.specification.source.MonitorSource; -import org.radarcns.schema.specification.source.Source; -import org.radarcns.schema.specification.source.active.ActiveSource; -import org.radarcns.schema.specification.source.active.questionnaire.QuestionnaireSource; -import org.radarcns.schema.specification.source.passive.PassiveSource; +import org.radarcns.schema.specification.active.ActiveSource; +import org.radarcns.schema.specification.active.questionnaire.QuestionnaireSource; +import org.radarcns.schema.specification.passive.PassiveSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -96,25 +94,6 @@ private static Map initSources(YamlConfigLoader configLoader, Pat }); } - private static Map initActiveSources(YamlConfigLoader configLoader, - Path root) throws IOException { - return initSources(root, Scope.ACTIVE, f -> { - try { - File file = f.toFile(); - ActiveSource source = configLoader.load(file, ActiveSource.class); - switch (source.getAssessmentType().toUpperCase(Locale.ENGLISH)) { - case "QUESTIONNAIRE": - return configLoader.load(file, QuestionnaireSource.class); - default: - return source; - } - } catch (IOException e) { - logger.error("Failed to load configuration {}", f, e); - return null; - } - }); - } - private static Map initSources(Path root, Scope scope, Function map) throws IOException { Path baseFolder = scope.getPath(root); @@ -134,6 +113,25 @@ private static Map initSources(Path root, Scope scope, Function

    initActiveSources(YamlConfigLoader configLoader, + Path root) throws IOException { + return initSources(root, Scope.ACTIVE, f -> { + try { + File file = f.toFile(); + ActiveSource source = configLoader.load(file, ActiveSource.class); + switch (source.getAssessmentType().toUpperCase(Locale.ENGLISH)) { + case "QUESTIONNAIRE": + return configLoader.load(file, QuestionnaireSource.class); + default: + return source; + } + } catch (IOException e) { + logger.error("Failed to load configuration {}", f, e); + return null; + } + }); + } + /** * TODO. * @return TODO diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/Topic.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Topic.java similarity index 82% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/Topic.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Topic.java index 9bbeda79..23688a7a 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/Topic.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Topic.java @@ -1,5 +1,3 @@ -package org.radarcns.schema.specification.source; - /* * Copyright 2017 King's College London and The Hyve * @@ -16,19 +14,21 @@ * limitations under the License. */ +package org.radarcns.schema.specification; + import org.radarcns.catalogue.TimeFrame; -import org.radarcns.schema.specification.util.Utils; import java.util.HashSet; import java.util.Objects; import java.util.Set; import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; + +import static org.radarcns.schema.specification.Source.deduceProjectClass; /** * TODO. */ -public class Topic implements Aggregatable{ +public class Topic implements Aggregatable { public static final String FROM_LABEL = "From-"; public static final String TO_LABEL = "-To-"; @@ -133,26 +133,25 @@ public Topic(String inputTopic, String inputKey, String inputValue, String aggre Objects.requireNonNull(inputValue); this.inputTopic = inputTopic; - this.inputKey = Utils.getProjectGroup() + inputKey; - this.inputValue = Utils.getProjectGroup() + inputValue; - this.aggregator = Objects.isNull(aggregator) ? null : - Utils.getProjectGroup() + aggregator; + this.inputKey = deduceProjectClass(inputKey); + this.inputValue = deduceProjectClass(inputValue); + this.aggregator = deduceProjectClass(aggregator); - this.baseOutput = Objects.nonNull(baseOutput) ? baseOutput : inputTopic; + this.baseOutput = baseOutput != null ? baseOutput : inputTopic; this.output = new HashSet<>(); - if (Objects.nonNull(this.aggregator) && Utils.isTimedAggregator(this.aggregator)) { + if (Utils.isTimedAggregator(this.aggregator)) { for (TimeLabel label : TimeLabel.values()) { if (label.intervalInMilliSec != -1) { this.output.add(new TopicMetadata(label, inputTopic, - getStateStoreName(inputTopic, getOutTopic(this.baseOutput, label)), - getOutTopic(this.baseOutput, label))); + getStateStoreName(inputTopic, getOutTopic(this.baseOutput, label)), + getOutTopic(this.baseOutput, label))); } } - } else if (Objects.nonNull(this.aggregator) && Utils.isTimedAggregator(this.aggregator)) { + } else if (this.aggregator != null) { this.output.add(new TopicMetadata(TimeLabel.NOT_APPLICABLE, inputTopic, - getStateStoreName(inputTopic, getOutTopic(this.baseOutput)), + getStateStoreName(inputTopic, getOutTopic(this.baseOutput)), getOutTopic(this.baseOutput))); } } @@ -169,7 +168,7 @@ public Set getOutputTopics() { @Override public boolean hasAggregator() { - return Objects.nonNull(aggregator); + return aggregator != null; } @Override @@ -220,12 +219,12 @@ public boolean equals(Object o) { return false; } Topic topic = (Topic) o; - return Objects.equals(inputTopic, topic.inputTopic) && - Objects.equals(inputKey, topic.inputKey) && - Objects.equals(inputValue, topic.inputValue) && - Objects.equals(aggregator, topic.aggregator) && - Objects.equals(baseOutput, topic.baseOutput) && - Objects.equals(output, topic.output); + return Objects.equals(inputTopic, topic.inputTopic) + && Objects.equals(inputKey, topic.inputKey) + && Objects.equals(inputValue, topic.inputValue) + && Objects.equals(aggregator, topic.aggregator) + && Objects.equals(baseOutput, topic.baseOutput) + && Objects.equals(output, topic.output); } @Override @@ -243,15 +242,15 @@ public String toString(boolean reduced) { if (output.isEmpty()) { result.append("output: empty"); } else { - result.append("output:\n\t- "); + result.append("output:"); } if (reduced) { - result.append(output.stream().map( - TopicMetadata::getOutput).collect(Collectors.joining("\n\t- "))); + output.forEach(topic -> result.append("\n\t- ").append(topic.getOutput())); } else { - result.append(output.stream().map(metadata -> metadata.getInput() - + '\t' + metadata.getStateStore() + '\t' - + metadata.getOutput()).collect(Collectors.joining("\n\t- "))); + output.forEach(topic -> result + .append("\n\t- ").append(topic.getInput()) + .append('\t').append(topic.getStateStore()) + .append('\t').append(topic.getOutput())); } return result.append('\n').toString(); diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/util/Utils.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Utils.java similarity index 68% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/util/Utils.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Utils.java index 72264309..733e7f1c 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/util/Utils.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Utils.java @@ -1,5 +1,3 @@ -package org.radarcns.schema.specification.util; - /* * Copyright 2017 King's College London and The Hyve * @@ -16,22 +14,27 @@ * limitations under the License. */ +package org.radarcns.schema.specification; + +import org.radarcns.kafka.aggregator.AggregatorDouble; +import org.radarcns.kafka.aggregator.AggregatorDoubleArray; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.io.IOException; +import java.io.InputStream; import java.util.HashSet; import java.util.Locale; -import java.util.Objects; import java.util.Properties; import java.util.Set; -import org.radarcns.kafka.aggregator.AggregatorDouble; -import org.radarcns.kafka.aggregator.AggregatorDoubleArray; /** * TODO. */ public final class Utils { - + private static final Logger logger = LoggerFactory.getLogger(Utils.class); private static final String GRADLE_PROPERTIES = "exchange.properties"; - private static final String PROPERTY_VALUE = "project.group"; + private static final String GROUP_PROPERTY = "project.group"; private static String projectGroup; private static final Set TIMED_AGGREGATOR; @@ -50,15 +53,24 @@ private Utils() { * TODO. * @return TODO */ - public static String getProjectGroup() { - if (Objects.isNull(projectGroup)) { - try { - Properties prop = new Properties(); - prop.load( - ClassLoader.getSystemClassLoader().getResourceAsStream(GRADLE_PROPERTIES)); - projectGroup = prop.getProperty(PROPERTY_VALUE); + public static synchronized String getProjectGroup() { + if (projectGroup == null) { + Properties prop = new Properties(); + ClassLoader loader = ClassLoader.getSystemClassLoader(); + try (InputStream in = loader.getResourceAsStream(GRADLE_PROPERTIES)) { + if (in == null) { + projectGroup = "org.radarcns"; + logger.warn("Project group not specified. Using \"{}\".", projectGroup); + } else { + prop.load(in); + projectGroup = prop.getProperty(GROUP_PROPERTY); + if (projectGroup == null) { + projectGroup = "org.radarcns"; + logger.warn("Project group not specified. Using \"{}\".", projectGroup); + } + } } catch (IOException exc) { - throw new IllegalStateException(PROPERTY_VALUE + throw new IllegalStateException(GROUP_PROPERTY + " cannot be extracted from " + GRADLE_PROPERTIES, exc); } } diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/ActiveSource.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/ActiveSource.java similarity index 78% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/ActiveSource.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/ActiveSource.java index d4f20477..ad0f286e 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/ActiveSource.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/ActiveSource.java @@ -1,4 +1,4 @@ -package org.radarcns.schema.specification.source.active; +package org.radarcns.schema.specification.active; /* * Copyright 2017 King's College London and The Hyve @@ -19,28 +19,30 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import org.radarcns.schema.specification.source.Source; -import org.radarcns.schema.specification.source.Topic; +import org.radarcns.schema.specification.Source; +import org.radarcns.schema.specification.Topic; import java.util.Objects; import java.util.Set; -import static org.radarcns.schema.specification.util.Labels.ASSESSMENT_TYPE; -import static org.radarcns.schema.specification.util.Labels.DOC; -import static org.radarcns.schema.specification.util.Labels.KEY; -import static org.radarcns.schema.specification.util.Labels.NAME; -import static org.radarcns.schema.specification.util.Labels.TOPIC; -import static org.radarcns.schema.specification.util.Labels.VALUE; +import static org.radarcns.schema.specification.Labels.ASSESSMENT_TYPE; +import static org.radarcns.schema.specification.Labels.DOC; +import static org.radarcns.schema.specification.Labels.KEY; +import static org.radarcns.schema.specification.Labels.NAME; +import static org.radarcns.schema.specification.Labels.TOPIC; +import static org.radarcns.schema.specification.Labels.VALUE; /** * TODO. */ @JsonIgnoreProperties(ignoreUnknown = true) public class ActiveSource extends Source { + public enum RadarSourceTypes { QUESTIONNAIRE } - private String assessmentType; + + private final String assessmentType; private final Topic topic; diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/Question.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/Question.java similarity index 94% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/Question.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/Question.java index 9c712c3c..59ba4b5c 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/Question.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/Question.java @@ -1,4 +1,4 @@ -package org.radarcns.schema.specification.source.active.questionnaire; +package org.radarcns.schema.specification.active.questionnaire; /* * Copyright 2017 King's College London and The Hyve @@ -21,7 +21,7 @@ import java.util.List; import java.util.Objects; import org.radarcns.catalogue.RadarWidget; -import org.radarcns.schema.specification.util.Labels; +import org.radarcns.schema.specification.Labels; /** * TODO. diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/QuestionnaireSource.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/QuestionnaireSource.java similarity index 72% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/QuestionnaireSource.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/QuestionnaireSource.java index 134b59a4..a3993df5 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/QuestionnaireSource.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/QuestionnaireSource.java @@ -1,4 +1,4 @@ -package org.radarcns.schema.specification.source.active.questionnaire; +package org.radarcns.schema.specification.active.questionnaire; /* * Copyright 2017 King's College London and The Hyve @@ -17,19 +17,20 @@ */ import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; -import org.radarcns.schema.specification.source.active.ActiveSource; +import org.radarcns.schema.specification.active.ActiveSource; import java.util.List; import java.util.Objects; -import static org.radarcns.schema.specification.util.Labels.ASSESSMENT_TYPE; -import static org.radarcns.schema.specification.util.Labels.DOC; -import static org.radarcns.schema.specification.util.Labels.KEY; -import static org.radarcns.schema.specification.util.Labels.NAME; -import static org.radarcns.schema.specification.util.Labels.QUESTIONS; -import static org.radarcns.schema.specification.util.Labels.TOPIC; -import static org.radarcns.schema.specification.util.Labels.VALUE; +import static org.radarcns.schema.specification.Labels.ASSESSMENT_TYPE; +import static org.radarcns.schema.specification.Labels.DOC; +import static org.radarcns.schema.specification.Labels.KEY; +import static org.radarcns.schema.specification.Labels.NAME; +import static org.radarcns.schema.specification.Labels.QUESTIONS; +import static org.radarcns.schema.specification.Labels.TOPIC; +import static org.radarcns.schema.specification.Labels.VALUE; /** * TODO. @@ -39,9 +40,10 @@ public enum RadarSourceTypes { PHQ8 } - private String type; + @JsonIgnore + private final String type; - private List questions; + private final List questions; /** * TODO. diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/Response.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/Response.java similarity index 86% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/Response.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/Response.java index b49b4063..25e852ff 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/active/questionnaire/Response.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/Response.java @@ -1,4 +1,4 @@ -package org.radarcns.schema.specification.source.active.questionnaire; +package org.radarcns.schema.specification.active.questionnaire; /* * Copyright 2017 King's College London and The Hyve @@ -16,8 +16,8 @@ * limitations under the License. */ -import static org.radarcns.schema.specification.util.Labels.SCORE; -import static org.radarcns.schema.specification.util.Labels.TEXT; +import static org.radarcns.schema.specification.Labels.SCORE; +import static org.radarcns.schema.specification.Labels.TEXT; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/PassiveSource.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveSource.java similarity index 82% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/PassiveSource.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveSource.java index bf003e10..856bbdd0 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/PassiveSource.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveSource.java @@ -1,4 +1,4 @@ -package org.radarcns.schema.specification.source.passive; +package org.radarcns.schema.specification.passive; /* * Copyright 2017 King's College London and The Hyve @@ -19,13 +19,13 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import org.radarcns.catalogue.SensorName; -import org.radarcns.schema.specification.source.Source; -import org.radarcns.schema.specification.util.Labels; -import org.radarcns.schema.specification.util.Utils; +import org.radarcns.schema.specification.Source; +import org.radarcns.schema.specification.Labels; import java.util.HashSet; import java.util.Objects; import java.util.Set; +import java.util.stream.Collectors; /** * TODO. @@ -58,6 +58,7 @@ public enum RadarSourceTypes { * @param processors TODO */ @JsonCreator + @SuppressWarnings("PMD.ExcessiveParameterList") public PassiveSource( @JsonProperty(Labels.VENDOR) String vendor, @JsonProperty(Labels.MODEL) String model, @@ -71,20 +72,18 @@ public PassiveSource( this.type = vendor + '_' + model; this.vendor = vendor; this.model = model; - this.appProvider = Objects.isNull(appProvider) - ? null : Utils.getProjectGroup() + appProvider; + this.appProvider = deduceProjectClass(appProvider); this.sensors = sensors; - this.processors = Objects.isNull(processors) ? new HashSet<>() : processors; + this.processors = processors == null ? new HashSet<>() : processors; topics = new HashSet<>(); - if (!this.sensors.isEmpty()) { - sensors.forEach(sensor -> topics.addAll(sensor.getTopic().getTopicNames())); - } - - if (!this.processors.isEmpty()) { - processors.forEach(proc -> topics.addAll(proc.getTopic().getTopicNames())); - } + topics.addAll(this.sensors.stream() + .flatMap(sensor -> sensor.getTopic().getTopicNames().stream()) + .collect(Collectors.toList())); + topics.addAll(this.processors.stream() + .flatMap(proc -> proc.getTopic().getTopicNames().stream()) + .collect(Collectors.toList())); } public String getType() { diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/Processor.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/Processor.java similarity index 89% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/Processor.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/Processor.java index a114be3f..aeb3f837 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/Processor.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/Processor.java @@ -1,4 +1,4 @@ -package org.radarcns.schema.specification.source.passive; +package org.radarcns.schema.specification.passive; /* * Copyright 2017 King's College London and The Hyve @@ -19,9 +19,9 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import org.radarcns.catalogue.ProcessingState; -import org.radarcns.schema.specification.source.KafkaActor; -import org.radarcns.schema.specification.source.Topic; -import org.radarcns.schema.specification.util.Labels; +import org.radarcns.schema.specification.KafkaActor; +import org.radarcns.schema.specification.Topic; +import org.radarcns.schema.specification.Labels; import java.util.Objects; @@ -46,6 +46,7 @@ public class Processor extends KafkaActor { * @param aggregator TODO */ @JsonCreator + @SuppressWarnings("PMD.ExcessiveParameterList") public Processor( @JsonProperty(Labels.NAME) String name, @JsonProperty(Labels.DOC) String doc, diff --git a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/Sensor.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/Sensor.java similarity index 80% rename from java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/Sensor.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/Sensor.java index aa7e2ab6..44e2031c 100644 --- a/java-sdk/radar-schemas-specifications/src/main/java/org/radarcns/schema/specification/source/passive/Sensor.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/Sensor.java @@ -1,4 +1,4 @@ -package org.radarcns.schema.specification.source.passive; +package org.radarcns.schema.specification.passive; /* * Copyright 2017 King's College London and The Hyve @@ -20,13 +20,14 @@ import com.fasterxml.jackson.annotation.JsonProperty; import org.radarcns.catalogue.ProcessingState; import org.radarcns.catalogue.SensorName; -import org.radarcns.schema.specification.source.KafkaActor; -import org.radarcns.schema.specification.source.Topic; -import org.radarcns.schema.specification.util.Labels; -import org.radarcns.schema.specification.util.Utils; +import org.radarcns.schema.specification.KafkaActor; +import org.radarcns.schema.specification.Topic; +import org.radarcns.schema.specification.Labels; import java.util.Objects; +import static org.radarcns.schema.specification.Source.deduceProjectClass; + /** * TODO. */ @@ -49,6 +50,7 @@ public class Sensor extends KafkaActor { * @param aggregator TODO */ @JsonCreator + @SuppressWarnings("PMD.ExcessiveParameterList") public Sensor( @JsonProperty(Labels.NAME) SensorName name, @JsonProperty(Labels.APP_PROVIDER) String appProvider, @@ -66,8 +68,7 @@ public Sensor( Objects.requireNonNull(name); this.name = name; - this.appProvider = Objects.isNull(appProvider) - ? null : Utils.getProjectGroup() + appProvider; + this.appProvider = deduceProjectClass(appProvider); } public String getAppProvider() { @@ -83,13 +84,12 @@ public boolean equals(Object o) { if (this == o) { return true; } - if (o == null || getClass() != o.getClass()) { + if (o == null || getClass() != o.getClass() || !super.equals(o)) { return false; } - if (!super.equals(o)) return false; Sensor sensor = (Sensor) o; - return name == sensor.name && - Objects.equals(appProvider, sensor.appProvider); + return name == sensor.name + && Objects.equals(appProvider, sensor.appProvider); } @Override diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SchemaRepository.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaRepository.java similarity index 100% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SchemaRepository.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaRepository.java diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SchemaValidator.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaValidator.java similarity index 62% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SchemaValidator.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaValidator.java index 55123785..b778799f 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SchemaValidator.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaValidator.java @@ -23,32 +23,89 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.IOException; +import java.nio.file.Files; import java.nio.file.Path; import java.util.Collection; import java.util.Objects; import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import static org.radarcns.schema.validation.SchemaRepository.COMMONS_PATH; import static org.radarcns.schema.validation.roles.SchemaValidationRoles.getActiveValidator; import static org.radarcns.schema.validation.roles.SchemaValidationRoles.getGeneralEnumValidator; import static org.radarcns.schema.validation.roles.SchemaValidationRoles.getGeneralRecordValidator; import static org.radarcns.schema.validation.roles.SchemaValidationRoles.getMonitorValidator; import static org.radarcns.schema.validation.roles.SchemaValidationRoles.getPassiveValidator; -final class SchemaValidator { +public class SchemaValidator { + public static final String AVRO_EXTENSION = "avsc"; private static final Logger LOGGER = LoggerFactory.getLogger(SchemaValidator.class); + private ExcludeConfig config; + + public SchemaValidator(ExcludeConfig config) { + this.config = config; + } + + /** + * TODO. + * @param scope TODO. + * @throws IOException TODO. + */ + public Collection analyseFiles(Scope scope) + throws IOException { + Schema.Parser parser = new Schema.Parser(); + return Files.walk(scope.getPath(COMMONS_PATH)) + .filter(Files::isRegularFile) + .filter(p -> !config.skipFile(p)) + .flatMap(p -> { + if (!isAvscFile(p)) { + return Stream.of(new ValidationException( + p.toAbsolutePath() + " is invalid. " + scope.getLower() + + " should contain only " + AVRO_EXTENSION + " files.")); + } + + try { + Schema schema = parser.parse(p.toFile()); + + if (config.contains(schema)) { + return validate(schema, p, scope, + config.isNameRecordEnable(schema), + config.skippedNameFieldCheck(schema)).stream(); + } else { + return validate(schema, p, scope).stream(); + } + } catch (IOException e) { + return Stream.of(new ValidationException( + "Cannot parse file " + p.toAbsolutePath(), e)); + } + }) + .collect(Collectors.toList()); + } + + /** + * TODO. + * @param file TODO + * @return TODO + */ + public static boolean isAvscFile(Path file) { + return ValidationSupport.matchesExtension(file, AVRO_EXTENSION); + } private SchemaValidator() { //Static class } - public static Collection validate(Schema schema, Path pathToSchema, Scope root) { + public static Collection validate(Schema schema, Path pathToSchema, + Scope root) { return validate(schema, pathToSchema, root, false, null); } - public static Collection validate(Schema schema, Path pathToSchema, Scope root, - boolean skipRecordName, Set skipFieldName) { + public static Collection validate(Schema schema, Path pathToSchema, + Scope root, boolean skipRecordName, Set skipFieldName) { Objects.requireNonNull(schema); Objects.requireNonNull(pathToSchema); Objects.requireNonNull(root); diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SpecificationsValidator.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SpecificationsValidator.java similarity index 100% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/SpecificationsValidator.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SpecificationsValidator.java diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationException.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/ValidationException.java similarity index 100% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationException.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/ValidationException.java diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationSupport.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/ValidationSupport.java similarity index 99% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationSupport.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/ValidationSupport.java index 966a172f..90203824 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/ValidationSupport.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/ValidationSupport.java @@ -34,7 +34,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import static org.radarcns.schema.specification.util.Utils.toSnakeCase; +import static org.radarcns.schema.specification.Utils.toSnakeCase; import static org.radarcns.schema.validation.SchemaRepository.COMMONS_PATH; import static org.radarcns.schema.validation.roles.SchemaValidationRoles.UNKNOWN; diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/config/ConfigItem.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/config/ConfigItem.java similarity index 100% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/config/ConfigItem.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/config/ConfigItem.java diff --git a/java-sdk/radar-schemas-validator/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 similarity index 99% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/config/ExcludeConfig.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/config/ExcludeConfig.java index e390e0d8..7082d17a 100644 --- a/java-sdk/radar-schemas-validator/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 @@ -53,7 +53,7 @@ public class ExcludeConfig { public static final String REPOSITORY_NAME = "/RADAR-Schemas/"; /** File path location. */ - private static final String FILE_NAME = "skip.yml"; + private static final String FILE_NAME = "schema.yml"; /** Wild card to suppress check for entire package. */ public static final String WILD_CARD_PACKAGE = ".*"; diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/ActiveSourceRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/ActiveSourceRoles.java similarity index 91% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/ActiveSourceRoles.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/ActiveSourceRoles.java index a7cadcee..ef1e0cbb 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/ActiveSourceRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/ActiveSourceRoles.java @@ -16,8 +16,8 @@ package org.radarcns.schema.validation.roles; -import org.radarcns.schema.specification.source.active.ActiveSource; -import org.radarcns.schema.specification.source.active.questionnaire.QuestionnaireSource; +import org.radarcns.schema.specification.active.ActiveSource; +import org.radarcns.schema.specification.active.questionnaire.QuestionnaireSource; import static org.radarcns.schema.validation.roles.Validator.validateNonNull; diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/AggregatableRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/AggregatableRoles.java similarity index 94% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/AggregatableRoles.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/AggregatableRoles.java index 4aa71122..70e2ae86 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/AggregatableRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/AggregatableRoles.java @@ -1,7 +1,7 @@ package org.radarcns.schema.validation.roles; -import org.radarcns.schema.specification.util.Utils; -import org.radarcns.schema.specification.source.Aggregatable; +import org.radarcns.schema.specification.Utils; +import org.radarcns.schema.specification.Aggregatable; import org.radarcns.schema.validation.ValidationSupport; import static org.radarcns.schema.validation.ValidationSupport.isValidClass; diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/MonitorRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/MonitorRoles.java similarity index 94% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/MonitorRoles.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/MonitorRoles.java index a85428b9..a25e26ac 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/MonitorRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/MonitorRoles.java @@ -1,7 +1,7 @@ package org.radarcns.schema.validation.roles; -import org.radarcns.schema.specification.source.MonitorSource; -import org.radarcns.schema.specification.util.Utils; +import org.radarcns.schema.specification.MonitorSource; +import org.radarcns.schema.specification.Utils; import java.nio.file.Path; import java.util.Collections; diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/PassiveSourceRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/PassiveSourceRoles.java similarity index 96% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/PassiveSourceRoles.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/PassiveSourceRoles.java index 56da46b9..f36378bf 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/PassiveSourceRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/PassiveSourceRoles.java @@ -17,8 +17,8 @@ package org.radarcns.schema.validation.roles; import org.radarcns.schema.specification.SourceCatalogue; -import org.radarcns.schema.specification.source.passive.PassiveSource; -import org.radarcns.schema.specification.util.Utils; +import org.radarcns.schema.specification.passive.PassiveSource; +import org.radarcns.schema.specification.Utils; import java.nio.file.Path; import java.util.Arrays; diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/ProcessorRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/ProcessorRoles.java similarity index 96% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/ProcessorRoles.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/ProcessorRoles.java index c7408207..db6d8a4a 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/ProcessorRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/ProcessorRoles.java @@ -18,7 +18,7 @@ import org.radarcns.catalogue.ProcessingState; import org.radarcns.catalogue.SensorName; -import org.radarcns.schema.specification.source.passive.Processor; +import org.radarcns.schema.specification.passive.Processor; import static org.radarcns.schema.validation.roles.Validator.validateNonNull; diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/QuestionRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/QuestionRoles.java similarity index 96% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/QuestionRoles.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/QuestionRoles.java index ac533720..062ca71f 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/QuestionRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/QuestionRoles.java @@ -17,7 +17,7 @@ */ import org.radarcns.catalogue.RadarWidget; -import org.radarcns.schema.specification.source.active.questionnaire.Question; +import org.radarcns.schema.specification.active.questionnaire.Question; import static org.radarcns.schema.validation.roles.Validator.validateNonNull; diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/QuestionnaireRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/QuestionnaireRoles.java similarity index 95% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/QuestionnaireRoles.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/QuestionnaireRoles.java index 06006231..a593a484 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/QuestionnaireRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/QuestionnaireRoles.java @@ -16,7 +16,7 @@ package org.radarcns.schema.validation.roles; -import org.radarcns.schema.specification.source.active.questionnaire.QuestionnaireSource; +import org.radarcns.schema.specification.active.questionnaire.QuestionnaireSource; import java.nio.file.Path; diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/ResponseRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/ResponseRoles.java similarity index 94% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/ResponseRoles.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/ResponseRoles.java index a13e53c4..e7ce7547 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/ResponseRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/ResponseRoles.java @@ -16,7 +16,7 @@ package org.radarcns.schema.validation.roles; -import org.radarcns.schema.specification.source.active.questionnaire.Response; +import org.radarcns.schema.specification.active.questionnaire.Response; import static org.radarcns.schema.validation.roles.Validator.validateNonNull; diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/SchemaValidationRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/SchemaValidationRoles.java similarity index 100% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/SchemaValidationRoles.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/SchemaValidationRoles.java diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/SensorRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/SensorRoles.java similarity index 97% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/SensorRoles.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/SensorRoles.java index 1a44b9c6..794eb329 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/SensorRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/SensorRoles.java @@ -18,7 +18,7 @@ import org.radarcns.catalogue.ProcessingState; import org.radarcns.catalogue.SensorName; -import org.radarcns.schema.specification.source.passive.Sensor; +import org.radarcns.schema.specification.passive.Sensor; import static org.radarcns.schema.validation.roles.PassiveSourceRoles.RADAR_PROVIDERS; import static org.radarcns.schema.validation.roles.Validator.validateNonNull; diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/TopicRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/TopicRoles.java similarity index 92% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/TopicRoles.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/TopicRoles.java index ea54acaf..2fd803a9 100644 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/TopicRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/TopicRoles.java @@ -16,8 +16,8 @@ package org.radarcns.schema.validation.roles; -import org.radarcns.schema.specification.source.Topic; -import org.radarcns.schema.specification.util.Utils; +import org.radarcns.schema.specification.Topic; +import org.radarcns.schema.specification.Utils; import org.radarcns.schema.validation.ValidationException; import org.radarcns.schema.validation.ValidationSupport; @@ -80,7 +80,8 @@ static Validator validateTopic() { static Validator> validateTopics() { return topics -> topics.stream() .filter(topic -> !isValidTopic(topic)) - .map(topic -> new ValidationException(TOPIC + ValidationSupport.isValidTopicVerbose(topic))) + .map(topic -> new ValidationException( + TOPIC + ValidationSupport.isValidTopicVerbose(topic))) .collect(Collectors.toList()); } } diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/Validator.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/Validator.java similarity index 100% rename from java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/roles/Validator.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/Validator.java diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/ActiveValidation.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/ActiveValidation.java similarity index 100% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/ActiveValidation.java rename to java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/ActiveValidation.java diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/ExcludeConfigTest.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/ExcludeConfigTest.java similarity index 100% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/ExcludeConfigTest.java rename to java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/ExcludeConfigTest.java diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/MonitorValidation.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/MonitorValidation.java similarity index 100% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/MonitorValidation.java rename to java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/MonitorValidation.java diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/PassiveValidation.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/PassiveValidation.java similarity index 97% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/PassiveValidation.java rename to java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/PassiveValidation.java index 41fd4e3d..7cf3dee2 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/PassiveValidation.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/PassiveValidation.java @@ -18,7 +18,7 @@ import org.junit.BeforeClass; import org.junit.Test; -import org.radarcns.schema.specification.source.passive.PassiveSource; +import org.radarcns.schema.specification.passive.PassiveSource; import java.io.IOException; import java.util.HashMap; diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java similarity index 59% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java rename to java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java index 536987c9..dcd94840 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java @@ -18,22 +18,75 @@ import org.apache.avro.Schema; import org.apache.avro.SchemaBuilder; +import org.junit.Before; import org.junit.Test; +import org.radarcns.schema.Scope; +import org.radarcns.schema.validation.config.ExcludeConfig; +import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Collection; +import java.util.stream.Collectors; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import static org.radarcns.schema.Scope.ACTIVE; +import static org.radarcns.schema.Scope.CATALOGUE; +import static org.radarcns.schema.Scope.KAFKA; import static org.radarcns.schema.Scope.MONITOR; +import static org.radarcns.schema.Scope.PASSIVE; import static org.radarcns.schema.validation.SchemaValidator.validate; /** * TODO. */ public class SchemaValidatorTest { + private SchemaValidator validator; + + @Before + public void setUp() { + ExcludeConfig config = ExcludeConfig.load(); + validator = new SchemaValidator(config); + } + + @Test + public void active() throws IOException { + testScope(ACTIVE); + } + + @Test + public void monitor() throws IOException { + testScope(MONITOR); + } + + @Test + public void passive() throws IOException { + testScope(PASSIVE); + } + + @Test + public void kafka() throws IOException { + testScope(KAFKA); + } + + @Test + public void catalogue() throws IOException { + testScope(CATALOGUE); + } + + private void testScope(Scope scope) throws IOException { + Collection results = validator.analyseFiles(scope); + if (!results.isEmpty()) { + String resultString = results.stream() + .map(r -> "\nValidation FAILED:\n" + r.getMessage() + "\n") + .collect(Collectors.joining()); + + fail(resultString); + } + } @Test public void testGetPath() { @@ -59,7 +112,7 @@ public void testEnumerator() { .doc(documentation) .symbols("CONNECTED", "DISCONNECTED", "UNKNOWN"); - Collection result =validate(schema, schemaPath, MONITOR); + Collection result = validate(schema, schemaPath, MONITOR); assertTrue(result.isEmpty()); diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SourceCatalogueValidation.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SourceCatalogueValidation.java similarity index 92% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SourceCatalogueValidation.java rename to java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SourceCatalogueValidation.java index 2e39b130..8b56b84a 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SourceCatalogueValidation.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SourceCatalogueValidation.java @@ -19,10 +19,10 @@ import org.junit.BeforeClass; import org.junit.Test; import org.radarcns.schema.specification.SourceCatalogue; -import org.radarcns.schema.specification.source.MonitorSource; -import org.radarcns.schema.specification.source.active.ActiveSource; -import org.radarcns.schema.specification.source.active.questionnaire.QuestionnaireSource; -import org.radarcns.schema.specification.source.passive.PassiveSource; +import org.radarcns.schema.specification.MonitorSource; +import org.radarcns.schema.specification.active.ActiveSource; +import org.radarcns.schema.specification.active.questionnaire.QuestionnaireSource; +import org.radarcns.schema.specification.passive.PassiveSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SpecificationsValidatorTest.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SpecificationsValidatorTest.java similarity index 100% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/SpecificationsValidatorTest.java rename to java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SpecificationsValidatorTest.java diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/roles/SchemaValidationRolesTest.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/roles/SchemaValidationRolesTest.java similarity index 98% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/roles/SchemaValidationRolesTest.java rename to java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/roles/SchemaValidationRolesTest.java index 72dd14d0..301f6124 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/roles/SchemaValidationRolesTest.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/roles/SchemaValidationRolesTest.java @@ -27,7 +27,6 @@ import java.nio.file.Paths; import java.util.Collection; import java.util.Collections; -import java.util.Optional; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -56,8 +55,6 @@ public class SchemaValidationRolesTest { private static final String RECORD_NAME_MOCK = "RecordName"; private static final String FIELD_NUMBER_MOCK = "Field1"; - private static final String INVALID_TEXT = " is invalid."; - @Test public void fileNameTest() { assertEquals("Questionnaire", @@ -133,7 +130,7 @@ public void nameSpaceTest() { assertNotNull(root); Path path = root.resolve("questionnaire/questionnaire.avsc"); - Collection result =validateNameSpace(path, ACTIVE).apply(schema); + Collection result = validateNameSpace(path, ACTIVE).apply(schema); assertTrue(result.isEmpty()); } @@ -149,7 +146,7 @@ public void nameSpaceInvalidDashTest() { Path root = MONITOR.getPath(COMMONS_PATH); assertNotNull(root); Path path = root.resolve("test/record_name.avsc"); - Collection result =validateNameSpace(path, MONITOR).apply(schema); + Collection result = validateNameSpace(path, MONITOR).apply(schema); assertFalse(result.isEmpty()); @@ -166,7 +163,7 @@ public void nameSpaceInvalidPlural() { Path root = MONITOR.getPath(COMMONS_PATH); assertNotNull(root); Path path = root.resolve("test/record_name.avsc"); - Collection result =validateNameSpace(path, MONITOR).apply(schema); + Collection result = validateNameSpace(path, MONITOR).apply(schema); assertFalse(result.isEmpty()); } @@ -183,7 +180,7 @@ public void nameSpaceInvalidLastPartPlural() { Path root = MONITOR.getPath(COMMONS_PATH); assertNotNull(root); Path path = root.resolve("test/record_name.avsc"); - Collection result =validateNameSpace(path, MONITOR).apply(schema); + Collection result = validateNameSpace(path, MONITOR).apply(schema); assertFalse(result.isEmpty()); } diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/util/TopicTest.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/util/TopicTest.java similarity index 98% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/util/TopicTest.java rename to java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/util/TopicTest.java index 55e46691..6bb58e0b 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/util/TopicTest.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/util/TopicTest.java @@ -17,7 +17,7 @@ */ import org.junit.Test; -import org.radarcns.schema.specification.source.Topic; +import org.radarcns.schema.specification.Topic; import java.util.HashSet; import java.util.Set; diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/util/UtilsTest.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/util/UtilsTest.java similarity index 96% rename from java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/util/UtilsTest.java rename to java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/util/UtilsTest.java index 83e7efb4..f19b31e5 100644 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/util/UtilsTest.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/util/UtilsTest.java @@ -23,7 +23,7 @@ import org.junit.Test; import org.radarcns.kafka.aggregator.AggregatorDouble; import org.radarcns.kafka.aggregator.AggregatorDoubleArray; -import org.radarcns.schema.specification.util.Utils; +import org.radarcns.schema.specification.Utils; /** * TODO. diff --git a/java-sdk/radar-schemas-validator/src/test/resources/key_measurement_test.avsc b/java-sdk/radar-schemas-tools/src/test/resources/key_measurement_test.avsc similarity index 100% rename from java-sdk/radar-schemas-validator/src/test/resources/key_measurement_test.avsc rename to java-sdk/radar-schemas-tools/src/test/resources/key_measurement_test.avsc diff --git a/java-sdk/radar-schemas-validator/src/test/resources/key_windowed_test.avsc b/java-sdk/radar-schemas-tools/src/test/resources/key_windowed_test.avsc similarity index 100% rename from java-sdk/radar-schemas-validator/src/test/resources/key_windowed_test.avsc rename to java-sdk/radar-schemas-tools/src/test/resources/key_windowed_test.avsc diff --git a/java-sdk/radar-schemas-validator/src/test/resources/logback.xml b/java-sdk/radar-schemas-tools/src/test/resources/logback.xml similarity index 100% rename from java-sdk/radar-schemas-validator/src/test/resources/logback.xml rename to java-sdk/radar-schemas-tools/src/test/resources/logback.xml diff --git a/java-sdk/radar-schemas-validator/src/test/resources/skip.yml b/java-sdk/radar-schemas-tools/src/test/resources/schema.yml similarity index 100% rename from java-sdk/radar-schemas-validator/src/test/resources/skip.yml rename to java-sdk/radar-schemas-tools/src/test/resources/schema.yml diff --git a/java-sdk/radar-schemas-validator/config/checkstyle/checkstyle.xml b/java-sdk/radar-schemas-validator/config/checkstyle/checkstyle.xml deleted file mode 100644 index b9f3a458..00000000 --- a/java-sdk/radar-schemas-validator/config/checkstyle/checkstyle.xml +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/java-sdk/radar-schemas-validator/config/intellij-java-google-style.xml b/java-sdk/radar-schemas-validator/config/intellij-java-google-style.xml deleted file mode 100644 index 70c15157..00000000 --- a/java-sdk/radar-schemas-validator/config/intellij-java-google-style.xml +++ /dev/null @@ -1,596 +0,0 @@ - - - - - -

    - - - - xmlns:android - - ^$ - - - -
    -
    - - - - xmlns:.* - - ^$ - - - BY_NAME - -
    -
    - - - - .*:id - - http://schemas.android.com/apk/res/android - - - -
    -
    - - - - style - - ^$ - - - -
    -
    - - - - .* - - ^$ - - - BY_NAME - -
    -
    - - - - .*:.*Style - - http://schemas.android.com/apk/res/android - - - BY_NAME - -
    -
    - - - - .*:layout_width - - http://schemas.android.com/apk/res/android - - - -
    -
    - - - - .*:layout_height - - http://schemas.android.com/apk/res/android - - - -
    -
    - - - - .*:layout_weight - - http://schemas.android.com/apk/res/android - - - -
    -
    - - - - .*:layout_margin - - http://schemas.android.com/apk/res/android - - - -
    -
    - - - - .*:layout_marginTop - - http://schemas.android.com/apk/res/android - - - -
    -
    - - - - .*:layout_marginBottom - - http://schemas.android.com/apk/res/android - - - -
    -
    - - - - .*:layout_marginStart - - http://schemas.android.com/apk/res/android - - - -
    -
    - - - - .*:layout_marginEnd - - http://schemas.android.com/apk/res/android - - - -
    -
    - - - - .*:layout_marginLeft - - http://schemas.android.com/apk/res/android - - - -
    -
    - - - - .*:layout_marginRight - - http://schemas.android.com/apk/res/android - - - -
    -
    - - - - .*:layout_.* - - http://schemas.android.com/apk/res/android - - - BY_NAME - -
    -
    - - - - .*:padding - - http://schemas.android.com/apk/res/android - - - -
    -
    - - - - .*:paddingTop - - http://schemas.android.com/apk/res/android - - - -
    -
    - - - - .*:paddingBottom - - http://schemas.android.com/apk/res/android - - - -
    -
    - - - - .*:paddingStart - - http://schemas.android.com/apk/res/android - - - -
    -
    - - - - .*:paddingEnd - - http://schemas.android.com/apk/res/android - - - -
    -
    - - - - .*:paddingLeft - - http://schemas.android.com/apk/res/android - - - -
    -
    - - - - .*:paddingRight - - http://schemas.android.com/apk/res/android - - - -
    -
    - - - - .* - http://schemas.android.com/apk/res/android - - - BY_NAME - -
    -
    - - - - .* - http://schemas.android.com/apk/res-auto - - - BY_NAME - -
    -
    - - - - .* - http://schemas.android.com/tools - - - BY_NAME - -
    -
    - - - - .* - .* - - - BY_NAME - -
    - - - - - - - - - - diff --git a/java-sdk/radar-schemas-validator/config/pmd/ruleset.xml b/java-sdk/radar-schemas-validator/config/pmd/ruleset.xml deleted file mode 100644 index d7b23e4c..00000000 --- a/java-sdk/radar-schemas-validator/config/pmd/ruleset.xml +++ /dev/null @@ -1,89 +0,0 @@ - - - - - This ruleset was parsed from the Codacy default codestyle. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/AvroValidator.java b/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/AvroValidator.java deleted file mode 100644 index 3e33eda3..00000000 --- a/java-sdk/radar-schemas-validator/src/main/java/org/radarcns/schema/validation/AvroValidator.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.radarcns.schema.validation; - -import org.apache.avro.Schema; -import org.apache.avro.Schema.Parser; -import org.radarcns.schema.Scope; -import org.radarcns.schema.validation.config.ExcludeConfig; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Collection; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static org.radarcns.schema.validation.SchemaRepository.COMMONS_PATH; - -public final class AvroValidator { - public static final String AVRO_EXTENSION = "avsc"; - private ExcludeConfig config; - - public AvroValidator(ExcludeConfig config) { - this.config = config; - } - - /** - * TODO. - * @param scope TODO. - * @throws IOException TODO. - */ - public Collection analyseFiles(Scope scope) - throws IOException { - Parser parser = new Parser(); - return Files.walk(scope.getPath(COMMONS_PATH)) - .filter(Files::isRegularFile) - .filter(p -> !config.skipFile(p)) - .flatMap(p -> { - if (!isAvscFile(p)) { - return Stream.of(new ValidationException( - p.toAbsolutePath() + " is invalid. " + scope.getLower() - + " should contain only " + AVRO_EXTENSION + " files.")); - } - - try { - Schema schema = parser.parse(p.toFile()); - - if (config.contains(schema)) { - return SchemaValidator.validate(schema, p, scope, - config.isNameRecordEnable(schema), - config.skippedNameFieldCheck(schema)).stream(); - } else { - return SchemaValidator.validate(schema, p, scope).stream(); - } - } catch (IOException e) { - return Stream.of(new ValidationException( - "Cannot parse file " + p.toAbsolutePath(), e)); - } - }) - .collect(Collectors.toList()); - } - - /** - * TODO. - * @param file TODO - * @return TODO - */ - public static boolean isAvscFile(Path file) { - return ValidationSupport.matchesExtension(file, AVRO_EXTENSION); - } -} diff --git a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/AvroValidatorTest.java b/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/AvroValidatorTest.java deleted file mode 100644 index 6ff8e496..00000000 --- a/java-sdk/radar-schemas-validator/src/test/java/org/radarcns/schema/validation/AvroValidatorTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package org.radarcns.schema.validation; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.junit.Before; -import org.junit.Test; -import org.radarcns.schema.Scope; -import org.radarcns.schema.validation.config.ExcludeConfig; - -import java.io.IOException; -import java.util.Collection; -import java.util.stream.Collectors; - -import static org.junit.Assert.fail; - -public class AvroValidatorTest { - private AvroValidator validator; - - @Before - public void setUp() { - ExcludeConfig config = ExcludeConfig.load(); - validator = new AvroValidator(config); - } - - @Test - public void active() throws IOException { - testScope(Scope.ACTIVE); - } - - @Test - public void monitor() throws IOException { - testScope(Scope.MONITOR); - } - - @Test - public void passive() throws IOException { - testScope(Scope.PASSIVE); - } - - @Test - public void kafka() throws IOException { - testScope(Scope.KAFKA); - } - - @Test - public void catalogue() throws IOException { - testScope(Scope.CATALOGUE); - } - - private void testScope(Scope scope) throws IOException { - Collection results = validator.analyseFiles(scope); - if (!results.isEmpty()) { - String resultString = results.stream() - .map(r -> "\nValidation FAILED:\n" + r.getMessage() + "\n") - .collect(Collectors.joining()); - - fail(resultString); - } - } -} diff --git a/java-sdk/settings.gradle b/java-sdk/settings.gradle index f8129cca..85b666dd 100644 --- a/java-sdk/settings.gradle +++ b/java-sdk/settings.gradle @@ -1,6 +1,5 @@ rootProject.name = 'radar-schemas' -include ':radar-schemas-validator' +include ':radar-schemas-tools' include ':radar-schemas-commons' include ':radar-schemas-restapi' -include ':radar-schemas-specifications' From db1b9bc5c5d9ab48248cc1e62520fdc957c35d63 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Thu, 14 Sep 2017 15:51:24 +0200 Subject: [PATCH 063/112] Fixed some tests --- commons/passive/phone/phone_sms_unread.avsc | 2 +- java-sdk/build.gradle | 1 + java-sdk/radar-schemas-tools/build.gradle | 31 +--- .../config/pmd/ruleset.xml | 2 +- .../org/radarcns/schema/CommandLineApp.java | 160 +++++++++++++++--- .../{validation => }/SchemaRepository.java | 12 +- .../radarcns/schema/specification/Source.java | 6 +- .../schema/specification/SourceCatalogue.java | 12 +- .../radarcns/schema/specification/Topic.java | 1 + .../schema/{specification => util}/Utils.java | 6 +- .../schema/validation/SchemaValidator.java | 42 +++-- .../validation/SpecificationsValidator.java | 8 +- .../schema/validation/ValidationSupport.java | 34 +--- .../validation/config/ExcludeConfig.java | 26 ++- .../validation/roles/AggregatableRoles.java | 2 +- .../schema/validation/roles/MonitorRoles.java | 2 +- .../validation/roles/PassiveSourceRoles.java | 2 +- .../roles/SchemaValidationRoles.java | 136 ++++++++------- .../schema/validation/roles/TopicRoles.java | 2 +- .../schema/validation/ActiveValidation.java | 2 +- .../schema/validation/MonitorValidation.java | 2 +- .../schema/validation/PassiveValidation.java | 2 +- .../validation/SchemaValidatorTest.java | 14 +- .../SpecificationsValidatorTest.java | 7 +- .../roles/SchemaValidationRolesTest.java | 26 +-- .../schema/validation/util/UtilsTest.java | 2 +- 26 files changed, 321 insertions(+), 221 deletions(-) rename java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/{validation => }/SchemaRepository.java (74%) rename java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/{specification => util}/Utils.java (93%) diff --git a/commons/passive/phone/phone_sms_unread.avsc b/commons/passive/phone/phone_sms_unread.avsc index 7fa77c4e..a8cbbac0 100644 --- a/commons/passive/phone/phone_sms_unread.avsc +++ b/commons/passive/phone/phone_sms_unread.avsc @@ -6,6 +6,6 @@ "fields": [ { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, { "name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, - { "name": "unreadSMS", "type": "int", "doc": "number of unread SMS messages currently in the inbox." } + { "name": "unreadSms", "type": "int", "doc": "number of unread SMS messages currently in the inbox." } ] } diff --git a/java-sdk/build.gradle b/java-sdk/build.gradle index 361893dc..fb86ba46 100644 --- a/java-sdk/build.gradle +++ b/java-sdk/build.gradle @@ -32,6 +32,7 @@ subprojects { // dependencies repositories { jcenter() + mavenCentral() } dependencies { diff --git a/java-sdk/radar-schemas-tools/build.gradle b/java-sdk/radar-schemas-tools/build.gradle index 3d31f742..651eafd9 100644 --- a/java-sdk/radar-schemas-tools/build.gradle +++ b/java-sdk/radar-schemas-tools/build.gradle @@ -27,37 +27,16 @@ dependencies { implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.8.10' implementation project(':radar-schemas-commons') implementation group: 'org.radarcns', name: 'radar-commons', version: '0.5' + implementation group: 'net.sourceforge.argparse4j', name: 'argparse4j', version: '0.7.0' - testCompile group: 'junit', name: 'junit', version: junitVersion - testCompile group: 'org.slf4j', name: 'slf4j-simple', version: slf4jVersion -} + runtimeOnly group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25' -//---------------------------------------------------------------------------// -// Exchange configuration with Java code // -//---------------------------------------------------------------------------// -ext.exchnageConfigPath = 'src/test/resources/gradle.properties' -task exchangeConfig() { - doLast { - if (!file(exchnageConfigPath).exists() || file(exchnageConfigPath).delete()) { - file(exchnageConfigPath).createNewFile() - file(exchnageConfigPath).write("project.group=${project.group}") - } else { - throw new GradleException("Error while creating file at ${exchnageConfigPath}") - } - } + testCompile group: 'junit', name: 'junit', version: junitVersion } -compileJava.dependsOn exchangeConfig -task cleanExchangeConfig() { - doLast { - if (file(exchnageConfigPath).exists()) { - if (!file(exchnageConfigPath).delete()) { - throw new GradleException("File at ${exchnageConfigPath} cannot be delated.") - } - } - } +task createStartScripts(type: CreateStartScripts) { + applicationName = 'radar-schema' } -clean.dependsOn cleanExchangeConfig //---------------------------------------------------------------------------// // Test definition // diff --git a/java-sdk/radar-schemas-tools/config/pmd/ruleset.xml b/java-sdk/radar-schemas-tools/config/pmd/ruleset.xml index d7b23e4c..8821c0b9 100644 --- a/java-sdk/radar-schemas-tools/config/pmd/ruleset.xml +++ b/java-sdk/radar-schemas-tools/config/pmd/ruleset.xml @@ -86,4 +86,4 @@ - \ No newline at end of file + diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java index d238f266..2bd56f3f 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java @@ -1,5 +1,3 @@ -package org.radarcns.schema; - /* * Copyright 2017 King's College London and The Hyve * @@ -16,30 +14,44 @@ * limitations under the License. */ -import java.io.IOException; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; +package org.radarcns.schema; +import net.sourceforge.argparse4j.ArgumentParsers; +import net.sourceforge.argparse4j.impl.Arguments; +import net.sourceforge.argparse4j.inf.ArgumentParser; +import net.sourceforge.argparse4j.inf.ArgumentParserException; +import net.sourceforge.argparse4j.inf.Namespace; +import net.sourceforge.argparse4j.inf.Subparser; +import net.sourceforge.argparse4j.inf.Subparsers; import org.radarcns.schema.specification.KafkaActor; import org.radarcns.schema.specification.MonitorSource; import org.radarcns.schema.specification.SourceCatalogue; import org.radarcns.schema.specification.Topic; import org.radarcns.schema.specification.active.ActiveSource; import org.radarcns.schema.specification.active.questionnaire.QuestionnaireSource; +import org.radarcns.schema.specification.passive.PassiveSource; import org.radarcns.schema.specification.passive.Processor; import org.radarcns.schema.specification.passive.Sensor; -import org.radarcns.schema.specification.passive.PassiveSource; +import org.radarcns.schema.validation.SchemaValidator; +import org.radarcns.schema.validation.ValidationException; +import org.radarcns.schema.validation.config.ExcludeConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; + /** * TODO. */ @@ -47,8 +59,10 @@ public class CommandLineApp { private static final Logger logger = LoggerFactory.getLogger(CommandLineApp.class); private final SourceCatalogue catalogue; + private final Path root; public CommandLineApp(Path root) throws IOException { + this.root = root; this.catalogue = SourceCatalogue.load(root); } @@ -56,8 +70,8 @@ public CommandLineApp(Path root) throws IOException { * TODO. * @return TODO */ - public Set getTopicsToCreate() { - Set set = new HashSet<>(); + public SortedSet getTopicsToCreate() { + SortedSet set = new TreeSet<>(); for (Topic topic : getAllTopics()) { set.add(topic.getInputTopic()); @@ -138,6 +152,7 @@ private Set getAllTopics() { * @return TODO */ public String getTopicsVerbose(boolean reduced, String source) { + logger.info("Topic list {} {}", reduced, source); StringBuilder result = new StringBuilder(); Map> map = getTopicsInfoVerbose(reduced); @@ -146,7 +161,7 @@ public String getTopicsVerbose(boolean reduced, String source) { Collections.sort(rootKeys); for (String key : rootKeys) { - if (Objects.isNull(source) || key.equalsIgnoreCase(source)) { + if (source == null || key.equalsIgnoreCase(source)) { result.append(key).append('\n'); List firstLevelKeys = new ArrayList<>(map.get(key).keySet()); @@ -154,7 +169,9 @@ public String getTopicsVerbose(boolean reduced, String source) { for (String details : firstLevelKeys) { result.append('\t').append(details); - result.append("\n\t\t").append(map.get(key).get(details)); + result.append("\n\t\t") + .append(map.get(key).get(details) + .replace("\n", "\n\t\t")); } result.append('\n'); } @@ -202,20 +219,115 @@ private Map> getTopicsInfoVerbose(boolean reduced) { return map; } + + public String validateSchemas(String scopeString, String configSubPath) throws IOException { + Path configPath = null; + if (configSubPath != null) { + if (configSubPath.charAt(0) == '/') { + configPath = Paths.get(configSubPath); + } else { + configPath = root.resolve(configSubPath); + } + } + ExcludeConfig config = ExcludeConfig.load(configPath); + SchemaValidator validator = new SchemaValidator(root, config); + StringBuilder result = new StringBuilder(); + if (scopeString == null) { + for (Scope scope : Scope.values()) { + Collection results = validator.analyseFiles(scope); + for (ValidationException ex : results) { + result.append("Validation FAILED:\n") + .append(ex.getMessage()).append("\n\n"); + } + } + } else { + Scope scope = Scope.valueOf(scopeString); + Collection results = validator.analyseFiles(scope); + for (ValidationException ex : results) { + result.append("Validation FAILED:\n") + .append(ex.getMessage()).append("\n\n"); + } + } + return result.toString(); + } + @SuppressWarnings("PMD.SystemPrintln") public static void main(String... args) { - if (args.length < 1) { - System.err.println("Usage: app ROOT_DIRECTORY"); + ArgumentParser parser = ArgumentParsers.newArgumentParser("radar-schema") + .defaultHelp(true) + .description("Validate and list schema specifications"); + + Subparsers subParsers = parser.addSubparsers().dest("subparser"); + Subparser validateParser = subParsers.addParser("validate", true) + .description("Validate a set of specifications"); + validateParser.addArgument("root") + .nargs("?") + .help("Root schemas directory with a specifications and commons directory") + .setDefault("."); + validateParser.addArgument("-s", "--scope") + .help("Type of specifications to validate") + .choices(Scope.values()); + validateParser.addArgument("-c", "--config") + .help("Configuration file to use"); + + Subparser listParser = subParsers.addParser("list", true) + .description("list topics and schemas"); + listParser.addArgument("root") + .nargs("?") + .help("Root schemas directory with a specifications and commons directory") + .setDefault("."); + listParser.addArgument("-r", "--raw") + .help("List raw input topics") + .action(Arguments.storeTrue()); + listParser.addArgument("-q", "--quiet") + .help("Only print the requested topics") + .action(Arguments.storeTrue()); + listParser.addArgument("-m", "--match") + .help("Only print the requested topics"); + listParser.addArgument("-S", "--stream") + .help("List the output topics of Kafka Streams") + .action(Arguments.storeTrue()); + + Namespace ns = null; + try { + ns = parser.parseArgs(args); + } catch (ArgumentParserException e) { + parser.handleError(e); System.exit(1); } + CommandLineApp app = null; try { - app = new CommandLineApp(Paths.get(args[0])); + app = new CommandLineApp(Paths.get(ns.getString("root")).toAbsolutePath()); } catch (IOException e) { - logger.error("Failed to load catalog from first argument."); + logger.error("Failed to load catalog from root."); System.exit(1); } - System.out.println(app.getTopicsToCreate()); + switch (ns.getString("subparser")) { + case "list": + if (ns.getBoolean("raw")) { + System.out.println(String.join("\n", app.getRawTopics())); + } else if (ns.getBoolean("stream")) { + System.out.println(String.join("\n", app.getResultsCacheTopics())); + } else if (ns.getBoolean("quiet")) { + System.out.println(String.join("\n", app.getTopicsToCreate())); + } else { + System.out.println(app.getTopicsVerbose(false, ns.getString("match"))); + } + break; + case "validate": + try { + System.out.println(app.validateSchemas( + ns.getString("scope"), ns.getString("config"))); + } catch (IOException e) { + logger.error("Failed to load schemas", e); + } + break; + default: + parser.handleError(new ArgumentParserException( + "Subcommand " + ns.getString("subparser") + " not implemented", + parser)); + break; + } } - } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaRepository.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/SchemaRepository.java similarity index 74% rename from java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaRepository.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/SchemaRepository.java index 65863ca4..d76ca520 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaRepository.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/SchemaRepository.java @@ -1,5 +1,3 @@ -package org.radarcns.schema.validation; - /* * Copyright 2017 King's College London and The Hyve * @@ -16,8 +14,7 @@ * limitations under the License. */ -import java.nio.file.Path; -import java.nio.file.Paths; +package org.radarcns.schema; /** * Checks the schema catalog. @@ -44,10 +41,9 @@ */ public final class SchemaRepository { - public static final Path PROJECT_ROOT = Paths.get("../..").toAbsolutePath(); - public static final Path COMMONS_PATH = PROJECT_ROOT.resolve("commons"); - public static final Path REST_API_PATH = PROJECT_ROOT.resolve("restapi"); - public static final Path SPECIFICATIONS_PATH = PROJECT_ROOT.resolve("specifications"); + public static final String COMMONS_PATH = "commons"; + public static final String REST_API_PATH = "restapi"; + public static final String SPECIFICATIONS_PATH = "specifications"; private SchemaRepository() { // utility class diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Source.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Source.java index bfb287e8..f6f1a52c 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Source.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Source.java @@ -1,5 +1,3 @@ -package org.radarcns.schema.specification; - /* * Copyright 2017 King's College London and The Hyve * @@ -16,6 +14,10 @@ * limitations under the License. */ +package org.radarcns.schema.specification; + +import org.radarcns.schema.util.Utils; + import java.util.Objects; import java.util.Set; diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java index 42300699..42113782 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java @@ -1,5 +1,3 @@ -package org.radarcns.schema.specification; - /* * Copyright 2017 King's College London and The Hyve * @@ -16,6 +14,8 @@ * limitations under the License. */ +package org.radarcns.schema.specification; + import org.radarcns.config.YamlConfigLoader; import org.radarcns.schema.Scope; import org.radarcns.schema.specification.active.ActiveSource; @@ -56,7 +56,7 @@ public class SourceCatalogue { private final Set sources; - // package private for testing + @SuppressWarnings("WeakerAccess") SourceCatalogue(Map activeSources, Map monitorSources, Map passiveSources) { @@ -188,8 +188,8 @@ public PassiveSource getPassiveSource(String type) { * @return TODO */ public Set getTopics() { - Set set = new HashSet<>(); - sources.forEach(source -> set.addAll(source.getTopics())); - return set; + return sources.stream() + .flatMap(source -> source.getTopics().stream()) + .collect(Collectors.toSet()); } } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Topic.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Topic.java index 23688a7a..7e22f59b 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Topic.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Topic.java @@ -17,6 +17,7 @@ package org.radarcns.schema.specification; import org.radarcns.catalogue.TimeFrame; +import org.radarcns.schema.util.Utils; import java.util.HashSet; import java.util.Objects; diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Utils.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/Utils.java similarity index 93% rename from java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Utils.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/Utils.java index 733e7f1c..13212a3b 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Utils.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/Utils.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.radarcns.schema.specification; +package org.radarcns.schema.util; import org.radarcns.kafka.aggregator.AggregatorDouble; import org.radarcns.kafka.aggregator.AggregatorDoubleArray; @@ -60,13 +60,13 @@ public static synchronized String getProjectGroup() { try (InputStream in = loader.getResourceAsStream(GRADLE_PROPERTIES)) { if (in == null) { projectGroup = "org.radarcns"; - logger.warn("Project group not specified. Using \"{}\".", projectGroup); + logger.debug("Project group not specified. Using \"{}\".", projectGroup); } else { prop.load(in); projectGroup = prop.getProperty(GROUP_PROPERTY); if (projectGroup == null) { projectGroup = "org.radarcns"; - logger.warn("Project group not specified. Using \"{}\".", projectGroup); + logger.debug("Project group not specified. Using \"{}\".", projectGroup); } } } catch (IOException exc) { diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaValidator.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaValidator.java index b778799f..7ce6f91d 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaValidator.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaValidator.java @@ -32,7 +32,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static org.radarcns.schema.validation.SchemaRepository.COMMONS_PATH; +import static org.radarcns.schema.SchemaRepository.COMMONS_PATH; import static org.radarcns.schema.validation.roles.SchemaValidationRoles.getActiveValidator; import static org.radarcns.schema.validation.roles.SchemaValidationRoles.getGeneralEnumValidator; import static org.radarcns.schema.validation.roles.SchemaValidationRoles.getGeneralRecordValidator; @@ -43,10 +43,12 @@ public class SchemaValidator { public static final String AVRO_EXTENSION = "avsc"; private static final Logger LOGGER = LoggerFactory.getLogger(SchemaValidator.class); - private ExcludeConfig config; + private final Path root; + private final ExcludeConfig config; - public SchemaValidator(ExcludeConfig config) { + public SchemaValidator(Path root, ExcludeConfig config) { this.config = config; + this.root = root; } /** @@ -57,7 +59,7 @@ public SchemaValidator(ExcludeConfig config) { public Collection analyseFiles(Scope scope) throws IOException { Schema.Parser parser = new Schema.Parser(); - return Files.walk(scope.getPath(COMMONS_PATH)) + return Files.walk(scope.getPath(root.resolve(COMMONS_PATH))) .filter(Files::isRegularFile) .filter(p -> !config.skipFile(p)) .flatMap(p -> { @@ -94,52 +96,48 @@ public static boolean isAvscFile(Path file) { return ValidationSupport.matchesExtension(file, AVRO_EXTENSION); } - private SchemaValidator() { - //Static class - } - - public static Collection validate(Schema schema, Path pathToSchema, - Scope root) { - return validate(schema, pathToSchema, root, + public Collection validate(Schema schema, Path pathToSchema, + Scope scope) { + return validate(schema, pathToSchema, scope, false, null); } - public static Collection validate(Schema schema, Path pathToSchema, - Scope root, boolean skipRecordName, Set skipFieldName) { + public Collection validate(Schema schema, Path pathToSchema, + Scope scope, boolean skipRecordName, Set skipFieldName) { Objects.requireNonNull(schema); Objects.requireNonNull(pathToSchema); - Objects.requireNonNull(root); + Objects.requireNonNull(scope); Collection result; if (schema.getType().equals(Type.ENUM)) { - result = getGeneralEnumValidator(pathToSchema, root, + result = getGeneralEnumValidator(root, pathToSchema, scope, skipRecordName).apply(schema); } else { - switch (root) { + switch (scope) { case ACTIVE: - result = getActiveValidator(pathToSchema, root, skipRecordName, + result = getActiveValidator(root, pathToSchema, scope, skipRecordName, skipFieldName).apply(schema); break; case CATALOGUE: - result = getGeneralRecordValidator(pathToSchema, root, + result = getGeneralRecordValidator(root, pathToSchema, scope, skipRecordName, skipFieldName).apply(schema); break; case KAFKA: - result = getGeneralRecordValidator(pathToSchema, root, + result = getGeneralRecordValidator(root, pathToSchema, scope, skipRecordName, skipFieldName).apply(schema); break; case MONITOR: - result = getMonitorValidator(pathToSchema, root, skipRecordName, + result = getMonitorValidator(root, pathToSchema, scope, skipRecordName, skipFieldName).apply(schema); break; case PASSIVE: - result = getPassiveValidator(pathToSchema, root, skipRecordName, + result = getPassiveValidator(root, pathToSchema, scope, skipRecordName, skipFieldName).apply(schema); break; default: LOGGER.warn("Applying general validation to {}", getPath(pathToSchema)); - result = getGeneralRecordValidator(pathToSchema, root, skipRecordName, + result = getGeneralRecordValidator(root, pathToSchema, scope, skipRecordName, skipFieldName).apply(schema); break; } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SpecificationsValidator.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SpecificationsValidator.java index ea20b00c..527f5220 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SpecificationsValidator.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SpecificationsValidator.java @@ -23,7 +23,7 @@ import java.nio.file.Files; import java.nio.file.Path; -import static org.radarcns.schema.validation.SchemaRepository.SPECIFICATIONS_PATH; +import static org.radarcns.schema.SchemaRepository.SPECIFICATIONS_PATH; /** * TODO. @@ -31,13 +31,15 @@ public class SpecificationsValidator { public static final String YML_EXTENSION = "yml"; private final ExcludeConfig config; + private final Path root; - public SpecificationsValidator(ExcludeConfig config) { + public SpecificationsValidator(Path root, ExcludeConfig config) { + this.root = root; this.config = config; } public boolean specificationsAreYmlFiles(Scope scope) throws IOException { - return Files.walk(scope.getPath(SPECIFICATIONS_PATH)) + return Files.walk(scope.getPath(root.resolve(SPECIFICATIONS_PATH))) .filter(Files::isRegularFile) .filter(p -> !config.skipFile(p)) .allMatch(SpecificationsValidator::isYmlFile); diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/ValidationSupport.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/ValidationSupport.java index 90203824..9da65c8d 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/ValidationSupport.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/ValidationSupport.java @@ -22,20 +22,19 @@ import org.apache.avro.Schema.Type; import org.radarcns.schema.Scope; -import java.io.IOException; import java.nio.file.Path; import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Objects; -import java.util.Properties; import java.util.function.Predicate; import java.util.regex.Matcher; import java.util.regex.Pattern; -import static org.radarcns.schema.specification.Utils.toSnakeCase; -import static org.radarcns.schema.validation.SchemaRepository.COMMONS_PATH; +import static org.radarcns.schema.SchemaRepository.COMMONS_PATH; +import static org.radarcns.schema.util.Utils.getProjectGroup; +import static org.radarcns.schema.util.Utils.toSnakeCase; import static org.radarcns.schema.validation.roles.SchemaValidationRoles.UNKNOWN; /** @@ -64,9 +63,6 @@ public String getName() { } } - private static final String GRADLE_PROPERTIES = "gradle.properties"; - private static final String PROPERTY_VALUE = "project.group"; - private static String projectGroup; // snake case private static final Pattern TOPIC_PATTERN = Pattern.compile( "[A-Za-z][a-z0-9-]*(_[A-Za-z0-9-]+)*"); @@ -75,34 +71,14 @@ private ValidationSupport() { //Static class } - /** - * TODO. - * @return TODO - */ - public static String getProjectGroup() { - if (Objects.isNull(projectGroup)) { - try { - Properties prop = new Properties(); - prop.load(ValidationSupport.class.getClassLoader().getResourceAsStream( - GRADLE_PROPERTIES)); - projectGroup = prop.getProperty(PROPERTY_VALUE); - } catch (IOException exc) { - throw new IllegalStateException(PROPERTY_VALUE - + " cannot be extracted from " + GRADLE_PROPERTIES, exc); - } - } - - return projectGroup; - } - /** * TODO. * @param scope TODO * @return TODO */ - public static String getNamespace(Path schemaPath, Scope scope) { + public static String getNamespace(Path root, Path schemaPath, Scope scope) { // add subfolder of root to namespace - Path rootPath = scope.getPath(COMMONS_PATH); + Path rootPath = scope.getPath(root.resolve(COMMONS_PATH)); if (rootPath == null) { throw new IllegalArgumentException("Scope " + scope + " does not have a commons path"); } 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 7082d17a..ae562c00 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 @@ -19,12 +19,14 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectReader; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import org.apache.avro.Schema; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; +import java.io.InputStream; import java.nio.file.FileSystem; import java.nio.file.FileSystems; import java.nio.file.Path; @@ -72,14 +74,22 @@ public ExcludeConfig() { } /** Load the ExcludeConfig from file. */ - public static ExcludeConfig load() { - try { - YAMLFactory factory = new YAMLFactory(); - return new ObjectMapper(factory) - .readerFor(ExcludeConfig.class) - .readValue(ExcludeConfig.class.getClassLoader().getResourceAsStream(FILE_NAME)); - } catch (IOException exc) { - throw new ExceptionInInitializerError(exc); + public static ExcludeConfig load(Path path) throws IOException { + YAMLFactory factory = new YAMLFactory(); + ObjectReader reader = new ObjectMapper(factory) + .readerFor(ExcludeConfig.class); + if (path == null) { + ClassLoader loader = ExcludeConfig.class.getClassLoader(); + try (InputStream in = loader.getResourceAsStream(FILE_NAME)) { + if (in == null) { + logger.debug("Not loading any configuration"); + return new ExcludeConfig(); + } else { + return reader.readValue(in); + } + } + } else { + return reader.readValue(path.toFile()); } } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/AggregatableRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/AggregatableRoles.java index 70e2ae86..eb18144f 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/AggregatableRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/AggregatableRoles.java @@ -1,6 +1,6 @@ package org.radarcns.schema.validation.roles; -import org.radarcns.schema.specification.Utils; +import org.radarcns.schema.util.Utils; import org.radarcns.schema.specification.Aggregatable; import org.radarcns.schema.validation.ValidationSupport; diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/MonitorRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/MonitorRoles.java index a25e26ac..102aca7b 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/MonitorRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/MonitorRoles.java @@ -1,7 +1,7 @@ package org.radarcns.schema.validation.roles; import org.radarcns.schema.specification.MonitorSource; -import org.radarcns.schema.specification.Utils; +import org.radarcns.schema.util.Utils; import java.nio.file.Path; import java.util.Collections; diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/PassiveSourceRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/PassiveSourceRoles.java index f36378bf..d043e818 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/PassiveSourceRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/PassiveSourceRoles.java @@ -18,7 +18,7 @@ import org.radarcns.schema.specification.SourceCatalogue; import org.radarcns.schema.specification.passive.PassiveSource; -import org.radarcns.schema.specification.Utils; +import org.radarcns.schema.util.Utils; import java.nio.file.Path; import java.util.Arrays; diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/SchemaValidationRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/SchemaValidationRoles.java index 30bbaca7..cba6ad2a 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/SchemaValidationRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/SchemaValidationRoles.java @@ -19,6 +19,7 @@ import org.apache.avro.Schema; import org.apache.avro.Schema.Type; import org.radarcns.schema.Scope; +import org.radarcns.schema.validation.ValidationException; import org.radarcns.schema.validation.ValidationSupport; import java.nio.file.Path; @@ -37,7 +38,6 @@ import static org.radarcns.schema.validation.roles.Validator.validateNonEmpty; import static org.radarcns.schema.validation.roles.Validator.validateNonNull; - /** * TODO. */ @@ -53,30 +53,30 @@ public final class SchemaValidationRoles { static final Pattern NAMESPACE_PATTERN = Pattern.compile("^[a-z][a-z.]*$"); - static final Pattern RECORD_NAME_PATTERN = Pattern.compile("(^[A-Z][a-z]+)" - + "|(^[A-Z][a-z0-9]+[A-Z]$)" - + "|(^[A-Z][a-z0-9]+([A-Z][a-z0-9]+)+$)" - + "|(^[A-Z][a-z0-9]+([A-Z][a-z0-9]+)+[A-Z]$)"); + // CamelCase + // see SchemaValidatorRolesTest#recordNameRegex() for valid and invalid values + static final Pattern RECORD_NAME_PATTERN = Pattern.compile( + "^([A-Z]([a-z]+[0-9]*|[a-z]*[0-9]+))+[A-Z]?$"); - static final Pattern FIELD_NAME_PATTERN = Pattern.compile("^[a-z][a-zA-Z]*$"); + // lowerCamelCase + static final Pattern FIELD_NAME_PATTERN = Pattern.compile( + "^[a-z][a-z0-9]*([a-z0-9][A-Z][a-z0-9]+)?([A-Z][a-z0-9]+)*[A-Z]?$"); static final Pattern ENUM_SYMBOL_PATTERN = Pattern.compile("^[A-Z][A-Z0-9_]*$"); /** Field names cannot contain the following values. */ enum FieldNameNotAllowed { LOWER_VALUE("value"), - UPPER_VALUE("Value"), - LOWER_VAL("val"), - UPPER_VAL("Val"); + UPPER_VALUE("Value"); - private final String name; + private final String literal; - FieldNameNotAllowed(String name) { - this.name = name; + FieldNameNotAllowed(String literal) { + this.literal = literal; } - public String getName() { - return name; + public String getLiteral() { + return literal; } } @@ -98,12 +98,15 @@ public String getName() { private static final String NOT_TIME_RECEIVED_FIELD = "\"" + TIME_RECEIVED + "\" is allow only in " + Scope.PASSIVE + " schemas."; private static final String FIELDS = "Avro Record must have field list."; - private static final String FIELD_NAME = "Field name does not respect lowerCamelCase name" - + " convention. It cannot contain any of the following values [" + private static final String FIELD_NAME_NOT_ALLOWED = "Field name cannot contain any of the" + + " following values [" + Arrays.stream(FieldNameNotAllowed.values()) - .map(FieldNameNotAllowed::getName) + .map(FieldNameNotAllowed::getLiteral) .collect(Collectors.joining(", ")) - + "]. Please avoid abbreviations and write out the field name instead."; + + "]."; + private static final String FIELD_NAME_LOWER_CAMEL = "Field name does not respect" + + " lowerCamelCase name convention. Please avoid abbreviations and write out the" + + " field name instead."; private static final String DOC = "Documentation is mandatory for any schema and field." + " The documentation should report " + "what is being measured, how, and what units or ranges are applicable. Abbreviations " @@ -128,8 +131,8 @@ private SchemaValidationRoles() { * @param scope TODO * @return TODO */ - public static Validator validateNameSpace(Path schemaPath, Scope scope) { - String expected = ValidationSupport.getNamespace(schemaPath, scope); + public static Validator validateNameSpace(Path root, Path schemaPath, Scope scope) { + String expected = ValidationSupport.getNamespace(root, schemaPath, scope); return validateNonNull(Schema::getNamespace, namespace -> matches(namespace, NAMESPACE_PATTERN) @@ -193,18 +196,32 @@ public static Validator validateFieldName() { * @return TODO */ public static Validator validateFieldName(Set skip) { - return validate(schema -> { + return schema -> { Stream stream = schema.getFields() .stream() .map(Schema.Field::name); if (skip != null && !skip.isEmpty()) { stream = stream.filter(name -> !skip.contains(name)); } - return stream.allMatch(name -> - matches(name, FIELD_NAME_PATTERN) - && Stream.of(FieldNameNotAllowed.values()) - .noneMatch(notAllowed -> name.contains(notAllowed.getName()))); - }, message(FIELD_NAME)); + + + return stream.map(name -> { + if (!matches(name, FIELD_NAME_PATTERN)) { + return new ValidationException( + "Field " + name + " of schema " + schema.getFullName() + + " is invalid. " + FIELD_NAME_LOWER_CAMEL); + } + if (Stream.of(FieldNameNotAllowed.values()) + .anyMatch(notAllowed -> name.endsWith(notAllowed.getLiteral()))) { + return new ValidationException( + "Field " + name + " of schema " + schema.getFullName() + + " is invalid. " + FIELD_NAME_NOT_ALLOWED); + } + return null; + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + }; } /** @@ -303,12 +320,12 @@ public static Validator validateUnknownSymbol() { /** * TODO. * @param pathToSchema TODO - * @param root TODO + * @param scope TODO * @return TODO */ - public static Validator getGeneralRecordValidator(Path pathToSchema, - Scope root) { - return validateNameSpace(pathToSchema, root) + public static Validator getGeneralRecordValidator(Path root, Path pathToSchema, + Scope scope) { + return validateNameSpace(root, pathToSchema, scope) .and(validateRecordName(pathToSchema)) .and(validateSchemaDocumentation()) .and(validateFields()) @@ -320,15 +337,15 @@ public static Validator getGeneralRecordValidator(Path pathToSchema, /** * TODO. * @param pathToSchema TODO - * @param root TODO + * @param scope TODO * @param skipRecordName TODO * @param skipFieldName TODO * @return TODO */ - public static Validator getGeneralRecordValidator(Path pathToSchema, - Scope root, boolean skipRecordName, + public static Validator getGeneralRecordValidator(Path root, Path pathToSchema, + Scope scope, boolean skipRecordName, Set skipFieldName) { - return validateNameSpace(pathToSchema, root) + return validateNameSpace(root, pathToSchema, scope) .and(validateRecordName(pathToSchema, skipRecordName)) .and(validateSchemaDocumentation()) .and(validateFields()) @@ -340,11 +357,11 @@ public static Validator getGeneralRecordValidator(Path pathToSchema, /** * TODO. * @param pathToSchema TODO - * @param root TODO + * @param scope TODO * @return TODO7 */ - public static Validator getActiveValidator(Path pathToSchema, Scope root) { - return getGeneralRecordValidator(pathToSchema, root) + public static Validator getActiveValidator(Path root, Path pathToSchema, Scope scope) { + return getGeneralRecordValidator(root, pathToSchema, scope) .and(validateTime()) .and(validateTimeCompleted()) .and(validateNotTimeReceived()); @@ -353,14 +370,14 @@ public static Validator getActiveValidator(Path pathToSchema, Scope root /** * TODO. * @param pathToSchema TODO - * @param root TODO + * @param scope TODO * @param skipRecordName TODO * @param skipFieldName TODO * @return TODO */ - public static Validator getActiveValidator(Path pathToSchema, Scope root, + public static Validator getActiveValidator(Path root, Path pathToSchema, Scope scope, boolean skipRecordName, Set skipFieldName) { - return getGeneralRecordValidator(pathToSchema, root, skipRecordName, + return getGeneralRecordValidator(root, pathToSchema, scope, skipRecordName, skipFieldName) .and(validateTime()) .and(validateTimeCompleted()) @@ -370,25 +387,25 @@ public static Validator getActiveValidator(Path pathToSchema, Scope root /** * TODO. * @param pathToSchema TODO - * @param root TODO + * @param scope TODO * @return TODO */ - public static Validator getMonitorValidator(Path pathToSchema, Scope root) { - return getGeneralRecordValidator(pathToSchema, root) + public static Validator getMonitorValidator(Path root, Path pathToSchema, Scope scope) { + return getGeneralRecordValidator(root, pathToSchema, scope) .and(validateTime()); } /** * TODO. * @param pathToSchema TODO - * @param root TODO + * @param scope TODO * @param skipRecordName TODO * @param skipFieldName TODO * @return TODO */ - public static Validator getMonitorValidator(Path pathToSchema, Scope root, + public static Validator getMonitorValidator(Path root, Path pathToSchema, Scope scope, boolean skipRecordName, Set skipFieldName) { - return getGeneralRecordValidator(pathToSchema, root, skipRecordName, + return getGeneralRecordValidator(root, pathToSchema, scope, skipRecordName, skipFieldName) .and(validateTime()); } @@ -396,11 +413,11 @@ public static Validator getMonitorValidator(Path pathToSchema, Scope roo /** * TODO. * @param pathToSchema TODO - * @param root TODO + * @param scope TODO * @return TODO */ - public static Validator getPassiveValidator(Path pathToSchema, Scope root) { - return getGeneralRecordValidator(pathToSchema, root) + public static Validator getPassiveValidator(Path root, Path pathToSchema, Scope scope) { + return getGeneralRecordValidator(root, pathToSchema, scope) .and(validateTime()) .and(validateTimeReceived()) .and(validateNotTimeCompleted()); @@ -409,14 +426,14 @@ public static Validator getPassiveValidator(Path pathToSchema, Scope roo /** * TODO. * @param pathToSchema TODO - * @param root TODO + * @param scope TODO * @param skipRecordName TODO * @param skipFieldName TODO * @return TODO */ - public static Validator getPassiveValidator(Path pathToSchema, Scope root, + public static Validator getPassiveValidator(Path root, Path pathToSchema, Scope scope, boolean skipRecordName, Set skipFieldName) { - return getGeneralRecordValidator(pathToSchema, root, skipRecordName, + return getGeneralRecordValidator(root, pathToSchema, scope, skipRecordName, skipFieldName) .and(validateTime()) .and(validateTimeReceived()) @@ -426,11 +443,12 @@ public static Validator getPassiveValidator(Path pathToSchema, Scope roo /** * TODO. * @param pathToSchema TODO - * @param root TODO + * @param scope TODO * @return TODO */ - public static Validator getGeneralEnumValidator(Path pathToSchema, Scope root) { - return validateNameSpace(pathToSchema, root) + public static Validator getGeneralEnumValidator(Path root, Path pathToSchema, + Scope scope) { + return validateNameSpace(root, pathToSchema, scope) .and(validateRecordName(pathToSchema)) .and(validateSchemaDocumentation()) .and(validateSymbols()) @@ -441,13 +459,13 @@ public static Validator getGeneralEnumValidator(Path pathToSchema, Scope /** * TODO. * @param pathToSchema TODO - * @param root TODO + * @param scope TODO * @param skipRecordName TODO * @return TODO */ - public static Validator getGeneralEnumValidator(Path pathToSchema, Scope root, - boolean skipRecordName) { - return validateNameSpace(pathToSchema, root) + public static Validator getGeneralEnumValidator(Path root, Path pathToSchema, + Scope scope, boolean skipRecordName) { + return validateNameSpace(root, pathToSchema, scope) .and(validateRecordName(pathToSchema, skipRecordName)) .and(validateSchemaDocumentation()) .and(validateSymbols()) diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/TopicRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/TopicRoles.java index 2fd803a9..4b88548a 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/TopicRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/TopicRoles.java @@ -17,7 +17,7 @@ package org.radarcns.schema.validation.roles; import org.radarcns.schema.specification.Topic; -import org.radarcns.schema.specification.Utils; +import org.radarcns.schema.util.Utils; import org.radarcns.schema.validation.ValidationException; import org.radarcns.schema.validation.ValidationSupport; diff --git a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/ActiveValidation.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/ActiveValidation.java index 262ab197..c8582897 100644 --- a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/ActiveValidation.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/ActiveValidation.java @@ -33,7 +33,7 @@ public void validate() throws IOException { } File file = new File(BASE_PATH.resolve( - NameFolder.ACTIVE.getName()).resolve( + NameFolder.ACTIVE.getLiteral()).resolve( type.name().toLowerCase() + YAML_EXTENSION)).toUri()); QuestionnaireSource source = new YamlConfigLoader().load(file, diff --git a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/MonitorValidation.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/MonitorValidation.java index 85114b75..06631b46 100644 --- a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/MonitorValidation.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/MonitorValidation.java @@ -33,7 +33,7 @@ public void validate() throws IOException { } File file = new File(BASE_PATH.resolve( - NameFolder.MONITOR.getName()).resolve( + NameFolder.MONITOR.getLiteral()).resolve( type.name().toLowerCase() + YAML_EXTENSION)).toUri()); MonitorSource source = new YamlConfigLoader().load(file, MonitorSource.class); diff --git a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/PassiveValidation.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/PassiveValidation.java index 7cf3dee2..e6672f17 100644 --- a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/PassiveValidation.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/PassiveValidation.java @@ -54,7 +54,7 @@ public void validate() throws IOException { } File file = new File(BASE_PATH.resolve( - NameFolder.PASSIVE.getName()).resolve( + NameFolder.PASSIVE.getLiteral()).resolve( type.name().toLowerCase() + YAML_EXTENSION)).toUri()); PassiveSource source = new YamlConfigLoader().load(file, PassiveSource.class); diff --git a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java index dcd94840..3996f233 100644 --- a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java @@ -38,18 +38,18 @@ import static org.radarcns.schema.Scope.KAFKA; import static org.radarcns.schema.Scope.MONITOR; import static org.radarcns.schema.Scope.PASSIVE; -import static org.radarcns.schema.validation.SchemaValidator.validate; /** * TODO. */ public class SchemaValidatorTest { private SchemaValidator validator; + private static final Path ROOT = Paths.get("../..").toAbsolutePath(); @Before - public void setUp() { - ExcludeConfig config = ExcludeConfig.load(); - validator = new SchemaValidator(config); + public void setUp() throws IOException { + ExcludeConfig config = ExcludeConfig.load(null); + validator = new SchemaValidator(ROOT, config); } @Test @@ -101,7 +101,7 @@ public void testGetPath() { @Test public void testEnumerator() { - Path schemaPath = SchemaRepository.PROJECT_ROOT.resolve( + Path schemaPath = ROOT.resolve( "commons/monitor/application/server_status.avsc"); String name = "org.radarcns.monitor.application.ServerStatus"; @@ -112,7 +112,7 @@ public void testEnumerator() { .doc(documentation) .symbols("CONNECTED", "DISCONNECTED", "UNKNOWN"); - Collection result = validate(schema, schemaPath, MONITOR); + Collection result = validator.validate(schema, schemaPath, MONITOR); assertTrue(result.isEmpty()); @@ -121,7 +121,7 @@ public void testEnumerator() { .doc(documentation) .symbols("CONNECTED", "DISCONNECTED", "un_known"); - result = validate(schema, schemaPath, MONITOR); + result = validator.validate(schema, schemaPath, MONITOR); assertFalse(result.isEmpty()); } diff --git a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SpecificationsValidatorTest.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SpecificationsValidatorTest.java index cf861a3b..b0e179fe 100644 --- a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SpecificationsValidatorTest.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SpecificationsValidatorTest.java @@ -8,13 +8,14 @@ import java.io.IOException; import static org.junit.Assert.assertTrue; +import static org.radarcns.schema.specification.SourceCatalogue.BASE_PATH; public class SpecificationsValidatorTest { private SpecificationsValidator validator; @Before - public void setUp() { - this.validator = new SpecificationsValidator(ExcludeConfig.load()); + public void setUp() throws IOException { + this.validator = new SpecificationsValidator(BASE_PATH, ExcludeConfig.load(null)); } @Test @@ -31,4 +32,4 @@ public void monitorIsYml() throws IOException { public void passiveIsYml() throws IOException { assertTrue(validator.specificationsAreYmlFiles(Scope.PASSIVE)); } -} \ No newline at end of file +} diff --git a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/roles/SchemaValidationRolesTest.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/roles/SchemaValidationRolesTest.java index 301f6124..6621169a 100644 --- a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/roles/SchemaValidationRolesTest.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/roles/SchemaValidationRolesTest.java @@ -34,7 +34,8 @@ import static org.junit.Assert.assertTrue; import static org.radarcns.schema.Scope.ACTIVE; import static org.radarcns.schema.Scope.MONITOR; -import static org.radarcns.schema.validation.SchemaRepository.COMMONS_PATH; +import static org.radarcns.schema.SchemaRepository.COMMONS_PATH; +import static org.radarcns.schema.specification.SourceCatalogue.BASE_PATH; import static org.radarcns.schema.validation.roles.SchemaValidationRoles.ENUM_SYMBOL_PATTERN; import static org.radarcns.schema.validation.roles.SchemaValidationRoles.FIELD_NAME_PATTERN; import static org.radarcns.schema.validation.roles.SchemaValidationRoles.NAMESPACE_PATTERN; @@ -80,8 +81,7 @@ public void recordNameRegex() { assertTrue(matches("EmpaticaE4Acceleration", RECORD_NAME_PATTERN)); assertTrue(matches("Heart4Me", RECORD_NAME_PATTERN)); assertTrue(matches("Heart4M", RECORD_NAME_PATTERN)); - - assertFalse(matches("Heart4", RECORD_NAME_PATTERN)); + assertTrue(matches("Heart4", RECORD_NAME_PATTERN)); assertFalse(matches("Heart4me", RECORD_NAME_PATTERN)); assertFalse(matches("Heart4ME", RECORD_NAME_PATTERN)); assertFalse(matches("4Me", RECORD_NAME_PATTERN)); @@ -126,11 +126,12 @@ public void nameSpaceTest() { .fields() .endRecord(); - Path root = ACTIVE.getPath(COMMONS_PATH); + Path root = ACTIVE.getPath(BASE_PATH.resolve(COMMONS_PATH)); assertNotNull(root); Path path = root.resolve("questionnaire/questionnaire.avsc"); - Collection result = validateNameSpace(path, ACTIVE).apply(schema); + Collection result = validateNameSpace(BASE_PATH, path, ACTIVE) + .apply(schema); assertTrue(result.isEmpty()); } @@ -143,10 +144,11 @@ public void nameSpaceInvalidDashTest() { .fields() .endRecord(); - Path root = MONITOR.getPath(COMMONS_PATH); + Path root = MONITOR.getPath(BASE_PATH.resolve(COMMONS_PATH)); assertNotNull(root); Path path = root.resolve("test/record_name.avsc"); - Collection result = validateNameSpace(path, MONITOR).apply(schema); + Collection result = validateNameSpace(BASE_PATH, path, MONITOR) + .apply(schema); assertFalse(result.isEmpty()); @@ -160,10 +162,11 @@ public void nameSpaceInvalidPlural() { .fields() .endRecord(); - Path root = MONITOR.getPath(COMMONS_PATH); + Path root = MONITOR.getPath(BASE_PATH.resolve(COMMONS_PATH)); assertNotNull(root); Path path = root.resolve("test/record_name.avsc"); - Collection result = validateNameSpace(path, MONITOR).apply(schema); + Collection result = validateNameSpace(BASE_PATH, path, MONITOR) + .apply(schema); assertFalse(result.isEmpty()); } @@ -177,10 +180,11 @@ public void nameSpaceInvalidLastPartPlural() { .fields() .endRecord(); - Path root = MONITOR.getPath(COMMONS_PATH); + Path root = MONITOR.getPath(BASE_PATH.resolve(COMMONS_PATH)); assertNotNull(root); Path path = root.resolve("test/record_name.avsc"); - Collection result = validateNameSpace(path, MONITOR).apply(schema); + Collection result = validateNameSpace(BASE_PATH, path, MONITOR) + .apply(schema); assertFalse(result.isEmpty()); } diff --git a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/util/UtilsTest.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/util/UtilsTest.java index f19b31e5..c34265c1 100644 --- a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/util/UtilsTest.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/util/UtilsTest.java @@ -23,7 +23,7 @@ import org.junit.Test; import org.radarcns.kafka.aggregator.AggregatorDouble; import org.radarcns.kafka.aggregator.AggregatorDoubleArray; -import org.radarcns.schema.specification.Utils; +import org.radarcns.schema.util.Utils; /** * TODO. From ad0f85a96ee2da56fad5777e338b979626b6e581 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Mon, 18 Sep 2017 13:17:51 +0200 Subject: [PATCH 064/112] Use streams for validators and fixed default values --- .../active/questionnaire/questionnaire.avsc | 2 +- .../kafka/aggregator/aggregator_double.avsc | 14 +- .../application_external_time.avsc | 4 +- .../application_record_counts.avsc | 4 +- .../passive/phone/phone_battery_level.avsc | 2 +- commons/passive/phone/phone_call.avsc | 4 +- .../phone/phone_relative_location.avsc | 12 +- commons/passive/phone/phone_sms.avsc | 6 +- .../org/radarcns/schema/CommandLineApp.java | 29 +- .../schema/validation/SchemaValidator.java | 95 +--- .../schema/validation/ValidationSupport.java | 2 +- .../roles/SchemaValidationRoles.java | 479 ------------------ .../{roles => rules}/ActiveSourceRoles.java | 4 +- .../{roles => rules}/AggregatableRoles.java | 6 +- .../{roles => rules}/MonitorRoles.java | 4 +- .../{roles => rules}/PassiveSourceRoles.java | 8 +- .../{roles => rules}/ProcessorRoles.java | 4 +- .../{roles => rules}/QuestionRoles.java | 4 +- .../{roles => rules}/QuestionnaireRoles.java | 6 +- .../rules/RadarSchemaValidationRules.java | 350 +++++++++++++ .../{roles => rules}/ResponseRoles.java | 4 +- .../validation/rules/SchemaMetadata.java | 30 ++ .../rules/SchemaValidationRules.java | 115 +++++ .../{roles => rules}/SensorRoles.java | 8 +- .../{roles => rules}/TopicRoles.java | 10 +- .../{roles => rules}/Validator.java | 42 +- .../schema/validation/PassiveValidation.java | 2 +- .../validation/SchemaValidatorTest.java | 21 +- .../RadarSchemaValidationRulesTest.java} | 281 +++++----- 29 files changed, 757 insertions(+), 795 deletions(-) delete mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/SchemaValidationRoles.java rename java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/{roles => rules}/ActiveSourceRoles.java (94%) rename java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/{roles => rules}/AggregatableRoles.java (91%) rename java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/{roles => rules}/MonitorRoles.java (94%) rename java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/{roles => rules}/PassiveSourceRoles.java (93%) rename java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/{roles => rules}/ProcessorRoles.java (93%) rename java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/{roles => rules}/QuestionRoles.java (95%) rename java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/{roles => rules}/QuestionnaireRoles.java (91%) create mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaValidationRules.java rename java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/{roles => rules}/ResponseRoles.java (92%) create mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaMetadata.java create mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaValidationRules.java rename java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/{roles => rules}/SensorRoles.java (89%) rename java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/{roles => rules}/TopicRoles.java (91%) rename java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/{roles => rules}/Validator.java (80%) rename java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/{roles/SchemaValidationRolesTest.java => rules/RadarSchemaValidationRulesTest.java} (68%) diff --git a/commons/active/questionnaire/questionnaire.avsc b/commons/active/questionnaire/questionnaire.avsc index a507ee64..6d8c5b86 100644 --- a/commons/active/questionnaire/questionnaire.avsc +++ b/commons/active/questionnaire/questionnaire.avsc @@ -6,7 +6,7 @@ "fields": [ { "name": "time", "type": "double", "doc": "timestamp in UTC (s) when the questionnaire is submitted to the subject." }, { "name": "timeCompleted", "type": "double", "doc": "timestamp in UTC (s) when subject marks the questionnaire as." }, - { "name": "name", "type": "string", "doc": "Questionnaire names.", "default": "UNKNOWN" }, + { "name": "name", "type": "string", "doc": "Questionnaire names." }, { "name": "version", "type": "string", "doc": "It reports the questionnaire version stated in the JSON specification." }, { "name": "answers", "type": { diff --git a/commons/kafka/aggregator/aggregator_double.avsc b/commons/kafka/aggregator/aggregator_double.avsc index 88f95a50..7996c5d9 100644 --- a/commons/kafka/aggregator/aggregator_double.avsc +++ b/commons/kafka/aggregator/aggregator_double.avsc @@ -4,12 +4,12 @@ "name": "AggregatorDouble", "doc": "Result of data aggregation.", "fields": [ - { "name": "min", "type": "double", "doc": "State the minimum between accumulated values.", "default": "+Infinity" }, - { "name": "max", "type": "double", "doc": "State the maximum between accumulated values.", "default": "-Infinity" }, - { "name": "sum", "type": "double", "doc": "State the sum of accumulated values.", "default": "0.0" }, - { "name": "count", "type": "double", "doc": "Count the accumulated values.", "default": "0.0" }, - { "name": "avg", "type": "double", "doc": "State the avg between accumulated values.", "default": "0.0" }, - { "name": "quartile", "type": {"type": "array", "items": "double"}, "doc": "Quartile of accumulated values." }, - { "name": "iqr", "type": "double", "doc": "State the interquartile range between accumulated values.", "default": "0.0" } + { "name": "min", "type": "double", "doc": "State the minimum between accumulated values." }, + { "name": "max", "type": "double", "doc": "State the maximum between accumulated values." }, + { "name": "sum", "type": "double", "doc": "State the sum of accumulated values." }, + { "name": "count", "type": "double", "doc": "Count the accumulated values." }, + { "name": "avg", "type": ["null", "double"], "doc": "State the avg between accumulated values.", "default": null }, + { "name": "quartile", "type": ["null", {"type": "array", "items": "double"}], "doc": "Quartile of accumulated values.", "default": null }, + { "name": "iqr", "type": ["null", "double"], "doc": "State the interquartile range between accumulated values.", "default": null } ] } diff --git a/commons/monitor/application/application_external_time.avsc b/commons/monitor/application/application_external_time.avsc index c5f91fba..930ae826 100755 --- a/commons/monitor/application/application_external_time.avsc +++ b/commons/monitor/application/application_external_time.avsc @@ -5,9 +5,9 @@ "doc": "Timestamp from an external source.", "fields": [ { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, - { "name": "externalTime", "type": "double", "doc": "timestamp in UTC according to an external source (s).", "default": "NaN" }, + { "name": "externalTime", "type": "double", "doc": "timestamp in UTC according to an external source (s)." }, { "name": "host", "type": ["null", "string"], "doc": "hostname or IP address that time was polled from.", "default": null }, { "name": "protocol", "type": {"name": "ExternalTimeProtocol", "type": "enum", "symbols": ["SNTP", "NTP", "UNKNOWN"], "doc": "SNTP (Simple Network Time Protocol) synchronizes with a single server once, NTP (Network Time Protocol) may synchronize with multiple servers and derive some continuous measures."}, "doc": "protocol for external time synchronization.", "default": "UNKNOWN" }, - { "name": "delay", "type": "double", "doc": "delay between sending and receiving a message from the host (s). The lower this delay, the more precise the external timestamp is expected to be.", "default": "NaN" } + { "name": "delay", "type": ["null", "double"], "doc": "delay between sending and receiving a message from the host (s). The lower this delay, the more precise the external timestamp is expected to be.", "default": null } ] } diff --git a/commons/monitor/application/application_record_counts.avsc b/commons/monitor/application/application_record_counts.avsc index 770c21ef..99d2ff09 100755 --- a/commons/monitor/application/application_record_counts.avsc +++ b/commons/monitor/application/application_record_counts.avsc @@ -5,8 +5,8 @@ "doc": "Number of records cached or created.", "fields": [ { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, - { "name": "recordsCached", "type": "int", "doc": "number of records currently being cached.", "default": -1 }, + { "name": "recordsCached", "type": ["null", "int"], "doc": "number of records currently being cached.", "default": null }, { "name": "recordsSent", "type": "int", "doc": "number of records sent since application start." }, - { "name": "recordsUnsent", "type": "int", "doc": "number of unsent records.", "default": -1 } + { "name": "recordsUnsent", "type": ["null", "int"], "doc": "number of unsent records.", "default": null } ] } diff --git a/commons/passive/phone/phone_battery_level.avsc b/commons/passive/phone/phone_battery_level.avsc index 1d8dd393..86356012 100644 --- a/commons/passive/phone/phone_battery_level.avsc +++ b/commons/passive/phone/phone_battery_level.avsc @@ -8,6 +8,6 @@ {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, {"name": "batteryLevel", "type": "float", "doc": "battery level from 0 to 1." }, {"name": "isPlugged", "type": "boolean", "doc": "whether the phone is connected to a power source." }, - {"name": "status", "type": {"name": "BatteryStatus", "type": "enum", "symbols": ["UNKNOWN", "CHARGING", "DISCHARGING", "NOT_CHARGING", "FULL"]}, "doc": "Android battery states.", "default": "UNKNOWN." } + {"name": "status", "type": {"name": "BatteryStatus", "type": "enum", "symbols": ["UNKNOWN", "CHARGING", "DISCHARGING", "NOT_CHARGING", "FULL"]}, "doc": "Android battery states.", "default": "UNKNOWN" } ] } diff --git a/commons/passive/phone/phone_call.avsc b/commons/passive/phone/phone_call.avsc index afaeb15f..80f0c21e 100644 --- a/commons/passive/phone/phone_call.avsc +++ b/commons/passive/phone/phone_call.avsc @@ -6,9 +6,9 @@ "fields": [ {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, - {"name": "duration", "type": "float", "doc": "duration of the call (s).", "default": "NaN" }, + {"name": "duration", "type": ["null", "float"], "doc": "duration of the call (s).", "default": null }, {"name": "target", "type": ["null", "bytes"], "doc": "HMAC SHA-256 one-way source/target of the call. This hash of a given phone number will be the same unless the app is reinstalled. If the number is unknown or anonymous, this contains null.", "default": null }, {"name": "type", "type": {"name": "PhoneCallType", "type": "enum", "symbols": ["INCOMING", "OUTGOING", "MISSED", "VOICEMAIL", "UNKNOWN"]}, "doc": "direction of phone call.", "default": "UNKNOWN" }, - {"name": "targetIsContact", "type": ["null","boolean"], "doc": "call to/from a known contact, null if unknown.", "default": null} + {"name": "targetIsContact", "type": ["null", "boolean"], "doc": "call to/from a known contact, null if unknown.", "default": null} ] } diff --git a/commons/passive/phone/phone_relative_location.avsc b/commons/passive/phone/phone_relative_location.avsc index 598ba8e6..268dacdb 100644 --- a/commons/passive/phone/phone_relative_location.avsc +++ b/commons/passive/phone/phone_relative_location.avsc @@ -7,11 +7,11 @@ { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, { "name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, { "name": "provider", "type": {"name": "LocationProvider", "type": "enum", "symbols": ["GPS", "NETWORK", "OTHER"]}, "doc": "Android provider of the location data." }, - { "name": "latitude", "type": "double", "doc": "relative latitude from an initial random reference latitude (degrees with range [-90, 90]).", "default": "NaN" }, - { "name": "longitude", "type": "double", "doc": "relative longitude from an initial reference longitude (degrees with range [-180, 180]).", "default": "NaN" }, - { "name": "altitude", "type": "float", "doc": "height above the WGS 84 reference ellipsoid (m).", "default": "NaN" }, - { "name": "accuracy", "type": "float", "doc": "The estimated horizontal accuracy of this location, radial (m). We define horizontal accuracy as the radius of 68% confidence. In other words, if you draw a circle centered at this location's latitude and longitude, and with a radius equal to the accuracy, then there is a 68% probability that the true location is inside the circle.", "default": "NaN" }, - { "name": "speed", "type": "float", "doc": "speed over ground (m/s).", "default": "NaN" }, - { "name": "bearing", "type": "float", "doc": "the horizontal direction of travel of this device (degrees with range (0, 360]).", "default": "NaN" } + { "name": "latitude", "type": ["null", "double"], "doc": "relative latitude from an initial random reference latitude (degrees with range [-90, 90]).", "default": null }, + { "name": "longitude", "type": ["null", "double"], "doc": "relative longitude from an initial reference longitude (degrees with range [-180, 180]).", "default": null }, + { "name": "altitude", "type": ["null", "float"], "doc": "height above the WGS 84 reference ellipsoid (m).", "default": null }, + { "name": "accuracy", "type": ["null", "float"], "doc": "The estimated horizontal accuracy of this location, radial (m). We define horizontal accuracy as the radius of 68% confidence. In other words, if you draw a circle centered at this location's latitude and longitude, and with a radius equal to the accuracy, then there is a 68% probability that the true location is inside the circle.", "default": null }, + { "name": "speed", "type": ["null", "float"], "doc": "speed over ground (m/s).", "default": null }, + { "name": "bearing", "type": ["null", "float"], "doc": "the horizontal direction of travel of this device (degrees with range (0, 360]).", "default": null } ] } diff --git a/commons/passive/phone/phone_sms.avsc b/commons/passive/phone/phone_sms.avsc index 7f9885a9..3d998d75 100644 --- a/commons/passive/phone/phone_sms.avsc +++ b/commons/passive/phone/phone_sms.avsc @@ -7,10 +7,10 @@ { "name": "time", "type": "double", "doc": "device timestamp in UTC (s)." }, { "name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)." }, { "name": "target", "type": ["null", "bytes"], "doc": "HMAC SHA-256 one-way source/target of the SMS. This hash of a given phone number will be the same unless the app is reinstalled. If the number is unknown or anonymous, this contains null.", "default": null }, - { "name": "type", "type": {"name": "PhoneSmsType", "type": "enum", "symbols": ["INCOMING", "OUTGOING", "OTHER", "UNKNOWN"]}, "doc": "direction of the SMS.", "default": "UNKNOWN." }, + { "name": "type", "type": {"name": "PhoneSmsType", "type": "enum", "symbols": ["INCOMING", "OUTGOING", "OTHER", "UNKNOWN"]}, "doc": "direction of the SMS.", "default": "UNKNOWN" }, { "name": "length", "type": ["null","int"], "doc": "number of characters in the message (null if unknown).", "default": null}, { "name": "targetIsContact", "type": ["null","boolean"], "doc": "sms sender is a known contact, null if unknown.", "default": null }, - { "name": "targetIsNonNumeric", "type": "boolean", "doc": "sms sender ID is replaced by text, e.g. a company name.", "default": false }, - { "name": "targetIsService", "type": "boolean", "doc": "target is a service, e.g. a 4-digit target.", "default": false } + { "name": "targetIsNonNumeric", "type": ["null", "boolean"], "doc": "sms sender ID is replaced by text, e.g. a company name.", "default": null }, + { "name": "targetIsService", "type": ["null", "boolean"], "doc": "target is a service, e.g. a 4-digit target.", "default": null } ] } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java index 2bd56f3f..1d06d062 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java @@ -33,7 +33,6 @@ import org.radarcns.schema.specification.passive.Processor; import org.radarcns.schema.specification.passive.Sensor; import org.radarcns.schema.validation.SchemaValidator; -import org.radarcns.schema.validation.ValidationException; import org.radarcns.schema.validation.config.ExcludeConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,7 +41,6 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -51,6 +49,8 @@ import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * TODO. @@ -231,24 +231,19 @@ public String validateSchemas(String scopeString, String configSubPath) throws I } ExcludeConfig config = ExcludeConfig.load(configPath); SchemaValidator validator = new SchemaValidator(root, config); - StringBuilder result = new StringBuilder(); if (scopeString == null) { - for (Scope scope : Scope.values()) { - Collection results = validator.analyseFiles(scope); - for (ValidationException ex : results) { - result.append("Validation FAILED:\n") - .append(ex.getMessage()).append("\n\n"); - } - } + return Stream.of(Scope.values()) + .flatMap(scope -> { + try { + return SchemaValidator.formatStream(validator.analyseFiles(scope)); + } catch (IOException ex) { + return Stream.of("Failed to read schemas from scope " + scope + "\n\n"); + } + }) + .collect(Collectors.joining()); } else { - Scope scope = Scope.valueOf(scopeString); - Collection results = validator.analyseFiles(scope); - for (ValidationException ex : results) { - result.append("Validation FAILED:\n") - .append(ex.getMessage()).append("\n\n"); - } + return SchemaValidator.format(validator.analyseFiles(Scope.valueOf(scopeString))); } - return result.toString(); } @SuppressWarnings("PMD.SystemPrintln") diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaValidator.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaValidator.java index 7ce6f91d..dc734018 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaValidator.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaValidator.java @@ -17,38 +17,32 @@ */ import org.apache.avro.Schema; -import org.apache.avro.Schema.Type; import org.radarcns.schema.Scope; import org.radarcns.schema.validation.config.ExcludeConfig; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.radarcns.schema.validation.rules.RadarSchemaValidationRules; +import org.radarcns.schema.validation.rules.SchemaMetadata; +import org.radarcns.schema.validation.rules.Validator; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Collection; -import java.util.Objects; -import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; import static org.radarcns.schema.SchemaRepository.COMMONS_PATH; -import static org.radarcns.schema.validation.roles.SchemaValidationRoles.getActiveValidator; -import static org.radarcns.schema.validation.roles.SchemaValidationRoles.getGeneralEnumValidator; -import static org.radarcns.schema.validation.roles.SchemaValidationRoles.getGeneralRecordValidator; -import static org.radarcns.schema.validation.roles.SchemaValidationRoles.getMonitorValidator; -import static org.radarcns.schema.validation.roles.SchemaValidationRoles.getPassiveValidator; public class SchemaValidator { public static final String AVRO_EXTENSION = "avsc"; - private static final Logger LOGGER = LoggerFactory.getLogger(SchemaValidator.class); private final Path root; private final ExcludeConfig config; + private final Validator validator; public SchemaValidator(Path root, ExcludeConfig config) { this.config = config; this.root = root; + this.validator = new RadarSchemaValidationRules(root, config) + .getValidator(); } /** @@ -56,9 +50,10 @@ public SchemaValidator(Path root, ExcludeConfig config) { * @param scope TODO. * @throws IOException TODO. */ - public Collection analyseFiles(Scope scope) + public Stream analyseFiles(Scope scope) throws IOException { Schema.Parser parser = new Schema.Parser(); + return Files.walk(scope.getPath(root.resolve(COMMONS_PATH))) .filter(Files::isRegularFile) .filter(p -> !config.skipFile(p)) @@ -72,19 +67,25 @@ public Collection analyseFiles(Scope scope) try { Schema schema = parser.parse(p.toFile()); - if (config.contains(schema)) { - return validate(schema, p, scope, - config.isNameRecordEnable(schema), - config.skippedNameFieldCheck(schema)).stream(); - } else { - return validate(schema, p, scope).stream(); - } + return validate(schema, p, scope); } catch (IOException e) { return Stream.of(new ValidationException( "Cannot parse file " + p.toAbsolutePath(), e)); } - }) - .collect(Collectors.toList()); + }); + } + + public Stream validate(Schema schema, Path path, Scope scope) { + return validator.apply(new SchemaMetadata(schema, scope, path)); + } + + public static Stream formatStream(Stream exceptionStream) { + return exceptionStream.map(ex -> "Validation FAILED:\n" + ex.getMessage() + "\n\n"); + } + + public static String format(Stream exceptionStream) { + return SchemaValidator.formatStream(exceptionStream) + .collect(Collectors.joining()); } /** @@ -96,56 +97,6 @@ public static boolean isAvscFile(Path file) { return ValidationSupport.matchesExtension(file, AVRO_EXTENSION); } - public Collection validate(Schema schema, Path pathToSchema, - Scope scope) { - return validate(schema, pathToSchema, scope, - false, null); - } - - public Collection validate(Schema schema, Path pathToSchema, - Scope scope, boolean skipRecordName, Set skipFieldName) { - Objects.requireNonNull(schema); - Objects.requireNonNull(pathToSchema); - Objects.requireNonNull(scope); - - Collection result; - - if (schema.getType().equals(Type.ENUM)) { - result = getGeneralEnumValidator(root, pathToSchema, scope, - skipRecordName).apply(schema); - } else { - switch (scope) { - case ACTIVE: - result = getActiveValidator(root, pathToSchema, scope, skipRecordName, - skipFieldName).apply(schema); - break; - case CATALOGUE: - result = getGeneralRecordValidator(root, pathToSchema, scope, - skipRecordName, skipFieldName).apply(schema); - break; - case KAFKA: - result = getGeneralRecordValidator(root, pathToSchema, scope, - skipRecordName, skipFieldName).apply(schema); - break; - case MONITOR: - result = getMonitorValidator(root, pathToSchema, scope, skipRecordName, - skipFieldName).apply(schema); - break; - case PASSIVE: - result = getPassiveValidator(root, pathToSchema, scope, skipRecordName, - skipFieldName).apply(schema); - break; - default: - LOGGER.warn("Applying general validation to {}", getPath(pathToSchema)); - result = getGeneralRecordValidator(root, pathToSchema, scope, skipRecordName, - skipFieldName).apply(schema); - break; - } - } - - return result; - } - /** * TODO. * @param path TODO diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/ValidationSupport.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/ValidationSupport.java index 9da65c8d..28e7bc80 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/ValidationSupport.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/ValidationSupport.java @@ -35,7 +35,7 @@ import static org.radarcns.schema.SchemaRepository.COMMONS_PATH; import static org.radarcns.schema.util.Utils.getProjectGroup; import static org.radarcns.schema.util.Utils.toSnakeCase; -import static org.radarcns.schema.validation.roles.SchemaValidationRoles.UNKNOWN; +import static org.radarcns.schema.validation.rules.RadarSchemaValidationRules.UNKNOWN; /** * TODO. diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/SchemaValidationRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/SchemaValidationRoles.java deleted file mode 100644 index cba6ad2a..00000000 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/SchemaValidationRoles.java +++ /dev/null @@ -1,479 +0,0 @@ -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.radarcns.schema.validation.roles; - -import org.apache.avro.Schema; -import org.apache.avro.Schema.Type; -import org.radarcns.schema.Scope; -import org.radarcns.schema.validation.ValidationException; -import org.radarcns.schema.validation.ValidationSupport; - -import java.nio.file.Path; -import java.util.Arrays; -import java.util.Objects; -import java.util.Set; -import java.util.function.Function; -import java.util.regex.Pattern; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static org.radarcns.schema.validation.ValidationSupport.extractEnumerationFields; -import static org.radarcns.schema.validation.ValidationSupport.nonEmpty; -import static org.radarcns.schema.validation.roles.Validator.matches; -import static org.radarcns.schema.validation.roles.Validator.validate; -import static org.radarcns.schema.validation.roles.Validator.validateNonEmpty; -import static org.radarcns.schema.validation.roles.Validator.validateNonNull; - -/** - * TODO. - */ -@SuppressWarnings("PMD.GodClass") -//TODO split in record and enumerator. -public final class SchemaValidationRoles { - - static final String TIME = "time"; - private static final String TIME_RECEIVED = "timeReceived"; - private static final String TIME_COMPLETED = "timeCompleted"; - - public static final String UNKNOWN = "UNKNOWN"; - - static final Pattern NAMESPACE_PATTERN = Pattern.compile("^[a-z][a-z.]*$"); - - // CamelCase - // see SchemaValidatorRolesTest#recordNameRegex() for valid and invalid values - static final Pattern RECORD_NAME_PATTERN = Pattern.compile( - "^([A-Z]([a-z]+[0-9]*|[a-z]*[0-9]+))+[A-Z]?$"); - - // lowerCamelCase - static final Pattern FIELD_NAME_PATTERN = Pattern.compile( - "^[a-z][a-z0-9]*([a-z0-9][A-Z][a-z0-9]+)?([A-Z][a-z0-9]+)*[A-Z]?$"); - - static final Pattern ENUM_SYMBOL_PATTERN = Pattern.compile("^[A-Z][A-Z0-9_]*$"); - - /** Field names cannot contain the following values. */ - enum FieldNameNotAllowed { - LOWER_VALUE("value"), - UPPER_VALUE("Value"); - - private final String literal; - - FieldNameNotAllowed(String literal) { - this.literal = literal; - } - - public String getLiteral() { - return literal; - } - } - - private static final String NAME_SPACE = "Namespace cannot be null and must fully lowercase dot" - + " separated without numeric. In this case the expected value is \""; - private static final String RECORD_NAME = "Record name must be the conversion of the .avsc file" - + " name in UpperCamelCase and must explicitly contain the device name." - + " The expected value is "; - private static final String TIME_FIELD = "Any schema representing collected data must have a \"" - + TIME + "\" field formatted in " + Type.DOUBLE + "."; - private static final String TIME_COMPLETED_FIELD = "Any " + Scope.ACTIVE - + " schema must have a \"" + TIME_COMPLETED + "\" field formatted in " - + Type.DOUBLE + "."; - private static final String NOT_TIME_COMPLETED_FIELD = "\"" + TIME_COMPLETED - + "\" is allow only in " + Scope.ACTIVE + " schemas."; - private static final String TIME_RECEIVED_FIELD = "Any " + Scope.PASSIVE - + " schema must have a \"" + TIME_RECEIVED + "\" field formatted in " - + Type.DOUBLE + "."; - private static final String NOT_TIME_RECEIVED_FIELD = "\"" + TIME_RECEIVED - + "\" is allow only in " + Scope.PASSIVE + " schemas."; - private static final String FIELDS = "Avro Record must have field list."; - private static final String FIELD_NAME_NOT_ALLOWED = "Field name cannot contain any of the" - + " following values [" - + Arrays.stream(FieldNameNotAllowed.values()) - .map(FieldNameNotAllowed::getLiteral) - .collect(Collectors.joining(", ")) - + "]."; - private static final String FIELD_NAME_LOWER_CAMEL = "Field name does not respect" - + " lowerCamelCase name convention. Please avoid abbreviations and write out the" - + " field name instead."; - private static final String DOC = "Documentation is mandatory for any schema and field." - + " The documentation should report " - + "what is being measured, how, and what units or ranges are applicable. Abbreviations " - + "and acronyms in the documentation should be written out. The sentence must be ended " - + "by a point. Please add \"doc\" property."; - private static final String SYMBOLS = "Avro Enumerator must have symbol list."; - private static final String ENUMERATION_SYMBOL = "Enumerator items should be written in" - + " uppercase characters separated by underscores."; - private static final String ENUMERATION_UNKNOWN_SYMBOL = "Enumerator must contain the \"" - + UNKNOWN + "\" symbol. It is useful to specify default value for a field using type" - + " equals to \"enum\"."; - private static final String DEFAULT_VALUE = "Any NULLABLE Avro field must specify a default" - + " value. The allowed default values are: \"UNKNOWN\" for ENUMERATION, and \"null\" " - + "for all the other cases."; - - private SchemaValidationRoles() { - // utility class - } - - /** - * TODO. - * @param scope TODO - * @return TODO - */ - public static Validator validateNameSpace(Path root, Path schemaPath, Scope scope) { - String expected = ValidationSupport.getNamespace(root, schemaPath, scope); - - return validateNonNull(Schema::getNamespace, - namespace -> matches(namespace, NAMESPACE_PATTERN) - && namespace.equalsIgnoreCase(expected), - schema -> NAME_SPACE + expected + "\". " + schema.getFullName() + " is invalid."); - } - - /** - * TODO. - * @param path TODO - * @return TODO - */ - public static Validator validateRecordName(Path path) { - return validateRecordName(path, false); - } - - /** - * TODO. - * @param path TODO - * @param skip TODO - * @return TODO - */ - public static Validator validateRecordName(Path path, boolean skip) { - String expected = ValidationSupport.getRecordName(path); - - return validate(schema -> skip - || matches(schema.getName(), RECORD_NAME_PATTERN) - && schema.getName().equalsIgnoreCase(expected), - schema -> RECORD_NAME + '"' + expected + "\". " + schema.getFullName() - + " is invalid."); - } - - /** - * TODO. - * @return TODO - */ - public static Validator validateSchemaDocumentation() { - return validateNonNull(Schema::getDoc, doc -> doc.charAt(doc.length() - 1) == '.', - message(DOC)); - } - - /** - * TODO. - * @return TODO - */ - public static Validator validateFields() { - return validateNonEmpty(Schema::getFields, message(FIELDS)); - } - - /** - * TODO. - * @return TODO - */ - public static Validator validateFieldName() { - return validateFieldName(null); - } - - /** - * TODO. - * @param skip TODO - * @return TODO - */ - public static Validator validateFieldName(Set skip) { - return schema -> { - Stream stream = schema.getFields() - .stream() - .map(Schema.Field::name); - if (skip != null && !skip.isEmpty()) { - stream = stream.filter(name -> !skip.contains(name)); - } - - - return stream.map(name -> { - if (!matches(name, FIELD_NAME_PATTERN)) { - return new ValidationException( - "Field " + name + " of schema " + schema.getFullName() - + " is invalid. " + FIELD_NAME_LOWER_CAMEL); - } - if (Stream.of(FieldNameNotAllowed.values()) - .anyMatch(notAllowed -> name.endsWith(notAllowed.getLiteral()))) { - return new ValidationException( - "Field " + name + " of schema " + schema.getFullName() - + " is invalid. " + FIELD_NAME_NOT_ALLOWED); - } - return null; - }) - .filter(Objects::nonNull) - .collect(Collectors.toList()); - }; - } - - /** - * TODO. - * @return TODO - */ - public static Validator validateFieldDocumentation() { - return validate(schema -> - schema.getFields() - .stream() - .allMatch(field -> field.doc() != null - && field.doc().charAt(field.doc().length() - 1) == '.'), - message(DOC)); - } - - /** - * TODO. - * @return TODO - */ - public static Validator validateSymbols() { - return validate(schema -> nonEmpty(schema.getEnumSymbols()), message(SYMBOLS)); - } - - /** - * TODO. - * @return TODO - */ - public static Validator validateEnumerationSymbols() { - return validate(schema -> - extractEnumerationFields(schema).stream().allMatch(matches(ENUM_SYMBOL_PATTERN)), - message(ENUMERATION_SYMBOL)); - } - - /** - * TODO. - * @return TODO - */ - public static Validator validateDefault() { - return validate(ValidationSupport::validateDefault, message(DEFAULT_VALUE)); - } - - /** - * TODO. - * @return TODO - */ - public static Validator validateTime() { - return validateNonNull(s -> s.getField(TIME), - time -> time.schema().getType().equals(Type.DOUBLE), message(TIME_FIELD)); - } - - /** - * TODO. - * @return TODO - */ - public static Validator validateTimeCompleted() { - return validateNonNull(s -> s.getField(TIME_COMPLETED), - time -> time.schema().getType().equals(Type.DOUBLE), message(TIME_COMPLETED_FIELD)); - } - - /** - * TODO. - * @return TODO - */ - public static Validator validateNotTimeCompleted() { - return validate(schema -> Objects.isNull(schema.getField(TIME_COMPLETED)), - message(NOT_TIME_COMPLETED_FIELD)); - } - - /** - * TODO. - * @return TODO - */ - public static Validator validateTimeReceived() { - return validateNonNull(s -> s.getField(TIME_RECEIVED), - time -> time.schema().getType().equals(Type.DOUBLE), message(TIME_RECEIVED_FIELD)); - } - - /** - * TODO. - * @return TODO - */ - public static Validator validateNotTimeReceived() { - return validate(schema -> Objects.isNull(schema.getField(TIME_RECEIVED)), - message(NOT_TIME_RECEIVED_FIELD)); - } - - /** - * TODO. - * @return TODO - */ - public static Validator validateUnknownSymbol() { - return validate(schema -> extractEnumerationFields(schema).contains(UNKNOWN), - message(ENUMERATION_UNKNOWN_SYMBOL)); - } - - /** - * TODO. - * @param pathToSchema TODO - * @param scope TODO - * @return TODO - */ - public static Validator getGeneralRecordValidator(Path root, Path pathToSchema, - Scope scope) { - return validateNameSpace(root, pathToSchema, scope) - .and(validateRecordName(pathToSchema)) - .and(validateSchemaDocumentation()) - .and(validateFields()) - .and(validateFieldName()) - .and(validateFieldDocumentation()) - .and(validateEnumerationSymbols()); - } - - /** - * TODO. - * @param pathToSchema TODO - * @param scope TODO - * @param skipRecordName TODO - * @param skipFieldName TODO - * @return TODO - */ - public static Validator getGeneralRecordValidator(Path root, Path pathToSchema, - Scope scope, boolean skipRecordName, - Set skipFieldName) { - return validateNameSpace(root, pathToSchema, scope) - .and(validateRecordName(pathToSchema, skipRecordName)) - .and(validateSchemaDocumentation()) - .and(validateFields()) - .and(validateFieldName(skipFieldName)) - .and(validateFieldDocumentation()) - .and(validateEnumerationSymbols()); - } - - /** - * TODO. - * @param pathToSchema TODO - * @param scope TODO - * @return TODO7 - */ - public static Validator getActiveValidator(Path root, Path pathToSchema, Scope scope) { - return getGeneralRecordValidator(root, pathToSchema, scope) - .and(validateTime()) - .and(validateTimeCompleted()) - .and(validateNotTimeReceived()); - } - - /** - * TODO. - * @param pathToSchema TODO - * @param scope TODO - * @param skipRecordName TODO - * @param skipFieldName TODO - * @return TODO - */ - public static Validator getActiveValidator(Path root, Path pathToSchema, Scope scope, - boolean skipRecordName, Set skipFieldName) { - return getGeneralRecordValidator(root, pathToSchema, scope, skipRecordName, - skipFieldName) - .and(validateTime()) - .and(validateTimeCompleted()) - .and(validateNotTimeReceived()); - } - - /** - * TODO. - * @param pathToSchema TODO - * @param scope TODO - * @return TODO - */ - public static Validator getMonitorValidator(Path root, Path pathToSchema, Scope scope) { - return getGeneralRecordValidator(root, pathToSchema, scope) - .and(validateTime()); - } - - /** - * TODO. - * @param pathToSchema TODO - * @param scope TODO - * @param skipRecordName TODO - * @param skipFieldName TODO - * @return TODO - */ - public static Validator getMonitorValidator(Path root, Path pathToSchema, Scope scope, - boolean skipRecordName, Set skipFieldName) { - return getGeneralRecordValidator(root, pathToSchema, scope, skipRecordName, - skipFieldName) - .and(validateTime()); - } - - /** - * TODO. - * @param pathToSchema TODO - * @param scope TODO - * @return TODO - */ - public static Validator getPassiveValidator(Path root, Path pathToSchema, Scope scope) { - return getGeneralRecordValidator(root, pathToSchema, scope) - .and(validateTime()) - .and(validateTimeReceived()) - .and(validateNotTimeCompleted()); - } - - /** - * TODO. - * @param pathToSchema TODO - * @param scope TODO - * @param skipRecordName TODO - * @param skipFieldName TODO - * @return TODO - */ - public static Validator getPassiveValidator(Path root, Path pathToSchema, Scope scope, - boolean skipRecordName, Set skipFieldName) { - return getGeneralRecordValidator(root, pathToSchema, scope, skipRecordName, - skipFieldName) - .and(validateTime()) - .and(validateTimeReceived()) - .and(validateNotTimeCompleted()); - } - - /** - * TODO. - * @param pathToSchema TODO - * @param scope TODO - * @return TODO - */ - public static Validator getGeneralEnumValidator(Path root, Path pathToSchema, - Scope scope) { - return validateNameSpace(root, pathToSchema, scope) - .and(validateRecordName(pathToSchema)) - .and(validateSchemaDocumentation()) - .and(validateSymbols()) - .and(validateEnumerationSymbols()) - .and(validateUnknownSymbol()); - } - - /** - * TODO. - * @param pathToSchema TODO - * @param scope TODO - * @param skipRecordName TODO - * @return TODO - */ - public static Validator getGeneralEnumValidator(Path root, Path pathToSchema, - Scope scope, boolean skipRecordName) { - return validateNameSpace(root, pathToSchema, scope) - .and(validateRecordName(pathToSchema, skipRecordName)) - .and(validateSchemaDocumentation()) - .and(validateSymbols()) - .and(validateEnumerationSymbols()) - .and(validateUnknownSymbol()); - } - - private static Function message(String text) { - return schema -> schema.getFullName() + " is invalid. " + text; - } -} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/ActiveSourceRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/ActiveSourceRoles.java similarity index 94% rename from java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/ActiveSourceRoles.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/ActiveSourceRoles.java index ef1e0cbb..f11c9eee 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/ActiveSourceRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/ActiveSourceRoles.java @@ -14,12 +14,12 @@ * limitations under the License. */ -package org.radarcns.schema.validation.roles; +package org.radarcns.schema.validation.rules; import org.radarcns.schema.specification.active.ActiveSource; import org.radarcns.schema.specification.active.questionnaire.QuestionnaireSource; -import static org.radarcns.schema.validation.roles.Validator.validateNonNull; +import static org.radarcns.schema.validation.rules.Validator.validateNonNull; /** * TODO. diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/AggregatableRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/AggregatableRoles.java similarity index 91% rename from java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/AggregatableRoles.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/AggregatableRoles.java index eb18144f..34575b4d 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/AggregatableRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/AggregatableRoles.java @@ -1,12 +1,12 @@ -package org.radarcns.schema.validation.roles; +package org.radarcns.schema.validation.rules; import org.radarcns.schema.util.Utils; import org.radarcns.schema.specification.Aggregatable; import org.radarcns.schema.validation.ValidationSupport; import static org.radarcns.schema.validation.ValidationSupport.isValidClass; -import static org.radarcns.schema.validation.roles.Validator.validateNonNull; -import static org.radarcns.schema.validation.roles.Validator.validateOrNull; +import static org.radarcns.schema.validation.rules.Validator.validateNonNull; +import static org.radarcns.schema.validation.rules.Validator.validateOrNull; /* * Copyright 2017 King's College London and The Hyve diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/MonitorRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/MonitorRoles.java similarity index 94% rename from java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/MonitorRoles.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/MonitorRoles.java index 102aca7b..fc4d1f98 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/MonitorRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/MonitorRoles.java @@ -1,4 +1,4 @@ -package org.radarcns.schema.validation.roles; +package org.radarcns.schema.validation.rules; import org.radarcns.schema.specification.MonitorSource; import org.radarcns.schema.util.Utils; @@ -9,7 +9,7 @@ import static org.radarcns.schema.specification.SourceCatalogue.YAML_EXTENSION; import static org.radarcns.schema.validation.ValidationSupport.equalsFileName; -import static org.radarcns.schema.validation.roles.Validator.validateNonNull; +import static org.radarcns.schema.validation.rules.Validator.validateNonNull; /* * Copyright 2017 King's College London and The Hyve diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/PassiveSourceRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/PassiveSourceRoles.java similarity index 93% rename from java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/PassiveSourceRoles.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/PassiveSourceRoles.java index d043e818..d83ca2dd 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/PassiveSourceRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/PassiveSourceRoles.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.radarcns.schema.validation.roles; +package org.radarcns.schema.validation.rules; import org.radarcns.schema.specification.SourceCatalogue; import org.radarcns.schema.specification.passive.PassiveSource; @@ -27,9 +27,9 @@ import java.util.Set; import static org.radarcns.schema.validation.ValidationSupport.equalsFileName; -import static org.radarcns.schema.validation.roles.Validator.validate; -import static org.radarcns.schema.validation.roles.Validator.validateNonNull; -import static org.radarcns.schema.validation.roles.Validator.validateOrNull; +import static org.radarcns.schema.validation.rules.Validator.validate; +import static org.radarcns.schema.validation.rules.Validator.validateNonNull; +import static org.radarcns.schema.validation.rules.Validator.validateOrNull; /** * TODO. diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/ProcessorRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/ProcessorRoles.java similarity index 93% rename from java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/ProcessorRoles.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/ProcessorRoles.java index db6d8a4a..de8744a2 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/ProcessorRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/ProcessorRoles.java @@ -14,13 +14,13 @@ * limitations under the License. */ -package org.radarcns.schema.validation.roles; +package org.radarcns.schema.validation.rules; import org.radarcns.catalogue.ProcessingState; import org.radarcns.catalogue.SensorName; import org.radarcns.schema.specification.passive.Processor; -import static org.radarcns.schema.validation.roles.Validator.validateNonNull; +import static org.radarcns.schema.validation.rules.Validator.validateNonNull; /** * TODO. diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/QuestionRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/QuestionRoles.java similarity index 95% rename from java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/QuestionRoles.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/QuestionRoles.java index 062ca71f..d03ba7fd 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/QuestionRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/QuestionRoles.java @@ -1,4 +1,4 @@ -package org.radarcns.schema.validation.roles; +package org.radarcns.schema.validation.rules; /* * Copyright 2017 King's College London and The Hyve @@ -19,7 +19,7 @@ import org.radarcns.catalogue.RadarWidget; import org.radarcns.schema.specification.active.questionnaire.Question; -import static org.radarcns.schema.validation.roles.Validator.validateNonNull; +import static org.radarcns.schema.validation.rules.Validator.validateNonNull; /** * TODO. diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/QuestionnaireRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/QuestionnaireRoles.java similarity index 91% rename from java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/QuestionnaireRoles.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/QuestionnaireRoles.java index a593a484..696d5d79 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/QuestionnaireRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/QuestionnaireRoles.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.radarcns.schema.validation.roles; +package org.radarcns.schema.validation.rules; import org.radarcns.schema.specification.active.questionnaire.QuestionnaireSource; @@ -22,8 +22,8 @@ import static org.radarcns.schema.specification.SourceCatalogue.YAML_EXTENSION; import static org.radarcns.schema.validation.ValidationSupport.equalsFileName; -import static org.radarcns.schema.validation.roles.Validator.validateNonEmpty; -import static org.radarcns.schema.validation.roles.Validator.validateNonNull; +import static org.radarcns.schema.validation.rules.Validator.validateNonEmpty; +import static org.radarcns.schema.validation.rules.Validator.validateNonNull; /** * TODO. diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaValidationRules.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaValidationRules.java new file mode 100644 index 00000000..e4d40f32 --- /dev/null +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaValidationRules.java @@ -0,0 +1,350 @@ +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.radarcns.schema.validation.rules; + +import org.apache.avro.JsonProperties; +import org.apache.avro.Schema; +import org.apache.avro.Schema.Type; +import org.radarcns.schema.Scope; +import org.radarcns.schema.validation.ValidationException; +import org.radarcns.schema.validation.ValidationSupport; +import org.radarcns.schema.validation.config.ExcludeConfig; + +import java.nio.file.Path; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.regex.Pattern; +import java.util.stream.Stream; + +import static org.radarcns.schema.validation.ValidationSupport.extractEnumerationFields; +import static org.radarcns.schema.validation.ValidationSupport.nonEmpty; +import static org.radarcns.schema.validation.rules.Validator.matches; +import static org.radarcns.schema.validation.rules.Validator.raise; +import static org.radarcns.schema.validation.rules.Validator.valid; +import static org.radarcns.schema.validation.rules.Validator.validate; +import static org.radarcns.schema.validation.rules.Validator.validateNonEmpty; +import static org.radarcns.schema.validation.rules.Validator.validateNonNull; + +/** + * TODO. + */ +public class RadarSchemaValidationRules implements SchemaValidationRules { + + static final String TIME = "time"; + private static final String TIME_RECEIVED = "timeReceived"; + private static final String TIME_COMPLETED = "timeCompleted"; + private final Map>> + defaultsValidator; + + public static final String UNKNOWN = "UNKNOWN"; + + static final Pattern NAMESPACE_PATTERN = Pattern.compile("^[a-z][a-z.]*$"); + + // CamelCase + // see SchemaValidatorRolesTest#recordNameRegex() for valid and invalid values + static final Pattern RECORD_NAME_PATTERN = Pattern.compile( + "^([A-Z]([a-z]+[0-9]*|[a-z]*[0-9]+))+[A-Z]?$"); + + // lowerCamelCase + static final Pattern FIELD_NAME_PATTERN = Pattern.compile( + "^[a-z][a-z0-9]*([a-z0-9][A-Z][a-z0-9]+)?([A-Z][a-z0-9]+)*[A-Z]?$"); + + static final Pattern ENUM_SYMBOL_PATTERN = Pattern.compile("^[A-Z][A-Z0-9_]*$"); + private static final List FIELD_NAME_NOT_ALLOWED_SUFFIX = Arrays.asList( + "value", "Value"); + + private static final String NAME_SPACE = "Namespace cannot be null and must fully lowercase dot" + + " separated without numeric. In this case the expected value is \""; + private static final String TIME_FIELD = "Any schema representing collected data must have a \"" + + TIME + "\" field formatted in " + Type.DOUBLE + "."; + private static final String TIME_COMPLETED_FIELD = "Any " + Scope.ACTIVE + + " schema must have a \"" + TIME_COMPLETED + "\" field formatted in " + + Type.DOUBLE + "."; + private static final String NOT_TIME_COMPLETED_FIELD = "\"" + TIME_COMPLETED + + "\" is allow only in " + Scope.ACTIVE + " schemas."; + private static final String TIME_RECEIVED_FIELD = "Any " + Scope.PASSIVE + + " schema must have a \"" + TIME_RECEIVED + "\" field formatted in " + + Type.DOUBLE + "."; + private static final String NOT_TIME_RECEIVED_FIELD = "\"" + TIME_RECEIVED + + "\" is allow only in " + Scope.PASSIVE + " schemas."; + private static final String FIELDS = "Avro Record must have field list."; + private static final String FIELD_NAME_NOT_ALLOWED = "Field name cannot end with the" + + " following values " + FIELD_NAME_NOT_ALLOWED_SUFFIX + "."; + private static final String FIELD_NAME_LOWER_CAMEL = "Field name does not respect" + + " lowerCamelCase name convention. Please avoid abbreviations and write out the" + + " field name instead."; + private static final String DOC = "Documentation is mandatory for any schema and field." + + " The documentation should report " + + "what is being measured, how, and what units or ranges are applicable. Abbreviations " + + "and acronyms in the documentation should be written out. The sentence must be ended " + + "by a point. Please add \"doc\" property."; + private static final String SYMBOLS = "Avro Enumerator must have symbol list."; + private static final String ENUMERATION_SYMBOL = "Enumerator items should be written in" + + " uppercase characters separated by underscores."; + + private final Path root; + private final ExcludeConfig config; + + public RadarSchemaValidationRules(Path root, ExcludeConfig config) { + this.root = root; + this.config = config; + + defaultsValidator = new HashMap<>(); + defaultsValidator.put(Type.RECORD, (f, s) -> this.validateDefault().apply(f.schema())); + defaultsValidator.put(Type.ENUM, this::validateDefaultEnum); + defaultsValidator.put(Type.UNION, this::validateDefaultUnion); + } + + /** + * TODO. + * @return TODO + */ + @Override + public Validator validateNameSpace() { + return metadata -> { + String expected = ValidationSupport.getNamespace(root, + metadata.getPath(), metadata.getScope()); + + String namespace = metadata.getSchema().getNamespace(); + + return namespace != null && matches(namespace, NAMESPACE_PATTERN) + && namespace.equalsIgnoreCase(expected) ? valid() : raise( + message(NAME_SPACE).apply(metadata.getSchema()) + + expected + "\"."); + }; + } + + /** + * TODO. + * @return TODO + */ + @Override + public Validator validateRecordName() { + return metadata -> { + String name = metadata.getSchema().getName(); + + if (!config.skipFile(metadata.getPath())) { + if (!matches(name, RECORD_NAME_PATTERN)) { + return raise(message("Record names must be camel case.") + .apply(metadata.getSchema())); + } + String expected = ValidationSupport.getRecordName(metadata.getPath()); + if (!name.equalsIgnoreCase(expected)) { + return raise(message("The path of a record must match its schema." + + " Expected record name is \"") + .apply(metadata.getSchema()) + expected + "\"."); + } + } + return valid(); + }; + } + + /** + * TODO. + * @return TODO + */ + @Override + public Validator validateSchemaDocumentation() { + return validateNonNull(Schema::getDoc, doc -> doc.charAt(doc.length() - 1) == '.', + message(DOC)); + } + + /** + * TODO. + * @return TODO + */ + @Override + public Validator validateFields() { + return validateNonEmpty(Schema::getFields, message(FIELDS)); + } + + /** + * TODO. + * @return TODO + */ + @Override + public Validator validateFieldName() { + return validateFieldName(config::skippedNameFieldCheck); + } + + /** + * TODO. + * @return TODO + */ + protected Validator validateFieldName(Function> skip) { + return schema -> { + Stream stream = schema.getFields().stream() + .map(Schema.Field::name); + Set skipped = skip.apply(schema); + if (skipped != null && !skipped.isEmpty()) { + stream = stream.filter(name -> !skipped.contains(name)); + } + + return stream + .flatMap(name -> { + if (!matches(name, FIELD_NAME_PATTERN)) { + return raise( + "Field " + name + " of schema " + schema.getFullName() + + " is invalid. " + FIELD_NAME_LOWER_CAMEL); + } + if (FIELD_NAME_NOT_ALLOWED_SUFFIX.stream().anyMatch(name::endsWith)) { + return raise( + "Field " + name + " of schema " + schema.getFullName() + + " is invalid. " + FIELD_NAME_NOT_ALLOWED); + } + return valid(); + }); + }; + } + + /** + * TODO. + * @return TODO + */ + @Override + public Validator validateFieldDocumentation() { + return validate(schema -> + schema.getFields() + .stream() + .allMatch(field -> field.doc() != null + && field.doc().charAt(field.doc().length() - 1) == '.'), + message(DOC)); + } + + /** + * TODO. + * @return TODO + */ + @Override + public Validator validateSymbols() { + return validate(schema -> nonEmpty(schema.getEnumSymbols()), message(SYMBOLS)); + } + + /** + * TODO. + * @return TODO + */ + @Override + public Validator validateEnumerationSymbols() { + return validate(schema -> + extractEnumerationFields(schema).stream().allMatch(matches(ENUM_SYMBOL_PATTERN)), + message(ENUMERATION_SYMBOL)); + } + + /** + * TODO. + * @return TODO + */ + @Override + public Validator validateDefault() { + return input -> { + if (!input.getType().equals(Type.RECORD)) { + return raise("Default validation can be applied only to an Avro RECORD, not to " + + input.getType() + '.'); + } + + return input.getFields().stream() + .flatMap(field -> defaultsValidator + .getOrDefault(field.schema().getType(), this::validateDefaultOther) + .apply(field, input)); + }; + } + + private Stream validateDefaultEnum(Schema.Field field, Schema schema) { + return !field.schema().getEnumSymbols().contains(UNKNOWN) + || (field.defaultVal() != null + && field.defaultVal().toString().equals(UNKNOWN)) ? valid() : raise(message( + "Default of field " + field.name() + " is \"" + field.defaultVal() + + "\". Any Avro enum type that has an \"UNKNOWN\" symbol must set its" + + " default value to \"UNKNOWN\".").apply(schema)); + } + + private Stream validateDefaultUnion(Schema.Field field, Schema schema) { + return !field.schema().getTypes().contains(Schema.create(Type.NULL)) + || (field.defaultVal() != null + && field.defaultVal().equals(JsonProperties.NULL_VALUE)) ? valid() : raise(message( + "Default of field " + field.name() + " is not null. Any nullable Avro" + + " field must specify have its default value set to null.").apply(schema)); + } + + private Stream validateDefaultOther(Schema.Field field, Schema schema) { + return field.defaultVal() == null ? valid() : raise(message("Default of field '" + + field.name() + "' with type " + field.schema().getType() + " is set to " + + field.defaultVal() + ". The only acceptable default values are the \"UNKNOWN\"" + + "enum symbol and null.").apply(schema)); + } + + /** + * TODO. + * @return TODO + */ + @Override + public Validator validateTime() { + return validateNonNull(s -> s.getField(TIME), + time -> time.schema().getType().equals(Type.DOUBLE), message(TIME_FIELD)); + } + + /** + * TODO. + * @return TODO + */ + @Override + public Validator validateTimeCompleted() { + return validateNonNull(s -> s.getField(TIME_COMPLETED), + time -> time.schema().getType().equals(Type.DOUBLE), message(TIME_COMPLETED_FIELD)); + } + + /** + * TODO. + * @return TODO + */ + @Override + public Validator validateNotTimeCompleted() { + return validate(schema -> Objects.isNull(schema.getField(TIME_COMPLETED)), + message(NOT_TIME_COMPLETED_FIELD)); + } + + /** + * TODO. + * @return TODO + */ + @Override + public Validator validateTimeReceived() { + return validateNonNull(s -> s.getField(TIME_RECEIVED), + time -> time.schema().getType().equals(Type.DOUBLE), message(TIME_RECEIVED_FIELD)); + } + + /** + * TODO. + * @return TODO + */ + @Override + public Validator validateNotTimeReceived() { + return validate(schema -> Objects.isNull(schema.getField(TIME_RECEIVED)), + message(NOT_TIME_RECEIVED_FIELD)); + } + + private static Function message(String text) { + return schema -> "Schema " + schema.getFullName() + " is invalid. " + text; + } +} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/ResponseRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/ResponseRoles.java similarity index 92% rename from java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/ResponseRoles.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/ResponseRoles.java index e7ce7547..1adef6fe 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/ResponseRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/ResponseRoles.java @@ -14,11 +14,11 @@ * limitations under the License. */ -package org.radarcns.schema.validation.roles; +package org.radarcns.schema.validation.rules; import org.radarcns.schema.specification.active.questionnaire.Response; -import static org.radarcns.schema.validation.roles.Validator.validateNonNull; +import static org.radarcns.schema.validation.rules.Validator.validateNonNull; /** * TODO. diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaMetadata.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaMetadata.java new file mode 100644 index 00000000..ab958093 --- /dev/null +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaMetadata.java @@ -0,0 +1,30 @@ +package org.radarcns.schema.validation.rules; + +import org.apache.avro.Schema; +import org.radarcns.schema.Scope; + +import java.nio.file.Path; + +public class SchemaMetadata { + private final Schema schema; + private final Scope scope; + private final Path path; + + public SchemaMetadata(Schema schema, Scope scope, Path path) { + this.schema = schema; + this.scope = scope; + this.path = path; + } + + public Path getPath() { + return path; + } + + public Scope getScope() { + return scope; + } + + public Schema getSchema() { + return schema; + } +} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaValidationRules.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaValidationRules.java new file mode 100644 index 00000000..63e64214 --- /dev/null +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaValidationRules.java @@ -0,0 +1,115 @@ +package org.radarcns.schema.validation.rules; + +import org.apache.avro.Schema; + +public interface SchemaValidationRules { + Validator validateNameSpace(); + + Validator validateRecordName(); + + Validator validateSchemaDocumentation(); + + Validator validateFields(); + + Validator validateFieldName(); + + Validator validateFieldDocumentation(); + + Validator validateSymbols(); + + Validator validateEnumerationSymbols(); + + Validator validateDefault(); + + Validator validateTime(); + + Validator validateTimeCompleted(); + + Validator validateNotTimeCompleted(); + + Validator validateTimeReceived(); + + Validator validateNotTimeReceived(); + + /** + * TODO. + * @return TODO + */ + default Validator generalRecordValidation() { + return validateNameSpace() + .and(validateRecordName()) + .and(validateSchemaDocumentation(), SchemaMetadata::getSchema) + .and(validateFields(), SchemaMetadata::getSchema) + .and(validateFieldName(), SchemaMetadata::getSchema) + .and(validateDefault(), SchemaMetadata::getSchema) + .and(validateFieldDocumentation(), SchemaMetadata::getSchema) + .and(validateEnumerationSymbols(), SchemaMetadata::getSchema); + } + + + /** + * TODO. + * @return TODO + */ + default Validator validateActive() { + return generalRecordValidation() + .and(validateTime(), SchemaMetadata::getSchema) + .and(validateTimeCompleted(), SchemaMetadata::getSchema) + .and(validateNotTimeReceived(), SchemaMetadata::getSchema); + } + + /** + * TODO. + * @return TODO + */ + default Validator validateMonitor() { + return generalRecordValidation() + .and(validateTime(), SchemaMetadata::getSchema); + } + + /** + * TODO. + * @return TODO + */ + default Validator validatePassive() { + return generalRecordValidation() + .and(validateTime(), SchemaMetadata::getSchema) + .and(validateTimeReceived(), SchemaMetadata::getSchema) + .and(validateNotTimeCompleted(), SchemaMetadata::getSchema); + } + + /** + * TODO. + * @return TODO + */ + default Validator validateEnum() { + return validateNameSpace() + .and(validateRecordName()) + .and(validateSchemaDocumentation(), SchemaMetadata::getSchema) + .and(validateSymbols(), SchemaMetadata::getSchema) + .and(validateEnumerationSymbols(), SchemaMetadata::getSchema); + } + + default Validator getValidator() { + return schema -> { + if (schema.getSchema().getType().equals(Schema.Type.ENUM)) { + return validateEnum().apply(schema); + } else { + switch (schema.getScope()) { + case ACTIVE: + return validateActive().apply(schema); + case CATALOGUE: + return generalRecordValidation().apply(schema); + case KAFKA: + return generalRecordValidation().apply(schema); + case MONITOR: + return validateMonitor().apply(schema); + case PASSIVE: + return validatePassive().apply(schema); + default: + return generalRecordValidation().apply(schema); + } + } + }; + } +} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/SensorRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SensorRoles.java similarity index 89% rename from java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/SensorRoles.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SensorRoles.java index 794eb329..4dab1f56 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/SensorRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SensorRoles.java @@ -14,15 +14,15 @@ * limitations under the License. */ -package org.radarcns.schema.validation.roles; +package org.radarcns.schema.validation.rules; import org.radarcns.catalogue.ProcessingState; import org.radarcns.catalogue.SensorName; import org.radarcns.schema.specification.passive.Sensor; -import static org.radarcns.schema.validation.roles.PassiveSourceRoles.RADAR_PROVIDERS; -import static org.radarcns.schema.validation.roles.Validator.validateNonNull; -import static org.radarcns.schema.validation.roles.Validator.validateOrNull; +import static org.radarcns.schema.validation.rules.PassiveSourceRoles.RADAR_PROVIDERS; +import static org.radarcns.schema.validation.rules.Validator.validateNonNull; +import static org.radarcns.schema.validation.rules.Validator.validateOrNull; /** * TODO. diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/TopicRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/TopicRoles.java similarity index 91% rename from java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/TopicRoles.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/TopicRoles.java index 4b88548a..9e559d4b 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/TopicRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/TopicRoles.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.radarcns.schema.validation.roles; +package org.radarcns.schema.validation.rules; import org.radarcns.schema.specification.Topic; import org.radarcns.schema.util.Utils; @@ -23,12 +23,11 @@ import java.util.Collection; import java.util.Objects; -import java.util.stream.Collectors; import static org.radarcns.schema.validation.ValidationSupport.isValidClass; import static org.radarcns.schema.validation.ValidationSupport.isValidTopic; -import static org.radarcns.schema.validation.roles.Validator.validate; -import static org.radarcns.schema.validation.roles.Validator.validateNonNull; +import static org.radarcns.schema.validation.rules.Validator.validate; +import static org.radarcns.schema.validation.rules.Validator.validateNonNull; /** * TODO. @@ -81,7 +80,6 @@ static Validator> validateTopics() { return topics -> topics.stream() .filter(topic -> !isValidTopic(topic)) .map(topic -> new ValidationException( - TOPIC + ValidationSupport.isValidTopicVerbose(topic))) - .collect(Collectors.toList()); + TOPIC + ValidationSupport.isValidTopicVerbose(topic))); } } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/Validator.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/Validator.java similarity index 80% rename from java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/Validator.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/Validator.java index a27e810b..e7330794 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/roles/Validator.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/Validator.java @@ -15,22 +15,20 @@ * limitations under the License. */ -package org.radarcns.schema.validation.roles; +package org.radarcns.schema.validation.rules; import org.radarcns.schema.validation.ValidationException; -import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; -import java.util.List; import java.util.function.Function; import java.util.function.Predicate; import java.util.regex.Pattern; +import java.util.stream.Stream; /** * TODO. */ -public interface Validator extends Function> { +public interface Validator extends Function> { /** * TODO. * @param predicate TODO @@ -38,8 +36,7 @@ public interface Validator extends Function Validator validate(Predicate predicate, String message) { - return object -> predicate.test(object) ? Collections.emptySet() - : Collections.singleton(new ValidationException(message)); + return object -> predicate.test(object) ? valid() : raise(message); } /** @@ -49,9 +46,7 @@ static Validator validate(Predicate predicate, String message) { * @return TODO */ static Validator validate(Predicate predicate, Function message) { - return object -> predicate.test(object) - ? Collections.emptySet() - : Collections.singleton(new ValidationException(message.apply(object))); + return object -> predicate.test(object) ? valid() : raise(message).apply(object); } /** @@ -159,11 +154,16 @@ static Validator validateOrNull(Function property, Predicate * @return TODO */ default Validator and(Validator other) { - return object -> { - List exceptionList = new ArrayList<>(this.apply(object)); - exceptionList.addAll(other.apply(object)); - return exceptionList; - }; + return object -> Stream.concat(this.apply(object), other.apply(object)); + } + + /** + * TODO. + * @param other TODO + * @return TODO + */ + default Validator and(Validator other, Function toOther) { + return object -> Stream.concat(this.apply(object), other.apply(toOther.apply(object))); } static boolean matches(String str, Pattern pattern) { @@ -173,4 +173,16 @@ static boolean matches(String str, Pattern pattern) { static Predicate matches(Pattern pattern) { return str -> pattern.matcher(str).matches(); } + + static Function> raise(Function message) { + return t -> raise(message.apply(t)); + } + + static Stream raise(String message) { + return Stream.of(new ValidationException(message)); + } + + static Stream valid() { + return Stream.empty(); + } } diff --git a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/PassiveValidation.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/PassiveValidation.java index e6672f17..ed521247 100644 --- a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/PassiveValidation.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/PassiveValidation.java @@ -59,7 +59,7 @@ public void validate() throws IOException { PassiveSource source = new YamlConfigLoader().load(file, PassiveSource.class); - Collection result =Validator.validatePassive(source, file); + Stream result =Validator.validatePassive(source, file); assertTrue(getMessage(file, result), result.isEmpty()); for (Sensor sensor : source.getSensors()) { diff --git a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java index 3996f233..e6c1dc2d 100644 --- a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java @@ -26,12 +26,9 @@ import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.Collection; -import java.util.stream.Collectors; +import java.util.stream.Stream; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.radarcns.schema.Scope.ACTIVE; import static org.radarcns.schema.Scope.CATALOGUE; @@ -78,13 +75,10 @@ public void catalogue() throws IOException { } private void testScope(Scope scope) throws IOException { - Collection results = validator.analyseFiles(scope); - if (!results.isEmpty()) { - String resultString = results.stream() - .map(r -> "\nValidation FAILED:\n" + r.getMessage() + "\n") - .collect(Collectors.joining()); + String result = SchemaValidator.format(validator.analyseFiles(scope)); - fail(resultString); + if (!result.isEmpty()) { + fail(result); } } @@ -112,9 +106,9 @@ public void testEnumerator() { .doc(documentation) .symbols("CONNECTED", "DISCONNECTED", "UNKNOWN"); - Collection result = validator.validate(schema, schemaPath, MONITOR); + Stream result = validator.validate(schema, schemaPath, MONITOR); - assertTrue(result.isEmpty()); + assertEquals(0, result.count()); schema = SchemaBuilder .enumeration(name) @@ -123,7 +117,6 @@ public void testEnumerator() { result = validator.validate(schema, schemaPath, MONITOR); - assertFalse(result.isEmpty()); + assertEquals(1, result.count()); } - } diff --git a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/roles/SchemaValidationRolesTest.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaValidationRulesTest.java similarity index 68% rename from java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/roles/SchemaValidationRolesTest.java rename to java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaValidationRulesTest.java index 6621169a..102c2238 100644 --- a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/roles/SchemaValidationRolesTest.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaValidationRulesTest.java @@ -14,39 +14,42 @@ * limitations under the License. */ -package org.radarcns.schema.validation.roles; +package org.radarcns.schema.validation.rules; import org.apache.avro.Schema; import org.apache.avro.Schema.Parser; import org.apache.avro.SchemaBuilder; +import org.junit.Before; import org.junit.Test; import org.radarcns.schema.validation.ValidationException; import org.radarcns.schema.validation.ValidationSupport; +import org.radarcns.schema.validation.config.ExcludeConfig; +import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.Collection; import java.util.Collections; +import java.util.stream.Stream; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import static org.radarcns.schema.SchemaRepository.COMMONS_PATH; import static org.radarcns.schema.Scope.ACTIVE; import static org.radarcns.schema.Scope.MONITOR; -import static org.radarcns.schema.SchemaRepository.COMMONS_PATH; +import static org.radarcns.schema.Scope.PASSIVE; import static org.radarcns.schema.specification.SourceCatalogue.BASE_PATH; -import static org.radarcns.schema.validation.roles.SchemaValidationRoles.ENUM_SYMBOL_PATTERN; -import static org.radarcns.schema.validation.roles.SchemaValidationRoles.FIELD_NAME_PATTERN; -import static org.radarcns.schema.validation.roles.SchemaValidationRoles.NAMESPACE_PATTERN; -import static org.radarcns.schema.validation.roles.SchemaValidationRoles.RECORD_NAME_PATTERN; -import static org.radarcns.schema.validation.roles.SchemaValidationRoles.validateNameSpace; -import static org.radarcns.schema.validation.roles.Validator.matches; +import static org.radarcns.schema.validation.rules.RadarSchemaValidationRules.ENUM_SYMBOL_PATTERN; +import static org.radarcns.schema.validation.rules.RadarSchemaValidationRules.FIELD_NAME_PATTERN; +import static org.radarcns.schema.validation.rules.RadarSchemaValidationRules.NAMESPACE_PATTERN; +import static org.radarcns.schema.validation.rules.RadarSchemaValidationRules.RECORD_NAME_PATTERN; +import static org.radarcns.schema.validation.rules.Validator.matches; /** * TODO. */ -public class SchemaValidationRolesTest { +public class RadarSchemaValidationRulesTest { private static final String ACTIVE_NAME_SPACE_MOCK = "org.radarcns.active.test"; private static final String MONITOR_NAME_SPACE_MOCK = "org.radarcns.monitor.test"; @@ -55,6 +58,14 @@ public class SchemaValidationRolesTest { private static final String RECORD_NAME_MOCK = "RecordName"; private static final String FIELD_NUMBER_MOCK = "Field1"; + private RadarSchemaValidationRules validator; + private ExcludeConfig config; + + @Before + public void setUp() throws IOException { + config = new ExcludeConfig(); + validator = new RadarSchemaValidationRules(BASE_PATH, config); + } @Test public void fileNameTest() { @@ -98,7 +109,7 @@ public void recordNameRegex() { public void fieldNameRegex() { assertTrue(matches("interBeatInterval", FIELD_NAME_PATTERN)); assertTrue(matches("x", FIELD_NAME_PATTERN)); - assertTrue(matches(SchemaValidationRoles.TIME, FIELD_NAME_PATTERN)); + assertTrue(matches(RadarSchemaValidationRules.TIME, FIELD_NAME_PATTERN)); assertTrue(matches("subjectId", FIELD_NAME_PATTERN)); assertTrue(matches("listOfSeveralThings", FIELD_NAME_PATTERN)); assertFalse(matches("Time", FIELD_NAME_PATTERN)); @@ -130,10 +141,10 @@ public void nameSpaceTest() { assertNotNull(root); Path path = root.resolve("questionnaire/questionnaire.avsc"); - Collection result = validateNameSpace(BASE_PATH, path, ACTIVE) - .apply(schema); + Stream result = validator.validateNameSpace() + .apply(new SchemaMetadata(schema, ACTIVE, path)); - assertTrue(result.isEmpty()); + assertEquals(0, result.count()); } @Test @@ -147,10 +158,10 @@ public void nameSpaceInvalidDashTest() { Path root = MONITOR.getPath(BASE_PATH.resolve(COMMONS_PATH)); assertNotNull(root); Path path = root.resolve("test/record_name.avsc"); - Collection result = validateNameSpace(BASE_PATH, path, MONITOR) - .apply(schema); + Stream result = validator.validateNameSpace() + .apply(new SchemaMetadata(schema, MONITOR, path)); - assertFalse(result.isEmpty()); + assertEquals(1, result.count()); } @@ -165,10 +176,10 @@ public void nameSpaceInvalidPlural() { Path root = MONITOR.getPath(BASE_PATH.resolve(COMMONS_PATH)); assertNotNull(root); Path path = root.resolve("test/record_name.avsc"); - Collection result = validateNameSpace(BASE_PATH, path, MONITOR) - .apply(schema); + Stream result = validator.validateNameSpace() + .apply(new SchemaMetadata(schema, MONITOR, path)); - assertFalse(result.isEmpty()); + assertEquals(1, result.count()); } @Test @@ -183,10 +194,10 @@ public void nameSpaceInvalidLastPartPlural() { Path root = MONITOR.getPath(BASE_PATH.resolve(COMMONS_PATH)); assertNotNull(root); Path path = root.resolve("test/record_name.avsc"); - Collection result = validateNameSpace(BASE_PATH, path, MONITOR) - .apply(schema); + Stream result = validator.validateNameSpace() + .apply(new SchemaMetadata(schema, MONITOR, path)); - assertFalse(result.isEmpty()); + assertEquals(1, result.count()); } @Test @@ -197,11 +208,12 @@ public void recordNameTest() { .fields() .endRecord(); - Collection result = SchemaValidationRoles.validateRecordName( - Paths.get("/path/to/schema.avsc")).apply(schema); + Stream result = validator.validateRecordName() + .apply(new SchemaMetadata(schema, ACTIVE, Paths.get("/path/to/schema.avsc"))); - assertTrue(result.isEmpty()); + assertEquals(0, result.count()); + // misspell aceleration String fieldName = "EmpaticaE4Aceleration"; Path filePath = Paths.get("/path/to/empatica_e4_acceleration.avsc"); @@ -211,19 +223,22 @@ public void recordNameTest() { .fields() .endRecord(); - result = SchemaValidationRoles.validateRecordName(filePath).apply(schema); + result = validator.validateRecordName() + .apply(new SchemaMetadata(schema, PASSIVE, filePath)); - assertFalse(result.isEmpty()); + assertEquals(1, result.count()); - result = SchemaValidationRoles.validateRecordName(filePath, true).apply(schema); + config.setFiles("/path/to/empatica_e4_acceleration.avsc"); + result = validator.validateRecordName() + .apply(new SchemaMetadata(schema, PASSIVE, filePath)); - assertTrue(result.isEmpty()); + assertEquals(0, result.count()); } @Test public void fieldsTest() { Schema schema; - Collection result; + Stream result; schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) @@ -231,9 +246,9 @@ public void fieldsTest() { .fields() .endRecord(); - result = SchemaValidationRoles.validateFields().apply(schema); + result = validator.validateFields().apply(schema); - assertFalse(result.isEmpty()); + assertEquals(1, result.count()); schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) @@ -242,15 +257,15 @@ public void fieldsTest() { .optionalBoolean("optional") .endRecord(); - result = SchemaValidationRoles.validateFields().apply(schema); + result = validator.validateFields().apply(schema); - assertTrue(result.isEmpty()); + assertEquals(0, result.count()); } @Test public void timeTest() { Schema schema; - Collection result; + Stream result; schema = SchemaBuilder .builder("org.radarcns.time.test") @@ -259,26 +274,26 @@ public void timeTest() { .requiredString("string") .endRecord(); - result = SchemaValidationRoles.validateTime().apply(schema); + result = validator.validateTime().apply(schema); - assertFalse(result.isEmpty()); + assertEquals(1, result.count()); schema = SchemaBuilder .builder("org.radarcns.time.test") .record(RECORD_NAME_MOCK) .fields() - .requiredDouble(SchemaValidationRoles.TIME) + .requiredDouble(RadarSchemaValidationRules.TIME) .endRecord(); - result = SchemaValidationRoles.validateTime().apply(schema); + result = validator.validateTime().apply(schema); - assertTrue(result.isEmpty()); + assertEquals(0, result.count()); } @Test public void timeCompletedTest() { Schema schema; - Collection result; + Stream result; schema = SchemaBuilder .builder(ACTIVE_NAME_SPACE_MOCK) @@ -287,11 +302,11 @@ public void timeCompletedTest() { .requiredString("field") .endRecord(); - result = SchemaValidationRoles.validateTimeCompleted().apply(schema); - assertFalse(result.isEmpty()); + result = validator.validateTimeCompleted().apply(schema); + assertEquals(1, result.count()); - result = SchemaValidationRoles.validateNotTimeCompleted().apply(schema); - assertTrue(result.isEmpty()); + result = validator.validateNotTimeCompleted().apply(schema); + assertEquals(0, result.count()); schema = SchemaBuilder .builder(ACTIVE_NAME_SPACE_MOCK) @@ -300,17 +315,17 @@ public void timeCompletedTest() { .requiredDouble("timeCompleted") .endRecord(); - result = SchemaValidationRoles.validateTimeCompleted().apply(schema); - assertTrue(result.isEmpty()); + result = validator.validateTimeCompleted().apply(schema); + assertEquals(0, result.count()); - result = SchemaValidationRoles.validateNotTimeCompleted().apply(schema); - assertFalse(result.isEmpty()); + result = validator.validateNotTimeCompleted().apply(schema); + assertEquals(1, result.count()); } @Test public void timeReceivedTest() { Schema schema; - Collection result; + Stream result; schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) @@ -319,11 +334,11 @@ public void timeReceivedTest() { .requiredString("field") .endRecord(); - result = SchemaValidationRoles.validateTimeReceived().apply(schema); - assertFalse(result.isEmpty()); + result = validator.validateTimeReceived().apply(schema); + assertEquals(1, result.count()); - result = SchemaValidationRoles.validateNotTimeReceived().apply(schema); - assertTrue(result.isEmpty()); + result = validator.validateNotTimeReceived().apply(schema); + assertEquals(0, result.count()); schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) @@ -332,17 +347,17 @@ public void timeReceivedTest() { .requiredDouble("timeReceived") .endRecord(); - result = SchemaValidationRoles.validateTimeReceived().apply(schema); - assertTrue(result.isEmpty()); + result = validator.validateTimeReceived().apply(schema); + assertEquals(0, result.count()); - result = SchemaValidationRoles.validateNotTimeReceived().apply(schema); - assertFalse(result.isEmpty()); + result = validator.validateNotTimeReceived().apply(schema); + assertEquals(1, result.count()); } @Test public void fieldNameTest() { Schema schema; - Collection result; + Stream result; schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) @@ -351,8 +366,8 @@ public void fieldNameTest() { .requiredString(FIELD_NUMBER_MOCK + "value") .endRecord(); - result = SchemaValidationRoles.validateFieldName().apply(schema); - assertFalse(result.isEmpty()); + result = validator.validateFieldName().apply(schema); + assertEquals(1, result.count()); schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) @@ -361,20 +376,20 @@ public void fieldNameTest() { .requiredString(FIELD_NUMBER_MOCK) .endRecord(); - result = SchemaValidationRoles.validateFieldName().apply(schema); - assertFalse(result.isEmpty()); + result = validator.validateFieldName().apply(schema); + assertEquals(1, result.count()); schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) .record(RECORD_NAME_MOCK) .fields() .requiredString(FIELD_NUMBER_MOCK) - .requiredString(SchemaValidationRoles.TIME) + .requiredString(RadarSchemaValidationRules.TIME) .endRecord(); - result = SchemaValidationRoles.validateFieldName( - Collections.singleton(SchemaValidationRoles.TIME)).apply(schema); - assertFalse(result.isEmpty()); + result = validator.validateFieldName(s -> + Collections.singleton(RadarSchemaValidationRules.TIME)).apply(schema); + assertEquals(1, result.count()); schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) @@ -383,26 +398,26 @@ public void fieldNameTest() { .requiredDouble("timeReceived") .endRecord(); - result = SchemaValidationRoles.validateFieldName().apply(schema); - assertTrue(result.isEmpty()); + result = validator.validateFieldName().apply(schema); + assertEquals(0, result.count()); schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) .record(RECORD_NAME_MOCK) .fields() .requiredString(FIELD_NUMBER_MOCK) - .requiredString(SchemaValidationRoles.TIME) + .requiredString(RadarSchemaValidationRules.TIME) .endRecord(); - result = SchemaValidationRoles.validateFieldName( + result = validator.validateFieldName(s -> Collections.singleton(FIELD_NUMBER_MOCK)).apply(schema); - assertTrue(result.isEmpty()); + assertEquals(0, result.count()); } @Test public void filedDocumentationTest() { Schema schema; - Collection result; + Stream result; schema = new Parser().parse("{\"namespace\": \"org.radarcns.kafka.key\", " + "\"type\": \"record\"," @@ -410,22 +425,22 @@ public void filedDocumentationTest() { + "{\"name\": \"userId\", \"type\": \"string\" , \"doc\": \"Documentation\"}," + "{\"name\": \"sourceId\", \"type\": \"string\"} ]}"); - result = SchemaValidationRoles.validateFieldDocumentation().apply(schema); + result = validator.validateFieldDocumentation().apply(schema); - assertFalse(result.isEmpty()); + assertEquals(1, result.count()); schema = new Parser().parse("{\"namespace\": \"org.radarcns.kafka.key\", " + "\"type\": \"record\", \"name\": \"key\", \"type\": \"record\", \"fields\": [" + "{\"name\": \"userId\", \"type\": \"string\" , \"doc\": \"Documentation.\"}]}"); - result = SchemaValidationRoles.validateFieldDocumentation().apply(schema); - assertTrue(result.isEmpty()); + result = validator.validateFieldDocumentation().apply(schema); + assertEquals(0, result.count()); } @Test public void schemaDocumentationTest() { Schema schema; - Collection result; + Stream result; schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) @@ -433,9 +448,9 @@ public void schemaDocumentationTest() { .fields() .endRecord(); - result = SchemaValidationRoles.validateSchemaDocumentation().apply(schema); + result = validator.validateSchemaDocumentation().apply(schema); - assertFalse(result.isEmpty()); + assertEquals(1, result.count()); schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) @@ -444,34 +459,34 @@ public void schemaDocumentationTest() { .fields() .endRecord(); - result = SchemaValidationRoles.validateSchemaDocumentation().apply(schema); + result = validator.validateSchemaDocumentation().apply(schema); - assertTrue(result.isEmpty()); + assertEquals(0, result.count()); } @Test public void enumerationSymbolsTest() { Schema schema; - Collection result; + Stream result; schema = SchemaBuilder.enumeration(ENUMERATOR_NAME_SPACE_MOCK) .symbols("TEST", UNKNOWN_MOCK); - result = SchemaValidationRoles.validateSymbols().apply(schema); + result = validator.validateSymbols().apply(schema); - assertTrue(result.isEmpty()); + assertEquals(0, result.count()); schema = SchemaBuilder.enumeration(ENUMERATOR_NAME_SPACE_MOCK).symbols(); - result = SchemaValidationRoles.validateSymbols().apply(schema); + result = validator.validateSymbols().apply(schema); - assertFalse(result.isEmpty()); + assertEquals(1, result.count()); } @Test public void enumerationSymbolTest() { Schema schema; - Collection result; + Stream result; String enumName = "org.radarcns.monitor.application.ApplicationServerStatus"; String connected = "CONNECTED"; @@ -480,9 +495,9 @@ public void enumerationSymbolTest() { .enumeration(enumName) .symbols(connected, "DISCONNECTED", UNKNOWN_MOCK); - result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); + result = validator.validateEnumerationSymbols().apply(schema); - assertTrue(result.isEmpty()); + assertEquals(0, result.count()); String schemaTxtInit = "{\"namespace\": \"org.radarcns.monitor.application\", " + "\"type\": \"record\", \"name\": \"ApplicationServerStatus\", \"fields\": " @@ -494,74 +509,56 @@ public void enumerationSymbolTest() { schema = new Parser().parse(schemaTxtInit + "\"CONNECTED\", \"NOT_CONNECTED\", \"" + UNKNOWN_MOCK + "\"" + schemaTxtEnd); - result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); + result = validator.validateEnumerationSymbols().apply(schema); - assertTrue(result.isEmpty()); + assertEquals(0, result.count()); schema = SchemaBuilder .enumeration(enumName) .symbols(connected, "disconnected", UNKNOWN_MOCK); - result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); + result = validator.validateEnumerationSymbols().apply(schema); - assertFalse(result.isEmpty()); + assertEquals(1, result.count()); schema = SchemaBuilder .enumeration(enumName) .symbols(connected, "Not_Connected", UNKNOWN_MOCK); - result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); + result = validator.validateEnumerationSymbols().apply(schema); - assertFalse(result.isEmpty()); + assertEquals(1, result.count()); schema = SchemaBuilder .enumeration(enumName) .symbols(connected, "NotConnected", UNKNOWN_MOCK); - result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); + result = validator.validateEnumerationSymbols().apply(schema); - assertFalse(result.isEmpty()); + assertEquals(1, result.count()); schema = new Parser().parse(schemaTxtInit + "\"CONNECTED\", \"Not_Connected\", \"" + UNKNOWN_MOCK + "\"" + schemaTxtEnd); - result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); + result = validator.validateEnumerationSymbols().apply(schema); - assertFalse(result.isEmpty()); + assertEquals(1, result.count()); schema = new Parser().parse(schemaTxtInit + "\"Connected\", \"NotConnected\", \"" + UNKNOWN_MOCK + "\"" + schemaTxtEnd); - result = SchemaValidationRoles.validateEnumerationSymbols().apply(schema); + result = validator.validateEnumerationSymbols().apply(schema); - assertFalse(result.isEmpty()); + assertEquals(1, result.count()); } @Test - public void unknownSymbolTest() { - Schema schema; - Collection result; - - schema = SchemaBuilder.enumeration(ENUMERATOR_NAME_SPACE_MOCK) - .symbols("VALUE", UNKNOWN_MOCK); - - result = SchemaValidationRoles.validateUnknownSymbol().apply(schema); - - assertTrue(result.isEmpty()); - - schema = SchemaBuilder.enumeration(ENUMERATOR_NAME_SPACE_MOCK) - .symbols("FIELD", "UN_KNOWN"); - - result = SchemaValidationRoles.validateUnknownSymbol().apply(schema); - - assertFalse(result.isEmpty()); - } - - @Test(expected = IllegalArgumentException.class) public void defaultValueExceptionTest() { - SchemaValidationRoles.validateDefault().apply( + Stream result = validator.validateDefault().apply( SchemaBuilder.enumeration(ENUMERATOR_NAME_SPACE_MOCK) - .symbols("VAL", UNKNOWN_MOCK)); + .symbols("VAL", UNKNOWN_MOCK)); + + assertEquals(1, result.count()); } @Test @@ -572,7 +569,7 @@ public void defaultValueTest() { //String recordName = "TestRecord"; Schema schema; - Collection result; + Stream result; /*schema = SchemaBuilder .builder(namespace) @@ -589,9 +586,9 @@ public void defaultValueTest() { .nullableBytes("nullableBytes", new byte[1]) //check with text schema .endRecord(); - result = SchemaValidationRoles.validateDefault().apply(schema); + result = validator.validateDefault().apply(schema); - assertTrue(result.isEmpty());*/ + assertEquals(0, result.count());*/ String scemaTxtInit = "{\"namespace\": \"org.radarcns.test\", " + "\"type\": \"record\", \"name\": \"TestRecord\", \"fields\": "; @@ -600,9 +597,9 @@ public void defaultValueTest() { + "[ {\"name\": \"nullableBytes\", \"type\": [ \"null\", \"bytes\"], " + "\"default\": \"null\" } ] }"); - result = SchemaValidationRoles.validateDefault().apply(schema); + result = validator.validateDefault().apply(schema); - assertTrue(result.isEmpty()); + assertEquals(0, result.count()); schema = SchemaBuilder .builder(namespace) @@ -611,9 +608,9 @@ public void defaultValueTest() { .nullableDouble("nullableDouble", -1) .endRecord(); - result = SchemaValidationRoles.validateDefault().apply(schema);*/ + result = validator.validateDefault().apply(schema);*/ - /*assertFalse(result.isEmpty()); + /*assertEquals(1, result.count()); assertEquals(Optional.of(invalidMessage), result.getReason()); schema = SchemaBuilder @@ -623,9 +620,9 @@ public void defaultValueTest() { .nullableInt("nullableInt", -1) .endRecord(); - result = SchemaValidationRoles.validateDefault().apply(schema); + result = validator.validateDefault().apply(schema); - assertFalse(result.isEmpty()); + assertEquals(1, result.count()); assertEquals(Optional.of(invalidMessage), result.getReason()); schema = SchemaBuilder @@ -635,9 +632,9 @@ public void defaultValueTest() { .nullableLong("nullableLong", -1) .endRecord(); - result = SchemaValidationRoles.validateDefault().apply(schema); + result = validator.validateDefault().apply(schema); - assertFalse(result.isEmpty()); + assertEquals(1, result.count()); assertEquals(Optional.of(invalidMessage), result.getReason());*/ schema = new Parser().parse(scemaTxtInit @@ -645,26 +642,26 @@ public void defaultValueTest() { + "\"enum\", \"symbols\": [\"Connected\", \"NotConnected\", \"UNKNOWN\"] }, " + "\"default\": \"UNKNOWN\" } ] }"); - result = SchemaValidationRoles.validateDefault().apply(schema); + result = validator.validateDefault().apply(schema); - assertTrue(result.isEmpty()); + assertEquals(0, result.count()); schema = new Parser().parse(scemaTxtInit + "[ {\"name\": \"serverStatus\", \"type\": {\"name\": \"ServerStatus\", \"type\": " + "\"enum\", \"symbols\": [\"Connected\", \"NotConnected\", \"UNKNOWN\"] }, " + "\"default\": \"null\" } ] }"); - result = SchemaValidationRoles.validateDefault().apply(schema); + result = validator.validateDefault().apply(schema); - assertFalse(result.isEmpty()); + assertEquals(1, result.count()); /*schema = new Parser().parse(scemaTxtInit + "[ {\"name\": \"nullableBoolean\", \"type\": [ \"null\", \"boolean\"], " + "\"default\": \"null\" } ] }"); - result = SchemaValidationRoles.validateDefault().apply(schema); + result = validator.validateDefault().apply(schema); - assertFalse(result.isEmpty()); + assertEquals(1, result.count()); assertEquals(Optional.of(invalidMessage), result.getReason());*/ } } From 8736a14216fce8206c0324c6bbad751e7217cc36 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Tue, 19 Sep 2017 12:31:48 +0200 Subject: [PATCH 065/112] Reduced RadarSchemaValidationRules complexity --- .../rules/RadarSchemaValidationRules.java | 153 +++++------------- .../rules/SchemaValidationRules.java | 36 +++++ .../rules/RadarSchemaValidationRulesTest.java | 38 +---- 3 files changed, 82 insertions(+), 145 deletions(-) diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaValidationRules.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaValidationRules.java index fbce452f..47dd9f5d 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaValidationRules.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaValidationRules.java @@ -19,7 +19,6 @@ import org.apache.avro.JsonProperties; import org.apache.avro.Schema; import org.apache.avro.Schema.Type; -import org.radarcns.schema.Scope; import org.radarcns.schema.validation.ValidationException; import org.radarcns.schema.validation.ValidationSupport; import org.radarcns.schema.validation.config.ExcludeConfig; @@ -32,10 +31,12 @@ import java.util.Objects; import java.util.function.BiFunction; import java.util.function.Function; -import java.util.function.Predicate; import java.util.regex.Pattern; import java.util.stream.Stream; +import static org.radarcns.schema.validation.rules.SchemaValidationRules.message; +import static org.radarcns.schema.validation.rules.SchemaValidationRules.messageField; +import static org.radarcns.schema.validation.rules.SchemaValidationRules.messageSchema; import static org.radarcns.schema.validation.rules.Validator.matches; import static org.radarcns.schema.validation.rules.Validator.raise; import static org.radarcns.schema.validation.rules.Validator.valid; @@ -70,28 +71,7 @@ public class RadarSchemaValidationRules implements SchemaValidationRules { private static final List FIELD_NAME_NOT_ALLOWED_SUFFIX = Arrays.asList( "value", "Value"); - private static final String NAME_SPACE = "Namespace cannot be null and must fully lowercase dot" - + " separated without numeric. In this case the expected value is \""; - private static final String TIME_FIELD = "Any schema representing collected data must have a \"" - + TIME + "\" field formatted in " + Type.DOUBLE + "."; - private static final String TIME_COMPLETED_FIELD = "Any " + Scope.ACTIVE - + " schema must have a \"" + TIME_COMPLETED + "\" field formatted in " - + Type.DOUBLE + "."; - private static final String NOT_TIME_COMPLETED_FIELD = "\"" + TIME_COMPLETED - + "\" is allow only in " + Scope.ACTIVE + " schemas."; - private static final String TIME_RECEIVED_FIELD = "Any " + Scope.PASSIVE - + " schema must have a \"" + TIME_RECEIVED + "\" field formatted in " - + Type.DOUBLE + "."; - private static final String NOT_TIME_RECEIVED_FIELD = "\"" + TIME_RECEIVED - + "\" is allow only in " + Scope.PASSIVE + " schemas."; - private static final String FIELD_NAME_NOT_ALLOWED = "Field name cannot end with the" - + " following values " + FIELD_NAME_NOT_ALLOWED_SUFFIX + "."; - private static final String FIELD_NAME_LOWER_CAMEL = "Field name does not respect" - + " lowerCamelCase name convention. Please avoid abbreviations and write out the" - + " field name instead."; - private static final String SYMBOLS = "Avro Enumerator must have symbol list."; - private static final String ENUMERATION_SYMBOL = "Enumerator items should be written in" - + " uppercase characters separated by underscores."; + private static final String WITH_TYPE_DOUBLE = "\" field with type \"double\"."; private final Path root; private final ExcludeConfig config; @@ -119,7 +99,7 @@ public Validator validateFieldTypes() { Schema.Type subType = field.getField().schema().getType(); if (subType == Schema.Type.UNION) { - return validateInternalUnion(field); + return validateInternalUnion().apply(field); } else if (subType == Schema.Type.RECORD) { return internalRecordValidation().apply(metadata); } else if (subType == Schema.Type.ENUM) { @@ -130,25 +110,6 @@ public Validator validateFieldTypes() { }; } - private Stream validateInternalUnion(SchemaField field) { - return field.getField().schema().getTypes().stream() - .flatMap(schema -> { - Schema.Type type = schema.getType(); - SchemaMetadata subMeta = field.getSchemaMetadata().withSubSchema( - schema); - if (type == Schema.Type.RECORD) { - return internalRecordValidation().apply(subMeta); - } else if (type == Schema.Type.ENUM) { - return internalEnumValidation().apply(subMeta); - } if (type == Schema.Type.UNION) { - return raise(messageField("Cannot have a nested union.") - .apply(field)); - } else { - return valid(); - } - }); - } - @Override public Validator validateSchemaLocation() { return validateNamespaceSchemaLocation() @@ -157,17 +118,19 @@ public Validator validateSchemaLocation() { private Validator validateNamespaceSchemaLocation() { return metadata -> { - try { - String expected = ValidationSupport.getNamespace( - root, metadata.getPath(), metadata.getScope()); - String namespace = metadata.getSchema().getNamespace(); - - return expected.equalsIgnoreCase(namespace) ? valid() : raise(message( - NAME_SPACE + expected + "\".").apply(metadata)); - } catch (IllegalArgumentException ex) { - return Stream.of(new ValidationException("Path " + metadata.getPath() - + " is not part of root " + root, ex)); - } + try { + String expected = ValidationSupport.getNamespace( + root, metadata.getPath(), metadata.getScope()); + String namespace = metadata.getSchema().getNamespace(); + + return expected.equalsIgnoreCase(namespace) ? valid() : raise(message( + "Namespace cannot be null and must fully lowercase dot" + + " separated without numeric. In this case the expected value is \"" + + expected + "\".").apply(metadata)); + } catch (IllegalArgumentException ex) { + return Stream.of(new ValidationException("Path " + metadata.getPath() + + " is not part of root " + root, ex)); + } }; } @@ -181,10 +144,6 @@ private Validator validateNameSchemaLocation() { }; } - /** - * TODO. - * @return TODO - */ @Override public Validator validateNameSpace() { return validateNonNull(Schema::getNamespace, matches(NAMESPACE_PATTERN), @@ -235,26 +194,13 @@ private Stream validateDocumentation(String doc, @Override public Validator validateFieldName() { - return validateFieldName(config::isSkipped); - } - - /** - * Checks field names, except when the given predicate tests true. - * @param skip fields to skip - */ - protected Validator validateFieldName(Predicate skip) { - return field -> { - if (!skip.test(field)) { - String name = field.getField().name(); - if (!matches(name, FIELD_NAME_PATTERN)) { - return raise(messageField(FIELD_NAME_LOWER_CAMEL).apply(field)); - } - if (FIELD_NAME_NOT_ALLOWED_SUFFIX.stream().anyMatch(name::endsWith)) { - return raise(messageField(FIELD_NAME_NOT_ALLOWED).apply(field)); - } - } - return valid(); - }; + return validateNonNull(f -> f.getField().name(), matches(FIELD_NAME_PATTERN), messageField( + "Field name does not respect lowerCamelCase name convention." + + " Please avoid abbreviations and write out the field name instead.")) + .and(validateNonNull(f -> f.getField().name(), + n -> FIELD_NAME_NOT_ALLOWED_SUFFIX.stream().noneMatch(n::endsWith), + messageField("Field name may not end with the following values: " + + FIELD_NAME_NOT_ALLOWED_SUFFIX + "."))); } @Override @@ -265,18 +211,22 @@ public Validator validateFieldDocumentation() { @Override public Validator validateSymbols() { - return validateNonEmpty(Schema::getEnumSymbols, messageSchema(SYMBOLS)) + return validateNonEmpty(Schema::getEnumSymbols, messageSchema( + "Avro Enumerator must have symbol list.")) .and(schema -> schema.getEnumSymbols().stream() .filter(symbol -> !matches(symbol, ENUM_SYMBOL_PATTERN)) .map(s -> new ValidationException(messageSchema( "Symbol " + s + " does not use valid syntax. " - + ENUMERATION_SYMBOL).apply(schema)))); + + "Enumerator items should be written in" + + " uppercase characters separated by underscores.") + .apply(schema)))); } @Override public Validator validateDefault() { return input -> defaultsValidator - .getOrDefault(input.getField().schema().getType(), this::validateDefaultOther) + .getOrDefault(input.getField().schema().getType(), + this::validateDefaultOther) .apply(input); } @@ -311,7 +261,9 @@ private Stream validateDefaultOther(SchemaField field) { @Override public Validator validateTime() { return validateNonNull(s -> s.getField(TIME), - time -> time.schema().getType().equals(Type.DOUBLE), messageSchema(TIME_FIELD)); + time -> time.schema().getType().equals(Type.DOUBLE), messageSchema( + "Any schema representing collected data must have a \"" + + TIME + WITH_TYPE_DOUBLE)); } /** @@ -321,7 +273,9 @@ public Validator validateTime() { @Override public Validator validateTimeCompleted() { return validateNonNull(s -> s.getField(TIME_COMPLETED), - time -> time.schema().getType().equals(Type.DOUBLE), messageSchema(TIME_COMPLETED_FIELD)); + time -> time.schema().getType().equals(Type.DOUBLE), + messageSchema("Any ACTIVE schema must have a \"" + + TIME_COMPLETED + WITH_TYPE_DOUBLE)); } /** @@ -331,41 +285,22 @@ public Validator validateTimeCompleted() { @Override public Validator validateNotTimeCompleted() { return validate(schema -> Objects.isNull(schema.getField(TIME_COMPLETED)), - messageSchema(NOT_TIME_COMPLETED_FIELD)); + messageSchema("\"" + TIME_COMPLETED + + "\" is allow only in ACTIVE schemas.")); } - /** - * TODO. - * @return TODO - */ @Override public Validator validateTimeReceived() { return validateNonNull(s -> s.getField(TIME_RECEIVED), - time -> time.schema().getType().equals(Type.DOUBLE), messageSchema(TIME_RECEIVED_FIELD)); + time -> time.schema().getType().equals(Type.DOUBLE), + messageSchema("Any PASSIVE schema must have a \"" + + TIME_RECEIVED + WITH_TYPE_DOUBLE)); } - /** - * TODO. - * @return TODO - */ @Override public Validator validateNotTimeReceived() { return validate(schema -> Objects.isNull(schema.getField(TIME_RECEIVED)), - messageSchema(NOT_TIME_RECEIVED_FIELD)); - } - - private static Function messageSchema(String text) { - return schema -> "Schema " + schema.getFullName() + " is invalid. " + text; - } - - private static Function message(String text) { - return metadata -> "Schema " + metadata.getSchema().getFullName() - + " at " + metadata.getPath() + " is invalid. " + text; - } - - private static Function messageField(String text) { - return schema -> "Field " + schema.getField().name() + " in schema " - + schema.getSchemaMetadata().getSchema().getFullName() + " is invalid. " + text; + messageSchema("\"" + TIME_RECEIVED + "\" is allow only in PASSIVE schemas.")); } @Override diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaValidationRules.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaValidationRules.java index 3a1bdf29..9a6eefe6 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaValidationRules.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaValidationRules.java @@ -2,7 +2,10 @@ import org.apache.avro.Schema; +import java.util.function.Function; + import static org.radarcns.schema.validation.rules.Validator.raise; +import static org.radarcns.schema.validation.rules.Validator.valid; public interface SchemaValidationRules { /** Checks the location of a schema with its internal data. */ @@ -38,6 +41,25 @@ default Validator internalRecordValidation() { .and(fields(validateFieldDocumentation())); } + default Validator validateInternalUnion() { + return field -> field.getField().schema().getTypes().stream() + .flatMap(schema -> { + Schema.Type type = schema.getType(); + SchemaMetadata subMeta = field.getSchemaMetadata().withSubSchema( + schema); + if (type == Schema.Type.RECORD) { + return internalRecordValidation().apply(subMeta); + } else if (type == Schema.Type.ENUM) { + return internalEnumValidation().apply(subMeta); + } else if (type == Schema.Type.UNION) { + return raise(messageField("Cannot have a nested union.") + .apply(field)); + } else { + return valid(); + } + }); + } + /** Checks field name format. */ Validator validateFieldName(); @@ -170,4 +192,18 @@ default Validator fields(Validator validator) { default Validator schema(Validator validator) { return metadata -> validator.apply(metadata.getSchema()); } + + static Function messageSchema(String text) { + return schema -> "Schema " + schema.getFullName() + " is invalid. " + text; + } + + static Function message(String text) { + return metadata -> "Schema " + metadata.getSchema().getFullName() + + " at " + metadata.getPath() + " is invalid. " + text; + } + + static Function messageField(String text) { + return schema -> "Field " + schema.getField().name() + " in schema " + + schema.getSchemaMetadata().getSchema().getFullName() + " is invalid. " + text; + } } diff --git a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaValidationRulesTest.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaValidationRulesTest.java index ce570691..8179708e 100644 --- a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaValidationRulesTest.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaValidationRulesTest.java @@ -36,7 +36,6 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.radarcns.schema.SchemaRepository.COMMONS_PATH; -import static org.radarcns.schema.Scope.ACTIVE; import static org.radarcns.schema.Scope.MONITOR; import static org.radarcns.schema.Scope.PASSIVE; import static org.radarcns.schema.specification.SourceCatalogue.BASE_PATH; @@ -59,11 +58,10 @@ public class RadarSchemaValidationRulesTest { private static final String RECORD_NAME_MOCK = "RecordName"; private static final String FIELD_NUMBER_MOCK = "Field1"; private RadarSchemaValidationRules validator; - private ExcludeConfig config; @Before public void setUp() throws IOException { - config = new ExcludeConfig(); + ExcludeConfig config = new ExcludeConfig(); validator = new RadarSchemaValidationRules(BASE_PATH, config); } @@ -137,9 +135,6 @@ public void nameSpaceTest() { .fields() .endRecord(); - Path root = ACTIVE.getPath(BASE_PATH.resolve(COMMONS_PATH)); - assertNotNull(root); - Stream result = validator.validateNameSpace() .apply(schema); @@ -154,9 +149,6 @@ public void nameSpaceInvalidDashTest() { .fields() .endRecord(); - Path root = MONITOR.getPath(BASE_PATH.resolve(COMMONS_PATH)); - assertNotNull(root); - Path path = root.resolve("test/record_name.avsc"); Stream result = validator.validateNameSpace() .apply(schema); @@ -375,7 +367,7 @@ public void fieldNameTest() { .endRecord(); result = validator.fields(validator.validateFieldName()).apply(new SchemaMetadata(schema)); - assertEquals(1, result.count()); + assertEquals(2, result.count()); schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) @@ -387,19 +379,6 @@ public void fieldNameTest() { result = validator.fields(validator.validateFieldName()).apply(new SchemaMetadata(schema)); assertEquals(1, result.count()); - schema = SchemaBuilder - .builder(MONITOR_NAME_SPACE_MOCK) - .record(RECORD_NAME_MOCK) - .fields() - .requiredString(FIELD_NUMBER_MOCK) - .requiredString(RadarSchemaValidationRules.TIME) - .endRecord(); - - result = validator.fields(validator.validateFieldName( - s -> RadarSchemaValidationRules.TIME.equalsIgnoreCase(s.getField().name()))) - .apply(new SchemaMetadata(schema)); - assertEquals(1, result.count()); - schema = SchemaBuilder .builder(MONITOR_NAME_SPACE_MOCK) .record(RECORD_NAME_MOCK) @@ -409,19 +388,6 @@ public void fieldNameTest() { result = validator.fields(validator.validateFieldName()).apply(new SchemaMetadata(schema)); assertEquals(0, result.count()); - - schema = SchemaBuilder - .builder(MONITOR_NAME_SPACE_MOCK) - .record(RECORD_NAME_MOCK) - .fields() - .requiredString(FIELD_NUMBER_MOCK) - .requiredString(RadarSchemaValidationRules.TIME) - .endRecord(); - - result = validator.fields(validator.validateFieldName( - s -> FIELD_NUMBER_MOCK.equalsIgnoreCase(s.getField().name()))) - .apply(new SchemaMetadata(schema)); - assertEquals(0, result.count()); } @Test From 226977177357ce51647230d7dd443460b0a23619 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Tue, 19 Sep 2017 15:29:43 +0200 Subject: [PATCH 066/112] Split validation into separate files --- .../active/questionnaire/Question.java | 4 +- .../schema/validation/SchemaValidator.java | 6 +- .../validation/config/ExcludeConfig.java | 2 +- .../validation/rules/QuestionRoles.java | 33 +- .../rules/RadarSchemaFieldRules.java | 106 +++++++ .../rules/RadarSchemaMetadataRules.java | 74 +++++ ...dationRules.java => RadarSchemaRules.java} | 156 +-------- .../schema/validation/rules/SchemaField.java | 10 +- .../validation/rules/SchemaFieldRules.java | 50 +++ .../validation/rules/SchemaMetadataRules.java | 53 ++++ .../schema/validation/rules/SchemaRules.java | 117 +++++++ .../rules/SchemaValidationRules.java | 209 ------------- .../schema/validation/rules/Validator.java | 48 ++- .../rules/RadarSchemaFieldRulesTest.java | 206 ++++++++++++ .../rules/RadarSchemaMetadataRulesTest.java | 129 ++++++++ ...lesTest.java => RadarSchemaRulesTest.java} | 295 +----------------- 16 files changed, 833 insertions(+), 665 deletions(-) create mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaFieldRules.java create mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaMetadataRules.java rename java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/{RadarSchemaValidationRules.java => RadarSchemaRules.java} (52%) create mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaFieldRules.java create mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaMetadataRules.java create mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaRules.java delete mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaValidationRules.java create mode 100644 java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaFieldRulesTest.java create mode 100644 java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaMetadataRulesTest.java rename java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/{RadarSchemaValidationRulesTest.java => RadarSchemaRulesTest.java} (51%) diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/Question.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/Question.java index 59ba4b5c..dafe935b 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/Question.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/Question.java @@ -1,5 +1,3 @@ -package org.radarcns.schema.specification.active.questionnaire; - /* * Copyright 2017 King's College London and The Hyve * @@ -16,6 +14,8 @@ * limitations under the License. */ +package org.radarcns.schema.specification.active.questionnaire; + import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaValidator.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaValidator.java index dc734018..ada08c0f 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaValidator.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaValidator.java @@ -19,7 +19,8 @@ import org.apache.avro.Schema; import org.radarcns.schema.Scope; import org.radarcns.schema.validation.config.ExcludeConfig; -import org.radarcns.schema.validation.rules.RadarSchemaValidationRules; +import org.radarcns.schema.validation.rules.RadarSchemaMetadataRules; +import org.radarcns.schema.validation.rules.RadarSchemaRules; import org.radarcns.schema.validation.rules.SchemaMetadata; import org.radarcns.schema.validation.rules.Validator; @@ -41,8 +42,7 @@ public class SchemaValidator { public SchemaValidator(Path root, ExcludeConfig config) { this.config = config; this.root = root; - this.validator = new RadarSchemaValidationRules(root, config) - .getValidator(); + this.validator = new RadarSchemaMetadataRules(root, config).getValidator(); } /** 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 06ba363b..3d3d8d53 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 @@ -131,7 +131,7 @@ public boolean isNameRecordEnable(Schema schema) { * @return TODO */ public boolean isSkipped(SchemaField field) { - Schema schema = field.getSchemaMetadata().getSchema(); + Schema schema = field.getSchema(); ConfigItem item = validation.get(schema.getFullName()) == null ? validation.get(schema.getNamespace() + WILD_CARD_PACKAGE) : validation.get(schema.getFullName()); diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/QuestionRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/QuestionRoles.java index 32170c68..ac7c9d52 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/QuestionRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/QuestionRoles.java @@ -18,20 +18,16 @@ import org.radarcns.schema.specification.active.questionnaire.Question; +import java.util.stream.Stream; + +import static org.radarcns.schema.validation.rules.Validator.check; +import static org.radarcns.schema.validation.rules.Validator.validateNonEmpty; import static org.radarcns.schema.validation.rules.Validator.validateNonNull; /** * TODO. */ public final class QuestionRoles { - private static final String CONTENT = "Question content cannot be null and should be ended by" - + " a point."; - private static final String LEAD = "Question lead cannot be null and should be ended by a" - + " question mark."; - private static final String WIDGET = "Widget cannot be null."; - private static final String RESPONSES = "Responses list cannot be null or empty."; - - private QuestionRoles() { // utility class } @@ -41,7 +37,13 @@ private QuestionRoles() { * @return TODO */ static Validator validateContent() { - return validateNonNull(Question::getContent, content -> content.endsWith("."), CONTENT); + return validateNonEmpty(Question::getContent, + "Question \"content\" property is empty.", + content -> Stream.concat( + check(content.charAt(content.length() - 1) == '.', + "Question content should be terminated with a period."), + check(Character.isUpperCase(content.charAt(0)), + "Question content should start with an uppercase character."))); } /** @@ -49,7 +51,12 @@ static Validator validateContent() { * @return TODO */ static Validator validateLead() { - return validateNonNull(Question::getLead, lead -> lead.endsWith("?"), LEAD); + return validateNonEmpty(Question::getLead, "Question \"lead\" is empty.", + lead -> Stream.concat( + check(lead.charAt(lead.length() - 1) == '?', + "Question lead should be ended by a question mark: " + lead), + check(Character.isUpperCase(lead.charAt(0)), + "Question lead should start with an uppercase character."))); } /** @@ -57,7 +64,7 @@ static Validator validateLead() { * @return TODO */ static Validator validateWidget() { - return validateNonNull(Question::getWidget, WIDGET); + return validateNonNull(Question::getWidget, "Widget cannot be null."); } /** @@ -65,7 +72,7 @@ static Validator validateWidget() { * @return TODO */ static Validator validateResponses() { - return validateNonNull(Question::getResponses, responses -> !responses.isEmpty(), - RESPONSES); + return validateNonEmpty(Question::getResponses, + "Responses list cannot be null or empty."); } } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaFieldRules.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaFieldRules.java new file mode 100644 index 00000000..e2c5e887 --- /dev/null +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaFieldRules.java @@ -0,0 +1,106 @@ +package org.radarcns.schema.validation.rules; + +import org.apache.avro.JsonProperties; +import org.apache.avro.Schema; +import org.radarcns.schema.validation.ValidationException; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; +import java.util.stream.Stream; + +import static org.radarcns.schema.validation.rules.RadarSchemaRules.validateDocumentation; +import static org.radarcns.schema.validation.rules.Validator.check; +import static org.radarcns.schema.validation.rules.Validator.matches; +import static org.radarcns.schema.validation.rules.Validator.raise; +import static org.radarcns.schema.validation.rules.Validator.valid; +import static org.radarcns.schema.validation.rules.Validator.validateNonNull; + +public class RadarSchemaFieldRules implements SchemaFieldRules { + private static final String UNKNOWN = "UNKNOWN"; + private static final List FIELD_NAME_NOT_ALLOWED_SUFFIX = Arrays.asList( + "value", "Value"); + + // lowerCamelCase + public static final Pattern FIELD_NAME_PATTERN = Pattern.compile( + "^[a-z][a-z0-9]*([a-z0-9][A-Z][a-z0-9]+)?([A-Z][a-z0-9]+)*[A-Z]?$"); + + private final Map> defaultsValidator; + + public RadarSchemaFieldRules() { + defaultsValidator = new HashMap<>(); + defaultsValidator.put(Schema.Type.RECORD, validateDefault()); + defaultsValidator.put(Schema.Type.ENUM, this::validateDefaultEnum); + defaultsValidator.put(Schema.Type.UNION, this::validateDefaultUnion); + } + + @Override + public Validator validateFieldTypes(SchemaRules schemaRules) { + return field -> { + Schema schema = field.getField().schema(); + Schema.Type subType = schema.getType(); + if (subType == Schema.Type.UNION) { + return validateInternalUnion(schemaRules).apply(field); + } else if (subType == Schema.Type.RECORD) { + return schemaRules.validateRecord(false).apply(schema); + } else if (subType == Schema.Type.ENUM) { + return schemaRules.validateEnum(false).apply(schema); + } else { + return valid(); + } + }; + } + + @Override + public Validator validateDefault() { + return input -> defaultsValidator + .getOrDefault(input.getField().schema().getType(), + this::validateDefaultOther) + .apply(input); + } + + + @Override + public Validator validateFieldName() { + return validateNonNull(f -> f.getField().name(), matches(FIELD_NAME_PATTERN), messageField( + "Field name does not respect lowerCamelCase name convention." + + " Please avoid abbreviations and write out the field name instead.")) + .and(validateNonNull(f -> f.getField().name(), + n -> FIELD_NAME_NOT_ALLOWED_SUFFIX.stream().noneMatch(n::endsWith), + messageField("Field name may not end with the following values: " + + FIELD_NAME_NOT_ALLOWED_SUFFIX + "."))); + } + + @Override + public Validator validateFieldDocumentation() { + return field -> validateDocumentation(field.getField().doc(), + (m, f) -> messageField(m).apply(f), field); + } + + + private Stream validateDefaultEnum(SchemaField field) { + return !field.getField().schema().getEnumSymbols().contains(UNKNOWN) + || (field.getField().defaultVal() != null + && field.getField().defaultVal().toString().equals(UNKNOWN)) ? valid() + : raise(messageField("Default is \"" + field.getField().defaultVal() + + "\". Any Avro enum type that has an \"UNKNOWN\" symbol must set its" + + " default value to \"UNKNOWN\".").apply(field)); + } + + private Stream validateDefaultUnion(SchemaField field) { + return !field.getField().schema().getTypes().contains(Schema.create(Schema.Type.NULL)) + || (field.getField().defaultVal() != null + && field.getField().defaultVal().equals(JsonProperties.NULL_VALUE)) ? valid() + : raise(messageField("Default is not null. Any nullable Avro field must" + + " specify have its default value set to null.").apply(field)); + } + + private Stream validateDefaultOther(SchemaField field) { + return check(field.getField().defaultVal() == null, messageField( + "Default of type " + field.getField().schema().getType() + " is set to " + + field.getField().defaultVal() + ". The only acceptable default values are the" + + " \"UNKNOWN\" enum symbol and null.").apply(field)); + } +} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaMetadataRules.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaMetadataRules.java new file mode 100644 index 00000000..16535474 --- /dev/null +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaMetadataRules.java @@ -0,0 +1,74 @@ +package org.radarcns.schema.validation.rules; + +import org.apache.avro.Schema; +import org.radarcns.schema.validation.ValidationException; +import org.radarcns.schema.validation.ValidationSupport; +import org.radarcns.schema.validation.config.ExcludeConfig; + +import java.nio.file.Path; +import java.util.stream.Stream; + +import static org.radarcns.schema.validation.rules.Validator.check; +import static org.radarcns.schema.validation.rules.Validator.raise; +import static org.radarcns.schema.validation.rules.Validator.valid; + +public class RadarSchemaMetadataRules implements SchemaMetadataRules { + private final SchemaRules schemaRules; + private final Path root; + private final ExcludeConfig config; + + public RadarSchemaMetadataRules(Path root, ExcludeConfig config) { + this(root, config, new RadarSchemaRules(config)); + } + + public RadarSchemaMetadataRules(Path root, ExcludeConfig config, SchemaRules schemaRules) { + this.schemaRules = schemaRules; + this.config = config; + this.root = root; + } + + @Override + public SchemaRules getSchemaRules() { + return schemaRules; + } + + @Override + public Validator validateSchemaLocation() { + return validateNamespaceSchemaLocation() + .and(validateNameSchemaLocation()); + } + + private Validator validateNamespaceSchemaLocation() { + return metadata -> { + try { + String expected = ValidationSupport.getNamespace( + root, metadata.getPath(), metadata.getScope()); + String namespace = metadata.getSchema().getNamespace(); + + return check(expected.equalsIgnoreCase(namespace), message( + "Namespace cannot be null and must fully lowercase dot" + + " separated without numeric. In this case the expected value is \"" + + expected + "\".").apply(metadata)); + } catch (IllegalArgumentException ex) { + return Stream.of(new ValidationException("Path " + metadata.getPath() + + " is not part of root " + root, ex)); + } + }; + } + + private Validator validateNameSchemaLocation() { + return metadata -> { + String expected = ValidationSupport.getRecordName(metadata.getPath()); + + return expected.equalsIgnoreCase(metadata.getSchema().getName()) ? valid() : raise( + message("Record name should match file name. Expected record name is \"" + + expected + "\".").apply(metadata)); + }; + } + + @Override + public Validator schema(Validator validator) { + return metadata -> config.skipFile(metadata.getPath()) ? valid() + : validator.apply(metadata.getSchema()); + } +} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaValidationRules.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaRules.java similarity index 52% rename from java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaValidationRules.java rename to java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaRules.java index 47dd9f5d..6f10bc88 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaValidationRules.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaRules.java @@ -16,27 +16,16 @@ package org.radarcns.schema.validation.rules; -import org.apache.avro.JsonProperties; import org.apache.avro.Schema; import org.apache.avro.Schema.Type; import org.radarcns.schema.validation.ValidationException; -import org.radarcns.schema.validation.ValidationSupport; import org.radarcns.schema.validation.config.ExcludeConfig; -import java.nio.file.Path; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.function.BiFunction; -import java.util.function.Function; import java.util.regex.Pattern; import java.util.stream.Stream; -import static org.radarcns.schema.validation.rules.SchemaValidationRules.message; -import static org.radarcns.schema.validation.rules.SchemaValidationRules.messageField; -import static org.radarcns.schema.validation.rules.SchemaValidationRules.messageSchema; import static org.radarcns.schema.validation.rules.Validator.matches; import static org.radarcns.schema.validation.rules.Validator.raise; import static org.radarcns.schema.validation.rules.Validator.valid; @@ -47,14 +36,11 @@ /** * Schema validation rules enforced for the RADAR-Schemas repository. */ -public class RadarSchemaValidationRules implements SchemaValidationRules { +public class RadarSchemaRules implements SchemaRules { - private static final String UNKNOWN = "UNKNOWN"; static final String TIME = "time"; private static final String TIME_RECEIVED = "timeReceived"; private static final String TIME_COMPLETED = "timeCompleted"; - private final Map>> - defaultsValidator; static final Pattern NAMESPACE_PATTERN = Pattern.compile("^[a-z]+(\\.[a-z]+)*$"); @@ -63,85 +49,29 @@ public class RadarSchemaValidationRules implements SchemaValidationRules { static final Pattern RECORD_NAME_PATTERN = Pattern.compile( "^([A-Z]([a-z]+[0-9]*|[a-z]*[0-9]+))+[A-Z]?$"); - // lowerCamelCase - static final Pattern FIELD_NAME_PATTERN = Pattern.compile( - "^[a-z][a-z0-9]*([a-z0-9][A-Z][a-z0-9]+)?([A-Z][a-z0-9]+)*[A-Z]?$"); - static final Pattern ENUM_SYMBOL_PATTERN = Pattern.compile("^[A-Z][A-Z0-9_]*$"); - private static final List FIELD_NAME_NOT_ALLOWED_SUFFIX = Arrays.asList( - "value", "Value"); private static final String WITH_TYPE_DOUBLE = "\" field with type \"double\"."; - private final Path root; private final ExcludeConfig config; + private final RadarSchemaFieldRules fieldRules; /** * RADAR-Schema validation rules. - * @param root root directory of the RADAR-Schemas repository * @param config validation configuration */ - public RadarSchemaValidationRules(Path root, ExcludeConfig config) { - this.root = root; + public RadarSchemaRules(ExcludeConfig config, RadarSchemaFieldRules fieldRules) { this.config = config; - - defaultsValidator = new HashMap<>(); - defaultsValidator.put(Type.RECORD, validateDefault()); - defaultsValidator.put(Type.ENUM, this::validateDefaultEnum); - defaultsValidator.put(Type.UNION, this::validateDefaultUnion); + this.fieldRules = fieldRules; } - @Override - public Validator validateFieldTypes() { - return field -> { - SchemaMetadata metadata = field.getSchemaMetadata().withSubSchema( - field.getField().schema()); - - Schema.Type subType = field.getField().schema().getType(); - if (subType == Schema.Type.UNION) { - return validateInternalUnion().apply(field); - } else if (subType == Schema.Type.RECORD) { - return internalRecordValidation().apply(metadata); - } else if (subType == Schema.Type.ENUM) { - return internalEnumValidation().apply(metadata); - } else { - return valid(); - } - }; + public RadarSchemaRules(ExcludeConfig config) { + this(config, new RadarSchemaFieldRules()); } @Override - public Validator validateSchemaLocation() { - return validateNamespaceSchemaLocation() - .and(validateNameSchemaLocation()); - } - - private Validator validateNamespaceSchemaLocation() { - return metadata -> { - try { - String expected = ValidationSupport.getNamespace( - root, metadata.getPath(), metadata.getScope()); - String namespace = metadata.getSchema().getNamespace(); - - return expected.equalsIgnoreCase(namespace) ? valid() : raise(message( - "Namespace cannot be null and must fully lowercase dot" - + " separated without numeric. In this case the expected value is \"" - + expected + "\".").apply(metadata)); - } catch (IllegalArgumentException ex) { - return Stream.of(new ValidationException("Path " + metadata.getPath() - + " is not part of root " + root, ex)); - } - }; - } - - private Validator validateNameSchemaLocation() { - return metadata -> { - String expected = ValidationSupport.getRecordName(metadata.getPath()); - - return expected.equalsIgnoreCase(metadata.getSchema().getName()) ? valid() : raise( - message("Record name should match file name. Expected record name is \"" - + expected + "\".").apply(metadata)); - }; + public SchemaFieldRules getFieldRules() { + return fieldRules; } @Override @@ -163,7 +93,7 @@ public Validator validateSchemaDocumentation() { schema); } - private Stream validateDocumentation(String doc, + static Stream validateDocumentation(String doc, BiFunction message, T schema) { if (doc == null || doc.isEmpty()) { return raise(message.apply("Property \"doc\" is missing. Documentation is" @@ -192,22 +122,6 @@ private Stream validateDocumentation(String doc, return result; } - @Override - public Validator validateFieldName() { - return validateNonNull(f -> f.getField().name(), matches(FIELD_NAME_PATTERN), messageField( - "Field name does not respect lowerCamelCase name convention." - + " Please avoid abbreviations and write out the field name instead.")) - .and(validateNonNull(f -> f.getField().name(), - n -> FIELD_NAME_NOT_ALLOWED_SUFFIX.stream().noneMatch(n::endsWith), - messageField("Field name may not end with the following values: " - + FIELD_NAME_NOT_ALLOWED_SUFFIX + "."))); - } - - @Override - public Validator validateFieldDocumentation() { - return field -> validateDocumentation(field.getField().doc(), - (m, f) -> messageField(m).apply(f), field); - } @Override public Validator validateSymbols() { @@ -222,38 +136,6 @@ public Validator validateSymbols() { .apply(schema)))); } - @Override - public Validator validateDefault() { - return input -> defaultsValidator - .getOrDefault(input.getField().schema().getType(), - this::validateDefaultOther) - .apply(input); - } - - private Stream validateDefaultEnum(SchemaField field) { - return !field.getField().schema().getEnumSymbols().contains(UNKNOWN) - || (field.getField().defaultVal() != null - && field.getField().defaultVal().toString().equals(UNKNOWN)) ? valid() - : raise(messageField("Default is \"" + field.getField().defaultVal() - + "\". Any Avro enum type that has an \"UNKNOWN\" symbol must set its" - + " default value to \"UNKNOWN\".").apply(field)); - } - - private Stream validateDefaultUnion(SchemaField field) { - return !field.getField().schema().getTypes().contains(Schema.create(Type.NULL)) - || (field.getField().defaultVal() != null - && field.getField().defaultVal().equals(JsonProperties.NULL_VALUE)) ? valid() - : raise(messageField("Default is not null. Any nullable Avro field must" - + " specify have its default value set to null.").apply(field)); - } - - private Stream validateDefaultOther(SchemaField field) { - return field.getField().defaultVal() == null ? valid() : raise(messageField( - "Default of type " + field.getField().schema().getType() + " is set to " - + field.getField().defaultVal() + ". The only acceptable default values are the" - + " \"UNKNOWN\" enum symbol and null.").apply(field)); - } - /** * TODO. * @return TODO @@ -284,7 +166,7 @@ public Validator validateTimeCompleted() { */ @Override public Validator validateNotTimeCompleted() { - return validate(schema -> Objects.isNull(schema.getField(TIME_COMPLETED)), + return validate(s -> s.getField(TIME_COMPLETED), Objects::isNull, messageSchema("\"" + TIME_COMPLETED + "\" is allow only in ACTIVE schemas.")); } @@ -299,17 +181,13 @@ public Validator validateTimeReceived() { @Override public Validator validateNotTimeReceived() { - return validate(schema -> Objects.isNull(schema.getField(TIME_RECEIVED)), + return validate(s -> s.getField(TIME_RECEIVED), Objects::isNull, messageSchema("\"" + TIME_RECEIVED + "\" is allow only in PASSIVE schemas.")); } @Override - public Validator fields(Validator validator) { - return metadata -> { - Schema schema = metadata.getSchema(); - if (config.skipFile(metadata.getPath())) { - return valid(); - } + public Validator fields(Validator validator) { + return schema -> { if (!schema.getType().equals(Schema.Type.RECORD)) { return raise("Default validation can be applied only to an Avro RECORD, not to " + schema.getType() + " of schema " + schema.getFullName() + '.'); @@ -319,16 +197,10 @@ public Validator fields(Validator validator) { } return schema.getFields().stream() .flatMap(field -> { - SchemaField schemaField = new SchemaField(metadata, field); + SchemaField schemaField = new SchemaField(schema, field); return config.isSkipped(schemaField) ? valid() : validator.apply(schemaField); }); }; } - - @Override - public Validator schema(Validator validator) { - return metadata -> config.skipFile(metadata.getPath()) ? valid() - : validator.apply(metadata.getSchema()); - } } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaField.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaField.java index 18a359d3..8d6c4410 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaField.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaField.java @@ -3,16 +3,16 @@ import org.apache.avro.Schema; public class SchemaField { - private final SchemaMetadata metadata; + private final Schema schema; private final Schema.Field field; - public SchemaField(SchemaMetadata metadata, Schema.Field field) { - this.metadata = metadata; + public SchemaField(Schema schema, Schema.Field field) { + this.schema = schema; this.field = field; } - public SchemaMetadata getSchemaMetadata() { - return metadata; + public Schema getSchema() { + return schema; } public Schema.Field getField() { diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaFieldRules.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaFieldRules.java new file mode 100644 index 00000000..a7c8f772 --- /dev/null +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaFieldRules.java @@ -0,0 +1,50 @@ +package org.radarcns.schema.validation.rules; + +import org.apache.avro.Schema; + +import java.util.function.Function; + +import static org.radarcns.schema.validation.rules.Validator.raise; +import static org.radarcns.schema.validation.rules.Validator.valid; + +public interface SchemaFieldRules { + default Validator getValidator(SchemaRules schemaRules) { + return validateFieldTypes(schemaRules) + .and(validateFieldName()) + .and(validateDefault()) + .and(validateFieldDocumentation()); + } + + /** Recursively checks field types. */ + Validator validateFieldTypes(SchemaRules schemaRules); + + /** Checks field name format. */ + Validator validateFieldName(); + + /** Checks field documentation presence and format. */ + Validator validateFieldDocumentation(); + + Validator validateDefault(); + + default Validator validateInternalUnion(SchemaRules schemaRules) { + return field -> field.getField().schema().getTypes().stream() + .flatMap(schema -> { + Schema.Type type = schema.getType(); + if (type == Schema.Type.RECORD) { + return schemaRules.validateRecord(false).apply(schema); + } else if (type == Schema.Type.ENUM) { + return schemaRules.validateEnum(false).apply(schema); + } else if (type == Schema.Type.UNION) { + return raise(messageField("Cannot have a nested union.") + .apply(field)); + } else { + return valid(); + } + }); + } + + default Function messageField(String text) { + return schema -> "Field " + schema.getField().name() + " in schema " + + schema.getSchema().getFullName() + " is invalid. " + text; + } +} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaMetadataRules.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaMetadataRules.java new file mode 100644 index 00000000..999aca64 --- /dev/null +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaMetadataRules.java @@ -0,0 +1,53 @@ +package org.radarcns.schema.validation.rules; + +import org.apache.avro.Schema; + +import java.util.function.Function; + +public interface SchemaMetadataRules { + SchemaRules getSchemaRules(); + + /** Checks the location of a schema with its internal data. */ + Validator validateSchemaLocation(); + + /** + * Validates any schema file. It will choose the correct validation method based on the scope + * and type of the schema. + */ + default Validator getValidator() { + return metadata -> { + SchemaRules schemaRules = getSchemaRules(); + Validator validator = validateSchemaLocation(); + + if (metadata.getSchema().getType().equals(Schema.Type.ENUM)) { + validator = validator.and(schema(schemaRules.validateEnum(true))); + } else { + switch (metadata.getScope()) { + case ACTIVE: + validator = validator.and(schema(schemaRules.validateActiveSource())); + break; + case MONITOR: + validator = validator.and(schema(schemaRules.validateMonitor())); + break; + case PASSIVE: + validator = validator.and(schema(schemaRules.validatePassive())); + break; + default: + validator = validator.and(schema(schemaRules.validateRecord(true))); + break; + } + } + return validator.apply(metadata); + }; + } + + /** Validates schemas without their metadata. */ + default Validator schema(Validator validator) { + return metadata -> validator.apply(metadata.getSchema()); + } + + default Function message(String text) { + return metadata -> "Schema " + metadata.getSchema().getFullName() + + " at " + metadata.getPath() + " is invalid. " + text; + } +} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaRules.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaRules.java new file mode 100644 index 00000000..b6549867 --- /dev/null +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaRules.java @@ -0,0 +1,117 @@ +package org.radarcns.schema.validation.rules; + +import org.apache.avro.Schema; + +import java.util.function.Function; + +import static org.radarcns.schema.validation.rules.Validator.raise; + +public interface SchemaRules { + SchemaFieldRules getFieldRules(); + + /** Checks schema namespace format. */ + Validator validateNameSpace(); + + /** Checks schema name format. */ + Validator validateName(); + + /** Checks schema documentation presence and format. */ + Validator validateSchemaDocumentation(); + + /** Checks that the symbols of enums have the required format. */ + Validator validateSymbols(); + + /** Checks that schemas should have a {@code time} field. */ + Validator validateTime(); + + /** Checks that schemas should have a {@code timeCompleted} field. */ + Validator validateTimeCompleted(); + + /** Checks that schemas should not have a {@code timeCompleted} field. */ + Validator validateNotTimeCompleted(); + + /** Checks that schemas should have a {@code timeReceived} field. */ + Validator validateTimeReceived(); + + /** Checks that schemas should not have a {@code timeReceived} field. */ + Validator validateNotTimeReceived(); + + default Validator validateEnum(boolean topLevel) { + Validator validator = validateSymbols() + .and(validateSchemaDocumentation()) + .and(validateName()); + if (topLevel) { + validator = validator.and(validateNameSpace()); + } + return validator; + } + + /** Validate a record that is defined inline. */ + default Validator validateRecord(boolean topLevel) { + SchemaFieldRules fieldRules = getFieldRules(); + + Validator validator = validateName() + .and(validateSchemaDocumentation()) + .and(fields(fieldRules.validateFieldTypes(this) + .and(fieldRules.validateFieldName()) + .and(fieldRules.validateDefault()) + .and(fieldRules.validateFieldDocumentation()))); + if (topLevel) { + validator = validator.and(validateNameSpace()); + } + return validator; + } + + + /** + * Validates record schemas of an active source + * @return TODO + */ + default Validator validateActiveSource() { + return validateRecord(true) + .and(validateTime() + .and(validateTimeCompleted()) + .and(validateNotTimeReceived())); + } + + /** + * Validates schemas of monitor sources. + * @return TODO + */ + default Validator validateMonitor() { + return validateRecord(true) + .and(validateTime()); + } + + /** + * Validates schemas of passive sources. + */ + default Validator validatePassive() { + return validateRecord(true) + .and(validateTime()) + .and(validateTimeReceived()) + .and(validateNotTimeCompleted()); + } + + default Function messageSchema(String text) { + return schema -> "Schema " + schema.getFullName() + " is invalid. " + text; + } + + /** + * Validates all fields of records. + * Validation will fail on non-record types or records with no fields. + */ + default Validator fields(Validator validator) { + return schema -> { + if (!schema.getType().equals(Schema.Type.RECORD)) { + return raise("Default validation can be applied only to an Avro RECORD, not to " + + schema.getType() + " of schema " + schema.getFullName() + '.'); + } + if (schema.getFields().isEmpty()) { + return raise("Schema " + schema.getFullName() + " does not contain any fields."); + } + return schema.getFields().stream() + .flatMap(field -> validator.apply(new SchemaField(schema, field))); + }; + } +} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaValidationRules.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaValidationRules.java deleted file mode 100644 index 9a6eefe6..00000000 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaValidationRules.java +++ /dev/null @@ -1,209 +0,0 @@ -package org.radarcns.schema.validation.rules; - -import org.apache.avro.Schema; - -import java.util.function.Function; - -import static org.radarcns.schema.validation.rules.Validator.raise; -import static org.radarcns.schema.validation.rules.Validator.valid; - -public interface SchemaValidationRules { - /** Checks the location of a schema with its internal data. */ - Validator validateSchemaLocation(); - - /** Checks schema namespace format. */ - Validator validateNameSpace(); - - /** Checks schema name format. */ - Validator validateName(); - - /** Checks schema documentation presence and format. */ - Validator validateSchemaDocumentation(); - - /** Recursively checks field types. */ - Validator validateFieldTypes(); - - /** Validate an enum that is defined inline. */ - default Validator internalEnumValidation() { - return schema(validateSymbols()) - .and(schema(validateSchemaDocumentation())) - .and(schema(validateName())); - } - - /** Validate a record that is defined inline. */ - default Validator internalRecordValidation() { - return schema(validateNameSpace()) - .and(schema(validateName())) - .and(schema(validateSchemaDocumentation())) - .and(fields(validateFieldTypes())) - .and(fields(validateFieldName())) - .and(fields(validateDefault())) - .and(fields(validateFieldDocumentation())); - } - - default Validator validateInternalUnion() { - return field -> field.getField().schema().getTypes().stream() - .flatMap(schema -> { - Schema.Type type = schema.getType(); - SchemaMetadata subMeta = field.getSchemaMetadata().withSubSchema( - schema); - if (type == Schema.Type.RECORD) { - return internalRecordValidation().apply(subMeta); - } else if (type == Schema.Type.ENUM) { - return internalEnumValidation().apply(subMeta); - } else if (type == Schema.Type.UNION) { - return raise(messageField("Cannot have a nested union.") - .apply(field)); - } else { - return valid(); - } - }); - } - - /** Checks field name format. */ - Validator validateFieldName(); - - /** Checks field documentation presence and format. */ - Validator validateFieldDocumentation(); - - /** Checks that the symbols of enums have the required format. */ - Validator validateSymbols(); - - Validator validateDefault(); - - /** Checks that schemas should have a {@code time} field. */ - Validator validateTime(); - - /** Checks that schemas should have a {@code timeCompleted} field. */ - Validator validateTimeCompleted(); - - /** Checks that schemas should not have a {@code timeCompleted} field. */ - Validator validateNotTimeCompleted(); - - /** Checks that schemas should have a {@code timeReceived} field. */ - Validator validateTimeReceived(); - - /** Checks that schemas should not have a {@code timeReceived} field. */ - Validator validateNotTimeReceived(); - - /** - * Validate record schemas. - * @return TODO - */ - default Validator validateGeneralRecord() { - return validateSchemaLocation() - .and(schema(validateNameSpace())) - .and(schema(validateName())) - .and(schema(validateSchemaDocumentation())) - .and(fields(validateFieldTypes())) - .and(fields(validateFieldName())) - .and(fields(validateDefault())) - .and(fields(validateFieldDocumentation())); - } - - /** - * Validates record schemas of an active source - * @return TODO - */ - default Validator validateActiveSource() { - return validateGeneralRecord() - .and(schema(validateTime())) - .and(schema(validateTimeCompleted())) - .and(schema(validateNotTimeReceived())); - } - - /** - * Validates schemas of monitor sources. - * @return TODO - */ - default Validator validateMonitor() { - return validateGeneralRecord() - .and(schema(validateTime())); - } - - /** - * Validates schemas of passive sources. - */ - default Validator validatePassive() { - return validateGeneralRecord() - .and(schema(validateTime())) - .and(schema(validateTimeReceived())) - .and(schema(validateNotTimeCompleted())); - } - - /** - * Validates enum schemas in standalone files. - */ - default Validator validateEnum() { - return validateSchemaLocation() - .and(schema(validateNameSpace())) - .and(schema(validateName())) - .and(schema(validateSchemaDocumentation())) - .and(schema(validateSymbols())); - } - - /** - * Validates any schema file. It will choose the correct validation method based on the scope - * and type of the schema. - */ - default Validator getValidator() { - return schema -> { - if (schema.getSchema().getType().equals(Schema.Type.ENUM)) { - return validateEnum().apply(schema); - } else { - switch (schema.getScope()) { - case ACTIVE: - return validateActiveSource().apply(schema); - case CATALOGUE: - return validateGeneralRecord().apply(schema); - case KAFKA: - return validateGeneralRecord().apply(schema); - case MONITOR: - return validateMonitor().apply(schema); - case PASSIVE: - return validatePassive().apply(schema); - default: - return validateGeneralRecord().apply(schema); - } - } - }; - } - - /** - * Validates all fields of records. - * Validation will fail on non-record types or records with no fields. - */ - default Validator fields(Validator validator) { - return metadata -> { - Schema schema = metadata.getSchema(); - if (!schema.getType().equals(Schema.Type.RECORD)) { - return raise("Default validation can be applied only to an Avro RECORD, not to " - + schema.getType() + " of schema " + schema.getFullName() + '.'); - } - if (schema.getFields().isEmpty()) { - return raise("Schema " + schema.getFullName() + " does not contain any fields."); - } - return schema.getFields().stream() - .flatMap(field -> validator.apply(new SchemaField(metadata, field))); - }; - } - - /** Validates schemas without their metadata. */ - default Validator schema(Validator validator) { - return metadata -> validator.apply(metadata.getSchema()); - } - - static Function messageSchema(String text) { - return schema -> "Schema " + schema.getFullName() + " is invalid. " + text; - } - - static Function message(String text) { - return metadata -> "Schema " + metadata.getSchema().getFullName() - + " at " + metadata.getPath() + " is invalid. " + text; - } - - static Function messageField(String text) { - return schema -> "Field " + schema.getField().name() + " in schema " - + schema.getSchemaMetadata().getSchema().getFullName() + " is invalid. " + text; - } -} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/Validator.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/Validator.java index e7330794..deb56416 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/Validator.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/Validator.java @@ -29,6 +29,10 @@ * TODO. */ public interface Validator extends Function> { + static Stream check(boolean test, String message) { + return test ? valid() : raise(message); + } + /** * TODO. * @param predicate TODO @@ -36,7 +40,7 @@ public interface Validator extends Function> { * @return TODO */ static Validator validate(Predicate predicate, String message) { - return object -> predicate.test(object) ? valid() : raise(message); + return object -> check(predicate.test(object), message); } /** @@ -46,7 +50,11 @@ static Validator validate(Predicate predicate, String message) { * @return TODO */ static Validator validate(Predicate predicate, Function message) { - return object -> predicate.test(object) ? valid() : raise(message).apply(object); + return object -> check(predicate.test(object), message.apply(object)); + } + + static Validator validate(Function property, Predicate predicate, Function message) { + return object -> check(predicate.test(property.apply(object)), message.apply(object)); } /** @@ -87,6 +95,38 @@ static Validator validateNonNull(Function property, Predicate }, message); } + /** + * TODO. + * @param message TODO + * @return TODO + */ + static Validator validateNonEmpty(Function property, + Function message, Validator validator) { + return o -> { + String val = property.apply(o); + if (val == null || val.isEmpty()) { + return raise(message.apply(o)); + } + return validator.apply(val); + }; + } + + /** + * TODO. + * @param message TODO + * @return TODO + */ + static Validator validateNonEmpty(Function property, String message, + Validator validator) { + return o -> { + String val = property.apply(o); + if (val == null || val.isEmpty()) { + return raise(message); + } + return validator.apply(val); + }; + } + /** * TODO. * @param message TODO @@ -174,10 +214,6 @@ static Predicate matches(Pattern pattern) { return str -> pattern.matcher(str).matches(); } - static Function> raise(Function message) { - return t -> raise(message.apply(t)); - } - static Stream raise(String message) { return Stream.of(new ValidationException(message)); } diff --git a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaFieldRulesTest.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaFieldRulesTest.java new file mode 100644 index 00000000..8f95efa9 --- /dev/null +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaFieldRulesTest.java @@ -0,0 +1,206 @@ +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.radarcns.schema.validation.rules; + +import org.apache.avro.Schema; +import org.apache.avro.Schema.Parser; +import org.apache.avro.SchemaBuilder; +import org.junit.Before; +import org.junit.Test; +import org.radarcns.schema.validation.ValidationException; +import org.radarcns.schema.validation.ValidationSupport; +import org.radarcns.schema.validation.config.ExcludeConfig; + +import java.io.IOException; +import java.nio.file.Paths; +import java.util.stream.Stream; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.radarcns.schema.validation.rules.RadarSchemaFieldRules.FIELD_NAME_PATTERN; +import static org.radarcns.schema.validation.rules.Validator.matches; + +/** + * TODO. + */ +public class RadarSchemaFieldRulesTest { + + private static final String MONITOR_NAME_SPACE_MOCK = "org.radarcns.monitor.test"; + private static final String ENUMERATOR_NAME_SPACE_MOCK = "org.radarcns.test.EnumeratorTest"; + private static final String UNKNOWN_MOCK = "UNKNOWN"; + + private static final String RECORD_NAME_MOCK = "RecordName"; + private static final String FIELD_NUMBER_MOCK = "Field1"; + private RadarSchemaFieldRules validator; + private RadarSchemaRules schemaValidator; + + @Before + public void setUp() throws IOException { + validator = new RadarSchemaFieldRules(); + schemaValidator = new RadarSchemaRules(new ExcludeConfig(), validator); + } + + @Test + public void fileNameTest() { + assertEquals("Questionnaire", + ValidationSupport.getRecordName(Paths.get("/path/to/questionnaire.avsc"))); + assertEquals("ApplicationExternalTime", + ValidationSupport.getRecordName( + Paths.get("/path/to/application_external_time.avsc"))); + } + + @Test + public void fieldNameRegex() { + assertTrue(matches("interBeatInterval", FIELD_NAME_PATTERN)); + assertTrue(matches("x", FIELD_NAME_PATTERN)); + assertTrue(matches(RadarSchemaRules.TIME, FIELD_NAME_PATTERN)); + assertTrue(matches("subjectId", FIELD_NAME_PATTERN)); + assertTrue(matches("listOfSeveralThings", FIELD_NAME_PATTERN)); + assertFalse(matches("Time", FIELD_NAME_PATTERN)); + assertFalse(matches("E4Heart", FIELD_NAME_PATTERN)); + } + + @Test + public void fieldsTest() { + Schema schema; + Stream result; + + schema = SchemaBuilder + .builder(MONITOR_NAME_SPACE_MOCK) + .record(RECORD_NAME_MOCK) + .fields() + .endRecord(); + + result = schemaValidator.fields(validator.validateFieldTypes(schemaValidator)).apply(schema); + + assertEquals(1, result.count()); + + schema = SchemaBuilder + .builder(MONITOR_NAME_SPACE_MOCK) + .record(RECORD_NAME_MOCK) + .fields() + .optionalBoolean("optional") + .endRecord(); + + result = schemaValidator.fields(validator.validateFieldTypes(schemaValidator)).apply(schema); + + assertEquals(0, result.count()); + } + + @Test + public void fieldNameTest() { + Schema schema; + Stream result; + + schema = SchemaBuilder + .builder(MONITOR_NAME_SPACE_MOCK) + .record(RECORD_NAME_MOCK) + .fields() + .requiredString(FIELD_NUMBER_MOCK + "value") + .endRecord(); + + result = schemaValidator.fields(validator.validateFieldName()).apply(schema); + assertEquals(2, result.count()); + + schema = SchemaBuilder + .builder(MONITOR_NAME_SPACE_MOCK) + .record(RECORD_NAME_MOCK) + .fields() + .requiredString(FIELD_NUMBER_MOCK) + .endRecord(); + + result = schemaValidator.fields(validator.validateFieldName()).apply(schema); + assertEquals(1, result.count()); + + schema = SchemaBuilder + .builder(MONITOR_NAME_SPACE_MOCK) + .record(RECORD_NAME_MOCK) + .fields() + .requiredDouble("timeReceived") + .endRecord(); + + result = schemaValidator.fields(validator.validateFieldName()).apply(schema); + assertEquals(0, result.count()); + } + + @Test + public void fieldDocumentationTest() { + Schema schema; + Stream result; + + schema = new Parser().parse("{\"namespace\": \"org.radarcns.kafka.key\", " + + "\"type\": \"record\"," + + " \"name\": \"key\", \"type\": \"record\", \"fields\": [" + + "{\"name\": \"userId\", \"type\": \"string\" , \"doc\": \"Documentation\"}," + + "{\"name\": \"sourceId\", \"type\": \"string\"} ]}"); + + result = schemaValidator.fields(validator.validateFieldDocumentation()).apply(schema); + + assertEquals(2, result.count()); + + schema = new Parser().parse("{\"namespace\": \"org.radarcns.kafka.key\", " + + "\"type\": \"record\", \"name\": \"key\", \"type\": \"record\", \"fields\": [" + + "{\"name\": \"userId\", \"type\": \"string\" , \"doc\": \"Documentation.\"}]}"); + + result = schemaValidator.fields(validator.validateFieldDocumentation()).apply(schema); + assertEquals(0, result.count()); + } + + @Test + public void defaultValueExceptionTest() { + Stream result = schemaValidator.fields(validator.validateDefault()) + .apply(SchemaBuilder.record(RECORD_NAME_MOCK) + .fields() + .name(FIELD_NUMBER_MOCK) + .type(SchemaBuilder.enumeration(ENUMERATOR_NAME_SPACE_MOCK) + .symbols("VAL", UNKNOWN_MOCK)) + .noDefault() + .endRecord()); + + assertEquals(1, result.count()); + } + + @Test + @SuppressWarnings("PMD.ExcessiveMethodLength") + // TODO improve test after having define the default guideline + public void defaultValueTest() { + Schema schema; + Stream result; + + String schemaTxtInit = "{\"namespace\": \"org.radarcns.test\", " + + "\"type\": \"record\", \"name\": \"TestRecord\", \"fields\": "; + + schema = new Parser().parse(schemaTxtInit + + "[ {\"name\": \"serverStatus\", \"type\": {\"name\": \"ServerStatus\", \"type\": " + + "\"enum\", \"symbols\": [\"Connected\", \"NotConnected\", \"UNKNOWN\"] }, " + + "\"default\": \"UNKNOWN\" } ] }"); + + result = schemaValidator.fields(validator.validateDefault()).apply(schema); + + assertEquals(0, result.count()); + + schema = new Parser().parse(schemaTxtInit + + "[ {\"name\": \"serverStatus\", \"type\": {\"name\": \"ServerStatus\", \"type\": " + + "\"enum\", \"symbols\": [\"Connected\", \"NotConnected\", \"UNKNOWN\"] }, " + + "\"default\": \"null\" } ] }"); + + result = schemaValidator.fields(validator.validateDefault()).apply(schema); + + assertEquals(1, result.count()); + } +} diff --git a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaMetadataRulesTest.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaMetadataRulesTest.java new file mode 100644 index 00000000..993fd15e --- /dev/null +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaMetadataRulesTest.java @@ -0,0 +1,129 @@ +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.radarcns.schema.validation.rules; + +import org.apache.avro.Schema; +import org.apache.avro.SchemaBuilder; +import org.junit.Before; +import org.junit.Test; +import org.radarcns.schema.validation.SchemaValidator; +import org.radarcns.schema.validation.ValidationException; +import org.radarcns.schema.validation.ValidationSupport; +import org.radarcns.schema.validation.config.ExcludeConfig; + +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.stream.Stream; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.radarcns.schema.SchemaRepository.COMMONS_PATH; +import static org.radarcns.schema.Scope.MONITOR; +import static org.radarcns.schema.Scope.PASSIVE; +import static org.radarcns.schema.specification.SourceCatalogue.BASE_PATH; + +/** + * TODO. + */ +public class RadarSchemaMetadataRulesTest { + + private static final String RECORD_NAME_MOCK = "RecordName"; + private RadarSchemaMetadataRules validator; + + @Before + public void setUp() throws IOException { + ExcludeConfig config = new ExcludeConfig(); + validator = new RadarSchemaMetadataRules(BASE_PATH, config); + } + + @Test + public void fileNameTest() { + assertEquals("Questionnaire", + ValidationSupport.getRecordName(Paths.get("/path/to/questionnaire.avsc"))); + assertEquals("ApplicationExternalTime", + ValidationSupport.getRecordName( + Paths.get("/path/to/application_external_time.avsc"))); + } + + @Test + public void nameSpaceInvalidPlural() { + Schema schema = SchemaBuilder + .builder("org.radarcns.monitors.test") + .record(RECORD_NAME_MOCK) + .fields() + .endRecord(); + + Path root = MONITOR.getPath(BASE_PATH.resolve(COMMONS_PATH)); + assertNotNull(root); + Path path = root.resolve("test/record_name.avsc"); + Stream result = validator.validateSchemaLocation() + .apply(new SchemaMetadata(schema, MONITOR, path)); + + assertEquals(1, result.count()); + } + + @Test + public void nameSpaceInvalidLastPartPlural() { + + Schema schema = SchemaBuilder + .builder("org.radarcns.monitor.tests") + .record(RECORD_NAME_MOCK) + .fields() + .endRecord(); + + Path root = MONITOR.getPath(BASE_PATH.resolve(COMMONS_PATH)); + assertNotNull(root); + Path path = root.resolve("test/record_name.avsc"); + Stream result = validator.validateSchemaLocation() + .apply(new SchemaMetadata(schema, MONITOR, path)); + + assertEquals(1, result.count()); + } + + @Test + public void recordNameTest() { + // misspell aceleration + String fieldName = "EmpaticaE4Aceleration"; + Path filePath = Paths.get("/path/to/empatica_e4_acceleration.avsc"); + + Schema schema = SchemaBuilder + .builder("org.radarcns.passive.empatica") + .record(fieldName) + .fields() + .endRecord(); + + Stream result = validator.validateSchemaLocation() + .apply(new SchemaMetadata(schema, PASSIVE, filePath)); + + assertEquals(2, result.count()); + + fieldName = "EmpaticaE4Acceleration"; + filePath = BASE_PATH.resolve("commons/passive/empatica/empatica_e4_acceleration.avsc"); + + schema = SchemaBuilder + .builder("org.radarcns.passive.empatica") + .record(fieldName) + .fields() + .endRecord(); + + result = validator.validateSchemaLocation() + .apply(new SchemaMetadata(schema, PASSIVE, filePath)); + + assertEquals("", SchemaValidator.format(result)); + } +} diff --git a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaValidationRulesTest.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaRulesTest.java similarity index 51% rename from java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaValidationRulesTest.java rename to java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaRulesTest.java index 8179708e..049ae2e3 100644 --- a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaValidationRulesTest.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaRulesTest.java @@ -21,34 +21,24 @@ import org.apache.avro.SchemaBuilder; import org.junit.Before; import org.junit.Test; -import org.radarcns.schema.validation.SchemaValidator; import org.radarcns.schema.validation.ValidationException; -import org.radarcns.schema.validation.ValidationSupport; import org.radarcns.schema.validation.config.ExcludeConfig; import java.io.IOException; -import java.nio.file.Path; -import java.nio.file.Paths; import java.util.stream.Stream; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -import static org.radarcns.schema.SchemaRepository.COMMONS_PATH; -import static org.radarcns.schema.Scope.MONITOR; -import static org.radarcns.schema.Scope.PASSIVE; -import static org.radarcns.schema.specification.SourceCatalogue.BASE_PATH; -import static org.radarcns.schema.validation.rules.RadarSchemaValidationRules.ENUM_SYMBOL_PATTERN; -import static org.radarcns.schema.validation.rules.RadarSchemaValidationRules.FIELD_NAME_PATTERN; -import static org.radarcns.schema.validation.rules.RadarSchemaValidationRules.NAMESPACE_PATTERN; -import static org.radarcns.schema.validation.rules.RadarSchemaValidationRules.RECORD_NAME_PATTERN; +import static org.radarcns.schema.validation.rules.RadarSchemaRules.ENUM_SYMBOL_PATTERN; +import static org.radarcns.schema.validation.rules.RadarSchemaRules.NAMESPACE_PATTERN; +import static org.radarcns.schema.validation.rules.RadarSchemaRules.RECORD_NAME_PATTERN; import static org.radarcns.schema.validation.rules.Validator.matches; /** * TODO. */ -public class RadarSchemaValidationRulesTest { +public class RadarSchemaRulesTest { private static final String ACTIVE_NAME_SPACE_MOCK = "org.radarcns.active.test"; private static final String MONITOR_NAME_SPACE_MOCK = "org.radarcns.monitor.test"; @@ -56,22 +46,12 @@ public class RadarSchemaValidationRulesTest { private static final String UNKNOWN_MOCK = "UNKNOWN"; private static final String RECORD_NAME_MOCK = "RecordName"; - private static final String FIELD_NUMBER_MOCK = "Field1"; - private RadarSchemaValidationRules validator; + private RadarSchemaRules validator; @Before public void setUp() throws IOException { ExcludeConfig config = new ExcludeConfig(); - validator = new RadarSchemaValidationRules(BASE_PATH, config); - } - - @Test - public void fileNameTest() { - assertEquals("Questionnaire", - ValidationSupport.getRecordName(Paths.get("/path/to/questionnaire.avsc"))); - assertEquals("ApplicationExternalTime", - ValidationSupport.getRecordName( - Paths.get("/path/to/application_external_time.avsc"))); + validator = new RadarSchemaRules(config); } @Test @@ -103,17 +83,6 @@ public void recordNameRegex() { assertFalse(matches("Aaaa4MMaa", RECORD_NAME_PATTERN)); } - @Test - public void fieldNameRegex() { - assertTrue(matches("interBeatInterval", FIELD_NAME_PATTERN)); - assertTrue(matches("x", FIELD_NAME_PATTERN)); - assertTrue(matches(RadarSchemaValidationRules.TIME, FIELD_NAME_PATTERN)); - assertTrue(matches("subjectId", FIELD_NAME_PATTERN)); - assertTrue(matches("listOfSeveralThings", FIELD_NAME_PATTERN)); - assertFalse(matches("Time", FIELD_NAME_PATTERN)); - assertFalse(matches("E4Heart", FIELD_NAME_PATTERN)); - } - @Test public void enumerationRegex() { assertTrue(matches("PHQ8", ENUM_SYMBOL_PATTERN)); @@ -156,41 +125,6 @@ public void nameSpaceInvalidDashTest() { } - @Test - public void nameSpaceInvalidPlural() { - Schema schema = SchemaBuilder - .builder("org.radarcns.monitors.test") - .record(RECORD_NAME_MOCK) - .fields() - .endRecord(); - - Path root = MONITOR.getPath(BASE_PATH.resolve(COMMONS_PATH)); - assertNotNull(root); - Path path = root.resolve("test/record_name.avsc"); - Stream result = validator.validateSchemaLocation() - .apply(new SchemaMetadata(schema, MONITOR, path)); - - assertEquals(1, result.count()); - } - - @Test - public void nameSpaceInvalidLastPartPlural() { - - Schema schema = SchemaBuilder - .builder("org.radarcns.monitor.tests") - .record(RECORD_NAME_MOCK) - .fields() - .endRecord(); - - Path root = MONITOR.getPath(BASE_PATH.resolve(COMMONS_PATH)); - assertNotNull(root); - Path path = root.resolve("test/record_name.avsc"); - Stream result = validator.validateSchemaLocation() - .apply(new SchemaMetadata(schema, MONITOR, path)); - - assertEquals(1, result.count()); - } - @Test public void recordNameTest() { Schema schema = SchemaBuilder @@ -203,35 +137,6 @@ public void recordNameTest() { .apply(schema); assertEquals(0, result.count()); - - // misspell aceleration - String fieldName = "EmpaticaE4Aceleration"; - Path filePath = Paths.get("/path/to/empatica_e4_acceleration.avsc"); - - schema = SchemaBuilder - .builder("org.radarcns.passive.empatica") - .record(fieldName) - .fields() - .endRecord(); - - result = validator.validateSchemaLocation() - .apply(new SchemaMetadata(schema, PASSIVE, filePath)); - - assertEquals(2, result.count()); - - fieldName = "EmpaticaE4Acceleration"; - filePath = BASE_PATH.resolve("commons/passive/empatica/empatica_e4_acceleration.avsc"); - - schema = SchemaBuilder - .builder("org.radarcns.passive.empatica") - .record(fieldName) - .fields() - .endRecord(); - - result = validator.validateSchemaLocation() - .apply(new SchemaMetadata(schema, PASSIVE, filePath)); - - assertEquals("", SchemaValidator.format(result)); } @Test @@ -245,7 +150,8 @@ public void fieldsTest() { .fields() .endRecord(); - result = validator.fields(validator.validateFieldTypes()).apply(new SchemaMetadata(schema)); + result = validator.fields(validator.getFieldRules().validateFieldTypes(validator)) + .apply(schema); assertEquals(1, result.count()); @@ -256,8 +162,8 @@ public void fieldsTest() { .optionalBoolean("optional") .endRecord(); - result = validator.fields(validator.validateFieldTypes()) - .apply(new SchemaMetadata(schema)); + result = validator.fields(validator.getFieldRules().validateFieldTypes(validator)) + .apply(schema); assertEquals(0, result.count()); } @@ -282,7 +188,7 @@ public void timeTest() { .builder("org.radarcns.time.test") .record(RECORD_NAME_MOCK) .fields() - .requiredDouble(RadarSchemaValidationRules.TIME) + .requiredDouble(RadarSchemaRules.TIME) .endRecord(); result = validator.validateTime().apply(schema); @@ -354,67 +260,6 @@ public void timeReceivedTest() { assertEquals(1, result.count()); } - @Test - public void fieldNameTest() { - Schema schema; - Stream result; - - schema = SchemaBuilder - .builder(MONITOR_NAME_SPACE_MOCK) - .record(RECORD_NAME_MOCK) - .fields() - .requiredString(FIELD_NUMBER_MOCK + "value") - .endRecord(); - - result = validator.fields(validator.validateFieldName()).apply(new SchemaMetadata(schema)); - assertEquals(2, result.count()); - - schema = SchemaBuilder - .builder(MONITOR_NAME_SPACE_MOCK) - .record(RECORD_NAME_MOCK) - .fields() - .requiredString(FIELD_NUMBER_MOCK) - .endRecord(); - - result = validator.fields(validator.validateFieldName()).apply(new SchemaMetadata(schema)); - assertEquals(1, result.count()); - - schema = SchemaBuilder - .builder(MONITOR_NAME_SPACE_MOCK) - .record(RECORD_NAME_MOCK) - .fields() - .requiredDouble("timeReceived") - .endRecord(); - - result = validator.fields(validator.validateFieldName()).apply(new SchemaMetadata(schema)); - assertEquals(0, result.count()); - } - - @Test - public void filedDocumentationTest() { - Schema schema; - Stream result; - - schema = new Parser().parse("{\"namespace\": \"org.radarcns.kafka.key\", " - + "\"type\": \"record\"," - + " \"name\": \"key\", \"type\": \"record\", \"fields\": [" - + "{\"name\": \"userId\", \"type\": \"string\" , \"doc\": \"Documentation\"}," - + "{\"name\": \"sourceId\", \"type\": \"string\"} ]}"); - - result = validator.fields(validator.validateFieldDocumentation()) - .apply(new SchemaMetadata(schema)); - - assertEquals(2, result.count()); - - schema = new Parser().parse("{\"namespace\": \"org.radarcns.kafka.key\", " - + "\"type\": \"record\", \"name\": \"key\", \"type\": \"record\", \"fields\": [" - + "{\"name\": \"userId\", \"type\": \"string\" , \"doc\": \"Documentation.\"}]}"); - - result = validator.fields(validator.validateFieldDocumentation()) - .apply(new SchemaMetadata(schema)); - assertEquals(0, result.count()); - } - @Test public void schemaDocumentationTest() { Schema schema; @@ -528,122 +373,4 @@ public void enumerationSymbolTest() { assertEquals(2, result.count()); } - - @Test - public void defaultValueExceptionTest() { - Stream result = validator.fields(validator.validateDefault()).apply( - new SchemaMetadata(SchemaBuilder.record(RECORD_NAME_MOCK) - .fields() - .name(FIELD_NUMBER_MOCK) - .type(SchemaBuilder.enumeration(ENUMERATOR_NAME_SPACE_MOCK) - .symbols("VAL", UNKNOWN_MOCK)) - .noDefault() - .endRecord())); - - assertEquals(1, result.count()); - } - - @Test - @SuppressWarnings("PMD.ExcessiveMethodLength") - // TODO improve test after having define the default guideline - public void defaultValueTest() { - //String namespace = "org.radarcns.test"; - //String recordName = "TestRecord"; - - Schema schema; - Stream result; - - /*schema = SchemaBuilder - .builder(namespace) - .record(recordName) - .fields() - .nullableDouble("nullableDouble", Double.NaN) - .nullableFloat("nullableFloat", Float.NaN) - .nullableInt("nullableIntMin", Integer.MIN_VALUE) - .nullableInt("nullableIntMax", Integer.MAX_VALUE) - .nullableLong("nullableLongMin", Long.MIN_VALUE) - .nullableLong("nullableLongMax", Long.MAX_VALUE) - .nullableString("nullableString", null) - .nullableBoolean("nullableBoolean", false) //check with text schema - .nullableBytes("nullableBytes", new byte[1]) //check with text schema - .endRecord(); - - result = validator.validateDefault().apply(schema); - - assertEquals(0, result.count());*/ - - String scemaTxtInit = "{\"namespace\": \"org.radarcns.test\", " - + "\"type\": \"record\", \"name\": \"TestRecord\", \"fields\": "; - - /*schema = new Parser().parse(scemaTxtInit - + "[ {\"name\": \"nullableBytes\", \"type\": [ \"null\", \"bytes\"], " - + "\"default\": \"null\" } ] }"); - - result = validator.validateDefault().apply(schema); - - assertEquals(0, result.count()); - - schema = SchemaBuilder - .builder(namespace) - .record(recordName) - .fields() - .nullableDouble("nullableDouble", -1) - .endRecord(); - - result = validator.validateDefault().apply(schema);*/ - - /*assertEquals(1, result.count()); - assertEquals(Optional.of(invalidMessage), result.getReason()); - - schema = SchemaBuilder - .builder(namespace) - .record(recordName) - .fields() - .nullableInt("nullableInt", -1) - .endRecord(); - - result = validator.validateDefault().apply(schema); - - assertEquals(1, result.count()); - assertEquals(Optional.of(invalidMessage), result.getReason()); - - schema = SchemaBuilder - .builder(namespace) - .record(recordName) - .fields() - .nullableLong("nullableLong", -1) - .endRecord(); - - result = validator.validateDefault().apply(schema); - - assertEquals(1, result.count()); - assertEquals(Optional.of(invalidMessage), result.getReason());*/ - - schema = new Parser().parse(scemaTxtInit - + "[ {\"name\": \"serverStatus\", \"type\": {\"name\": \"ServerStatus\", \"type\": " - + "\"enum\", \"symbols\": [\"Connected\", \"NotConnected\", \"UNKNOWN\"] }, " - + "\"default\": \"UNKNOWN\" } ] }"); - - result = validator.fields(validator.validateDefault()).apply(new SchemaMetadata(schema)); - - assertEquals(0, result.count()); - - schema = new Parser().parse(scemaTxtInit - + "[ {\"name\": \"serverStatus\", \"type\": {\"name\": \"ServerStatus\", \"type\": " - + "\"enum\", \"symbols\": [\"Connected\", \"NotConnected\", \"UNKNOWN\"] }, " - + "\"default\": \"null\" } ] }"); - - result = validator.fields(validator.validateDefault()).apply(new SchemaMetadata(schema)); - - assertEquals(1, result.count()); - - /*schema = new Parser().parse(scemaTxtInit - + "[ {\"name\": \"nullableBoolean\", \"type\": [ \"null\", \"boolean\"], " - + "\"default\": \"null\" } ] }"); - - result = validator.validateDefault().apply(schema); - - assertEquals(1, result.count()); - assertEquals(Optional.of(invalidMessage), result.getReason());*/ - } } From 6574c1653a92a7f671ef7b2c441ef2e28f33f958 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Tue, 19 Sep 2017 17:14:36 +0200 Subject: [PATCH 067/112] Validate and output schema uniqueness --- .../schema/validation/SchemaValidator.java | 71 +++++++++++++------ .../rules/RadarSchemaFieldRules.java | 5 +- .../validation/rules/RadarSchemaRules.java | 22 ++++++ .../validation/rules/SchemaFieldRules.java | 19 ++--- .../validation/rules/SchemaMetadataRules.java | 4 +- .../schema/validation/rules/SchemaRules.java | 37 ++++------ 6 files changed, 100 insertions(+), 58 deletions(-) diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaValidator.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaValidator.java index ada08c0f..4eecda80 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaValidator.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaValidator.java @@ -22,11 +22,15 @@ import org.radarcns.schema.validation.rules.RadarSchemaMetadataRules; import org.radarcns.schema.validation.rules.RadarSchemaRules; import org.radarcns.schema.validation.rules.SchemaMetadata; +import org.radarcns.schema.validation.rules.SchemaMetadataRules; import org.radarcns.schema.validation.rules.Validator; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Map; +import java.util.SortedSet; +import java.util.TreeSet; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -38,41 +42,54 @@ public class SchemaValidator { private final Path root; private final ExcludeConfig config; private final Validator validator; + private final SchemaMetadataRules rules; public SchemaValidator(Path root, ExcludeConfig config) { this.config = config; this.root = root; - this.validator = new RadarSchemaMetadataRules(root, config).getValidator(); + this.rules = new RadarSchemaMetadataRules(root, config); + this.validator = rules.getValidator(); } /** * TODO. * @param scope TODO. + */ + public Stream analyseFiles(Scope scope) { + try { + return Files.walk(scope.getPath(root.resolve(COMMONS_PATH))) + .filter(Files::isRegularFile) + .filter(p -> !config.skipFile(p)) + .flatMap(p -> { + if (!isAvscFile(p)) { + return Stream.of(new ValidationException( + p.toAbsolutePath() + " is invalid. " + scope.getLower() + + " should contain only " + AVRO_EXTENSION + " files.")); + } + + try { + Schema schema = new Schema.Parser().parse(p.toFile()); + + return validate(schema, p, scope); + } catch (IOException e) { + return Stream.of(new ValidationException( + "Cannot parse file " + p.toAbsolutePath(), e)); + } + }); + } catch (IOException ex) { + return Stream.of(new ValidationException("Failed to read files: " + ex, ex)); + } + } + + + /** + * TODO. * @throws IOException TODO. */ - public Stream analyseFiles(Scope scope) + public Stream analyseFiles() throws IOException { - Schema.Parser parser = new Schema.Parser(); - - return Files.walk(scope.getPath(root.resolve(COMMONS_PATH))) - .filter(Files::isRegularFile) - .filter(p -> !config.skipFile(p)) - .flatMap(p -> { - if (!isAvscFile(p)) { - return Stream.of(new ValidationException( - p.toAbsolutePath() + " is invalid. " + scope.getLower() - + " should contain only " + AVRO_EXTENSION + " files.")); - } - - try { - Schema schema = parser.parse(p.toFile()); - - return validate(schema, p, scope); - } catch (IOException e) { - return Stream.of(new ValidationException( - "Cannot parse file " + p.toAbsolutePath(), e)); - } - }); + return Stream.of(Scope.values()) + .flatMap(this::analyseFiles); } public Stream validate(Schema schema, Path path, Scope scope) { @@ -105,4 +122,12 @@ public static boolean isAvscFile(Path file) { public static String getPath(Path path) { return path.toString().substring(path.toString().indexOf(ExcludeConfig.REPOSITORY_NAME)); } + + public SchemaMetadataRules getRules() { + return rules; + } + + public Map getValidatedSchemas() { + return ((RadarSchemaRules) rules.getSchemaRules()).getSchemaStore(); + } } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaFieldRules.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaFieldRules.java index e2c5e887..42b288a3 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaFieldRules.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaFieldRules.java @@ -2,6 +2,7 @@ import org.apache.avro.JsonProperties; import org.apache.avro.Schema; +import org.apache.avro.SchemaBuilder; import org.radarcns.schema.validation.ValidationException; import java.util.Arrays; @@ -44,9 +45,9 @@ public Validator validateFieldTypes(SchemaRules schemaRules) { if (subType == Schema.Type.UNION) { return validateInternalUnion(schemaRules).apply(field); } else if (subType == Schema.Type.RECORD) { - return schemaRules.validateRecord(false).apply(schema); + return schemaRules.validateRecord().apply(schema); } else if (subType == Schema.Type.ENUM) { - return schemaRules.validateEnum(false).apply(schema); + return schemaRules.validateEnum().apply(schema); } else { return valid(); } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaRules.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaRules.java index 6f10bc88..2229a8b3 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaRules.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaRules.java @@ -21,11 +21,16 @@ import org.radarcns.schema.validation.ValidationException; import org.radarcns.schema.validation.config.ExcludeConfig; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.function.BiFunction; import java.util.regex.Pattern; import java.util.stream.Stream; +import static org.radarcns.schema.validation.rules.Validator.check; import static org.radarcns.schema.validation.rules.Validator.matches; import static org.radarcns.schema.validation.rules.Validator.raise; import static org.radarcns.schema.validation.rules.Validator.valid; @@ -43,6 +48,7 @@ public class RadarSchemaRules implements SchemaRules { private static final String TIME_COMPLETED = "timeCompleted"; static final Pattern NAMESPACE_PATTERN = Pattern.compile("^[a-z]+(\\.[a-z]+)*$"); + private final Map schemaStore; // CamelCase // see SchemaValidatorRolesTest#recordNameRegex() for valid and invalid values @@ -63,6 +69,7 @@ public class RadarSchemaRules implements SchemaRules { public RadarSchemaRules(ExcludeConfig config, RadarSchemaFieldRules fieldRules) { this.config = config; this.fieldRules = fieldRules; + this.schemaStore = new HashMap<>(); } public RadarSchemaRules(ExcludeConfig config) { @@ -74,6 +81,17 @@ public SchemaFieldRules getFieldRules() { return fieldRules; } + @Override + public Validator validateUniqueness() { + return schema -> { + String key = schema.getFullName(); + Schema oldSchema = schemaStore.putIfAbsent(key, schema); + return check(oldSchema == null || oldSchema.equals(schema), messageSchema( + "Schema is already defined elsewhere with a different definition.") + .apply(schema)); + }; + } + @Override public Validator validateNameSpace() { return validateNonNull(Schema::getNamespace, matches(NAMESPACE_PATTERN), @@ -203,4 +221,8 @@ public Validator fields(Validator validator) { }); }; } + + public Map getSchemaStore() { + return Collections.unmodifiableMap(schemaStore); + } } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaFieldRules.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaFieldRules.java index a7c8f772..bb959fec 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaFieldRules.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaFieldRules.java @@ -8,13 +8,6 @@ import static org.radarcns.schema.validation.rules.Validator.valid; public interface SchemaFieldRules { - default Validator getValidator(SchemaRules schemaRules) { - return validateFieldTypes(schemaRules) - .and(validateFieldName()) - .and(validateDefault()) - .and(validateFieldDocumentation()); - } - /** Recursively checks field types. */ Validator validateFieldTypes(SchemaRules schemaRules); @@ -24,16 +17,24 @@ default Validator getValidator(SchemaRules schemaRules) { /** Checks field documentation presence and format. */ Validator validateFieldDocumentation(); + /** Checks field default values. */ Validator validateDefault(); + default Validator getValidator(SchemaRules schemaRules) { + return validateFieldTypes(schemaRules) + .and(validateFieldName()) + .and(validateDefault()) + .and(validateFieldDocumentation()); + } + default Validator validateInternalUnion(SchemaRules schemaRules) { return field -> field.getField().schema().getTypes().stream() .flatMap(schema -> { Schema.Type type = schema.getType(); if (type == Schema.Type.RECORD) { - return schemaRules.validateRecord(false).apply(schema); + return schemaRules.validateRecord().apply(schema); } else if (type == Schema.Type.ENUM) { - return schemaRules.validateEnum(false).apply(schema); + return schemaRules.validateEnum().apply(schema); } else if (type == Schema.Type.UNION) { return raise(messageField("Cannot have a nested union.") .apply(field)); diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaMetadataRules.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaMetadataRules.java index 999aca64..7c5676aa 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaMetadataRules.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaMetadataRules.java @@ -20,7 +20,7 @@ default Validator getValidator() { Validator validator = validateSchemaLocation(); if (metadata.getSchema().getType().equals(Schema.Type.ENUM)) { - validator = validator.and(schema(schemaRules.validateEnum(true))); + validator = validator.and(schema(schemaRules.validateEnum())); } else { switch (metadata.getScope()) { case ACTIVE: @@ -33,7 +33,7 @@ default Validator getValidator() { validator = validator.and(schema(schemaRules.validatePassive())); break; default: - validator = validator.and(schema(schemaRules.validateRecord(true))); + validator = validator.and(schema(schemaRules.validateRecord())); break; } } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaRules.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaRules.java index b6549867..5a5d5fd8 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaRules.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SchemaRules.java @@ -9,6 +9,9 @@ public interface SchemaRules { SchemaFieldRules getFieldRules(); + /** Checks that schemas are unique compared to already validated schemas. */ + Validator validateUniqueness(); + /** Checks schema namespace format. */ Validator validateNameSpace(); @@ -36,39 +39,29 @@ public interface SchemaRules { /** Checks that schemas should not have a {@code timeReceived} field. */ Validator validateNotTimeReceived(); - default Validator validateEnum(boolean topLevel) { - Validator validator = validateSymbols() + default Validator validateEnum() { + return validateUniqueness() + .and(validateNameSpace()) + .and(validateSymbols()) .and(validateSchemaDocumentation()) .and(validateName()); - if (topLevel) { - validator = validator.and(validateNameSpace()); - } - return validator; } /** Validate a record that is defined inline. */ - default Validator validateRecord(boolean topLevel) { - SchemaFieldRules fieldRules = getFieldRules(); - - Validator validator = validateName() + default Validator validateRecord() { + return validateUniqueness() + .and(validateNameSpace()) + .and(validateName()) .and(validateSchemaDocumentation()) - .and(fields(fieldRules.validateFieldTypes(this) - .and(fieldRules.validateFieldName()) - .and(fieldRules.validateDefault()) - .and(fieldRules.validateFieldDocumentation()))); - if (topLevel) { - validator = validator.and(validateNameSpace()); - } - return validator; + .and(fields(getFieldRules().getValidator(this))); } - /** * Validates record schemas of an active source * @return TODO */ default Validator validateActiveSource() { - return validateRecord(true) + return validateRecord() .and(validateTime() .and(validateTimeCompleted()) .and(validateNotTimeReceived())); @@ -79,7 +72,7 @@ default Validator validateActiveSource() { * @return TODO */ default Validator validateMonitor() { - return validateRecord(true) + return validateRecord() .and(validateTime()); } @@ -87,7 +80,7 @@ default Validator validateMonitor() { * Validates schemas of passive sources. */ default Validator validatePassive() { - return validateRecord(true) + return validateRecord() .and(validateTime()) .and(validateTimeReceived()) .and(validateNotTimeCompleted()); From e4ec5dbf4dc97c7b7af83df623d65fc7a518926f Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Tue, 19 Sep 2017 17:14:58 +0200 Subject: [PATCH 068/112] Update "sample_rate" --- .../org/radarcns/schema/CommandLineApp.java | 71 ++++++++++++------- .../schema/specification/KafkaActor.java | 20 +++--- .../radarcns/schema/specification/Labels.java | 3 +- .../schema/specification/MonitorSource.java | 8 +-- .../radarcns/schema/specification/Source.java | 10 +-- .../radarcns/schema/specification/Topic.java | 8 +-- .../specification/passive/PassiveSource.java | 2 +- .../specification/passive/Processor.java | 5 +- .../schema/specification/passive/Sensor.java | 9 +-- .../validation/SchemaValidatorTest.java | 7 +- .../rules/RadarSchemaRulesTest.java | 42 +++++++++++ specifications/monitor/external_time.yml | 2 +- specifications/monitor/record_counts.yml | 2 +- specifications/monitor/server_status.yml | 2 +- specifications/monitor/uptime.yml | 2 +- specifications/passive/biovotion_vsm1.yml | 24 +++---- specifications/passive/empatica_e4.yml | 14 ++-- specifications/passive/pebble_2.yml | 8 +-- 18 files changed, 158 insertions(+), 81 deletions(-) diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java index 1d06d062..3f9724d0 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java @@ -33,6 +33,7 @@ import org.radarcns.schema.specification.passive.Processor; import org.radarcns.schema.specification.passive.Sensor; import org.radarcns.schema.validation.SchemaValidator; +import org.radarcns.schema.validation.ValidationException; import org.radarcns.schema.validation.config.ExcludeConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -49,12 +50,12 @@ import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; -import java.util.stream.Collectors; import java.util.stream.Stream; /** * TODO. */ +@SuppressWarnings("PMD.SystemPrintln") public class CommandLineApp { private static final Logger logger = LoggerFactory.getLogger(CommandLineApp.class); @@ -219,8 +220,44 @@ private Map> getTopicsInfoVerbose(boolean reduced) { return map; } + public int validateSchemas(Namespace ns) { + try { + ExcludeConfig config = loadConfig(ns.getString("config")); + SchemaValidator validator = new SchemaValidator(root, config); + Stream stream = validateSchemas( + ns.getString("scope"), validator); + + if (ns.getBoolean("quiet")) { + return stream.count() > 0 ? 1 : 0; + } else { + String result = SchemaValidator.format(stream); + + System.out.println(result); + if (ns.getBoolean("verbose")) { + System.out.println("Validated schemas:"); + for (String name : new TreeSet<>(validator.getValidatedSchemas().keySet())) { + System.out.println(" - " + name); + } + System.out.println(); + } + return result.isEmpty() ? 0 : 1; + } + } catch (IOException e) { + System.err.println("Failed to load schemas: " + e); + return 1; + } + } - public String validateSchemas(String scopeString, String configSubPath) throws IOException { + private Stream validateSchemas(String scopeString, + SchemaValidator validator) throws IOException { + if (scopeString == null) { + return validator.analyseFiles(); + } else { + return validator.analyseFiles(Scope.valueOf(scopeString)); + } + } + + private ExcludeConfig loadConfig(String configSubPath) throws IOException { Path configPath = null; if (configSubPath != null) { if (configSubPath.charAt(0) == '/') { @@ -229,24 +266,9 @@ public String validateSchemas(String scopeString, String configSubPath) throws I configPath = root.resolve(configSubPath); } } - ExcludeConfig config = ExcludeConfig.load(configPath); - SchemaValidator validator = new SchemaValidator(root, config); - if (scopeString == null) { - return Stream.of(Scope.values()) - .flatMap(scope -> { - try { - return SchemaValidator.formatStream(validator.analyseFiles(scope)); - } catch (IOException ex) { - return Stream.of("Failed to read schemas from scope " + scope + "\n\n"); - } - }) - .collect(Collectors.joining()); - } else { - return SchemaValidator.format(validator.analyseFiles(Scope.valueOf(scopeString))); - } + return ExcludeConfig.load(configPath); } - @SuppressWarnings("PMD.SystemPrintln") public static void main(String... args) { ArgumentParser parser = ArgumentParsers.newArgumentParser("radar-schema") .defaultHelp(true) @@ -264,6 +286,12 @@ public static void main(String... args) { .choices(Scope.values()); validateParser.addArgument("-c", "--config") .help("Configuration file to use"); + validateParser.addArgument("-v", "--verbose") + .help("Verbose validation message") + .action(Arguments.storeTrue()); + validateParser.addArgument("-q", "--quiet") + .help("Only set exit code.") + .action(Arguments.storeTrue()); Subparser listParser = subParsers.addParser("list", true) .description("list topics and schemas"); @@ -311,12 +339,7 @@ public static void main(String... args) { } break; case "validate": - try { - System.out.println(app.validateSchemas( - ns.getString("scope"), ns.getString("config"))); - } catch (IOException e) { - logger.error("Failed to load schemas", e); - } + System.exit(app.validateSchemas(ns)); break; default: parser.handleError(new ArgumentParserException( diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/KafkaActor.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/KafkaActor.java index f7682b1a..4a02e3cf 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/KafkaActor.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/KafkaActor.java @@ -24,7 +24,7 @@ public class KafkaActor { private final String doc; - private final double sampleRate; + private final Double sampleInterval; private final String unit; @@ -32,14 +32,18 @@ public class KafkaActor { private final Topic topic; - public KafkaActor(String doc, double sampleRate, String unit, ProcessingState dataType, - Topic topic) { + public KafkaActor(String doc, Double sampleInterval, Double sampleRate, String unit, + ProcessingState dataType, Topic topic) { Objects.requireNonNull(dataType); Objects.requireNonNull(topic); Objects.requireNonNull(unit); this.doc = doc; - this.sampleRate = sampleRate; + if (sampleInterval == null && sampleRate != null) { + this.sampleInterval = 1.0 / sampleRate; + } else { + this.sampleInterval = sampleInterval; + } this.unit = unit; this.dataType = dataType; this.topic = topic; @@ -49,8 +53,8 @@ public String getDoc() { return doc; } - public double getSampleRate() { - return sampleRate; + public Double getSampleInterval() { + return sampleInterval; } public String getUnit() { @@ -74,7 +78,7 @@ public boolean equals(Object o) { return false; } KafkaActor that = (KafkaActor) o; - return Double.compare(that.sampleRate, sampleRate) == 0 + return Objects.equals(that.sampleInterval, sampleInterval) && Objects.equals(doc, that.doc) && Objects.equals(unit, that.unit) && dataType == that.dataType @@ -83,6 +87,6 @@ public boolean equals(Object o) { @Override public int hashCode() { - return Objects.hash(doc, sampleRate, unit, dataType, topic); + return Objects.hash(doc, sampleInterval, unit, dataType, topic); } } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Labels.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Labels.java index 3bd43ad9..af115338 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Labels.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Labels.java @@ -38,7 +38,8 @@ public final class Labels { public static final String PROCESSORS = "processors"; public static final String QUESTIONS = "questions"; public static final String RESPONSES = "responses"; - public static final String SAMPLE_RATE = "sample_rate"; + public static final String DEFAULT_SAMPLE_RATE = "default_sample_rate"; + public static final String DEFAULT_SAMPLE_INTERVAL = "default_sample_interval"; public static final String SCORE = "score"; public static final String SENSORS = "sensors"; public static final String TEXT = "text"; diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/MonitorSource.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/MonitorSource.java index 9a2511c7..8b398071 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/MonitorSource.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/MonitorSource.java @@ -54,7 +54,8 @@ public MonitorSource( @JsonProperty(Labels.NAME) String name, @JsonProperty(Labels.APP_PROVIDER) String appProvider, @JsonProperty(Labels.DOC) String doc, - @JsonProperty(Labels.SAMPLE_RATE) double sampleRate, + @JsonProperty(Labels.DEFAULT_SAMPLE_RATE) Double sampleRate, + @JsonProperty(Labels.DEFAULT_SAMPLE_INTERVAL) Double sampleInterval, @JsonProperty(Labels.UNIT) String unit, @JsonProperty(Labels.PROCESSING_STATE) ProcessingState dataType, @JsonProperty(Labels.TOPIC) String topic, @@ -66,9 +67,8 @@ public MonitorSource( Objects.requireNonNull(appProvider); this.type = name; - this.appProvider = deduceProjectClass(appProvider); - - this.kafkaActor = new KafkaActor(doc, sampleRate, unit, dataType, + this.appProvider = expandClass(appProvider); + this.kafkaActor = new KafkaActor(doc, sampleInterval, sampleRate, unit, dataType, new Topic(topic, key, value, aggregator, null)); } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Source.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Source.java index f6f1a52c..8221706f 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Source.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Source.java @@ -71,13 +71,13 @@ public int hashCode() { return Objects.hash(name, doc); } - public static String deduceProjectClass(String appProvider) { - if (appProvider == null || appProvider.isEmpty()) { + public static String expandClass(String classShorthand) { + if (classShorthand == null || classShorthand.isEmpty()) { return null; - } else if (appProvider.charAt(0) == '.') { - return Utils.getProjectGroup() + appProvider; + } else if (classShorthand.charAt(0) == '.') { + return Utils.getProjectGroup() + classShorthand; } else { - return appProvider; + return classShorthand; } } } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Topic.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Topic.java index 7e22f59b..021ff29e 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Topic.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Topic.java @@ -24,7 +24,7 @@ import java.util.Set; import java.util.concurrent.TimeUnit; -import static org.radarcns.schema.specification.Source.deduceProjectClass; +import static org.radarcns.schema.specification.Source.expandClass; /** * TODO. @@ -134,9 +134,9 @@ public Topic(String inputTopic, String inputKey, String inputValue, String aggre Objects.requireNonNull(inputValue); this.inputTopic = inputTopic; - this.inputKey = deduceProjectClass(inputKey); - this.inputValue = deduceProjectClass(inputValue); - this.aggregator = deduceProjectClass(aggregator); + this.inputKey = expandClass(inputKey); + this.inputValue = expandClass(inputValue); + this.aggregator = expandClass(aggregator); this.baseOutput = baseOutput != null ? baseOutput : inputTopic; diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveSource.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveSource.java index 856bbdd0..28fc4219 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveSource.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveSource.java @@ -72,7 +72,7 @@ public PassiveSource( this.type = vendor + '_' + model; this.vendor = vendor; this.model = model; - this.appProvider = deduceProjectClass(appProvider); + this.appProvider = expandClass(appProvider); this.sensors = sensors; this.processors = processors == null ? new HashSet<>() : processors; diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/Processor.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/Processor.java index aeb3f837..422d3ff9 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/Processor.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/Processor.java @@ -50,7 +50,8 @@ public class Processor extends KafkaActor { public Processor( @JsonProperty(Labels.NAME) String name, @JsonProperty(Labels.DOC) String doc, - @JsonProperty(Labels.SAMPLE_RATE) double sampleRate, + @JsonProperty(Labels.DEFAULT_SAMPLE_INTERVAL) double sampleInterval, + @JsonProperty(Labels.DEFAULT_SAMPLE_RATE) double sampleRate, @JsonProperty(Labels.UNIT) String unit, @JsonProperty(Labels.PROCESSING_STATE) ProcessingState dataType, @JsonProperty(Labels.INPUT_TOPIC) String inputTopic, @@ -58,7 +59,7 @@ public Processor( @JsonProperty(Labels.INPUT_VALUE) String inputValue, @JsonProperty(Labels.BASE_OUTPUT_TOPIC) String baseOutputTopic, @JsonProperty(Labels.AGGREGATOR) String aggregator) { - super(doc, sampleRate, unit, dataType, + super(doc, sampleInterval, sampleRate, unit, dataType, new Topic(inputTopic, inputKey, inputValue, aggregator, baseOutputTopic)); Objects.requireNonNull(baseOutputTopic); diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/Sensor.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/Sensor.java index 44e2031c..91866007 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/Sensor.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/Sensor.java @@ -26,7 +26,7 @@ import java.util.Objects; -import static org.radarcns.schema.specification.Source.deduceProjectClass; +import static org.radarcns.schema.specification.Source.expandClass; /** * TODO. @@ -55,20 +55,21 @@ public Sensor( @JsonProperty(Labels.NAME) SensorName name, @JsonProperty(Labels.APP_PROVIDER) String appProvider, @JsonProperty(Labels.DOC) String doc, - @JsonProperty(Labels.SAMPLE_RATE) double sampleRate, + @JsonProperty(Labels.DEFAULT_SAMPLE_INTERVAL) double sampleInterval, + @JsonProperty(Labels.DEFAULT_SAMPLE_RATE) double sampleRate, @JsonProperty(Labels.UNIT) String unit, @JsonProperty(Labels.PROCESSING_STATE) ProcessingState dataType, @JsonProperty(Labels.TOPIC) String topic, @JsonProperty(Labels.KEY) String key, @JsonProperty(Labels.VALUE) String value, @JsonProperty(Labels.AGGREGATOR) String aggregator) { - super(doc, sampleRate, unit, dataType, + super(doc, sampleInterval, sampleRate, unit, dataType, new Topic(topic, key, value, aggregator, null)); Objects.requireNonNull(name); this.name = name; - this.appProvider = deduceProjectClass(appProvider); + this.appProvider = expandClass(appProvider); } public String getAppProvider() { diff --git a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java index e6c1dc2d..09f105d2 100644 --- a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java @@ -22,10 +22,14 @@ import org.junit.Test; import org.radarcns.schema.Scope; import org.radarcns.schema.validation.config.ExcludeConfig; +import org.radarcns.schema.validation.rules.RadarSchemaRules; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.TreeSet; import java.util.stream.Stream; import static org.junit.Assert.assertEquals; @@ -42,6 +46,7 @@ public class SchemaValidatorTest { private SchemaValidator validator; private static final Path ROOT = Paths.get("../..").toAbsolutePath(); + private static final Logger logger = LoggerFactory.getLogger(SchemaValidatorTest.class); @Before public void setUp() throws IOException { @@ -117,6 +122,6 @@ public void testEnumerator() { result = validator.validate(schema, schemaPath, MONITOR); - assertEquals(1, result.count()); + assertEquals(2, result.count()); } } diff --git a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaRulesTest.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaRulesTest.java index 049ae2e3..3b0ece6d 100644 --- a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaRulesTest.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaRulesTest.java @@ -373,4 +373,46 @@ public void enumerationSymbolTest() { assertEquals(2, result.count()); } + + + @Test + public void testUniqueness() { + String schemaTxt = "{\"namespace\": \"org.radarcns.monitor.application\", " + + "\"name\": \"ServerStatus\", \"type\": " + + "\"enum\", \"symbols\": [\"A\", \"B\"]}"; + String schemaTxtAlt = "{\"namespace\": \"org.radarcns.monitor.application\", " + + "\"name\": \"ServerStatus\", \"type\": " + + "\"enum\", \"symbols\": [\"A\", \"B\", \"C\"]}"; + String schemaTxt2 = "{\"namespace\": \"org.radarcns.monitor.application\", " + + "\"name\": \"ServerStatus2\", \"type\": " + + "\"enum\", \"symbols\": [\"A\", \"B\"]}"; + String schemaTxt3 = "{\"namespace\": \"org.radarcns.monitor.applications\", " + + "\"name\": \"ServerStatus\", \"type\": " + + "\"enum\", \"symbols\": [\"A\", \"B\"]}"; + + Schema schema = new Parser().parse(schemaTxt); + Stream result = validator.validateUniqueness().apply(schema); + assertEquals(0, result.count()); + result = validator.validateUniqueness().apply(schema); + assertEquals(0, result.count()); + + Schema schemaAlt = new Parser().parse(schemaTxtAlt); + result = validator.validateUniqueness().apply(schemaAlt); + assertEquals(1, result.count()); + result = validator.validateUniqueness().apply(schemaAlt); + assertEquals(1, result.count()); + + Schema schema2 = new Parser().parse(schemaTxt2); + result = validator.validateUniqueness().apply(schema2); + assertEquals(0, result.count()); + + Schema schema3 = new Parser().parse(schemaTxt3); + result = validator.validateUniqueness().apply(schema3); + assertEquals(0, result.count()); + result = validator.validateUniqueness().apply(schema3); + assertEquals(0, result.count()); + + result = validator.validateUniqueness().apply(schemaAlt); + assertEquals(1, result.count()); + } } diff --git a/specifications/monitor/external_time.yml b/specifications/monitor/external_time.yml index b5faa15e..14f2caac 100644 --- a/specifications/monitor/external_time.yml +++ b/specifications/monitor/external_time.yml @@ -2,7 +2,7 @@ name: EXTERNAL_TIME app_provider: .application.ApplicationServiceProvider doc: Information sent by the Android pRMT about time synchronisation with a NTS different from the default one. -sample_rate: 0.08 +default_sample_interval: 300 unit: NON_DIMENSIONAL processing_state: RAW topic: application_external_time diff --git a/specifications/monitor/record_counts.yml b/specifications/monitor/record_counts.yml index 697728f3..d1a7990f 100644 --- a/specifications/monitor/record_counts.yml +++ b/specifications/monitor/record_counts.yml @@ -2,7 +2,7 @@ name: RECORD_COUNTS app_provider: .application.ApplicationServiceProvider doc: Monitor used by the Android pRMT to report the number of cached and created records. -sample_rate: 0.08 +default_sample_interval: 300 unit: NON_DIMENSIONAL processing_state: RAW topic: application_record_counts diff --git a/specifications/monitor/server_status.yml b/specifications/monitor/server_status.yml index 5345a267..fe83150e 100644 --- a/specifications/monitor/server_status.yml +++ b/specifications/monitor/server_status.yml @@ -2,7 +2,7 @@ name: SERVER_STATUS app_provider: .application.ApplicationServiceProvider doc: Monitor used by the Android pRMT to report the server connection status between the android client and the RADAR-CNS Platform. -sample_rate: 0.08 +default_sample_interval: 300 unit: NON_DIMENSIONAL processing_state: RAW topic: application_server_status diff --git a/specifications/monitor/uptime.yml b/specifications/monitor/uptime.yml index 4abac95b..913c4c33 100644 --- a/specifications/monitor/uptime.yml +++ b/specifications/monitor/uptime.yml @@ -2,7 +2,7 @@ name: UPTIME app_provider: .application.ApplicationServiceProvider doc: Monitor used by the Android pRMT to notify the time duration since last reboot. -sample_rate: 0.08 +default_sample_interval: 300 unit: NON_DIMENSIONAL processing_state: RAW topic: application_uptime diff --git a/specifications/passive/biovotion_vsm1.yml b/specifications/passive/biovotion_vsm1.yml index 5c3e8146..1c2d95a2 100644 --- a/specifications/passive/biovotion_vsm1.yml +++ b/specifications/passive/biovotion_vsm1.yml @@ -4,7 +4,7 @@ model: VSM1 app_provider: .biovotion.BiovotionServiceProvider sensors: - name: ACCELEROMETER - sample_rate: 51.2 + default_sample_rate: 51.2 unit: G processing_state: RAW topic: android_biovotion_vsm1_acceleration @@ -12,7 +12,7 @@ sensors: value: .passive.biovotion.BiovotionVsm1Acceleration aggregator: .kafka.aggregator.AggregatorDoubleArray - name: BATTERY - sample_rate: 1.0 + default_sample_rate: 1.0 unit: PERCENTAGE processing_state: RAW topic: android_biovotion_vsm1_battery_level @@ -20,7 +20,7 @@ sensors: value: .passive.biovotion.BiovotionVsm1BatteryLevel aggregator: .kafka.aggregator.AggregatorDouble - name: BLOOD_PULSE_WAVE - sample_rate: 1.0 + default_sample_rate: 1.0 unit: NON_DIMENSIONAL processing_state: VENDOR topic: android_biovotion_vsm1_blood_volume_pulse @@ -28,7 +28,7 @@ sensors: value: .passive.biovotion.BiovotionVsm1BloodPulseWave aggregator: .kafka.aggregator.AggregatorDouble - name: ENERGY - sample_rate: 1.0 + default_sample_rate: 1.0 unit: CALORIES_PER_SEC processing_state: VENDOR topic: android_biovotion_vsm1_energy @@ -36,7 +36,7 @@ sensors: value: .passive.biovotion.BiovotionVsm1Energy aggregator: .kafka.aggregator.AggregatorDouble - name: GALVANIC_SKIN_RESPONSE - sample_rate: 1.0 + default_sample_rate: 1.0 unit: KILO_OHM processing_state: VENDOR topic: android_biovotion_vsm1_galvanic_skin_response @@ -44,7 +44,7 @@ sensors: value: .passive.biovotion.BiovotionVsm1GalvanicSkinResponse aggregator: .kafka.aggregator.AggregatorDoubleArray - name: HEART_RATE - sample_rate: 1.0 + default_sample_rate: 1.0 unit: BEATS_PER_MIN processing_state: VENDOR topic: android_biovotion_vsm1_heartrate @@ -52,7 +52,7 @@ sensors: value: .passive.biovotion.BiovotionVsm1HeartRate aggregator: .kafka.aggregator.AggregatorDouble - name: HEART_RATE_VARIABILITY - sample_rate: 1.0 + default_sample_rate: 1.0 unit: RMSSD_IN_MILLI_SEC processing_state: VENDOR topic: android_biovotion_vsm1_heartrate_variability @@ -60,7 +60,7 @@ sensors: value: .passive.biovotion.BiovotionVsm1HeartRateVariability aggregator: .kafka.aggregator.AggregatorDouble - name: LED - sample_rate: 1.0 + default_sample_rate: 1.0 unit: MILLI_AMPERE processing_state: VENDOR topic: android_biovotion_vsm1_led_current @@ -68,7 +68,7 @@ sensors: value: .passive.biovotion.BiovotionVsm1LedCurrent aggregator: .kafka.aggregator.AggregatorDoubleArray - name: PHOTOPLETHYSMOGRAPHY - sample_rate: 51.2 + default_sample_rate: 51.2 unit: NON_DIMENSIONAL processing_state: RAW topic: android_biovotion_vsm1_ppg_raw @@ -76,7 +76,7 @@ sensors: value: .passive.biovotion.BiovotionVsm1PpgRaw aggregator: .kafka.aggregator.AggregatorDoubleArray - name: RESPIRATION_RATE - sample_rate: 1.0 + default_sample_rate: 1.0 unit: BEATS_PER_MIN processing_state: VENDOR topic: android_biovotion_vsm1_respiration_rate @@ -84,7 +84,7 @@ sensors: value: .passive.biovotion.BiovotionVsm1RespirationRate aggregator: .kafka.aggregator.AggregatorDouble - name: OXYGEN_SATURATION - sample_rate: 1.0 + default_sample_rate: 1.0 unit: PERCENTAGE processing_state: VENDOR topic: android_biovotion_vsm1_oxygen_saturation @@ -92,7 +92,7 @@ sensors: value: .passive.biovotion.BiovotionVsm1OxygenSaturation aggregator: .kafka.aggregator.AggregatorDouble - name: THERMOMETER - sample_rate: 1.0 + default_sample_rate: 1.0 unit: CELSIUS processing_state: RAW topic: android_biovotion_vsm1_temperature diff --git a/specifications/passive/empatica_e4.yml b/specifications/passive/empatica_e4.yml index eb5d4e5d..dbc16107 100644 --- a/specifications/passive/empatica_e4.yml +++ b/specifications/passive/empatica_e4.yml @@ -4,7 +4,7 @@ model: E4 app_provider: .empatica.E4ServiceProvider sensors: - name: ACCELEROMETER - sample_rate: 32.0 + default_sample_rate: 32.0 unit: G processing_state: RAW topic: android_empatica_e4_acceleration @@ -12,7 +12,7 @@ sensors: value: .passive.empatica.EmpaticaE4Acceleration aggregator: .kafka.aggregator.AggregatorDoubleArray - name: BATTERY - sample_rate: 1.0 + default_sample_rate: 1.0 unit: PERCENTAGE processing_state: RAW topic: android_empatica_e4_battery_level @@ -20,7 +20,7 @@ sensors: value: .passive.empatica.EmpaticaE4BatteryLevel aggregator: .kafka.aggregator.AggregatorDouble - name: BLOOD_VOLUME_PULSE - sample_rate: 64.0 + default_sample_rate: 64.0 unit: NANO_WATT processing_state: RAW topic: android_empatica_e4_blood_volume_pulse @@ -28,7 +28,7 @@ sensors: value: .passive.empatica.EmpaticaE4BloodVolumePulse aggregator: .kafka.aggregator.AggregatorDouble - name: ELECTRODERMAL_ACTIVITY - sample_rate: 4.0 + default_sample_rate: 4.0 unit: MICRO_SIEMENS processing_state: RAW topic: android_empatica_e4_electrodermal_activity @@ -36,7 +36,7 @@ sensors: value: .passive.empatica.EmpaticaE4ElectroDermalActivity aggregator: .kafka.aggregator.AggregatorDouble - name: INTER_BEAT_INTERVAL - sample_rate: 1.0 + default_sample_rate: 1.0 unit: BEATS_PER_MIN processing_state: VENDOR topic: android_empatica_e4_inter_beat_interval @@ -44,7 +44,7 @@ sensors: value: .passive.empatica.EmpaticaE4InterBeatInterval aggregator: .kafka.aggregator.AggregatorDouble - name: THERMOMETER - sample_rate: 4.0 + default_sample_rate: 4.0 unit: CELSIUS processing_state: RAW topic: android_empatica_e4_temperature @@ -53,7 +53,7 @@ sensors: aggregator: .kafka.aggregator.AggregatorDouble processors: - name: HEART_RATE - sample_rate: 1.0 + default_sample_rate: 1.0 unit: BEATS_PER_MIN processing_state: RADAR input_topic: android_empatica_e4_inter_beat_interval diff --git a/specifications/passive/pebble_2.yml b/specifications/passive/pebble_2.yml index bade2051..4b808298 100644 --- a/specifications/passive/pebble_2.yml +++ b/specifications/passive/pebble_2.yml @@ -4,7 +4,7 @@ model: 2 app_provider: .pebble.PebbleServiceProvider sensors: - name: ACCELEROMETER - sample_rate: 10.0 + default_sample_rate: 10.0 unit: G processing_state: RAW topic: android_pebble_2_acceleration @@ -12,7 +12,7 @@ sensors: value: .passive.pebble.Pebble2Acceleration aggregator: .kafka.aggregator.AggregatorDoubleArray - name: BATTERY - sample_rate: 1.0 + default_sample_rate: 1.0 unit: PERCENTAGE processing_state: RAW topic: android_pebble_2_battery_level @@ -20,7 +20,7 @@ sensors: value: .passive.pebble.Pebble2BatteryLevel aggregator: .kafka.aggregator.AggregatorDouble - name: HEART_RATE - sample_rate: 1.0 + default_sample_rate: 1.0 unit: BEATS_PER_MIN processing_state: VENDOR topic: android_pebble_2_heartrate @@ -28,7 +28,7 @@ sensors: value: .passive.pebble.Pebble2HeartRate aggregator: .kafka.aggregator.AggregatorDouble - name: HEART_RATE_FILTERED - sample_rate: 1.0 + default_sample_rate: 1.0 unit: BEATS_PER_MIN processing_state: VENDOR topic: android_pebble_2_heartrate_filtered From cc1e5ab55397addb61b701f2bdfcc616487573d2 Mon Sep 17 00:00:00 2001 From: Pavel Mikhailovskii Date: Wed, 20 Sep 2017 16:57:42 +0200 Subject: [PATCH 069/112] Renamed bluetoothEnabled to enabled --- commons/phone/phone_bluetooth_devices.avsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/commons/phone/phone_bluetooth_devices.avsc b/commons/phone/phone_bluetooth_devices.avsc index ef89233d..c7dfd126 100644 --- a/commons/phone/phone_bluetooth_devices.avsc +++ b/commons/phone/phone_bluetooth_devices.avsc @@ -6,8 +6,8 @@ "fields": [ {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "pairedDevices", "type": "int", "doc": "Number of paired devices"}, + {"name": "pairedDevices", "type": ["null", "int"], "doc": "Number of paired devices"}, {"name": "nearbyDevices", "type": "int", "doc": "Number of nearby devices"}, - {"name": "enabled", "type": "boolean", "doc": "whether Bluetooth is enabled"} + {"name": "bluetoothEnabled", "type": "boolean", "doc": "whether Bluetooth is enabled"} ] } From 361632e5aac40d6fc2dfa52b98acb8011977cf79 Mon Sep 17 00:00:00 2001 From: Pavel Mikhailovskii Date: Wed, 20 Sep 2017 17:28:49 +0200 Subject: [PATCH 070/112] Made contactsAdded/Removed nullable, renaming --- commons/phone/phone_contact_list.avsc | 13 +++++++++++++ commons/phone/phone_contacts_list.avsc | 13 ------------- 2 files changed, 13 insertions(+), 13 deletions(-) create mode 100644 commons/phone/phone_contact_list.avsc delete mode 100644 commons/phone/phone_contacts_list.avsc diff --git a/commons/phone/phone_contact_list.avsc b/commons/phone/phone_contact_list.avsc new file mode 100644 index 00000000..5d306a06 --- /dev/null +++ b/commons/phone/phone_contact_list.avsc @@ -0,0 +1,13 @@ +{ + "namespace": "org.radarcns.phone", + "type": "record", + "name": "PhoneContactList", + "doc": "Data describing the number of contacts in the the list of contacts and its change since the previous check.", + "fields": [ + {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, + {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, + {"name": "contactsAdded", "type": ["null", "int"], "doc": "Number of new contacts added to the list of contacts since the previous measurement that was sent. The value is null if this is the first measurement or if the previous measurement is unknown to the sender."}, + {"name": "contactsRemoved", "type": ["null", "int"], "doc": "Number of new contacts removed from the list of contacts since the previous measurement that was sent. The value is null if this is the first measurement or if the previous measurement is unknown to the sender."}, + {"name": "contacts", "type": "int", "doc": "Current number of contacts in the list of contacts."} + ] +} diff --git a/commons/phone/phone_contacts_list.avsc b/commons/phone/phone_contacts_list.avsc deleted file mode 100644 index 0a1be2aa..00000000 --- a/commons/phone/phone_contacts_list.avsc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "namespace": "org.radarcns.phone", - "type": "record", - "name": "PhoneContactsList", - "doc": "Number of new contacts added/removed from the list of contacts between this and the previous record.", - "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "contactsAdded", "type": "int", "doc": "Number of new contacts added to the list of contacts."}, - {"name": "contactsRemoved", "type": "int", "doc": "Number of new contacts removed from the list of contacts."}, - {"name": "contactsNumber", "type": "int", "doc": "Current number of contacts in the list of contacts."} - ] -} From dcad52ddd84f5911f1dc132371346c13b06663c4 Mon Sep 17 00:00:00 2001 From: Pavel Mikhailovskii Date: Thu, 21 Sep 2017 11:02:02 +0200 Subject: [PATCH 071/112] Made nearbyDevices nullable, added default values --- commons/phone/phone_bluetooth_devices.avsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/commons/phone/phone_bluetooth_devices.avsc b/commons/phone/phone_bluetooth_devices.avsc index c7dfd126..e931bb0b 100644 --- a/commons/phone/phone_bluetooth_devices.avsc +++ b/commons/phone/phone_bluetooth_devices.avsc @@ -6,8 +6,8 @@ "fields": [ {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "pairedDevices", "type": ["null", "int"], "doc": "Number of paired devices"}, - {"name": "nearbyDevices", "type": "int", "doc": "Number of nearby devices"}, + {"name": "pairedDevices", "type": ["null", "int"], "default": "null", "doc": "Number of paired devices"}, + {"name": "nearbyDevices", "type": ["null", "int"], "default": "null", "doc": "Number of nearby devices"}, {"name": "bluetoothEnabled", "type": "boolean", "doc": "whether Bluetooth is enabled"} ] } From 7b3f4f930cb5dfcb06790af626117ce8f9df40ed Mon Sep 17 00:00:00 2001 From: Pavel Mikhailovskii Date: Thu, 21 Sep 2017 11:03:29 +0200 Subject: [PATCH 072/112] Added default values for contactsAdded/Removed --- commons/phone/phone_contact_list.avsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/commons/phone/phone_contact_list.avsc b/commons/phone/phone_contact_list.avsc index 5d306a06..fd1df052 100644 --- a/commons/phone/phone_contact_list.avsc +++ b/commons/phone/phone_contact_list.avsc @@ -6,8 +6,8 @@ "fields": [ {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "contactsAdded", "type": ["null", "int"], "doc": "Number of new contacts added to the list of contacts since the previous measurement that was sent. The value is null if this is the first measurement or if the previous measurement is unknown to the sender."}, - {"name": "contactsRemoved", "type": ["null", "int"], "doc": "Number of new contacts removed from the list of contacts since the previous measurement that was sent. The value is null if this is the first measurement or if the previous measurement is unknown to the sender."}, + {"name": "contactsAdded", "type": ["null", "int"], "default": null, "doc": "Number of new contacts added to the list of contacts since the previous measurement that was sent. The value is null if this is the first measurement or if the previous measurement is unknown to the sender."}, + {"name": "contactsRemoved", "type": ["null", "int"], "default": null, "doc": "Number of new contacts removed from the list of contacts since the previous measurement that was sent. The value is null if this is the first measurement or if the previous measurement is unknown to the sender."}, {"name": "contacts", "type": "int", "doc": "Current number of contacts in the list of contacts."} ] } From 4939f3cdfe34de3b35189f42b7cf3a00222db80b Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Thu, 21 Sep 2017 14:07:10 +0200 Subject: [PATCH 073/112] Refactored specifications according to ManagementPortal structure --- .../main/java/org/radarcns/schema/Scope.java | 2 +- java-sdk/radar-schemas-tools/build.gradle | 1 + .../org/radarcns/schema/CommandLineApp.java | 154 +++------ .../schema/specification/Aggregatable.java | 34 -- .../schema/specification/AppDataTopic.java | 38 +++ .../schema/specification/AppSource.java | 21 ++ .../schema/specification/DataProducer.java | 77 +++++ .../schema/specification/DataTopic.java | 154 +++++++++ .../schema/specification/KafkaActor.java | 92 ----- .../radarcns/schema/specification/Labels.java | 55 --- .../schema/specification/MonitorSource.java | 91 ----- .../radarcns/schema/specification/Source.java | 83 ----- .../schema/specification/SourceCatalogue.java | 115 ++++--- .../radarcns/schema/specification/Topic.java | 314 ------------------ .../specification/active/ActiveSource.java | 77 ++--- .../active/questionnaire/Question.java | 44 +-- .../questionnaire/QuestionnaireDataTopic.java | 49 +++ .../questionnaire/QuestionnaireSource.java | 77 +---- .../active/questionnaire/Response.java | 34 +- .../monitor/MonitorDataTopic.java | 9 + .../specification/monitor/MonitorSource.java | 22 ++ .../passive/PassiveDataTopic.java | 52 +++ .../specification/passive/PassiveSource.java | 128 ++----- .../specification/passive/Processor.java | 74 ----- .../schema/specification/passive/Sensor.java | 100 ------ .../specification/stream/StreamDataTopic.java | 126 +++++++ .../specification/stream/StreamGroup.java | 35 ++ .../java/org/radarcns/schema/util/Utils.java | 46 +++ .../schema/validation/SchemaValidator.java | 16 +- .../validation/rules/ActiveSourceRoles.java | 8 +- .../validation/rules/AggregatableRoles.java | 58 ---- .../schema/validation/rules/MonitorRoles.java | 28 +- .../validation/rules/PassiveSourceRoles.java | 18 +- .../validation/rules/ProcessorRoles.java | 56 ---- .../validation/rules/QuestionnaireRoles.java | 10 +- .../rules/RadarSchemaFieldRules.java | 5 +- .../rules/RadarSchemaMetadataRules.java | 10 +- .../validation/rules/RadarSchemaRules.java | 1 - .../validation/rules/ResponseRoles.java | 2 +- .../schema/validation/rules/SensorRoles.java | 22 +- .../schema/validation/rules/TopicRoles.java | 85 ----- .../schema/validation/rules/Validator.java | 25 +- .../schema/validation/ActiveValidation.java | 4 +- .../schema/validation/PassiveValidation.java | 2 +- .../validation/SchemaValidatorTest.java | 5 - .../validation/SourceCatalogueValidation.java | 66 ++-- .../rules/RadarSchemaFieldRulesTest.java | 6 +- .../rules/RadarSchemaRulesTest.java | 28 +- .../schema/validation/util/TopicTest.java | 118 ------- specifications/active/phq8.yml | 201 +++++------ specifications/monitor/external_time.yml | 10 - specifications/monitor/radar_prmt.yml | 27 ++ specifications/monitor/record_counts.yml | 10 - specifications/monitor/server_status.yml | 10 - specifications/monitor/uptime.yml | 10 - specifications/passive/android_phone.yml | 91 ++--- specifications/passive/biovotion_vsm1.yml | 74 ++--- specifications/passive/empatica_e4.yml | 48 +-- specifications/passive/pebble_2.yml | 27 +- specifications/stream/android_phone.yml | 40 +++ specifications/stream/biovotion_vsm1.yml | 40 +++ specifications/stream/empatica_e4.yml | 31 ++ 62 files changed, 1252 insertions(+), 2044 deletions(-) delete mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Aggregatable.java create mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/AppDataTopic.java create mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/AppSource.java create mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/DataProducer.java create mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/DataTopic.java delete mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/KafkaActor.java delete mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Labels.java delete mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/MonitorSource.java delete mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Source.java delete mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Topic.java create mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/QuestionnaireDataTopic.java create mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/monitor/MonitorDataTopic.java create mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/monitor/MonitorSource.java create mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveDataTopic.java delete mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/Processor.java delete mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/Sensor.java create mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/stream/StreamDataTopic.java create mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/stream/StreamGroup.java delete mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/AggregatableRoles.java delete mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/ProcessorRoles.java delete mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/TopicRoles.java delete mode 100644 java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/util/TopicTest.java delete mode 100644 specifications/monitor/external_time.yml create mode 100644 specifications/monitor/radar_prmt.yml delete mode 100644 specifications/monitor/record_counts.yml delete mode 100644 specifications/monitor/server_status.yml delete mode 100644 specifications/monitor/uptime.yml create mode 100644 specifications/stream/android_phone.yml create mode 100644 specifications/stream/biovotion_vsm1.yml create mode 100644 specifications/stream/empatica_e4.yml diff --git a/java-sdk/radar-schemas-commons/src/main/java/org/radarcns/schema/Scope.java b/java-sdk/radar-schemas-commons/src/main/java/org/radarcns/schema/Scope.java index ab1e4b97..c0e03357 100644 --- a/java-sdk/radar-schemas-commons/src/main/java/org/radarcns/schema/Scope.java +++ b/java-sdk/radar-schemas-commons/src/main/java/org/radarcns/schema/Scope.java @@ -5,7 +5,7 @@ import java.util.Locale; public enum Scope { - ACTIVE, KAFKA, CATALOGUE, MONITOR, PASSIVE; + ACTIVE, KAFKA, CATALOGUE, MONITOR, PASSIVE, STREAM; private final String lower; diff --git a/java-sdk/radar-schemas-tools/build.gradle b/java-sdk/radar-schemas-tools/build.gradle index 651eafd9..64af8fe9 100644 --- a/java-sdk/radar-schemas-tools/build.gradle +++ b/java-sdk/radar-schemas-tools/build.gradle @@ -24,6 +24,7 @@ ext.slf4jVersion = '1.7.25' dependencies { api group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.8.10' + api group: 'javax.validation', name: 'validation-api', version: '2.0.0.Final' implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.8.10' implementation project(':radar-schemas-commons') implementation group: 'org.radarcns', name: 'radar-commons', version: '0.5' diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java index 3f9724d0..32db5edb 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java @@ -23,15 +23,10 @@ import net.sourceforge.argparse4j.inf.Namespace; import net.sourceforge.argparse4j.inf.Subparser; import net.sourceforge.argparse4j.inf.Subparsers; -import org.radarcns.schema.specification.KafkaActor; -import org.radarcns.schema.specification.MonitorSource; +import org.radarcns.schema.specification.DataTopic; +import org.radarcns.schema.specification.DataProducer; import org.radarcns.schema.specification.SourceCatalogue; -import org.radarcns.schema.specification.Topic; -import org.radarcns.schema.specification.active.ActiveSource; -import org.radarcns.schema.specification.active.questionnaire.QuestionnaireSource; -import org.radarcns.schema.specification.passive.PassiveSource; -import org.radarcns.schema.specification.passive.Processor; -import org.radarcns.schema.specification.passive.Sensor; +import org.radarcns.schema.specification.stream.StreamGroup; import org.radarcns.schema.validation.SchemaValidator; import org.radarcns.schema.validation.ValidationException; import org.radarcns.schema.validation.config.ExcludeConfig; @@ -43,13 +38,10 @@ import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; -import java.util.SortedSet; import java.util.TreeSet; +import java.util.stream.Collectors; import java.util.stream.Stream; /** @@ -71,92 +63,47 @@ public CommandLineApp(Path root) throws IOException { * TODO. * @return TODO */ - public SortedSet getTopicsToCreate() { - SortedSet set = new TreeSet<>(); - - for (Topic topic : getAllTopics()) { - set.add(topic.getInputTopic()); - if (topic.hasAggregator()) { - topic.getOutputTopics().stream() - .map(Topic.TopicMetadata::getOutput) - .forEach(set::add); - } - } - - return set; + public List getTopicsToCreate() { + return catalogue.getTopicNames() + .sorted() + .collect(Collectors.toList()); } /** * TODO. * @return TODO */ - public Set getRawTopics() { - Set set = new HashSet<>(); - - for (Topic topic : getAllTopics()) { - set.add(topic.getInputTopic()); - } - - return set; + public List getRawTopics() { + return Stream.of( + catalogue.getPassiveSources(), + catalogue.getActiveSources(), + catalogue.getMonitorSources()) + .flatMap(map -> map.values().stream()) + .flatMap(DataProducer::getTopicNames) + .sorted() + .collect(Collectors.toList()); } /** * TODO. * @return TODO */ - public Set getResultsCacheTopics() { - Set set = new HashSet<>(); - - for (Topic topic : getAllTopics()) { - if (topic.hasAggregator()) { - topic.getOutputTopics().stream() - .map(Topic.TopicMetadata::getOutput) - .forEach(set::add); - } else { - set.add(topic.getInputTopic()); - } - } - - return set; - } - - private Set getAllTopics() { - Set set = new HashSet<>(); - - catalogue.getActiveSources().values().stream() - .map(ActiveSource::getTopic) - .forEach(set::add); - - catalogue.getMonitorSources().values().stream() - .map(MonitorSource::getKafkaActor) - .map(KafkaActor::getTopic) - .forEach(set::add); - - catalogue.getPassiveSources().values().stream() - .map(PassiveSource::getSensors) - .flatMap(Set::stream) - .map(Sensor::getTopic) - .forEach(set::add); - - catalogue.getPassiveSources().values().stream() - .map(PassiveSource::getProcessors) - .flatMap(Set::stream) - .map(Processor::getTopic) - .forEach(set::add); - - return set; + public List getResultsCacheTopics() { + return catalogue.getStreamGroups().values().stream() + .flatMap(StreamGroup::getTimedTopicNames) + .sorted() + .collect(Collectors.toList()); } /** * TODO. - * @param reduced TODO * @return TODO */ - public String getTopicsVerbose(boolean reduced, String source) { - logger.info("Topic list {} {}", reduced, source); + public String getTopicsVerbose(boolean prettyPrint, String source) { + logger.info("Topic list {} {}", prettyPrint, source); StringBuilder result = new StringBuilder(); - Map> map = getTopicsInfoVerbose(reduced); + Map> map = getTopicsInfoVerbose(prettyPrint); List rootKeys = new ArrayList<>(map.keySet()); Collections.sort(rootKeys); @@ -170,9 +117,11 @@ public String getTopicsVerbose(boolean reduced, String source) { for (String details : firstLevelKeys) { result.append('\t').append(details); - result.append("\n\t\t") - .append(map.get(key).get(details) - .replace("\n", "\n\t\t")); + result.append("\n\t\t"); + String next = map.get(key).get(details) + .replace("\n", "\n\t\t"); + // remove last two tabs + result.append(next.substring(0, next.length() - 2)); } result.append('\n'); } @@ -183,41 +132,16 @@ public String getTopicsVerbose(boolean reduced, String source) { /** * TODO. - * @param reduced TODO + * @param prettyPrint TODO * @return TODO */ - private Map> getTopicsInfoVerbose(boolean reduced) { - Map> map = new HashMap<>(); - - Map details = new HashMap<>(); - for (ActiveSource source : catalogue.getActiveSources().values()) { - if (source instanceof QuestionnaireSource) { - details.put( - ((QuestionnaireSource)source).getQuestionnaireType(), - source.getTopic().toString(reduced)); - } - } - map.put(ActiveSource.RadarSourceTypes.QUESTIONNAIRE.name(), details); - - details = new HashMap<>(); - for (MonitorSource source : catalogue.getMonitorSources().values()) { - details.put(source.getType(), - source.getKafkaActor().getTopic().toString(reduced)); - } - map.put(Scope.MONITOR.name(), details); - - for (PassiveSource source : catalogue.getPassiveSources().values()) { - details = new HashMap<>(); - for (Sensor sensor : source.getSensors()) { - details.put(sensor.getName().name(), sensor.getTopic().toString(reduced)); - } - for (Processor proc : source.getProcessors()) { - details.put(proc.getName(), proc.getTopic().toString(reduced)); - } - map.put(source.getType(), details); - } - - return map; + private Map> getTopicsInfoVerbose(boolean prettyPrint) { + return catalogue.getSources().stream() + .collect(Collectors.toMap( + source -> source.getScope() + " - " + source.getName(), + source -> source.getData().stream() + .collect(Collectors.toMap( + DataTopic::getType, d -> d.toString(prettyPrint))))); } public int validateSchemas(Namespace ns) { @@ -335,7 +259,7 @@ public static void main(String... args) { } else if (ns.getBoolean("quiet")) { System.out.println(String.join("\n", app.getTopicsToCreate())); } else { - System.out.println(app.getTopicsVerbose(false, ns.getString("match"))); + System.out.println(app.getTopicsVerbose(true, ns.getString("match"))); } break; case "validate": diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Aggregatable.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Aggregatable.java deleted file mode 100644 index 885280bd..00000000 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Aggregatable.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.radarcns.schema.specification; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.util.Set; - -/** - * TODO - */ -public interface Aggregatable { - - boolean hasAggregator(); - - String getAggregator(); - - String getInputTopic(); - - Set getOutputTopics(); - -} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/AppDataTopic.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/AppDataTopic.java new file mode 100644 index 00000000..decab272 --- /dev/null +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/AppDataTopic.java @@ -0,0 +1,38 @@ +package org.radarcns.schema.specification; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; + +import java.util.Map; + +import static org.radarcns.schema.util.Utils.expandClass; + +public class AppDataTopic extends DataTopic { + @JsonProperty("app_provider") + private String appProvider; + + @JsonSetter + @SuppressWarnings("PMD.UnusedPrivateMethod") + private void setAppProvider(String provider) { + this.appProvider = expandClass(provider); + } + + public String getAppProvider() { + return appProvider; + } + + @Override + protected void propertiesMap(Map map, boolean reduced) { + map.put("app_provider", appProvider); + super.propertiesMap(map, reduced); + } + + public static class DataField { + @JsonProperty + private String name; + + public String getName() { + return name; + } + } +} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/AppSource.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/AppSource.java new file mode 100644 index 00000000..fc76f6fb --- /dev/null +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/AppSource.java @@ -0,0 +1,21 @@ +package org.radarcns.schema.specification; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; + +import static org.radarcns.schema.util.Utils.expandClass; + +public abstract class AppSource extends DataProducer { + @JsonProperty("app_provider") + private String appProvider; + + @JsonSetter + @SuppressWarnings("PMD.UnusedPrivateMethod") + private void setAppProvider(String provider) { + this.appProvider = expandClass(provider); + } + + public String getAppProvider() { + return appProvider; + } +} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/DataProducer.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/DataProducer.java new file mode 100644 index 00000000..36af741e --- /dev/null +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/DataProducer.java @@ -0,0 +1,77 @@ +package org.radarcns.schema.specification; + +import com.fasterxml.jackson.annotation.JsonProperty; +import org.radarcns.schema.Scope; +import org.radarcns.topic.AvroTopic; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Stream; + +import static org.radarcns.schema.util.Utils.applyOrEmpty; + +public abstract class DataProducer { + @JsonProperty @NotBlank + private String name; + + @JsonProperty @NotBlank + private String doc; + + @JsonProperty + private Map properties; + + @JsonProperty + private List labels; + + public String getName() { + return name; + } + + public String getDoc() { + return doc; + } + + @NotNull + public abstract List getData(); + + @NotNull + public abstract Scope getScope(); + + public List getLabels() { + return labels; + } + + public Map getProperties() { + return properties; + } + + public Stream getTopicNames() { + return getData().stream().flatMap(DataTopic::getTopicNames); + } + + public Stream> getTopics() { + return getData().stream().flatMap(applyOrEmpty(DataTopic::getTopics)); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + DataProducer producer = (DataProducer) o; + return Objects.equals(name, producer.name) + && Objects.equals(doc, producer.doc) + && Objects.equals(getData(), producer.getData()); + } + + @Override + public int hashCode() { + return Objects.hash(name, doc, getData()); + } +} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/DataTopic.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/DataTopic.java new file mode 100644 index 00000000..f548e178 --- /dev/null +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/DataTopic.java @@ -0,0 +1,154 @@ +package org.radarcns.schema.specification; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import org.radarcns.catalogue.Unit; +import org.radarcns.config.AvroTopicConfig; +import org.radarcns.kafka.key.KeyMeasurement; +import org.radarcns.topic.AvroTopic; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Stream; + +import static com.fasterxml.jackson.dataformat.yaml.YAMLGenerator.Feature.MINIMIZE_QUOTES; +import static com.fasterxml.jackson.dataformat.yaml.YAMLGenerator.Feature.WRITE_DOC_START_MARKER; + +/** DataTopic topic from a data producer. */ +public class DataTopic extends AvroTopicConfig { + private static final Logger logger = LoggerFactory.getLogger(DataTopic.class); + + @JsonProperty + private String type; + + @JsonProperty + private String doc; + + @JsonProperty("default_sample_interval") + private Double sampleInterval; + + @JsonProperty("default_sample_rate") + private Double sampleRate; + + @JsonProperty + private Unit unit; + + @JsonProperty + private List fields; + + /** + * DataTopic using KeyMeasurement as the default key. + */ + public DataTopic() { + // default value + setKeySchema(KeyMeasurement.class.getName()); + } + + /** Get all topic names that are provided by the data. */ + public Stream getTopicNames() { + return Stream.of(getTopic()); + } + + /** Get all Avro topics that are provided by the data. */ + public Stream> getTopics() throws IOException { + try { + return Stream.of(parseAvroTopic()); + } catch (ClassNotFoundException + | NoSuchMethodException + | InvocationTargetException + | IllegalAccessException ex) { + throw new IOException("Cannot parse schemas Avro Topic " + getTopic() + + ", with key_schema " + getKeySchema() + + " and value_schema " + getValueSchema(), ex); + } + } + + public String getType() { + return type; + } + + public String getDoc() { + return doc; + } + + public Double getSampleInterval() { + return sampleInterval; + } + + public Double getSampleRate() { + return sampleRate; + } + + public Unit getUnit() { + return unit; + } + + public List getFields() { + return fields; + } + + @Override + public String toString() { + return toString(false); + } + + public String toString(boolean prettyString) { + String name = getClass().getSimpleName(); + // preserves insertion order + Map properties = new LinkedHashMap<>(); + propertiesMap(properties, !prettyString); + + if (prettyString) { + Map completeMap = Collections.singletonMap(name, properties); + YAMLFactory factory = new YAMLFactory(); + factory.configure(WRITE_DOC_START_MARKER, false); + factory.configure(MINIMIZE_QUOTES, true); + ObjectMapper mapper = new ObjectMapper(factory); + try { + return mapper.writeValueAsString(completeMap); + } catch (JsonProcessingException ex) { + logger.error("Failed to convert data to YAML", ex); + return name + properties; + } + } else { + return name + properties; + } + } + + protected void propertiesMap(Map map, boolean reduced) { + map.put("type", type); + if (!reduced && doc != null) { + map.put("doc", doc); + } + + String topic = getTopic(); + if (topic != null) { + map.put("topic", topic); + } + map.put("key_schema", getKeySchema()); + map.put("value_schema", getValueSchema()); + + if (!reduced) { + if (sampleInterval != null) { + map.put("default_sample_interval", sampleInterval); + } + if (sampleRate != null) { + map.put("default_sample_rate", sampleRate); + } + if (unit != null) { + map.put("unit", unit); + } + if (fields != null) { + map.put("fields", fields); + } + } + } +} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/KafkaActor.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/KafkaActor.java deleted file mode 100644 index 4a02e3cf..00000000 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/KafkaActor.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.radarcns.schema.specification; - -import org.radarcns.catalogue.ProcessingState; - -import java.util.Objects; - -public class KafkaActor { - - private final String doc; - - private final Double sampleInterval; - - private final String unit; - - private final ProcessingState dataType; - - private final Topic topic; - - public KafkaActor(String doc, Double sampleInterval, Double sampleRate, String unit, - ProcessingState dataType, Topic topic) { - Objects.requireNonNull(dataType); - Objects.requireNonNull(topic); - Objects.requireNonNull(unit); - - this.doc = doc; - if (sampleInterval == null && sampleRate != null) { - this.sampleInterval = 1.0 / sampleRate; - } else { - this.sampleInterval = sampleInterval; - } - this.unit = unit; - this.dataType = dataType; - this.topic = topic; - } - - public String getDoc() { - return doc; - } - - public Double getSampleInterval() { - return sampleInterval; - } - - public String getUnit() { - return unit; - } - - public ProcessingState getProcessingState() { - return dataType; - } - - public Topic getTopic() { - return topic; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - KafkaActor that = (KafkaActor) o; - return Objects.equals(that.sampleInterval, sampleInterval) - && Objects.equals(doc, that.doc) - && Objects.equals(unit, that.unit) - && dataType == that.dataType - && Objects.equals(topic, that.topic); - } - - @Override - public int hashCode() { - return Objects.hash(doc, sampleInterval, unit, dataType, topic); - } -} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Labels.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Labels.java deleted file mode 100644 index af115338..00000000 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Labels.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.radarcns.schema.specification; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * TODO - */ -public final class Labels { - - public static final String AGGREGATOR = "aggregator"; - public static final String APP_PROVIDER = "app_provider"; - public static final String ASSESSMENT_TYPE = "assessment_type"; - public static final String CONTENT = "content"; - public static final String BASE_OUTPUT_TOPIC = "base_output_topic"; - public static final String PROCESSING_STATE = "processing_state"; - public static final String DOC = "doc"; - public static final String KEY = "key"; - public static final String INPUT_KEY = "input_key"; - public static final String INPUT_TOPIC = "input_topic"; - public static final String INPUT_VALUE = "input_value"; - public static final String LEAD = "lead"; - public static final String MODEL = "model"; - public static final String NAME = "name"; - public static final String PROCESSORS = "processors"; - public static final String QUESTIONS = "questions"; - public static final String RESPONSES = "responses"; - public static final String DEFAULT_SAMPLE_RATE = "default_sample_rate"; - public static final String DEFAULT_SAMPLE_INTERVAL = "default_sample_interval"; - public static final String SCORE = "score"; - public static final String SENSORS = "sensors"; - public static final String TEXT = "text"; - public static final String TOPIC = "topic"; - public static final String UNIT = "unit"; - public static final String VALUE = "value"; - public static final String VENDOR = "vendor"; - public static final String WIDGET = "widget"; - - private Labels() { - //Static class - } -} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/MonitorSource.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/MonitorSource.java deleted file mode 100644 index 8b398071..00000000 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/MonitorSource.java +++ /dev/null @@ -1,91 +0,0 @@ -package org.radarcns.schema.specification; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.Objects; -import java.util.Set; -import org.radarcns.catalogue.ProcessingState; - -/** - * TODO. - */ -public class MonitorSource extends Source { - public enum RadarSourceTypes { - EXTERNAL_TIME, RECORD_COUNTS, SERVER_STATUS, UPTIME - } - - private final String type; - private final String appProvider; - private final KafkaActor kafkaActor; - - /** - * TODO. - * - * @param name TODO - * @param appProvider TODO - * @param doc TODO - * @param sampleRate TODO - * @param unit TODO - * @param dataType TODO - * @param topic TODO - * @param key TODO - * @param value TODO - * @param aggregator TODO - */ - @JsonCreator - @SuppressWarnings("PMD.ExcessiveParameterList") - public MonitorSource( - @JsonProperty(Labels.NAME) String name, - @JsonProperty(Labels.APP_PROVIDER) String appProvider, - @JsonProperty(Labels.DOC) String doc, - @JsonProperty(Labels.DEFAULT_SAMPLE_RATE) Double sampleRate, - @JsonProperty(Labels.DEFAULT_SAMPLE_INTERVAL) Double sampleInterval, - @JsonProperty(Labels.UNIT) String unit, - @JsonProperty(Labels.PROCESSING_STATE) ProcessingState dataType, - @JsonProperty(Labels.TOPIC) String topic, - @JsonProperty(Labels.KEY) String key, - @JsonProperty(Labels.VALUE) String value, - @JsonProperty(Labels.AGGREGATOR) String aggregator) { - super(name, doc); - - Objects.requireNonNull(appProvider); - - this.type = name; - this.appProvider = expandClass(appProvider); - this.kafkaActor = new KafkaActor(doc, sampleInterval, sampleRate, unit, dataType, - new Topic(topic, key, value, aggregator, null)); - } - - public String getType() { - return type; - } - - public String getAppProvider() { - return appProvider; - } - - public KafkaActor getKafkaActor() { - return kafkaActor; - } - - @Override - public Set getTopics() { - return kafkaActor.getTopic().getTopicNames(); - } -} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Source.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Source.java deleted file mode 100644 index 8221706f..00000000 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Source.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.radarcns.schema.specification; - -import org.radarcns.schema.util.Utils; - -import java.util.Objects; -import java.util.Set; - -/** - * TODO. - */ -public abstract class Source { - private final String name; - private final String doc; - - /** - * TODO. - * @param name TODO - * @param doc TODO - */ - public Source(String name, String doc) { - Objects.requireNonNull(name); - this.name = name; - this.doc = doc; - } - - public String getName() { - return name; - } - - public String getDoc() { - return doc; - } - - /** - * TODO. - * @return TODO. - */ - public abstract Set getTopics(); - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - Source source = (Source) o; - return Objects.equals(name, source.name) - && Objects.equals(doc, source.doc); - } - - @Override - public int hashCode() { - return Objects.hash(name, doc); - } - - public static String expandClass(String classShorthand) { - if (classShorthand == null || classShorthand.isEmpty()) { - return null; - } else if (classShorthand.charAt(0) == '.') { - return Utils.getProjectGroup() + classShorthand; - } else { - return classShorthand; - } - } -} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java index 023f22bb..0bc4d99c 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java @@ -16,15 +16,20 @@ package org.radarcns.schema.specification; -import org.radarcns.config.YamlConfigLoader; +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectReader; +import com.fasterxml.jackson.databind.PropertyNamingStrategy; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import org.radarcns.schema.Scope; import org.radarcns.schema.specification.active.ActiveSource; -import org.radarcns.schema.specification.active.questionnaire.QuestionnaireSource; +import org.radarcns.schema.specification.stream.StreamGroup; +import org.radarcns.schema.specification.monitor.MonitorSource; import org.radarcns.schema.specification.passive.PassiveSource; +import org.radarcns.topic.AvroTopic; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -36,8 +41,8 @@ import java.util.Map; import java.util.Objects; import java.util.Set; -import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * TODO. @@ -50,51 +55,53 @@ public class SourceCatalogue { public static final Path BASE_PATH = Paths.get("../..").toAbsolutePath().normalize(); - private final Map activeSources; + private final Map> activeSources; private final Map monitorSources; private final Map passiveSources; + private final Map streamGroups; - private final Set sources; + private final Set> sources; @SuppressWarnings("WeakerAccess") - SourceCatalogue(Map activeSources, + SourceCatalogue(Map> activeSources, Map monitorSources, - Map passiveSources) { + Map passiveSources, + Map streamGroups) { this.activeSources = activeSources; this.monitorSources = monitorSources; this.passiveSources = passiveSources; + this.streamGroups = streamGroups; sources = new HashSet<>(); sources.addAll(activeSources.values()); sources.addAll(monitorSources.values()); sources.addAll(passiveSources.values()); + sources.addAll(streamGroups.values()); } public static SourceCatalogue load(Path root) throws IOException { Path specRoot = root.resolve("specifications"); - YamlConfigLoader configLoader = new YamlConfigLoader(); - return new SourceCatalogue( - initActiveSources(configLoader, specRoot), - initSources(configLoader, specRoot, Scope.MONITOR, MonitorSource.class), - initSources(configLoader, specRoot, Scope.PASSIVE, PassiveSource.class) - ); - } + ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); + mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); - private static Map initSources(YamlConfigLoader configLoader, Path root, - Scope scope, Class sourceClass) throws IOException { - return initSources(root, scope, f -> { - try { - return configLoader.load(f.toFile(), sourceClass); - } catch (IOException e) { - logger.error("Failed to load configuration {}", f, e); - return null; - } - }); + // only serialize fields, not getters, etc. + mapper.setVisibility(mapper.getSerializationConfig().getDefaultVisibilityChecker() + .withFieldVisibility(JsonAutoDetect.Visibility.ANY) + .withGetterVisibility(JsonAutoDetect.Visibility.NONE) + .withIsGetterVisibility(JsonAutoDetect.Visibility.NONE) + .withSetterVisibility(JsonAutoDetect.Visibility.NONE) + .withCreatorVisibility(JsonAutoDetect.Visibility.NONE)); + + return new SourceCatalogue( + initSources(mapper.readerFor(ActiveSource.class), specRoot, Scope.ACTIVE), + initSources(mapper.readerFor(MonitorSource.class), specRoot, Scope.MONITOR), + initSources(mapper.readerFor(PassiveSource.class), specRoot, Scope.PASSIVE), + initSources(mapper.readerFor(StreamGroup.class), specRoot, Scope.STREAM)); } - private static Map initSources(Path root, Scope scope, Function map) + private static Map initSources(ObjectReader reader, Path root, Scope scope) throws IOException { Path baseFolder = scope.getPath(root); if (baseFolder == null) { @@ -104,39 +111,27 @@ private static Map initSources(Path root, Scope scope, Function

    new AbstractMap.SimpleImmutableEntry<>( - f.getFileName().toString() - .split("\\.")[0] - .toUpperCase(Locale.ENGLISH), - map.apply(f))) + .map(f -> { + try { + return new AbstractMap.SimpleImmutableEntry<>( + f.getFileName().toString() + .split("\\.")[0] + .toUpperCase(Locale.ENGLISH), + reader.readValue(f.toFile())); + } catch (IOException ex) { + logger.error("Failed to load configuration {}", f, ex); + return null; + } + }) .filter(Objects::nonNull) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); } - private static Map initActiveSources(YamlConfigLoader configLoader, - Path root) throws IOException { - return initSources(root, Scope.ACTIVE, f -> { - try { - File file = f.toFile(); - ActiveSource source = configLoader.load(file, ActiveSource.class); - switch (source.getAssessmentType().toUpperCase(Locale.ENGLISH)) { - case "QUESTIONNAIRE": - return configLoader.load(file, QuestionnaireSource.class); - default: - return source; - } - } catch (IOException e) { - logger.error("Failed to load configuration {}", f, e); - return null; - } - }); - } - /** * TODO. * @return TODO */ - public Map getActiveSources() { + public Map> getActiveSources() { return activeSources; } @@ -187,9 +182,21 @@ public PassiveSource getPassiveSource(String type) { * TODO. * @return TODO */ - public Set getTopics() { + public Stream getTopicNames() { return sources.stream() - .flatMap(source -> source.getTopics().stream()) - .collect(Collectors.toSet()); + .flatMap(DataProducer::getTopicNames); + } + + public Stream> getTopics() { + return sources.stream() + .flatMap(DataProducer::getTopics); + } + + public Map getStreamGroups() { + return streamGroups; + } + + public Set> getSources() { + return sources; } } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Topic.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Topic.java deleted file mode 100644 index 021ff29e..00000000 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/Topic.java +++ /dev/null @@ -1,314 +0,0 @@ -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.radarcns.schema.specification; - -import org.radarcns.catalogue.TimeFrame; -import org.radarcns.schema.util.Utils; - -import java.util.HashSet; -import java.util.Objects; -import java.util.Set; -import java.util.concurrent.TimeUnit; - -import static org.radarcns.schema.specification.Source.expandClass; - -/** - * TODO. - */ -public class Topic implements Aggregatable { - - public static final String FROM_LABEL = "From-"; - public static final String TO_LABEL = "-To-"; - - public static final String OUTPUT_LABEL = "_output"; - - /** Folder names. */ - public enum TimeLabel { - TEN_SECOND(TimeFrame.TEN_SECOND, TimeUnit.SECONDS.toMillis(10), "_10sec"), - THIRTY_SECOND(TimeFrame.THIRTY_SECOND, TimeUnit.SECONDS.toMillis(30), "_30sec"), - ONE_MIN(TimeFrame.ONE_MIN, TimeUnit.MINUTES.toMillis(1), "_1min"), - TEN_MIN(TimeFrame.TEN_MIN, TimeUnit.MINUTES.toMillis(10), "_10min"), - ONE_HOUR(TimeFrame.ONE_HOUR, TimeUnit.HOURS.toMillis(1), "_1hour"), - ONE_DAY(TimeFrame.ONE_DAY, TimeUnit.DAYS.toMillis(1), "_1day"), - ONE_WEEK(TimeFrame.ONE_WEEK, TimeUnit.DAYS.toMillis(7), "_1week"), - NOT_APPLICABLE(null, -1, null); - - private final TimeFrame timeFrame; - private final long intervalInMilliSec; - private final String label; - - TimeLabel(TimeFrame timeFrame, long intervalInMilliSec, String label) { - this.timeFrame = timeFrame; - this.intervalInMilliSec = intervalInMilliSec; - this.label = label; - } - - public TimeFrame getTimeFrame() { - return timeFrame; - } - - public long getIntervalInMilliSec() { - return intervalInMilliSec; - } - - public String getLabel() { - return label; - } - } - - private final String inputTopic; - private final String inputKey; - private final String inputValue; - - private final String aggregator; - - private final String baseOutput; - - private final Set output; - - /** - * TODO. - */ - public class TopicMetadata { - private final TimeFrame timeFrame; - private final long intervalInMilliSec; - private final String input; - private final String stateStore; - private final String output; - - public TopicMetadata(TimeLabel timeLabel, String input, String stateStore, String output) { - this.timeFrame = timeLabel.getTimeFrame(); - this.intervalInMilliSec = timeLabel.getIntervalInMilliSec(); - this.input = input; - this.stateStore = stateStore; - this.output = output; - } - - public TimeFrame getTimeFrame() { - return timeFrame; - } - - public long getIntervalInMilliSec() { - return intervalInMilliSec; - } - - public String getInput() { - return input; - } - - public String getStateStore() { - return stateStore; - } - - public String getOutput() { - return output; - } - } - - /** - * TODO. - * @param inputTopic TODO - * @param inputKey TODO - * @param inputValue TODO - * @param aggregator TODO - * @param baseOutput TODO - */ - public Topic(String inputTopic, String inputKey, String inputValue, String aggregator, - String baseOutput) { - Objects.requireNonNull(inputTopic); - Objects.requireNonNull(inputKey); - Objects.requireNonNull(inputValue); - - this.inputTopic = inputTopic; - this.inputKey = expandClass(inputKey); - this.inputValue = expandClass(inputValue); - this.aggregator = expandClass(aggregator); - - this.baseOutput = baseOutput != null ? baseOutput : inputTopic; - - this.output = new HashSet<>(); - - if (Utils.isTimedAggregator(this.aggregator)) { - for (TimeLabel label : TimeLabel.values()) { - if (label.intervalInMilliSec != -1) { - this.output.add(new TopicMetadata(label, inputTopic, - getStateStoreName(inputTopic, getOutTopic(this.baseOutput, label)), - getOutTopic(this.baseOutput, label))); - } - } - } else if (this.aggregator != null) { - this.output.add(new TopicMetadata(TimeLabel.NOT_APPLICABLE, inputTopic, - getStateStoreName(inputTopic, getOutTopic(this.baseOutput)), - getOutTopic(this.baseOutput))); - } - } - - @Override - public String getInputTopic() { - return inputTopic; - } - - @Override - public Set getOutputTopics() { - return output; - } - - @Override - public boolean hasAggregator() { - return aggregator != null; - } - - @Override - public String getAggregator() { - return aggregator; - } - - /** - * TODO. - * @return TODO - */ - public String getInputKey() { - return inputKey; - } - - /** - * TODO. - * @return TODO - */ - public String getInputValue() { - return inputValue; - } - - /** - * TODO. - * @return TODO - */ - public Set getTopicNames() { - Set names = new HashSet<>(); - names.add(inputTopic); - - if (hasAggregator()) { - for (TopicMetadata metadata : output) { - names.add(metadata.getStateStore()); - names.add(metadata.getOutput()); - } - } - - return names; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - Topic topic = (Topic) o; - return Objects.equals(inputTopic, topic.inputTopic) - && Objects.equals(inputKey, topic.inputKey) - && Objects.equals(inputValue, topic.inputValue) - && Objects.equals(aggregator, topic.aggregator) - && Objects.equals(baseOutput, topic.baseOutput) - && Objects.equals(output, topic.output); - } - - @Override - public int hashCode() { - return Objects.hash(inputTopic, inputKey, inputValue, aggregator, baseOutput, output); - } - - public String toString(boolean reduced) { - StringBuilder result = new StringBuilder() - .append("inputTopic: ").append(inputTopic).append('\n') - .append("inputKey: ").append(inputKey).append('\n') - .append("inputValue: ").append(inputValue).append('\n') - .append("aggregator: ").append(aggregator).append('\n'); - - if (output.isEmpty()) { - result.append("output: empty"); - } else { - result.append("output:"); - } - if (reduced) { - output.forEach(topic -> result.append("\n\t- ").append(topic.getOutput())); - } else { - output.forEach(topic -> result - .append("\n\t- ").append(topic.getInput()) - .append('\t').append(topic.getStateStore()) - .append('\t').append(topic.getOutput())); - } - - return result.append('\n').toString(); - } - - /** - * TODO. - * @param topicName TODO - * @return TODO - */ - public static String getOutTopic(String topicName) { - return topicName + OUTPUT_LABEL; - } - - /** - * TODO. - * @param topicName TODO - * @param timeLabel TODO - * @return TODO - */ - public static String getOutTopic(String topicName, TimeLabel timeLabel) { - return topicName + timeLabel.getLabel(); - } - - /** - * TODO. - * @param topicName TODO - * @return TODO - */ - public static Set getTimedOutTopics(String topicName) { - Set set = new HashSet<>(); - - for (TimeLabel label : TimeLabel.values()) { - if (label.getIntervalInMilliSec() != -1) { - set.add(topicName + label.getLabel()); - } - } - - return set; - } - - /** - * Kafka Streams allows for stateful stream processing. The internal state is managed in - * so-called state stores. A fault-tolerant state store is an internally created and - * compacted changelog topic. This function return the changelog topic name. - * - * @param inputTopic {@link String} stating the inputTopic topic name read by the stateful - * stream - * @param outputTopic {@link String} stating the output topic name written by the stateful - * stream - * - * @return {@code String} representing the changelog topic name - */ - public static String getStateStoreName(String inputTopic, String outputTopic) { - Objects.requireNonNull(inputTopic); - Objects.requireNonNull(outputTopic); - - return FROM_LABEL + inputTopic + TO_LABEL + outputTopic; - } -} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/ActiveSource.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/ActiveSource.java index ad0f286e..cdfd280d 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/ActiveSource.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/ActiveSource.java @@ -16,78 +16,47 @@ * limitations under the License. */ -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import org.radarcns.schema.specification.Source; -import org.radarcns.schema.specification.Topic; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import org.radarcns.schema.Scope; +import org.radarcns.schema.specification.DataTopic; +import org.radarcns.schema.specification.DataProducer; +import org.radarcns.schema.specification.active.questionnaire.QuestionnaireSource; -import java.util.Objects; -import java.util.Set; - -import static org.radarcns.schema.specification.Labels.ASSESSMENT_TYPE; -import static org.radarcns.schema.specification.Labels.DOC; -import static org.radarcns.schema.specification.Labels.KEY; -import static org.radarcns.schema.specification.Labels.NAME; -import static org.radarcns.schema.specification.Labels.TOPIC; -import static org.radarcns.schema.specification.Labels.VALUE; +import javax.validation.constraints.NotBlank; +import java.util.List; /** * TODO. */ -@JsonIgnoreProperties(ignoreUnknown = true) -public class ActiveSource extends Source { - +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, + include = JsonTypeInfo.As.PROPERTY, + property = "assessment_type") +@JsonSubTypes(value = @JsonSubTypes.Type( + name = "QUESTIONNAIRE", value = QuestionnaireSource.class)) +public class ActiveSource extends DataProducer { public enum RadarSourceTypes { QUESTIONNAIRE } - private final String assessmentType; - - private final Topic topic; - - private final Set topics; - - /** - * TODO. - * @param name TODO - * @param topic TODO - * @param key TODO - * @param value TODO - * @param description TODO - */ - @JsonCreator - public ActiveSource( - @JsonProperty(ASSESSMENT_TYPE) String assessmentType, - @JsonProperty(NAME) String name, - @JsonProperty(TOPIC) String topic, - @JsonProperty(KEY) String key, - @JsonProperty(VALUE) String value, - @JsonProperty(DOC) String description) { - super(name, description); + @JsonProperty("assessment_type") @NotBlank + private String assessmentType; - Objects.requireNonNull(assessmentType); - Objects.requireNonNull(key); - Objects.requireNonNull(topic); - Objects.requireNonNull(value); - - this.assessmentType = assessmentType; - - this.topic = new Topic(topic, key, value, null, null); - - this.topics = this.topic.getTopicNames(); - } + @JsonProperty + private List data; public String getAssessmentType() { return assessmentType; } - public Topic getTopic() { - return topic; + @Override + public List getData() { + return data; } @Override - public Set getTopics() { - return topics; + public Scope getScope() { + return Scope.ACTIVE; } } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/Question.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/Question.java index dafe935b..b3eb3add 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/Question.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/Question.java @@ -16,50 +16,28 @@ package org.radarcns.schema.specification.active.questionnaire; -import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.List; -import java.util.Objects; import org.radarcns.catalogue.RadarWidget; -import org.radarcns.schema.specification.Labels; + +import javax.validation.constraints.NotBlank; +import java.util.List; /** * TODO. */ public class Question { - private final String lead; - - private final String content; + @JsonProperty @NotBlank + private String lead; - private final RadarWidget widget; + @JsonProperty @NotBlank + private String content; - private final List responses; + @JsonProperty + private RadarWidget widget; - /** - * TODO. - * @param lead TODO - * @param content TODO - * @param widget TODO - * @param responses TODO - */ - @JsonCreator - public Question( - @JsonProperty(Labels.LEAD) String lead, - @JsonProperty(Labels.CONTENT) String content, - @JsonProperty(Labels.WIDGET) RadarWidget widget, - @JsonProperty(Labels.RESPONSES) List responses) { - - Objects.requireNonNull(lead); - Objects.requireNonNull(content); - Objects.requireNonNull(widget); - Objects.requireNonNull(responses); - - this.lead = lead; - this.content = content; - this.widget = widget; - this.responses = responses; - } + @JsonProperty + private List responses; public String getLead() { return lead; diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/QuestionnaireDataTopic.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/QuestionnaireDataTopic.java new file mode 100644 index 00000000..951cb624 --- /dev/null +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/QuestionnaireDataTopic.java @@ -0,0 +1,49 @@ +package org.radarcns.schema.specification.active.questionnaire; + +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import com.fasterxml.jackson.annotation.JsonProperty; +import org.radarcns.schema.specification.DataTopic; + +import javax.validation.constraints.NotEmpty; +import java.util.List; +import java.util.Map; + +/** + * TODO. + */ +public class QuestionnaireDataTopic extends DataTopic { + public enum RadarSourceTypes { + PHQ8 + } + + @JsonProperty + @NotEmpty + private List questions; + + public List getQuestions() { + return questions; + } + + @Override + protected void propertiesMap(Map properties, boolean reduced) { + super.propertiesMap(properties, reduced); + if (!reduced) { + properties.put("questions", questions); + } + } +} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/QuestionnaireSource.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/QuestionnaireSource.java index a3993df5..3f4124bc 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/QuestionnaireSource.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/QuestionnaireSource.java @@ -1,81 +1,6 @@ package org.radarcns.schema.specification.active.questionnaire; -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; import org.radarcns.schema.specification.active.ActiveSource; -import java.util.List; -import java.util.Objects; - -import static org.radarcns.schema.specification.Labels.ASSESSMENT_TYPE; -import static org.radarcns.schema.specification.Labels.DOC; -import static org.radarcns.schema.specification.Labels.KEY; -import static org.radarcns.schema.specification.Labels.NAME; -import static org.radarcns.schema.specification.Labels.QUESTIONS; -import static org.radarcns.schema.specification.Labels.TOPIC; -import static org.radarcns.schema.specification.Labels.VALUE; - -/** - * TODO. - */ -public class QuestionnaireSource extends ActiveSource { - public enum RadarSourceTypes { - PHQ8 - } - - @JsonIgnore - private final String type; - - private final List questions; - - /** - * TODO. - * @param topic TODO - * @param key TODO - * @param value TODO - * @param doc TODO - * @param name TODO - * @param assessmentType TODO - * @param questions TODO - */ - @JsonCreator - public QuestionnaireSource( - @JsonProperty(ASSESSMENT_TYPE) String assessmentType, - @JsonProperty(NAME) String name, - @JsonProperty(DOC) String doc, - @JsonProperty(TOPIC) String topic, - @JsonProperty(KEY) String key, - @JsonProperty(VALUE) String value, - @JsonProperty(QUESTIONS) List questions) { - super(assessmentType, name, topic, key, value, doc); - this.type = name; - - Objects.requireNonNull(questions); - this.questions = questions; - } - - public String getQuestionnaireType() { - return type; - } - - public List getQuestions() { - return questions; - } +public class QuestionnaireSource extends ActiveSource { } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/Response.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/Response.java index 25e852ff..bbe234d6 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/Response.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/Response.java @@ -16,43 +16,25 @@ * limitations under the License. */ -import static org.radarcns.schema.specification.Labels.SCORE; -import static org.radarcns.schema.specification.Labels.TEXT; - -import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.Objects; + +import javax.validation.constraints.NotBlank; /** * TODO. */ public class Response { + @JsonProperty @NotBlank + private String text; - private final String text; - private final Integer score; - - /** - * TODO. - * @param text TODO - * @param score TODO - */ - @JsonCreator - public Response( - @JsonProperty(TEXT) String text, - @JsonProperty(SCORE) Integer score) { - - Objects.requireNonNull(score); - Objects.requireNonNull(text); - - this.score = score; - this.text = text; - } + @JsonProperty + private Object value; public String getText() { return text; } - public Integer getScore() { - return score; + public Object getValue() { + return value; } } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/monitor/MonitorDataTopic.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/monitor/MonitorDataTopic.java new file mode 100644 index 00000000..6f054230 --- /dev/null +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/monitor/MonitorDataTopic.java @@ -0,0 +1,9 @@ +package org.radarcns.schema.specification.monitor; + +import org.radarcns.schema.specification.AppDataTopic; + +public class MonitorDataTopic extends AppDataTopic { + public enum RadarSourceTypes { + EXTERNAL_TIME, RECORD_COUNTS, SERVER_STATUS, UPTIME + } +} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/monitor/MonitorSource.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/monitor/MonitorSource.java new file mode 100644 index 00000000..0dfa4ec2 --- /dev/null +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/monitor/MonitorSource.java @@ -0,0 +1,22 @@ +package org.radarcns.schema.specification.monitor; + +import com.fasterxml.jackson.annotation.JsonProperty; +import org.radarcns.schema.Scope; +import org.radarcns.schema.specification.AppSource; + +import java.util.List; + +public class MonitorSource extends AppSource { + @JsonProperty + private List data; + + @Override + public List getData() { + return data; + } + + @Override + public Scope getScope() { + return Scope.MONITOR; + } +} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveDataTopic.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveDataTopic.java new file mode 100644 index 00000000..ca2057df --- /dev/null +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveDataTopic.java @@ -0,0 +1,52 @@ +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.radarcns.schema.specification.passive; + +import com.fasterxml.jackson.annotation.JsonProperty; +import org.radarcns.catalogue.ProcessingState; +import org.radarcns.schema.specification.AppDataTopic; + +import java.util.Objects; + +/** + * TODO. + */ +public class PassiveDataTopic extends AppDataTopic { + @JsonProperty("processing_state") + private ProcessingState processingState; + + public ProcessingState getProcessingState() { + return processingState; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass() || !super.equals(o)) { + return false; + } + PassiveDataTopic passiveData = (PassiveDataTopic) o; + return Objects.equals(processingState, passiveData.processingState); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), processingState); + } +} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveSource.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveSource.java index 28fc4219..d1119740 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveSource.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveSource.java @@ -1,5 +1,3 @@ -package org.radarcns.schema.specification.passive; - /* * Copyright 2017 King's College London and The Hyve * @@ -16,78 +14,46 @@ * limitations under the License. */ -import com.fasterxml.jackson.annotation.JsonCreator; +package org.radarcns.schema.specification.passive; + import com.fasterxml.jackson.annotation.JsonProperty; -import org.radarcns.catalogue.SensorName; -import org.radarcns.schema.specification.Source; -import org.radarcns.schema.specification.Labels; +import org.radarcns.schema.Scope; +import org.radarcns.schema.specification.AppSource; -import java.util.HashSet; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; /** * TODO. */ -public class PassiveSource extends Source { +public class PassiveSource extends AppSource { public enum RadarSourceTypes { EMPATICA_E4, PEBBLE_2, ANDROID_PHONE, BIOVOTION_VSM1 } - private final String type; - - private final String vendor; + @JsonProperty @NotBlank + private String vendor; - private final String model; + @JsonProperty @NotBlank + private String model; - private final String appProvider; + @JsonProperty @NotEmpty + private List data; - private final Set sensors; - - private final Set processors; - - private final Set topics; - - /** - * TODO. - * @param vendor TODO - * @param model TODO - * @param appProvider TODO - * @param sensors TODO - * @param processors TODO - */ - @JsonCreator - @SuppressWarnings("PMD.ExcessiveParameterList") - public PassiveSource( - @JsonProperty(Labels.VENDOR) String vendor, - @JsonProperty(Labels.MODEL) String model, - @JsonProperty(Labels.DOC) String description, - @JsonProperty(Labels.APP_PROVIDER) String appProvider, - @JsonProperty(Labels.SENSORS) Set sensors, - @JsonProperty(Labels.PROCESSORS) Set processors) { - super(vendor + '_' + model, description); - - Objects.requireNonNull(sensors); - this.type = vendor + '_' + model; - this.vendor = vendor; - this.model = model; - this.appProvider = expandClass(appProvider); - this.sensors = sensors; - this.processors = processors == null ? new HashSet<>() : processors; - - topics = new HashSet<>(); + @Override + public List getData() { + return data; + } - topics.addAll(this.sensors.stream() - .flatMap(sensor -> sensor.getTopic().getTopicNames().stream()) - .collect(Collectors.toList())); - topics.addAll(this.processors.stream() - .flatMap(proc -> proc.getTopic().getTopicNames().stream()) - .collect(Collectors.toList())); + @Override + public Scope getScope() { + return Scope.PASSIVE; } - public String getType() { - return type; + public String getName() { + return vendor + '_' + model; } public String getVendor() { @@ -98,50 +64,14 @@ public String getModel() { return model; } - public String getAppProvider() { - return appProvider; - } - - public Set getSensors() { - return sensors; - } - - /** - * TODO. - * @param name TODO - * @return TODO - */ - public Sensor getSensor(SensorName name) { - for (Sensor sensor : sensors) { - if (sensor.getName().name().equals(name.name())) { - return sensor; - } - } - - throw new IllegalArgumentException(name.name() + " is not a valid sensor for " + getName()); - } - - public Set getProcessors() { - return processors; - } - /** * TODO. - * @param name TODO + * @param type TODO * @return TODO */ - public Processor getProcessor(SensorName name) { - for (Processor processor : processors) { - if (processor.getName().equals(name.name())) { - return processor; - } - } - - throw new IllegalArgumentException(name.name() + " is not a valid sensor for " + getName()); - } - - @Override - public Set getTopics() { - return topics; + public PassiveDataTopic getSensor(@NotNull String type) { + return data.stream().filter(s -> type.equalsIgnoreCase(s.getType())).findFirst() + .orElseThrow(() -> new IllegalArgumentException( + type + " is not a valid sensor for " + this.getName())); } } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/Processor.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/Processor.java deleted file mode 100644 index 422d3ff9..00000000 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/Processor.java +++ /dev/null @@ -1,74 +0,0 @@ -package org.radarcns.schema.specification.passive; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; -import org.radarcns.catalogue.ProcessingState; -import org.radarcns.schema.specification.KafkaActor; -import org.radarcns.schema.specification.Topic; -import org.radarcns.schema.specification.Labels; - -import java.util.Objects; - -/** - * TODO. - */ -public class Processor extends KafkaActor { - - private final String name; - - /** - * TODO. - * @param name TODO - * @param doc TODO - * @param sampleRate TODO - * @param unit TODO - * @param dataType TODO - * @param inputTopic TODO - * @param inputKey TODO - * @param inputValue TODO - * @param baseOutputTopic TODO - * @param aggregator TODO - */ - @JsonCreator - @SuppressWarnings("PMD.ExcessiveParameterList") - public Processor( - @JsonProperty(Labels.NAME) String name, - @JsonProperty(Labels.DOC) String doc, - @JsonProperty(Labels.DEFAULT_SAMPLE_INTERVAL) double sampleInterval, - @JsonProperty(Labels.DEFAULT_SAMPLE_RATE) double sampleRate, - @JsonProperty(Labels.UNIT) String unit, - @JsonProperty(Labels.PROCESSING_STATE) ProcessingState dataType, - @JsonProperty(Labels.INPUT_TOPIC) String inputTopic, - @JsonProperty(Labels.INPUT_KEY) String inputKey, - @JsonProperty(Labels.INPUT_VALUE) String inputValue, - @JsonProperty(Labels.BASE_OUTPUT_TOPIC) String baseOutputTopic, - @JsonProperty(Labels.AGGREGATOR) String aggregator) { - super(doc, sampleInterval, sampleRate, unit, dataType, - new Topic(inputTopic, inputKey, inputValue, aggregator, baseOutputTopic)); - - Objects.requireNonNull(baseOutputTopic); - Objects.requireNonNull(name); - - this.name = name; - } - - public String getName() { - return name; - } -} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/Sensor.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/Sensor.java deleted file mode 100644 index 91866007..00000000 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/Sensor.java +++ /dev/null @@ -1,100 +0,0 @@ -package org.radarcns.schema.specification.passive; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; -import org.radarcns.catalogue.ProcessingState; -import org.radarcns.catalogue.SensorName; -import org.radarcns.schema.specification.KafkaActor; -import org.radarcns.schema.specification.Topic; -import org.radarcns.schema.specification.Labels; - -import java.util.Objects; - -import static org.radarcns.schema.specification.Source.expandClass; - -/** - * TODO. - */ -public class Sensor extends KafkaActor { - - private final SensorName name; - private final String appProvider; - - /** - * TODO. - * @param name TODO - * @param appProvider TODO - * @param doc TODO - * @param sampleRate TODO - * @param unit TODO - * @param dataType TODO - * @param topic TODO - * @param key TODO - * @param value TODO - * @param aggregator TODO - */ - @JsonCreator - @SuppressWarnings("PMD.ExcessiveParameterList") - public Sensor( - @JsonProperty(Labels.NAME) SensorName name, - @JsonProperty(Labels.APP_PROVIDER) String appProvider, - @JsonProperty(Labels.DOC) String doc, - @JsonProperty(Labels.DEFAULT_SAMPLE_INTERVAL) double sampleInterval, - @JsonProperty(Labels.DEFAULT_SAMPLE_RATE) double sampleRate, - @JsonProperty(Labels.UNIT) String unit, - @JsonProperty(Labels.PROCESSING_STATE) ProcessingState dataType, - @JsonProperty(Labels.TOPIC) String topic, - @JsonProperty(Labels.KEY) String key, - @JsonProperty(Labels.VALUE) String value, - @JsonProperty(Labels.AGGREGATOR) String aggregator) { - super(doc, sampleInterval, sampleRate, unit, dataType, - new Topic(topic, key, value, aggregator, null)); - - Objects.requireNonNull(name); - - this.name = name; - this.appProvider = expandClass(appProvider); - } - - public String getAppProvider() { - return appProvider; - } - - public SensorName getName() { - return name; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass() || !super.equals(o)) { - return false; - } - Sensor sensor = (Sensor) o; - return name == sensor.name - && Objects.equals(appProvider, sensor.appProvider); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), name, appProvider); - } -} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/stream/StreamDataTopic.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/stream/StreamDataTopic.java new file mode 100644 index 00000000..9d964cdf --- /dev/null +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/stream/StreamDataTopic.java @@ -0,0 +1,126 @@ +package org.radarcns.schema.specification.stream; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import org.radarcns.catalogue.TimeFrame; +import org.radarcns.catalogue.Unit; +import org.radarcns.kafka.key.KeyMeasurement; +import org.radarcns.kafka.key.KeyWindowed; +import org.radarcns.schema.specification.DataTopic; +import org.radarcns.topic.AvroTopic; + +import javax.validation.constraints.NotBlank; +import java.io.IOException; +import java.util.Arrays; +import java.util.concurrent.TimeUnit; +import java.util.stream.Stream; + +import static org.radarcns.schema.util.Utils.applyOrEmpty; + +public class StreamDataTopic extends DataTopic { + + public enum TimeLabel { + TEN_SECOND(TimeFrame.TEN_SECOND, TimeUnit.SECONDS.toMillis(10), "_10sec"), + ONE_MIN(TimeFrame.ONE_MIN, TimeUnit.MINUTES.toMillis(1), "_1min"), + TEN_MIN(TimeFrame.TEN_MIN, TimeUnit.MINUTES.toMillis(10), "_10min"), + ONE_HOUR(TimeFrame.ONE_HOUR, TimeUnit.HOURS.toMillis(1), "_1hour"), + ONE_DAY(TimeFrame.ONE_DAY, TimeUnit.DAYS.toMillis(1), "_1day"), + ONE_WEEK(TimeFrame.ONE_WEEK, TimeUnit.DAYS.toMillis(7), "_1week"); + + private final TimeFrame timeFrame; + private final long intervalInMilliSec; + private final String label; + + TimeLabel(TimeFrame timeFrame, long intervalInMilliSec, String label) { + this.timeFrame = timeFrame; + this.intervalInMilliSec = intervalInMilliSec; + this.label = label; + } + + public TimeFrame getTimeFrame() { + return timeFrame; + } + + public long getIntervalInMilliSec() { + return intervalInMilliSec; + } + + public String getTimedTopic(String topic) { + return topic + label; + } + } + + @JsonProperty + private boolean windowed = false; + + @JsonProperty + private Unit unit; + + @JsonProperty("input_topic") + @NotBlank + private String inputTopic; + + @JsonSetter + @SuppressWarnings("PMD.UnusedPrivateMethod") + private void setWindowed(boolean windowed) { + this.windowed = windowed; + if (windowed && (this.getKeySchema() == null + || this.getKeySchema().equals(KeyMeasurement.class.getName()))) { + this.setKeySchema(KeyWindowed.class.getName()); + } + } + + @JsonSetter + @SuppressWarnings("PMD.UnusedPrivateMethod") + private void setInputTopic(String inputTopic) { + if (getTopic() == null) { + setTopic(inputTopic + "_output"); + } + this.inputTopic = inputTopic; + } + + public boolean isWindowed() { + return windowed; + } + + public String getInputTopic() { + return inputTopic; + } + + public Unit getUnit() { + return unit; + } + + public Stream getTopicNames() { + if (windowed) { + return Arrays.stream(TimeLabel.values()) + .map(label -> label.getTimedTopic(inputTopic)) + .flatMap(topic -> Stream.of(topic, "From-" + inputTopic + "-To-" + topic)); + } else { + return Stream.of(getTopic(), "From-" + inputTopic + "-To-" + getTopic()); + } + } + + public Stream> getTopics() throws IOException { + if (windowed) { + return Arrays.stream(TimeLabel.values()) + .map(label -> label.getTimedTopic(inputTopic)) + .flatMap(applyOrEmpty(topic -> { + setTopic(topic); + return super.getTopics(); + })); + } else { + return super.getTopics(); + } + } + + public Stream getTimedTopicNames() { + if (windowed) { + return Arrays.stream(TimeLabel.values()) + .map(label -> label.getTimedTopic(inputTopic)) + .flatMap(topic -> Stream.of(topic, "From-" + inputTopic + "-To-" + topic)); + } else { + return Stream.empty(); + } + } +} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/stream/StreamGroup.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/stream/StreamGroup.java new file mode 100644 index 00000000..e238b951 --- /dev/null +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/stream/StreamGroup.java @@ -0,0 +1,35 @@ +package org.radarcns.schema.specification.stream; + +import com.fasterxml.jackson.annotation.JsonProperty; +import org.radarcns.schema.Scope; +import org.radarcns.schema.specification.DataProducer; + +import javax.validation.constraints.NotEmpty; +import java.util.List; +import java.util.stream.Stream; + +public class StreamGroup extends DataProducer { + @JsonProperty @NotEmpty + private List data; + + @JsonProperty + private String master; + + @Override + public List getData() { + return data; + } + + @Override + public Scope getScope() { + return Scope.STREAM; + } + + public Stream getTimedTopicNames() { + return data.stream().flatMap(StreamDataTopic::getTimedTopicNames); + } + + public String getMaster() { + return master; + } +} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/Utils.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/Utils.java index 13212a3b..316acd67 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/Utils.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/Utils.java @@ -27,6 +27,9 @@ import java.util.Locale; import java.util.Properties; import java.util.Set; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Stream; /** * TODO. @@ -78,6 +81,16 @@ public static synchronized String getProjectGroup() { return projectGroup; } + public static String expandClass(String classShorthand) { + if (classShorthand == null || classShorthand.isEmpty()) { + return null; + } else if (classShorthand.charAt(0) == '.') { + return getProjectGroup() + classShorthand; + } else { + return classShorthand; + } + } + /** * TODO. * @param aggregator TODO @@ -114,4 +127,37 @@ public static String toSnakeCase(String value) { return builder.toString(); } + public static Function> applyOrEmpty(ThrowingFunction> func) { + return t -> { + try { + return func.apply(t); + } catch (Exception ex) { + logger.error("Failed to apply function, returning empty.", ex); + return Stream.empty(); + } + }; + } + + public static Predicate testOrFalse(ThrowingPredicate test) { + return t -> { + try { + return test.test(t); + } catch (Exception ex) { + logger.error("Failed to test predicate, returning false.", ex); + return false; + } + }; + } + + @FunctionalInterface + @SuppressWarnings("PMD.SignatureDeclareThrowsException") + public interface ThrowingFunction { + R apply(T value) throws Exception; + } + + @FunctionalInterface + @SuppressWarnings("PMD.SignatureDeclareThrowsException") + public interface ThrowingPredicate { + boolean test(T value) throws Exception; + } } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaValidator.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaValidator.java index 4eecda80..da126f97 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaValidator.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaValidator.java @@ -28,13 +28,13 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Arrays; import java.util.Map; -import java.util.SortedSet; -import java.util.TreeSet; import java.util.stream.Collectors; import java.util.stream.Stream; import static org.radarcns.schema.SchemaRepository.COMMONS_PATH; +import static org.radarcns.schema.validation.rules.Validator.raise; public class SchemaValidator { public static final String AVRO_EXTENSION = "avsc"; @@ -62,9 +62,8 @@ public Stream analyseFiles(Scope scope) { .filter(p -> !config.skipFile(p)) .flatMap(p -> { if (!isAvscFile(p)) { - return Stream.of(new ValidationException( - p.toAbsolutePath() + " is invalid. " + scope.getLower() - + " should contain only " + AVRO_EXTENSION + " files.")); + return raise(p.toAbsolutePath() + " is invalid. " + scope.getLower() + + " should contain only " + AVRO_EXTENSION + " files."); } try { @@ -72,12 +71,11 @@ public Stream analyseFiles(Scope scope) { return validate(schema, p, scope); } catch (IOException e) { - return Stream.of(new ValidationException( - "Cannot parse file " + p.toAbsolutePath(), e)); + return raise("Cannot parse file " + p.toAbsolutePath(), e); } }); } catch (IOException ex) { - return Stream.of(new ValidationException("Failed to read files: " + ex, ex)); + return raise("Failed to read files: " + ex, ex); } } @@ -88,7 +86,7 @@ public Stream analyseFiles(Scope scope) { */ public Stream analyseFiles() throws IOException { - return Stream.of(Scope.values()) + return Arrays.stream(Scope.values()) .flatMap(this::analyseFiles); } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/ActiveSourceRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/ActiveSourceRoles.java index f11c9eee..758d4f18 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/ActiveSourceRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/ActiveSourceRoles.java @@ -17,7 +17,7 @@ package org.radarcns.schema.validation.rules; import org.radarcns.schema.specification.active.ActiveSource; -import org.radarcns.schema.specification.active.questionnaire.QuestionnaireSource; +import org.radarcns.schema.specification.active.questionnaire.QuestionnaireDataTopic; import static org.radarcns.schema.validation.rules.Validator.validateNonNull; @@ -39,8 +39,8 @@ private ActiveSourceRoles() { * TODO. * @return TODO */ - static Validator validateAssessmentType() { - return validateNonNull(QuestionnaireSource::getQuestionnaireType, type -> type.equals( + static Validator validateAssessmentType() { + return validateNonNull(QuestionnaireDataTopic::getType, type -> type.equals( ActiveSource.RadarSourceTypes.QUESTIONNAIRE.name()), ASSESSMENT_TYPE); } @@ -49,6 +49,6 @@ static Validator validateAssessmentType() { * @return TODO */ static Validator validateTopics() { - return validateNonNull(ActiveSource::getTopics, topics -> topics.size() == 1, TOPICS); + return validateNonNull(ActiveSource::getTopicNames, topics -> topics.count() == 1, TOPICS); } } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/AggregatableRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/AggregatableRoles.java deleted file mode 100644 index 34575b4d..00000000 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/AggregatableRoles.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.radarcns.schema.validation.rules; - -import org.radarcns.schema.util.Utils; -import org.radarcns.schema.specification.Aggregatable; -import org.radarcns.schema.validation.ValidationSupport; - -import static org.radarcns.schema.validation.ValidationSupport.isValidClass; -import static org.radarcns.schema.validation.rules.Validator.validateNonNull; -import static org.radarcns.schema.validation.rules.Validator.validateOrNull; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * TODO. - */ -public final class AggregatableRoles { - private static final String AGGREGATOR_PACKAGE = Utils.getProjectGroup() - + ValidationSupport.Package.AGGREGATOR.getName(); - - private static final String AGGREGATOR = "Kafka aggregator class is invalid," - + " it should must be a valid AVRO " - + "schema located at " + ValidationSupport.Package.AGGREGATOR.getName() + "."; - - private AggregatableRoles() { - // utility class - } - - /** - * TODO. - * @param nullable TODO - * @return TODO - */ - static Validator validateAggregator(boolean nullable) { - if (nullable) { - return validateOrNull(Aggregatable::getAggregator, - aggregator -> aggregator.startsWith(AGGREGATOR_PACKAGE) - && isValidClass(aggregator), AGGREGATOR); - } else { - return validateNonNull(Aggregatable::getAggregator, - aggregator -> aggregator.startsWith(AGGREGATOR_PACKAGE) - && isValidClass(aggregator), AGGREGATOR); - } - } -} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/MonitorRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/MonitorRoles.java index fc4d1f98..5c58da46 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/MonitorRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/MonitorRoles.java @@ -1,16 +1,3 @@ -package org.radarcns.schema.validation.rules; - -import org.radarcns.schema.specification.MonitorSource; -import org.radarcns.schema.util.Utils; - -import java.nio.file.Path; -import java.util.Collections; -import java.util.Set; - -import static org.radarcns.schema.specification.SourceCatalogue.YAML_EXTENSION; -import static org.radarcns.schema.validation.ValidationSupport.equalsFileName; -import static org.radarcns.schema.validation.rules.Validator.validateNonNull; - /* * Copyright 2017 King's College London and The Hyve * @@ -27,6 +14,19 @@ * limitations under the License. */ +package org.radarcns.schema.validation.rules; + +import org.radarcns.schema.specification.monitor.MonitorSource; +import org.radarcns.schema.util.Utils; + +import java.nio.file.Path; +import java.util.Collections; +import java.util.Set; + +import static org.radarcns.schema.specification.SourceCatalogue.YAML_EXTENSION; +import static org.radarcns.schema.validation.ValidationSupport.equalsFileName; +import static org.radarcns.schema.validation.rules.Validator.validateNonNull; + /** * TODO. */ @@ -56,7 +56,7 @@ static Validator validateAppProvider() { * @return TODO */ static Validator validateSourceType(Path file) { - return validateNonNull(MonitorSource::getType, equalsFileName(file, YAML_EXTENSION), + return validateNonNull(MonitorSource::getName, equalsFileName(file, YAML_EXTENSION), SOURCE_TYPE); } } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/PassiveSourceRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/PassiveSourceRoles.java index d83ca2dd..b1a4bff2 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/PassiveSourceRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/PassiveSourceRoles.java @@ -28,7 +28,7 @@ import static org.radarcns.schema.validation.ValidationSupport.equalsFileName; import static org.radarcns.schema.validation.rules.Validator.validate; -import static org.radarcns.schema.validation.rules.Validator.validateNonNull; +import static org.radarcns.schema.validation.rules.Validator.validateNonEmpty; import static org.radarcns.schema.validation.rules.Validator.validateOrNull; /** @@ -48,10 +48,6 @@ public final class PassiveSourceRoles { /** Messages. */ private static final String APP_PROVIDER = "App provider must be equal to one of the following " + RADAR_PROVIDERS + "."; - private static final String SENSORS = "Sensor list cannot be null or empty and cannot contain" - + " two sensors with the same name"; - private static final String TYPE = "Passive Source Type should be the concatenation of vendor" - + " and name values in uppercase separated by underscore."; private static final String VENDOR_AND_NAME = "Vendor and name values cannot be null." + " The concatenation of vendor with \"_\" and name should be equal to the source file" + " name in lowercase."; @@ -85,15 +81,7 @@ && equalsFileName(passive.getVendor() + '_' + passive.getModel(), * @return TODO */ static Validator validateSensors() { - return validateNonNull(PassiveSource::getSensors, sensors -> !sensors.isEmpty() - && new HashSet<>(sensors).size() == sensors.size(), SENSORS); - } - - /** - * TODO. - * @return TODO - */ - static Validator validateSourceType() { - return validateNonNull(PassiveSource::getType, TYPE); + return validateNonEmpty(PassiveSource::getData, "PassiveDataTopic list cannot be null or" + + " empty and cannot contain two sensors with the same name"); } } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/ProcessorRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/ProcessorRoles.java deleted file mode 100644 index de8744a2..00000000 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/ProcessorRoles.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.radarcns.schema.validation.rules; - -import org.radarcns.catalogue.ProcessingState; -import org.radarcns.catalogue.SensorName; -import org.radarcns.schema.specification.passive.Processor; - -import static org.radarcns.schema.validation.rules.Validator.validateNonNull; - -/** - * TODO. - */ -public final class ProcessorRoles { - - private static final String DATA_TYPE = "Processor data type should be equal to " - + ProcessingState.RADAR.name() + "."; - private static final String NAME = "Processor name should be not null and different from " - + SensorName.UNKNOWN.name() + "."; - - private ProcessorRoles() { - // utility class - } - - /** - * TODO. - * @return TODO - */ - static Validator validateDataType() { - return validateNonNull(Processor::getProcessingState, ProcessingState.RADAR::equals, - DATA_TYPE); - } - - /** - * TODO. - * @return TODO - */ - static Validator validateName() { - return validateNonNull(Processor::getName, - name -> !name.equalsIgnoreCase(SensorName.UNKNOWN.name()), NAME); - } -} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/QuestionnaireRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/QuestionnaireRoles.java index 696d5d79..d36ee6c7 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/QuestionnaireRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/QuestionnaireRoles.java @@ -16,7 +16,7 @@ package org.radarcns.schema.validation.rules; -import org.radarcns.schema.specification.active.questionnaire.QuestionnaireSource; +import org.radarcns.schema.specification.active.questionnaire.QuestionnaireDataTopic; import java.nio.file.Path; @@ -42,8 +42,8 @@ private QuestionnaireRoles() { * TODO. * @return TODO */ - static Validator validateQuestionnaireType(Path file) { - return validateNonNull(QuestionnaireSource::getQuestionnaireType, + static Validator validateQuestionnaireType(Path file) { + return validateNonNull(QuestionnaireDataTopic::getType, equalsFileName(file, YAML_EXTENSION), QUESTIONNAIRE_TYPE); } @@ -52,7 +52,7 @@ static Validator validateQuestionnaireType(Path file) { * TODO. * @return TODO */ - static Validator validateQuestions() { - return validateNonEmpty(QuestionnaireSource::getQuestions, QUESTIONS); + static Validator validateQuestions() { + return validateNonEmpty(QuestionnaireDataTopic::getQuestions, QUESTIONS); } } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaFieldRules.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaFieldRules.java index 42b288a3..c39f9f29 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaFieldRules.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaFieldRules.java @@ -2,7 +2,6 @@ import org.apache.avro.JsonProperties; import org.apache.avro.Schema; -import org.apache.avro.SchemaBuilder; import org.radarcns.schema.validation.ValidationException; import java.util.Arrays; @@ -101,7 +100,7 @@ private Stream validateDefaultUnion(SchemaField field) { private Stream validateDefaultOther(SchemaField field) { return check(field.getField().defaultVal() == null, messageField( "Default of type " + field.getField().schema().getType() + " is set to " - + field.getField().defaultVal() + ". The only acceptable default values are the" - + " \"UNKNOWN\" enum symbol and null.").apply(field)); + + field.getField().defaultVal() + ". The only acceptable default values are the" + + " \"UNKNOWN\" enum symbol and null.").apply(field)); } } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaMetadataRules.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaMetadataRules.java index 16535474..a5e09837 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaMetadataRules.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaMetadataRules.java @@ -1,12 +1,10 @@ package org.radarcns.schema.validation.rules; import org.apache.avro.Schema; -import org.radarcns.schema.validation.ValidationException; import org.radarcns.schema.validation.ValidationSupport; import org.radarcns.schema.validation.config.ExcludeConfig; import java.nio.file.Path; -import java.util.stream.Stream; import static org.radarcns.schema.validation.rules.Validator.check; import static org.radarcns.schema.validation.rules.Validator.raise; @@ -47,11 +45,11 @@ private Validator validateNamespaceSchemaLocation() { return check(expected.equalsIgnoreCase(namespace), message( "Namespace cannot be null and must fully lowercase dot" - + " separated without numeric. In this case the expected value is \"" - + expected + "\".").apply(metadata)); + + " separated without numeric. In this case the expected value is \"" + + expected + "\".").apply(metadata)); } catch (IllegalArgumentException ex) { - return Stream.of(new ValidationException("Path " + metadata.getPath() - + " is not part of root " + root, ex)); + return raise("Path " + metadata.getPath() + + " is not part of root " + root, ex); } }; } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaRules.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaRules.java index 2229a8b3..d964be1b 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaRules.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/RadarSchemaRules.java @@ -25,7 +25,6 @@ import java.util.HashMap; import java.util.Map; import java.util.Objects; -import java.util.Set; import java.util.function.BiFunction; import java.util.regex.Pattern; import java.util.stream.Stream; diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/ResponseRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/ResponseRoles.java index 1adef6fe..88fe1990 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/ResponseRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/ResponseRoles.java @@ -36,7 +36,7 @@ private ResponseRoles() { * @return TODO */ static Validator validateScore() { - return validateNonNull(Response::getScore, SCORE); + return validateNonNull(Response::getValue, SCORE); } /** diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SensorRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SensorRoles.java index 4dab1f56..2ae9349a 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SensorRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SensorRoles.java @@ -18,8 +18,9 @@ import org.radarcns.catalogue.ProcessingState; import org.radarcns.catalogue.SensorName; -import org.radarcns.schema.specification.passive.Sensor; +import org.radarcns.schema.specification.passive.PassiveDataTopic; +import static org.radarcns.schema.util.Utils.testOrFalse; import static org.radarcns.schema.validation.rules.PassiveSourceRoles.RADAR_PROVIDERS; import static org.radarcns.schema.validation.rules.Validator.validateNonNull; import static org.radarcns.schema.validation.rules.Validator.validateOrNull; @@ -31,10 +32,10 @@ public final class SensorRoles { private static final String APP_PROVIDER = "App provider must be equal to one of the following: " + RADAR_PROVIDERS + "."; private static final String DATA_TYPE = - "Sensor data type cannot be null and should differ from " + "PassiveDataTopic data type cannot be null and should differ from " + ProcessingState.UNKNOWN.name() + "."; private static final String NAME = - "Sensor name cannot be not null and should different from " + "PassiveDataTopic name cannot be not null and should different from " + SensorName.UNKNOWN.name() + "."; private SensorRoles() { @@ -45,16 +46,17 @@ private SensorRoles() { * TODO. * @return TODO */ - static Validator validateAppProvider() { - return validateOrNull(Sensor::getAppProvider, RADAR_PROVIDERS::contains, APP_PROVIDER); + static Validator validateAppProvider() { + return validateOrNull(PassiveDataTopic::getAppProvider, RADAR_PROVIDERS::contains, + APP_PROVIDER); } /** * TODO. * @return TODO */ - static Validator validateDataType() { - return validateNonNull(Sensor::getProcessingState, + static Validator validateDataType() { + return validateNonNull(PassiveDataTopic::getProcessingState, state -> !state.name().equals(ProcessingState.UNKNOWN.name()), DATA_TYPE); } @@ -62,8 +64,8 @@ static Validator validateDataType() { * TODO. * @return TODO */ - static Validator validateName() { - return validateNonNull(Sensor::getName, - name -> name.name().equals(SensorName.UNKNOWN.name()), NAME); + static Validator validateName() { + return validateNonNull(PassiveDataTopic::getType, + testOrFalse(name -> SensorName.valueOf(name) != SensorName.UNKNOWN), NAME); } } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/TopicRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/TopicRoles.java deleted file mode 100644 index 9e559d4b..00000000 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/TopicRoles.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.radarcns.schema.validation.rules; - -import org.radarcns.schema.specification.Topic; -import org.radarcns.schema.util.Utils; -import org.radarcns.schema.validation.ValidationException; -import org.radarcns.schema.validation.ValidationSupport; - -import java.util.Collection; -import java.util.Objects; - -import static org.radarcns.schema.validation.ValidationSupport.isValidClass; -import static org.radarcns.schema.validation.ValidationSupport.isValidTopic; -import static org.radarcns.schema.validation.rules.Validator.validate; -import static org.radarcns.schema.validation.rules.Validator.validateNonNull; - -/** - * TODO. - */ -public final class TopicRoles { - public static final String TOPIC_KEY_PACKAGE = Utils.getProjectGroup() - + ValidationSupport.Package.KAFKA_KEY.getName(); - - /** Messages. */ - private static final String KEY = "Kafka key class is invalid, cannot be null and must be a" - + " valid AVRO schema located at " + TOPIC_KEY_PACKAGE + "."; - private static final String TOPIC = "Topic name is invalid."; - private static final String VALUE = "Kafka value class is invalid. It cannot be null and must" - + " be a valida AVRO schema located at"; - - private TopicRoles() { - // utility class - } - - /** - * TODO. - * @return TODO - */ - static Validator validateKey() { - return validateNonNull(Topic::getInputKey, - key -> key.startsWith(TOPIC_KEY_PACKAGE) && isValidClass(key), KEY); - } - - /** - * TODO. - * @return TODO - */ - static Validator validateValue(ValidationSupport.Package packageName) { - Objects.requireNonNull(packageName); - return validateNonNull(Topic::getInputValue, - value -> value.startsWith(Utils.getProjectGroup() + packageName.getName()) - && isValidClass(value), VALUE); - } - - /** - * TODO. - * @return TODO - */ - static Validator validateTopic() { - return validate(ValidationSupport::isValidTopic, - topic -> TOPIC + ValidationSupport.isValidTopicVerbose(topic)); - } - - static Validator> validateTopics() { - return topics -> topics.stream() - .filter(topic -> !isValidTopic(topic)) - .map(topic -> new ValidationException( - TOPIC + ValidationSupport.isValidTopicVerbose(topic))); - } -} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/Validator.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/Validator.java index deb56416..535c2f98 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/Validator.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/Validator.java @@ -53,7 +53,8 @@ static Validator validate(Predicate predicate, Function mes return object -> check(predicate.test(object), message.apply(object)); } - static Validator validate(Function property, Predicate predicate, Function message) { + static Validator validate(Function property, Predicate predicate, + Function message) { return object -> check(predicate.test(property.apply(object)), message.apply(object)); } @@ -95,6 +96,15 @@ static Validator validateNonNull(Function property, Predicate }, message); } + /** + * TODO. + * @param message TODO + * @return TODO + */ + static Validator validateNonNull(Function property, String message) { + return validate(o -> property.apply(o) != null, message); + } + /** * TODO. * @param message TODO @@ -127,15 +137,6 @@ static Validator validateNonEmpty(Function property, String me }; } - /** - * TODO. - * @param message TODO - * @return TODO - */ - static Validator validateNonNull(Function property, String message) { - return validate(o -> property.apply(o) != null, message); - } - /** * TODO. * @param message TODO @@ -218,6 +219,10 @@ static Stream raise(String message) { return Stream.of(new ValidationException(message)); } + static Stream raise(String message, Exception ex) { + return Stream.of(new ValidationException(message, ex)); + } + static Stream valid() { return Stream.empty(); } diff --git a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/ActiveValidation.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/ActiveValidation.java index c8582897..97f3bc19 100644 --- a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/ActiveValidation.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/ActiveValidation.java @@ -36,8 +36,8 @@ public void validate() throws IOException { NameFolder.ACTIVE.getLiteral()).resolve( type.name().toLowerCase() + YAML_EXTENSION)).toUri()); - QuestionnaireSource source = new YamlConfigLoader().load(file, - QuestionnaireSource.class); + QuestionnaireDataTopic source = new YamlConfigLoader().load(file, + QuestionnaireDataTopic.class); ValidationResult result = Validator.validateQuestionnaire(source, file); assertTrue(getMessage(file, result), result.isEmpty()); diff --git a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/PassiveValidation.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/PassiveValidation.java index ed521247..c32c27eb 100644 --- a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/PassiveValidation.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/PassiveValidation.java @@ -62,7 +62,7 @@ public void validate() throws IOException { Stream result =Validator.validatePassive(source, file); assertTrue(getMessage(file, result), result.isEmpty()); - for (Sensor sensor : source.getSensors()) { + for (PassiveData sensor : source.getSensors()) { result = Validator.validateSensor(converter.get(type), sensor); assertTrue(getMessage(file, result), result.isEmpty()); diff --git a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java index 09f105d2..27e9377a 100644 --- a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SchemaValidatorTest.java @@ -22,14 +22,10 @@ import org.junit.Test; import org.radarcns.schema.Scope; import org.radarcns.schema.validation.config.ExcludeConfig; -import org.radarcns.schema.validation.rules.RadarSchemaRules; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.TreeSet; import java.util.stream.Stream; import static org.junit.Assert.assertEquals; @@ -46,7 +42,6 @@ public class SchemaValidatorTest { private SchemaValidator validator; private static final Path ROOT = Paths.get("../..").toAbsolutePath(); - private static final Logger logger = LoggerFactory.getLogger(SchemaValidatorTest.class); @Before public void setUp() throws IOException { diff --git a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SourceCatalogueValidation.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SourceCatalogueValidation.java index 8b56b84a..1e899dab 100644 --- a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SourceCatalogueValidation.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SourceCatalogueValidation.java @@ -18,20 +18,20 @@ import org.junit.BeforeClass; import org.junit.Test; +import org.radarcns.schema.specification.DataProducer; import org.radarcns.schema.specification.SourceCatalogue; -import org.radarcns.schema.specification.MonitorSource; -import org.radarcns.schema.specification.active.ActiveSource; -import org.radarcns.schema.specification.active.questionnaire.QuestionnaireSource; +import org.radarcns.schema.specification.active.questionnaire.QuestionnaireDataTopic; +import org.radarcns.schema.specification.monitor.MonitorDataTopic; import org.radarcns.schema.specification.passive.PassiveSource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.radarcns.schema.specification.SourceCatalogue.BASE_PATH; import static org.radarcns.schema.validation.ValidationSupport.isValidTopic; @@ -40,7 +40,6 @@ * TODO. */ public class SourceCatalogueValidation { - private static final Logger logger = LoggerFactory.getLogger(SourceCatalogueValidation.class); private static SourceCatalogue catalogue; @BeforeClass @@ -50,51 +49,46 @@ public static void setUp() throws IOException { @Test public void checkActiveSourceType() { - assertTrue("Not all " + QuestionnaireSource.RadarSourceTypes.class.getName() - + " have a specification", - Arrays.stream(QuestionnaireSource.RadarSourceTypes.values()) - .allMatch(type -> catalogue.getActiveSource(type.name()) != null)); + Arrays.stream(QuestionnaireDataTopic.RadarSourceTypes.values()) + .forEach(type -> assertNotNull( + "Active RADAR source " + type + " does not have a specification", + catalogue.getActiveSource(type.name()))); } @Test public void checkMonitorSourceType() { - assertTrue("Not all " + MonitorSource.RadarSourceTypes.class.getName() - + " have a specification", - Arrays.stream(MonitorSource.RadarSourceTypes.values()) - .allMatch(type -> catalogue.getMonitorSource(type.name()) != null)); + Arrays.stream(MonitorDataTopic.RadarSourceTypes.values()) + .forEach(type -> assertNotNull( + "Monitor RADAR source " + type + " does not have a specification", + catalogue.getMonitorSource(type.name()) != null)); } @Test public void checkPassiveSourceType() { - assertEquals("Not all " + PassiveSource.RadarSourceTypes.class.getName() - + " have a specification", 0, - Arrays.stream(PassiveSource.RadarSourceTypes.values()) - .filter(type -> catalogue.getPassiveSource(type.name()) == null) - .peek(t -> logger.error("Passive source {} unknown", t)) - .count()); + Arrays.stream(PassiveSource.RadarSourceTypes.values()) + .forEach(type -> assertNotNull( + "Passive RADAR source " + type + " does not have a specification", + catalogue.getPassiveSource(type.name()) != null)); } @Test public void validateTopicNames() { - catalogue.getTopics().forEach(topic -> + catalogue.getTopicNames().forEach(topic -> assertTrue(topic + " is invalid", isValidTopic(topic))); } @Test public void validateTopics() { - Set expected = new HashSet<>(); + List expected = Stream.of( + catalogue.getActiveSources(), + catalogue.getMonitorSources(), + catalogue.getPassiveSources(), + catalogue.getStreamGroups()) + .flatMap(map -> map.values().stream()) + .flatMap(DataProducer::getTopicNames) + .sorted() + .collect(Collectors.toList()); - for (ActiveSource source : catalogue.getActiveSources().values()) { - expected.addAll(source.getTopics()); - } - for (MonitorSource source : catalogue.getMonitorSources().values()) { - expected.addAll(source.getTopics()); - } - for (PassiveSource source : catalogue.getPassiveSources().values()) { - expected.addAll(source.getTopics()); - } - - expected.removeAll(catalogue.getTopics()); - assertTrue(expected.isEmpty()); + assertEquals(expected, catalogue.getTopicNames().sorted().collect(Collectors.toList())); } } diff --git a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaFieldRulesTest.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaFieldRulesTest.java index 8f95efa9..fb586d11 100644 --- a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaFieldRulesTest.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaFieldRulesTest.java @@ -86,7 +86,8 @@ public void fieldsTest() { .fields() .endRecord(); - result = schemaValidator.fields(validator.validateFieldTypes(schemaValidator)).apply(schema); + result = schemaValidator.fields(validator.validateFieldTypes(schemaValidator)) + .apply(schema); assertEquals(1, result.count()); @@ -97,7 +98,8 @@ public void fieldsTest() { .optionalBoolean("optional") .endRecord(); - result = schemaValidator.fields(validator.validateFieldTypes(schemaValidator)).apply(schema); + result = schemaValidator.fields(validator.validateFieldTypes(schemaValidator)) + .apply(schema); assertEquals(0, result.count()); } diff --git a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaRulesTest.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaRulesTest.java index 3b0ece6d..9df9d07c 100644 --- a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaRulesTest.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/rules/RadarSchemaRulesTest.java @@ -377,36 +377,32 @@ public void enumerationSymbolTest() { @Test public void testUniqueness() { - String schemaTxt = "{\"namespace\": \"org.radarcns.monitor.application\", " - + "\"name\": \"ServerStatus\", \"type\": " - + "\"enum\", \"symbols\": [\"A\", \"B\"]}"; - String schemaTxtAlt = "{\"namespace\": \"org.radarcns.monitor.application\", " - + "\"name\": \"ServerStatus\", \"type\": " - + "\"enum\", \"symbols\": [\"A\", \"B\", \"C\"]}"; - String schemaTxt2 = "{\"namespace\": \"org.radarcns.monitor.application\", " - + "\"name\": \"ServerStatus2\", \"type\": " - + "\"enum\", \"symbols\": [\"A\", \"B\"]}"; - String schemaTxt3 = "{\"namespace\": \"org.radarcns.monitor.applications\", " - + "\"name\": \"ServerStatus\", \"type\": " - + "\"enum\", \"symbols\": [\"A\", \"B\"]}"; + final String prefix = "{\"namespace\": \"org.radarcns.monitor.application\", " + + "\"name\": \""; + final String infix = "\", \"type\": \"enum\", \"symbols\": "; + final char suffix = '}'; - Schema schema = new Parser().parse(schemaTxt); + Schema schema = new Parser().parse(prefix + "ServerStatus" + + infix + "[\"A\", \"B\"]" + suffix); Stream result = validator.validateUniqueness().apply(schema); assertEquals(0, result.count()); result = validator.validateUniqueness().apply(schema); assertEquals(0, result.count()); - Schema schemaAlt = new Parser().parse(schemaTxtAlt); + Schema schemaAlt = new Parser().parse(prefix + "ServerStatus" + + infix + "[\"A\", \"B\", \"C\"]" + suffix); result = validator.validateUniqueness().apply(schemaAlt); assertEquals(1, result.count()); result = validator.validateUniqueness().apply(schemaAlt); assertEquals(1, result.count()); - Schema schema2 = new Parser().parse(schemaTxt2); + Schema schema2 = new Parser().parse(prefix + "ServerStatus2" + + infix + "[\"A\", \"B\"]" + suffix); result = validator.validateUniqueness().apply(schema2); assertEquals(0, result.count()); - Schema schema3 = new Parser().parse(schemaTxt3); + Schema schema3 = new Parser().parse(prefix + "ServerStatus" + + infix + "[\"A\", \"B\"]" + suffix); result = validator.validateUniqueness().apply(schema3); assertEquals(0, result.count()); result = validator.validateUniqueness().apply(schema3); diff --git a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/util/TopicTest.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/util/TopicTest.java deleted file mode 100644 index 6bb58e0b..00000000 --- a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/util/TopicTest.java +++ /dev/null @@ -1,118 +0,0 @@ -package org.radarcns.schema.validation.util; - -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.junit.Test; -import org.radarcns.schema.specification.Topic; - -import java.util.HashSet; -import java.util.Set; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.radarcns.schema.validation.ValidationSupport.isValidTopic; - -/** - * TODO. - */ -public class TopicTest { - - @Test - public void getOutTopicTest() { - assertEquals("topic_name_output", Topic.getOutTopic("topic_name")); - } - - @Test - public void getOutTopicWithTimeTest() { - Set expected = new HashSet<>(); - expected.add("topic_name_output_10sec"); - expected.add("topic_name_output_30sec"); - expected.add("topic_name_output_1min"); - expected.add("topic_name_output_10min"); - expected.add("topic_name_output_1hour"); - expected.add("topic_name_output_1day"); - expected.add("topic_name_output_1week"); - - Set actual = Topic.getTimedOutTopics("topic_name_output"); - assertEquals(expected.size(), actual.size()); - - actual.forEach(expected::remove); - assertTrue(expected.isEmpty()); - } - - /*@Test(expected = NullPointerException.class) - public void getTimeIntervalNullTest() { - getTimeInterval(null); - } - - @Test(expected = IllegalArgumentException.class) - public void getTimeIntervalExceptionTest() { - getTimeInterval("topic_name_10secs"); - } - - @Test - public void getTimeIntervalTest() { - assertEquals(10000, getTimeInterval("topic_name_10sec"), 0); - }*/ - - @Test - public void getStateStoreNameTest() { - assertEquals("From-topic_in-To-topic_out", - Topic.getStateStoreName("topic_in", "topic_out")); - - assertTrue(isValidTopic(Topic.getStateStoreName("topic_in", "topic_out"))); - } - - @Test(expected = NullPointerException.class) - public void getStateStoreNullInputTest() { - Topic.getStateStoreName(null, "topic_out"); - } - - @Test(expected = NullPointerException.class) - public void getStateStoreNullOutputTest() { - Topic.getStateStoreName("topic_in", null); - } - - @Test(expected = NullPointerException.class) - public void getStateStoreNullTest() { - Topic.getStateStoreName(null, null); - } - - /*@Test - public void getTimedOutputStateStoreTopicTest() { - Set expected = new HashSet<>(); - expected.add("topic_name_10sec"); - expected.add("From-topic_name-To-topic_name_10sec"); - expected.add("topic_name_10sec"); - expected.add("From-topic_name-To-topic_name_10sec"); - expected.add("topic_name_30sec"); - expected.add("From-topic_name-To-topic_name_30sec"); - expected.add("topic_name_1min"); - expected.add("From-topic_name-To-topic_name_1min"); - expected.add("topic_name_10min"); - expected.add("From-topic_name-To-topic_name_10min"); - expected.add("topic_name_1hour"); - expected.add("From-topic_name-To-topic_name_1hour"); - expected.add("topic_name_1day"); - expected.add("From-topic_name-To-topic_name_1day"); - expected.add("topic_name_1week"); - expected.add("From-topic_name-To-topic_name_1week"); - - assertEquals(expected, Topic.getTimedOutputStateStoreTopics("topic_name")); - }*/ - -} diff --git a/specifications/active/phq8.yml b/specifications/active/phq8.yml index 3efc222c..5a0126d3 100644 --- a/specifications/active/phq8.yml +++ b/specifications/active/phq8.yml @@ -2,103 +2,104 @@ name: PHQ8 assessment_type: QUESTIONNAIRE doc: Personal Health Questionnaire Depression Scale (PHQ-8) definition. -topic: questionnaire_phq8 -key: .kafka.key.KeyMeasurement -value: .active.questionnaire.Questionnaire -questions: - - lead: Over the past two weeks, how often have you been bothered by any of the following problems? - content: Little interest or pleasure in doing things. - widget: RADIO - responses: - - text: Not at all - score: 0 - - text: Several days - score: 1 - - text: More than half the days - score: 2 - - text: Nearly every day - score: 3 - - lead: Over the past two weeks, how often have you been bothered by any of the following problems? - content: Feeling down, depressed, or hopeless. - widget: RADIO - responses: - - text: Not at all - score: 0 - - text: Several days - score: 1 - - text: More than half the days - score: 2 - - text: Nearly every day - score: 3 - - lead: Over the past two weeks, how often have you been bothered by any of the following problems? - content: Trouble falling or staying asleep, or sleeping too much. - widget: RADIO - responses: - - text: Not at all - score: 0 - - text: Several days - score: 1 - - text: More than half the days - score: 2 - - text: Nearly every day - score: 3 - - lead: Over the past two weeks, how often have you been bothered by any of the following problems? - content: Feeling tired or having little energy. - widget: RADIO - responses: - - text: Not at all - score: 0 - - text: Several days - score: 1 - - text: More than half the days - score: 2 - - text: Nearly every day - score: 3 - - lead: Over the past two weeks, how often have you been bothered by any of the following problems? - content: Poor appetite or overeating. - widget: RADIO - responses: - - text: Not at all - score: 0 - - text: Several days - score: 1 - - text: More than half the days - score: 2 - - text: Nearly every day - score: 3 - - lead: Over the past two weeks, how often have you been bothered by any of the following problems? - content: Feeling bad about yourself, or that you are a failure, or have let yourself or your family down. - widget: RADIO - responses: - - text: Not at all - score: 0 - - text: Several days - score: 1 - - text: More than half the days - score: 2 - - text: Nearly every day - score: 3 - - lead: Over the past two weeks, how often have you been bothered by any of the following problems? - content: Trouble concentrating on things, such as reading the newspaper or watching television. - widget: RADIO - responses: - - text: Not at all - score: 0 - - text: Several days - score: 1 - - text: More than half the days - score: 2 - - text: Nearly every day - score: 3 - - lead: Over the past two weeks, how often have you been bothered by any of the following problems? - content: Moving or speaking so slowly that other people could have noticed. Or the opposite – being so fidgety or restless that you have been moving around a lot more than usual. - widget: RADIO - responses: - - text: Not at all - score: 0 - - text: Several days - score: 1 - - text: More than half the days - score: 2 - - text: Nearly every day - score: 3 +data: + - type: PHQ8 + topic: questionnaire_phq8 + value_schema: .active.questionnaire.Questionnaire + questions: + - lead: Over the past two weeks, how often have you been bothered by any of the following problems? + content: Little interest or pleasure in doing things. + widget: RADIO + responses: + - text: Not at all + value: 0 + - text: Several days + value: 1 + - text: More than half the days + value: 2 + - text: Nearly every day + value: 3 + - lead: Over the past two weeks, how often have you been bothered by any of the following problems? + content: Feeling down, depressed, or hopeless. + widget: RADIO + responses: + - text: Not at all + value: 0 + - text: Several days + value: 1 + - text: More than half the days + value: 2 + - text: Nearly every day + value: 3 + - lead: Over the past two weeks, how often have you been bothered by any of the following problems? + content: Trouble falling or staying asleep, or sleeping too much. + widget: RADIO + responses: + - text: Not at all + value: 0 + - text: Several days + value: 1 + - text: More than half the days + value: 2 + - text: Nearly every day + value: 3 + - lead: Over the past two weeks, how often have you been bothered by any of the following problems? + content: Feeling tired or having little energy. + widget: RADIO + responses: + - text: Not at all + value: 0 + - text: Several days + value: 1 + - text: More than half the days + value: 2 + - text: Nearly every day + value: 3 + - lead: Over the past two weeks, how often have you been bothered by any of the following problems? + content: Poor appetite or overeating. + widget: RADIO + responses: + - text: Not at all + value: 0 + - text: Several days + value: 1 + - text: More than half the days + value: 2 + - text: Nearly every day + value: 3 + - lead: Over the past two weeks, how often have you been bothered by any of the following problems? + content: Feeling bad about yourself, or that you are a failure, or have let yourself or your family down. + widget: RADIO + responses: + - text: Not at all + value: 0 + - text: Several days + value: 1 + - text: More than half the days + value: 2 + - text: Nearly every day + value: 3 + - lead: Over the past two weeks, how often have you been bothered by any of the following problems? + content: Trouble concentrating on things, such as reading the newspaper or watching television. + widget: RADIO + responses: + - text: Not at all + value: 0 + - text: Several days + value: 1 + - text: More than half the days + value: 2 + - text: Nearly every day + value: 3 + - lead: Over the past two weeks, how often have you been bothered by any of the following problems? + content: Moving or speaking so slowly that other people could have noticed. Or the opposite – being so fidgety or restless that you have been moving around a lot more than usual. + widget: RADIO + responses: + - text: Not at all + value: 0 + - text: Several days + value: 1 + - text: More than half the days + value: 2 + - text: Nearly every day + value: 3 \ No newline at end of file diff --git a/specifications/monitor/external_time.yml b/specifications/monitor/external_time.yml deleted file mode 100644 index 14f2caac..00000000 --- a/specifications/monitor/external_time.yml +++ /dev/null @@ -1,10 +0,0 @@ -#==================================== External Time Monitor =======================================# -name: EXTERNAL_TIME -app_provider: .application.ApplicationServiceProvider -doc: Information sent by the Android pRMT about time synchronisation with a NTS different from the default one. -default_sample_interval: 300 -unit: NON_DIMENSIONAL -processing_state: RAW -topic: application_external_time -key: .kafka.key.KeyMeasurement -value: .monitor.application.ApplicationExternalTime diff --git a/specifications/monitor/radar_prmt.yml b/specifications/monitor/radar_prmt.yml new file mode 100644 index 00000000..c3e5961e --- /dev/null +++ b/specifications/monitor/radar_prmt.yml @@ -0,0 +1,27 @@ +name: ANDROID_PHONE +doc: Status updates from the RADAR-CNS pRMT app. +data: + - type: EXTERNAL_TIME + app_provider: .application.ApplicationServiceProvider + doc: Information sent by the Android pRMT about time synchronisation with a NTS different from the default one. + default_sample_interval: 300 + topic: application_external_time + value_schema: .monitor.application.ApplicationExternalTime + - type: RECORD_COUNTS + app_provider: .application.ApplicationServiceProvider + doc: Monitor used by the Android pRMT to report the number of cached and created records. + default_sample_interval: 300 + topic: application_record_counts + value_schema: .monitor.application.ApplicationRecordCounts + - type: SERVER_STATUS + doc: Monitor used by the Android pRMT to report the server connection status between the android client and the RADAR-CNS Platform. + app_provider: .application.ApplicationServiceProvider + default_sample_interval: 300 + topic: application_server_status + value_schema: .monitor.application.ApplicationServerStatus + - type: UPTIME + doc: Monitor used by the Android pRMT to notify the time duration since last reboot. + app_provider: .application.ApplicationServiceProvider + default_sample_interval: 300 + topic: application_uptime + value_schema: .monitor.application.ApplicationUptime \ No newline at end of file diff --git a/specifications/monitor/record_counts.yml b/specifications/monitor/record_counts.yml deleted file mode 100644 index d1a7990f..00000000 --- a/specifications/monitor/record_counts.yml +++ /dev/null @@ -1,10 +0,0 @@ -#==================================== Record Counts Monitor =======================================# -name: RECORD_COUNTS -app_provider: .application.ApplicationServiceProvider -doc: Monitor used by the Android pRMT to report the number of cached and created records. -default_sample_interval: 300 -unit: NON_DIMENSIONAL -processing_state: RAW -topic: application_record_counts -key: .kafka.key.KeyMeasurement -value: .monitor.application.ApplicationRecordCounts diff --git a/specifications/monitor/server_status.yml b/specifications/monitor/server_status.yml deleted file mode 100644 index fe83150e..00000000 --- a/specifications/monitor/server_status.yml +++ /dev/null @@ -1,10 +0,0 @@ -#==================================== Server Status Monitor =======================================# -name: SERVER_STATUS -app_provider: .application.ApplicationServiceProvider -doc: Monitor used by the Android pRMT to report the server connection status between the android client and the RADAR-CNS Platform. -default_sample_interval: 300 -unit: NON_DIMENSIONAL -processing_state: RAW -topic: application_server_status -key: .kafka.key.KeyMeasurement -value: .monitor.application.ApplicationServerStatus diff --git a/specifications/monitor/uptime.yml b/specifications/monitor/uptime.yml deleted file mode 100644 index 913c4c33..00000000 --- a/specifications/monitor/uptime.yml +++ /dev/null @@ -1,10 +0,0 @@ -#======================================== Uptime Monitor ==========================================# -name: UPTIME -app_provider: .application.ApplicationServiceProvider -doc: Monitor used by the Android pRMT to notify the time duration since last reboot. -default_sample_interval: 300 -unit: NON_DIMENSIONAL -processing_state: RAW -topic: application_uptime -key: .kafka.key.KeyMeasurement -value: .monitor.application.ApplicationUptime diff --git a/specifications/passive/android_phone.yml b/specifications/passive/android_phone.yml index c38b026a..bbe449c1 100644 --- a/specifications/passive/android_phone.yml +++ b/specifications/passive/android_phone.yml @@ -1,98 +1,99 @@ #====================================== Android Phone Sensors =====================================# vendor: ANDROID model: PHONE -sensors: +data: #Phone sensors - - name: ACCELEROMETER + - type: ACCELEROMETER app_provider: .phone.PhoneSensorProvider unit: G + fields: + - name: x + - name: y + - name: z processing_state: RAW topic: android_phone_acceleration - key: .kafka.key.KeyMeasurement - value: .passive.phone.PhoneAcceleration - aggregator: .kafka.aggregator.AggregatorDoubleArray - - name: BATTERY + value_schema: .passive.phone.PhoneAcceleration + - type: BATTERY app_provider: .phone.PhoneSensorProvider unit: PERCENTAGE processing_state: RAW topic: android_phone_battery_level - key: .kafka.key.KeyMeasurement - value: .passive.phone.PhoneBatteryLevel - aggregator: .kafka.aggregator.AggregatorDouble - - name: GYROSCOPE + value_schema: .passive.phone.PhoneBatteryLevel + fields: + - name: batteryLevel + - type: GYROSCOPE app_provider: .phone.PhoneSensorProvider unit: RADAIAN_PER_SEC processing_state: RAW topic: android_phone_gyroscope - key: .kafka.key.KeyMeasurement - value: .passive.phone.PhoneGyroscope - aggregator: .kafka.aggregator.AggregatorDoubleArray - - name: LIGHT + value_schema: .passive.phone.PhoneGyroscope + fields: + - name: x + - name: y + - name: z + - type: LIGHT app_provider: .phone.PhoneSensorProvider unit: LUX processing_state: RAW topic: android_phone_light - key: .kafka.key.KeyMeasurement - value: .passive.phone.PhoneLight - aggregator: .kafka.aggregator.AggregatorDouble - - name: MAGNETIC_FIELD + value_schema: .passive.phone.PhoneLight + fields: + - name: light + - type: MAGNETIC_FIELD app_provider: .phone.PhoneSensorProvider unit: MICRO_TESLA processing_state: RAW topic: android_phone_magnetic_field - key: .kafka.key.KeyMeasurement - value: .passive.phone.PhoneMagneticField - aggregator: .kafka.aggregator.AggregatorDoubleArray - - name: STEP_COUNT + value_schema: .passive.phone.PhoneMagneticField + fields: + - name: x + - name: y + - name: z + - type: STEP_COUNT app_provider: .phone.PhoneSensorProvider unit: NON_DIMENSIONAL processing_state: VENDOR topic: android_phone_step_count - key: .kafka.key.KeyMeasurement - value: .passive.phone.PhoneStepCount - aggregator: .kafka.aggregator.AggregatorDouble + value_schema: .passive.phone.PhoneStepCount + fields: + - name: steps # Location - - name: RELATIVE_LOCATION + - type: RELATIVE_LOCATION app_provider: .phone.PhoneLocationProvider unit: DEGREE processing_state: RAW topic: android_phone_relative_location - key: .kafka.key.KeyMeasurement - value: .passive.phone.PhoneRelativeLocation + value_schema: .passive.phone.PhoneRelativeLocation + fields: + - name: longitude + - name: latitude # Log - - name: PHONE_CALL + - type: PHONE_CALL app_provider: .phone.PhoneLogProvider - unit: NON_DIMENSIONAL processing_state: RAW topic: android_phone_call - key: .kafka.key.KeyMeasurement - value: .passive.phone.PhoneCall - - name: PHONE_SMS + value_schema: .passive.phone.PhoneCall + - type: PHONE_SMS app_provider: .phone.PhoneLogProvider unit: NON_DIMENSIONAL processing_state: RAW topic: android_phone_sms - key: .kafka.key.KeyMeasurement - value: .passive.phone.PhoneSms - - name: PHONE_SMS_UNREAD + value_schema: .passive.phone.PhoneSms + - type: PHONE_SMS_UNREAD app_provider: .phone.PhoneLogProvider unit: NON_DIMENSIONAL processing_state: RAW topic: android_phone_sms_unread - key: .kafka.key.KeyMeasurement - value: .passive.phone.PhoneSmsUnread + value_schema: .passive.phone.PhoneSmsUnread # Usage - - name: USAGE_EVENT + - type: USAGE_EVENT app_provider: .phone.PhoneUsageProvider - unit: NON_DIMENSIONAL processing_state: RAW topic: android_phone_usage_event - key: .kafka.key.KeyMeasurement - value: .passive.phone.PhoneUsageEvent - - name: USER_INTERACTION + value_schema: .passive.phone.PhoneUsageEvent + - type: USER_INTERACTION app_provider: .phone.PhoneUsageProvider unit: NON_DIMENSIONAL processing_state: RAW topic: android_phone_user_interaction - key: .kafka.key.KeyMeasurement - value: .passive.phone.PhoneUserInteraction + value_schema: .passive.phone.PhoneUserInteraction diff --git a/specifications/passive/biovotion_vsm1.yml b/specifications/passive/biovotion_vsm1.yml index 1c2d95a2..06859fdc 100644 --- a/specifications/passive/biovotion_vsm1.yml +++ b/specifications/passive/biovotion_vsm1.yml @@ -2,100 +2,76 @@ vendor: BIOVOTION model: VSM1 app_provider: .biovotion.BiovotionServiceProvider -sensors: - - name: ACCELEROMETER +data: + - type: ACCELEROMETER default_sample_rate: 51.2 unit: G processing_state: RAW topic: android_biovotion_vsm1_acceleration - key: .kafka.key.KeyMeasurement - value: .passive.biovotion.BiovotionVsm1Acceleration - aggregator: .kafka.aggregator.AggregatorDoubleArray - - name: BATTERY + value_schema: .passive.biovotion.BiovotionVsm1Acceleration + - type: BATTERY default_sample_rate: 1.0 unit: PERCENTAGE processing_state: RAW topic: android_biovotion_vsm1_battery_level - key: .kafka.key.KeyMeasurement - value: .passive.biovotion.BiovotionVsm1BatteryLevel - aggregator: .kafka.aggregator.AggregatorDouble - - name: BLOOD_PULSE_WAVE + value_schema: .passive.biovotion.BiovotionVsm1BatteryLevel + - type: BLOOD_PULSE_WAVE default_sample_rate: 1.0 unit: NON_DIMENSIONAL processing_state: VENDOR topic: android_biovotion_vsm1_blood_volume_pulse - key: .kafka.key.KeyMeasurement - value: .passive.biovotion.BiovotionVsm1BloodPulseWave - aggregator: .kafka.aggregator.AggregatorDouble - - name: ENERGY + value_schema: .passive.biovotion.BiovotionVsm1BloodPulseWave + - type: ENERGY default_sample_rate: 1.0 unit: CALORIES_PER_SEC processing_state: VENDOR topic: android_biovotion_vsm1_energy - key: .kafka.key.KeyMeasurement - value: .passive.biovotion.BiovotionVsm1Energy - aggregator: .kafka.aggregator.AggregatorDouble - - name: GALVANIC_SKIN_RESPONSE + value_schema: .passive.biovotion.BiovotionVsm1Energy + - type: GALVANIC_SKIN_RESPONSE default_sample_rate: 1.0 unit: KILO_OHM processing_state: VENDOR topic: android_biovotion_vsm1_galvanic_skin_response - key: .kafka.key.KeyMeasurement - value: .passive.biovotion.BiovotionVsm1GalvanicSkinResponse - aggregator: .kafka.aggregator.AggregatorDoubleArray - - name: HEART_RATE + value_schema: .passive.biovotion.BiovotionVsm1GalvanicSkinResponse + - type: HEART_RATE default_sample_rate: 1.0 unit: BEATS_PER_MIN processing_state: VENDOR topic: android_biovotion_vsm1_heartrate - key: .kafka.key.KeyMeasurement - value: .passive.biovotion.BiovotionVsm1HeartRate - aggregator: .kafka.aggregator.AggregatorDouble - - name: HEART_RATE_VARIABILITY + value_schema: .passive.biovotion.BiovotionVsm1HeartRate + - type: HEART_RATE_VARIABILITY default_sample_rate: 1.0 unit: RMSSD_IN_MILLI_SEC processing_state: VENDOR topic: android_biovotion_vsm1_heartrate_variability - key: .kafka.key.KeyMeasurement - value: .passive.biovotion.BiovotionVsm1HeartRateVariability - aggregator: .kafka.aggregator.AggregatorDouble - - name: LED + value_schema: .passive.biovotion.BiovotionVsm1HeartRateVariability + - type: LED default_sample_rate: 1.0 unit: MILLI_AMPERE processing_state: VENDOR topic: android_biovotion_vsm1_led_current - key: .kafka.key.KeyMeasurement - value: .passive.biovotion.BiovotionVsm1LedCurrent - aggregator: .kafka.aggregator.AggregatorDoubleArray - - name: PHOTOPLETHYSMOGRAPHY + value_schema: .passive.biovotion.BiovotionVsm1LedCurrent + - type: PHOTOPLETHYSMOGRAPHY default_sample_rate: 51.2 unit: NON_DIMENSIONAL processing_state: RAW topic: android_biovotion_vsm1_ppg_raw - key: .kafka.key.KeyMeasurement - value: .passive.biovotion.BiovotionVsm1PpgRaw - aggregator: .kafka.aggregator.AggregatorDoubleArray - - name: RESPIRATION_RATE + value_schema: .passive.biovotion.BiovotionVsm1PpgRaw + - type: RESPIRATION_RATE default_sample_rate: 1.0 unit: BEATS_PER_MIN processing_state: VENDOR topic: android_biovotion_vsm1_respiration_rate - key: .kafka.key.KeyMeasurement - value: .passive.biovotion.BiovotionVsm1RespirationRate - aggregator: .kafka.aggregator.AggregatorDouble - - name: OXYGEN_SATURATION + value_schema: .passive.biovotion.BiovotionVsm1RespirationRate + - type: OXYGEN_SATURATION default_sample_rate: 1.0 unit: PERCENTAGE processing_state: VENDOR topic: android_biovotion_vsm1_oxygen_saturation - key: .kafka.key.KeyMeasurement - value: .passive.biovotion.BiovotionVsm1OxygenSaturation - aggregator: .kafka.aggregator.AggregatorDouble - - name: THERMOMETER + value_schema: .passive.biovotion.BiovotionVsm1OxygenSaturation + - type: THERMOMETER default_sample_rate: 1.0 unit: CELSIUS processing_state: RAW topic: android_biovotion_vsm1_temperature - key: .kafka.key.KeyMeasurement - value: .passive.biovotion.BiovotionVsm1Temperature - aggregator: .kafka.aggregator.AggregatorDouble + value_schema: .passive.biovotion.BiovotionVsm1Temperature \ No newline at end of file diff --git a/specifications/passive/empatica_e4.yml b/specifications/passive/empatica_e4.yml index dbc16107..2ecb4c65 100644 --- a/specifications/passive/empatica_e4.yml +++ b/specifications/passive/empatica_e4.yml @@ -2,62 +2,40 @@ vendor: EMPATICA model: E4 app_provider: .empatica.E4ServiceProvider -sensors: - - name: ACCELEROMETER +data: + - type: ACCELEROMETER default_sample_rate: 32.0 unit: G processing_state: RAW topic: android_empatica_e4_acceleration - key: .kafka.key.KeyMeasurement - value: .passive.empatica.EmpaticaE4Acceleration - aggregator: .kafka.aggregator.AggregatorDoubleArray - - name: BATTERY + value_schema: .passive.empatica.EmpaticaE4Acceleration + - type: BATTERY default_sample_rate: 1.0 unit: PERCENTAGE processing_state: RAW topic: android_empatica_e4_battery_level - key: .kafka.key.KeyMeasurement - value: .passive.empatica.EmpaticaE4BatteryLevel - aggregator: .kafka.aggregator.AggregatorDouble - - name: BLOOD_VOLUME_PULSE + value_schema: .passive.empatica.EmpaticaE4BatteryLevel + - type: BLOOD_VOLUME_PULSE default_sample_rate: 64.0 unit: NANO_WATT processing_state: RAW topic: android_empatica_e4_blood_volume_pulse - key: .kafka.key.KeyMeasurement - value: .passive.empatica.EmpaticaE4BloodVolumePulse - aggregator: .kafka.aggregator.AggregatorDouble - - name: ELECTRODERMAL_ACTIVITY + value_schema: .passive.empatica.EmpaticaE4BloodVolumePulse + - type: ELECTRODERMAL_ACTIVITY default_sample_rate: 4.0 unit: MICRO_SIEMENS processing_state: RAW topic: android_empatica_e4_electrodermal_activity - key: .kafka.key.KeyMeasurement - value: .passive.empatica.EmpaticaE4ElectroDermalActivity - aggregator: .kafka.aggregator.AggregatorDouble - - name: INTER_BEAT_INTERVAL + value_schema: .passive.empatica.EmpaticaE4ElectroDermalActivity + - type: INTER_BEAT_INTERVAL default_sample_rate: 1.0 unit: BEATS_PER_MIN processing_state: VENDOR topic: android_empatica_e4_inter_beat_interval - key: .kafka.key.KeyMeasurement - value: .passive.empatica.EmpaticaE4InterBeatInterval - aggregator: .kafka.aggregator.AggregatorDouble - - name: THERMOMETER + value_schema: .passive.empatica.EmpaticaE4InterBeatInterval + - type: THERMOMETER default_sample_rate: 4.0 unit: CELSIUS processing_state: RAW topic: android_empatica_e4_temperature - key: .kafka.key.KeyMeasurement - value: .passive.empatica.EmpaticaE4Temperature - aggregator: .kafka.aggregator.AggregatorDouble -processors: - - name: HEART_RATE - default_sample_rate: 1.0 - unit: BEATS_PER_MIN - processing_state: RADAR - input_topic: android_empatica_e4_inter_beat_interval - input_key: .kafka.key.KeyMeasurement - input_value: .passive.empatica.EmpaticaE4InterBeatInterval - base_output_topic: android_empatica_e4_heartrate - aggregator: .kafka.aggregator.AggregatorDouble + value_schema: .passive.empatica.EmpaticaE4Temperature diff --git a/specifications/passive/pebble_2.yml b/specifications/passive/pebble_2.yml index 4b808298..8e9f4284 100644 --- a/specifications/passive/pebble_2.yml +++ b/specifications/passive/pebble_2.yml @@ -1,37 +1,30 @@ #============================================ Pebble 2 ============================================# vendor: PEBBLE model: 2 +doc: Pebble 2 data collected over Bluetooth by a RADAR Pebble app app_provider: .pebble.PebbleServiceProvider -sensors: - - name: ACCELEROMETER +data: + - type: ACCELEROMETER default_sample_rate: 10.0 unit: G processing_state: RAW topic: android_pebble_2_acceleration - key: .kafka.key.KeyMeasurement - value: .passive.pebble.Pebble2Acceleration - aggregator: .kafka.aggregator.AggregatorDoubleArray - - name: BATTERY + value_schema: .passive.pebble.Pebble2Acceleration + - type: BATTERY default_sample_rate: 1.0 unit: PERCENTAGE processing_state: RAW topic: android_pebble_2_battery_level - key: .kafka.key.KeyMeasurement - value: .passive.pebble.Pebble2BatteryLevel - aggregator: .kafka.aggregator.AggregatorDouble - - name: HEART_RATE + value_schema: .passive.pebble.Pebble2BatteryLevel + - type: HEART_RATE default_sample_rate: 1.0 unit: BEATS_PER_MIN processing_state: VENDOR topic: android_pebble_2_heartrate - key: .kafka.key.KeyMeasurement - value: .passive.pebble.Pebble2HeartRate - aggregator: .kafka.aggregator.AggregatorDouble - - name: HEART_RATE_FILTERED + value_schema: .passive.pebble.Pebble2HeartRate + - type: HEART_RATE_FILTERED default_sample_rate: 1.0 unit: BEATS_PER_MIN processing_state: VENDOR topic: android_pebble_2_heartrate_filtered - key: .kafka.key.KeyMeasurement - value: .passive.pebble.Pebble2HeartRateFiltered - aggregator: .kafka.aggregator.AggregatorDouble + value_schema: .passive.pebble.Pebble2HeartRateFiltered diff --git a/specifications/stream/android_phone.yml b/specifications/stream/android_phone.yml new file mode 100644 index 00000000..c2313f03 --- /dev/null +++ b/specifications/stream/android_phone.yml @@ -0,0 +1,40 @@ +name: ANDROID_PHONE +doc: Aggregation of Biovotion data +master: .kafka.stream.biovotion.BiovotionVsm1Master +data: + - input_topic: android_biovotion_vsm1_acceleration + value_schema: .kafka.aggregator.AggregatorDoubleArray + windowed: true + - input_topic: android_biovotion_vsm1_battery_level + value_schema: .kafka.aggregator.AggregatorDouble + windowed: true + - input_topic: android_biovotion_vsm1_blood_volume_pulse + value_schema: .kafka.aggregator.AggregatorDouble + windowed: true + - input_topic: android_biovotion_vsm1_energy + value_schema: .kafka.aggregator.AggregatorDouble + windowed: true + - input_topic: android_biovotion_vsm1_galvanic_skin_response + value_schema: .kafka.aggregator.AggregatorDoubleArray + windowed: true + - input_topic: android_biovotion_vsm1_heartrate + value_schema: .kafka.aggregator.AggregatorDouble + windowed: true + - input_topic: android_biovotion_vsm1_heartrate_variability + value_schema: .kafka.aggregator.AggregatorDouble + windowed: true + - input_topic: android_biovotion_vsm1_led_current + value_schema: .kafka.aggregator.AggregatorDoubleArray + windowed: true + - input_topic: android_biovotion_vsm1_ppg_raw + value_schema: .kafka.aggregator.AggregatorDoubleArray + windowed: true + - input_topic: android_biovotion_vsm1_respiration_rate + value_schema: .kafka.aggregator.AggregatorDouble + windowed: true + - input_topic: android_biovotion_vsm1_oxygen_saturation + value_schema: .kafka.aggregator.AggregatorDouble + windowed: true + - input_topic: android_biovotion_vsm1_temperature + value_schema: .kafka.aggregator.AggregatorDouble + windowed: true diff --git a/specifications/stream/biovotion_vsm1.yml b/specifications/stream/biovotion_vsm1.yml new file mode 100644 index 00000000..09c38407 --- /dev/null +++ b/specifications/stream/biovotion_vsm1.yml @@ -0,0 +1,40 @@ +name: BIOVOTION_VSM1 +doc: Aggregation of Biovotion data +master: .kafka.stream.biovotion.BiovotionVsm1Master +data: + - input_topic: android_biovotion_vsm1_acceleration + value_schema: .kafka.aggregator.AggregatorDoubleArray + windowed: true + - input_topic: android_biovotion_vsm1_battery_level + value_schema: .kafka.aggregator.AggregatorDouble + windowed: true + - input_topic: android_biovotion_vsm1_blood_volume_pulse + value_schema: .kafka.aggregator.AggregatorDouble + windowed: true + - input_topic: android_biovotion_vsm1_energy + value_schema: .kafka.aggregator.AggregatorDouble + windowed: true + - input_topic: android_biovotion_vsm1_galvanic_skin_response + value_schema: .kafka.aggregator.AggregatorDoubleArray + windowed: true + - input_topic: android_biovotion_vsm1_heartrate + value_schema: .kafka.aggregator.AggregatorDouble + windowed: true + - input_topic: android_biovotion_vsm1_heartrate_variability + value_schema: .kafka.aggregator.AggregatorDouble + windowed: true + - input_topic: android_biovotion_vsm1_led_current + value_schema: .kafka.aggregator.AggregatorDoubleArray + windowed: true + - input_topic: android_biovotion_vsm1_ppg_raw + value_schema: .kafka.aggregator.AggregatorDoubleArray + windowed: true + - input_topic: android_biovotion_vsm1_respiration_rate + value_schema: .kafka.aggregator.AggregatorDouble + windowed: true + - input_topic: android_biovotion_vsm1_oxygen_saturation + value_schema: .kafka.aggregator.AggregatorDouble + windowed: true + - input_topic: android_biovotion_vsm1_temperature + value_schema: .kafka.aggregator.AggregatorDouble + windowed: true diff --git a/specifications/stream/empatica_e4.yml b/specifications/stream/empatica_e4.yml new file mode 100644 index 00000000..0b4985dd --- /dev/null +++ b/specifications/stream/empatica_e4.yml @@ -0,0 +1,31 @@ +name: EMPATICA_E4 +doc: Aggregation and conversion of Empatica E4 data +master: .kafka.stream.biovotion.EmpaticaE4Master +data: + - input_topic: android_empatica_e4_acceleration + value_schema: .kafka.aggregator.AggregatorDoubleArray + windowed: true + - input_topic: android_empatica_e4_battery_level + value_schema: .kafka.aggregator.AggregatorDouble + windowed: true + - input_topic: android_empatica_e4_blood_volume_pulse + value_schema: .kafka.aggregator.AggregatorDouble + windowed: true + - input_topic: android_empatica_e4_electrodermal_activity + value_schema: .kafka.aggregator.AggregatorDouble + windowed: true + - input_topic: android_empatica_e4_inter_beat_interval + value_schema: .kafka.aggregator.AggregatorDouble + windowed: true + - input_topic: android_empatica_e4_temperature + value_schema: .kafka.aggregator.AggregatorDouble + windowed: true + - type: HEART_RATE + unit: BEATS_PER_MIN + input_topic: android_empatica_e4_inter_beat_interval + topic: android_empatica_e4_heartrate + value_schema: .passive.empatica.EmpaticaE4HeartRate + default_sample_rate: 1.0 + - input_topic: android_empatica_e4_heartrate + value_schema: .kafka.aggregator.AggregatorDouble + windowed: true From 7d433a1a97c68b7fbc476cd15310677003941b02 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Thu, 21 Sep 2017 15:48:27 +0200 Subject: [PATCH 074/112] Additional validation and reverted aggregator/key names --- commons/catalogue/time_frame.avsc | 1 - ..._measurement.avsc => measurement_key.avsc} | 4 +- .../key_windowed.avsc => windowed_key.avsc} | 4 +- .../aggregator/double_aggregation.avsc} | 4 +- .../aggregator/double_array_aggregation.avsc} | 4 +- .../aggregator/phone_usage_aggregation.avsc} | 4 +- .../org/radarcns/schema/CommandLineApp.java | 2 +- .../schema/specification/DataTopic.java | 24 ++++-- .../schema/specification/SourceCatalogue.java | 16 ++-- .../questionnaire/QuestionnaireDataTopic.java | 7 +- .../specification/stream/StreamDataTopic.java | 78 +++++++++++++------ .../java/org/radarcns/schema/util/Utils.java | 21 ----- .../validation/SourceCatalogueValidation.java | 14 ++++ .../schema/validation/util/UtilsTest.java | 18 +---- .../test/resources/key_measurement_test.avsc | 2 +- .../src/test/resources/key_windowed_test.avsc | 2 +- specifications/monitor/radar_prmt.yml | 7 +- specifications/stream/android_phone.yml | 42 +--------- specifications/stream/biovotion_vsm1.yml | 24 +++--- specifications/stream/empatica_e4.yml | 20 ++--- 20 files changed, 143 insertions(+), 155 deletions(-) rename commons/kafka/{key/key_measurement.avsc => measurement_key.avsc} (80%) rename commons/kafka/{key/key_windowed.avsc => windowed_key.avsc} (88%) rename commons/{kafka/aggregator/aggregator_double.avsc => stream/aggregator/double_aggregation.avsc} (91%) rename commons/{kafka/aggregator/aggregator_double_array.avsc => stream/aggregator/double_array_aggregation.avsc} (92%) rename commons/{kafka/aggregator/aggregator_phone_usage.avsc => stream/aggregator/phone_usage_aggregation.avsc} (90%) diff --git a/commons/catalogue/time_frame.avsc b/commons/catalogue/time_frame.avsc index af9260f0..601d1ae6 100644 --- a/commons/catalogue/time_frame.avsc +++ b/commons/catalogue/time_frame.avsc @@ -5,7 +5,6 @@ "doc": "Interval between two consecutive samples.", "symbols": [ "TEN_SECOND" , - "THIRTY_SECOND" , "ONE_MIN" , "TEN_MIN" , "ONE_HOUR" , diff --git a/commons/kafka/key/key_measurement.avsc b/commons/kafka/measurement_key.avsc similarity index 80% rename from commons/kafka/key/key_measurement.avsc rename to commons/kafka/measurement_key.avsc index 5c46d826..8f2004ce 100644 --- a/commons/kafka/key/key_measurement.avsc +++ b/commons/kafka/measurement_key.avsc @@ -1,7 +1,7 @@ { - "namespace": "org.radarcns.kafka.key", + "namespace": "org.radarcns.kafka", "type": "record", - "name": "KeyMeasurement", + "name": "MeasurementKey", "doc": "Measurement key in the RADAR-CNS project.", "fields": [ {"name": "userId", "type": "string", "doc": "User Identifier created during the enrolment."}, diff --git a/commons/kafka/key/key_windowed.avsc b/commons/kafka/windowed_key.avsc similarity index 88% rename from commons/kafka/key/key_windowed.avsc rename to commons/kafka/windowed_key.avsc index c346ac95..7e0a6dd9 100644 --- a/commons/kafka/key/key_windowed.avsc +++ b/commons/kafka/windowed_key.avsc @@ -1,7 +1,7 @@ { - "namespace": "org.radarcns.kafka.key", + "namespace": "org.radarcns.kafka", "type": "record", - "name": "KeyWindowed", + "name": "WindowedKey", "doc": "Windowed key in the RADAR-CNS project.", "fields": [ {"name": "userId", "type": "string", "doc": "User Identifier created during the enrolment."}, diff --git a/commons/kafka/aggregator/aggregator_double.avsc b/commons/stream/aggregator/double_aggregation.avsc similarity index 91% rename from commons/kafka/aggregator/aggregator_double.avsc rename to commons/stream/aggregator/double_aggregation.avsc index 7996c5d9..1552211a 100644 --- a/commons/kafka/aggregator/aggregator_double.avsc +++ b/commons/stream/aggregator/double_aggregation.avsc @@ -1,7 +1,7 @@ { - "namespace": "org.radarcns.kafka.aggregator", + "namespace": "org.radarcns.stream.aggregator", "type": "record", - "name": "AggregatorDouble", + "name": "DoubleAggregation", "doc": "Result of data aggregation.", "fields": [ { "name": "min", "type": "double", "doc": "State the minimum between accumulated values." }, diff --git a/commons/kafka/aggregator/aggregator_double_array.avsc b/commons/stream/aggregator/double_array_aggregation.avsc similarity index 92% rename from commons/kafka/aggregator/aggregator_double_array.avsc rename to commons/stream/aggregator/double_array_aggregation.avsc index b2bda37c..b52b7231 100644 --- a/commons/kafka/aggregator/aggregator_double_array.avsc +++ b/commons/stream/aggregator/double_array_aggregation.avsc @@ -1,7 +1,7 @@ { - "namespace": "org.radarcns.kafka.aggregator", + "namespace": "org.radarcns.stream.aggregator", "type": "record", - "name": "AggregatorDoubleArray", + "name": "DoubleArrayAggregation", "doc": "Result of data aggregation.", "fields": [ { "name": "min", "type": {"type": "array", "items": "double"}, "doc": "For each component, it states the minimum between accumulated values." }, diff --git a/commons/kafka/aggregator/aggregator_phone_usage.avsc b/commons/stream/aggregator/phone_usage_aggregation.avsc similarity index 90% rename from commons/kafka/aggregator/aggregator_phone_usage.avsc rename to commons/stream/aggregator/phone_usage_aggregation.avsc index a2aaa3fc..deea8c14 100644 --- a/commons/kafka/aggregator/aggregator_phone_usage.avsc +++ b/commons/stream/aggregator/phone_usage_aggregation.avsc @@ -1,7 +1,7 @@ { - "namespace": "org.radarcns.kafka.aggregator", + "namespace": "org.radarcns.stream.aggregator", "type": "record", - "name": "AggregatorPhoneUsage", + "name": "PhoneUsageAggregation", "doc": "Aggregate time and opening events for an app.", "fields": [ {"name": "packageName", "type": "string", "doc": "Package name of the app in use."}, diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java index 32db5edb..7c3a2a1e 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java @@ -141,7 +141,7 @@ private Map> getTopicsInfoVerbose(boolean prettyPrin source -> source.getScope() + " - " + source.getName(), source -> source.getData().stream() .collect(Collectors.toMap( - DataTopic::getType, d -> d.toString(prettyPrint))))); + DataTopic::getTopic, d -> d.toString(prettyPrint))))); } public int validateSchemas(Namespace ns) { diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/DataTopic.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/DataTopic.java index f548e178..680d62ca 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/DataTopic.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/DataTopic.java @@ -1,12 +1,13 @@ package org.radarcns.schema.specification; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import org.radarcns.catalogue.Unit; import org.radarcns.config.AvroTopicConfig; -import org.radarcns.kafka.key.KeyMeasurement; +import org.radarcns.kafka.MeasurementKey; import org.radarcns.topic.AvroTopic; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -21,6 +22,7 @@ import static com.fasterxml.jackson.dataformat.yaml.YAMLGenerator.Feature.MINIMIZE_QUOTES; import static com.fasterxml.jackson.dataformat.yaml.YAMLGenerator.Feature.WRITE_DOC_START_MARKER; +import static org.radarcns.schema.util.Utils.expandClass; /** DataTopic topic from a data producer. */ public class DataTopic extends AvroTopicConfig { @@ -45,11 +47,11 @@ public class DataTopic extends AvroTopicConfig { private List fields; /** - * DataTopic using KeyMeasurement as the default key. + * DataTopic using MeasurementKey as the default key. */ public DataTopic() { // default value - setKeySchema(KeyMeasurement.class.getName()); + setKeySchema(MeasurementKey.class.getName()); } /** Get all topic names that are provided by the data. */ @@ -65,8 +67,8 @@ public Stream getTopicNames() { | NoSuchMethodException | InvocationTargetException | IllegalAccessException ex) { - throw new IOException("Cannot parse schemas Avro Topic " + getTopic() - + ", with key_schema " + getKeySchema() + throw new IOException("Cannot parse Avro Topic " + getTopic() + + " schemas, with key_schema " + getKeySchema() + " and value_schema " + getValueSchema(), ex); } } @@ -95,6 +97,18 @@ public List getFields() { return fields; } + @Override + @JsonSetter + public void setKeySchema(String schema) { + super.setKeySchema(expandClass(schema)); + } + + @Override + @JsonSetter + public void setValueSchema(String schema) { + super.setValueSchema(expandClass(schema)); + } + @Override public String toString() { return toString(false); diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java index 0bc4d99c..979cf1e5 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java @@ -178,6 +178,14 @@ public PassiveSource getPassiveSource(String type) { return passiveSources.get(type); } + public Map getStreamGroups() { + return streamGroups; + } + + public Set> getSources() { + return sources; + } + /** * TODO. * @return TODO @@ -191,12 +199,4 @@ public Stream getTopicNames() { return sources.stream() .flatMap(DataProducer::getTopics); } - - public Map getStreamGroups() { - return streamGroups; - } - - public Set> getSources() { - return sources; - } } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/QuestionnaireDataTopic.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/QuestionnaireDataTopic.java index 951cb624..2d7c3f76 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/QuestionnaireDataTopic.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/active/questionnaire/QuestionnaireDataTopic.java @@ -1,5 +1,3 @@ -package org.radarcns.schema.specification.active.questionnaire; - /* * Copyright 2017 King's College London and The Hyve * @@ -16,6 +14,8 @@ * limitations under the License. */ +package org.radarcns.schema.specification.active.questionnaire; + import com.fasterxml.jackson.annotation.JsonProperty; import org.radarcns.schema.specification.DataTopic; @@ -31,8 +31,7 @@ public enum RadarSourceTypes { PHQ8 } - @JsonProperty - @NotEmpty + @JsonProperty @NotEmpty private List questions; public List getQuestions() { diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/stream/StreamDataTopic.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/stream/StreamDataTopic.java index 9d964cdf..f7f9e9b5 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/stream/StreamDataTopic.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/stream/StreamDataTopic.java @@ -4,19 +4,22 @@ import com.fasterxml.jackson.annotation.JsonSetter; import org.radarcns.catalogue.TimeFrame; import org.radarcns.catalogue.Unit; -import org.radarcns.kafka.key.KeyMeasurement; -import org.radarcns.kafka.key.KeyWindowed; +import org.radarcns.config.AvroTopicConfig; +import org.radarcns.kafka.MeasurementKey; +import org.radarcns.kafka.WindowedKey; import org.radarcns.schema.specification.DataTopic; import org.radarcns.topic.AvroTopic; import javax.validation.constraints.NotBlank; import java.io.IOException; import java.util.Arrays; +import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.stream.Stream; import static org.radarcns.schema.util.Utils.applyOrEmpty; +//@JsonDeserialize(builder = StreamDataTopic.StreamDataTopicBuilder) public class StreamDataTopic extends DataTopic { public enum TimeLabel { @@ -45,7 +48,7 @@ public long getIntervalInMilliSec() { return intervalInMilliSec; } - public String getTimedTopic(String topic) { + public String getLabel(String topic) { return topic + label; } } @@ -60,25 +63,36 @@ public String getTimedTopic(String topic) { @NotBlank private String inputTopic; + @JsonProperty("topic_base") + private String topicBase; + @JsonSetter @SuppressWarnings("PMD.UnusedPrivateMethod") private void setWindowed(boolean windowed) { this.windowed = windowed; if (windowed && (this.getKeySchema() == null - || this.getKeySchema().equals(KeyMeasurement.class.getName()))) { - this.setKeySchema(KeyWindowed.class.getName()); + || this.getKeySchema().equals(MeasurementKey.class.getName()))) { + this.setKeySchema(WindowedKey.class.getName()); } } @JsonSetter @SuppressWarnings("PMD.UnusedPrivateMethod") private void setInputTopic(String inputTopic) { - if (getTopic() == null) { - setTopic(inputTopic + "_output"); + if (topicBase == null) { + topicBase = inputTopic; } this.inputTopic = inputTopic; } + public String getTopic() { + if (windowed) { + return topicBase + "_"; + } else { + return topicBase + "_output"; + } + } + public boolean isWindowed() { return windowed; } @@ -91,36 +105,54 @@ public Unit getUnit() { return unit; } + public String getTopicBase() { + return topicBase; + } + public Stream getTopicNames() { if (windowed) { return Arrays.stream(TimeLabel.values()) - .map(label -> label.getTimedTopic(inputTopic)) - .flatMap(topic -> Stream.of(topic, "From-" + inputTopic + "-To-" + topic)); + .map(label -> label.getLabel(topicBase)); } else { - return Stream.of(getTopic(), "From-" + inputTopic + "-To-" + getTopic()); + String currentTopic = getTopic(); + if (currentTopic == null) { + currentTopic = topicBase + "_output"; + setTopic(currentTopic); + } + return Stream.of(currentTopic); } } public Stream> getTopics() throws IOException { - if (windowed) { - return Arrays.stream(TimeLabel.values()) - .map(label -> label.getTimedTopic(inputTopic)) - .flatMap(applyOrEmpty(topic -> { - setTopic(topic); - return super.getTopics(); - })); - } else { - return super.getTopics(); - } + return getTopicNames() + .flatMap(applyOrEmpty(topic -> { + AvroTopicConfig config = new AvroTopicConfig(); + config.setTopic(topic); + config.setKeySchema(getKeySchema()); + config.setValueSchema(getValueSchema()); + return Stream.of(config.parseAvroTopic()); + })); } public Stream getTimedTopicNames() { if (windowed) { - return Arrays.stream(TimeLabel.values()) - .map(label -> label.getTimedTopic(inputTopic)) - .flatMap(topic -> Stream.of(topic, "From-" + inputTopic + "-To-" + topic)); + return getTopicNames(); } else { return Stream.empty(); } } + + @Override + protected void propertiesMap(Map properties, boolean reduce) { + properties.put("input_topic", inputTopic); + properties.put("windowed", windowed); + if (!reduce) { + if (!topicBase.equals(inputTopic)) { + properties.put("topic_base", topicBase); + } + if (unit != null) { + properties.put("unit", unit); + } + } + } } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/Utils.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/Utils.java index 316acd67..85e6d179 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/Utils.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/Utils.java @@ -16,17 +16,13 @@ package org.radarcns.schema.util; -import org.radarcns.kafka.aggregator.AggregatorDouble; -import org.radarcns.kafka.aggregator.AggregatorDoubleArray; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.InputStream; -import java.util.HashSet; import java.util.Locale; import java.util.Properties; -import java.util.Set; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Stream; @@ -40,14 +36,6 @@ public final class Utils { private static final String GROUP_PROPERTY = "project.group"; private static String projectGroup; - private static final Set TIMED_AGGREGATOR; - - static { - TIMED_AGGREGATOR = new HashSet<>(); - TIMED_AGGREGATOR.add(AggregatorDouble.class.getCanonicalName()); - TIMED_AGGREGATOR.add(AggregatorDoubleArray.class.getCanonicalName()); - } - private Utils() { //Static class } @@ -91,15 +79,6 @@ public static String expandClass(String classShorthand) { } } - /** - * TODO. - * @param aggregator TODO - * @return TODO - */ - public static boolean isTimedAggregator(String aggregator) { - return TIMED_AGGREGATOR.contains(aggregator); - } - public static String toSnakeCase(String value) { char[] fileName = value.toCharArray(); diff --git a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SourceCatalogueValidation.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SourceCatalogueValidation.java index 1e899dab..585cb261 100644 --- a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SourceCatalogueValidation.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/SourceCatalogueValidation.java @@ -33,6 +33,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import static org.radarcns.schema.specification.SourceCatalogue.BASE_PATH; import static org.radarcns.schema.validation.ValidationSupport.isValidTopic; @@ -91,4 +92,17 @@ public void validateTopics() { assertEquals(expected, catalogue.getTopicNames().sorted().collect(Collectors.toList())); } + + @Test + public void validateTopicSchemas() { + catalogue.getSources().stream() + .flatMap(source -> source.getData().stream()) + .forEach(data -> { + try { + assertTrue(data.getTopics().count() > 0); + } catch (IOException ex) { + fail("Cannot create topic from specification: " + ex); + } + }); + } } diff --git a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/util/UtilsTest.java b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/util/UtilsTest.java index c34265c1..89232e1e 100644 --- a/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/util/UtilsTest.java +++ b/java-sdk/radar-schemas-tools/src/test/java/org/radarcns/schema/validation/util/UtilsTest.java @@ -1,5 +1,3 @@ -package org.radarcns.schema.validation.util; - /* * Copyright 2017 King's College London and The Hyve * @@ -16,15 +14,13 @@ * limitations under the License. */ -import static junit.framework.TestCase.assertFalse; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +package org.radarcns.schema.validation.util; import org.junit.Test; -import org.radarcns.kafka.aggregator.AggregatorDouble; -import org.radarcns.kafka.aggregator.AggregatorDoubleArray; import org.radarcns.schema.util.Utils; +import static org.junit.Assert.assertEquals; + /** * TODO. */ @@ -34,12 +30,4 @@ public class UtilsTest { public void projectGroupTest() { assertEquals("org.radarcns", Utils.getProjectGroup()); } - - @Test - public void timedAggregatorTest() { - assertTrue(Utils.isTimedAggregator(AggregatorDouble.class.getCanonicalName())); - assertTrue(Utils.isTimedAggregator(AggregatorDoubleArray.class.getCanonicalName())); - assertFalse(Utils.isTimedAggregator(getClass().getCanonicalName())); - } - } diff --git a/java-sdk/radar-schemas-tools/src/test/resources/key_measurement_test.avsc b/java-sdk/radar-schemas-tools/src/test/resources/key_measurement_test.avsc index 9b6b0f09..30e3314a 100644 --- a/java-sdk/radar-schemas-tools/src/test/resources/key_measurement_test.avsc +++ b/java-sdk/radar-schemas-tools/src/test/resources/key_measurement_test.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.kafka.key", "type": "record", - "name": "KeyMeasurementTest", + "name": "MeasurementKeyTest", "doc": "Measurement key in the RADAR-CNS project.", "fields": [ {"name": "userTestId", "type": "string", "doc": "User Identifier created during the enrolment."}, diff --git a/java-sdk/radar-schemas-tools/src/test/resources/key_windowed_test.avsc b/java-sdk/radar-schemas-tools/src/test/resources/key_windowed_test.avsc index 5ae0e6a9..11501954 100644 --- a/java-sdk/radar-schemas-tools/src/test/resources/key_windowed_test.avsc +++ b/java-sdk/radar-schemas-tools/src/test/resources/key_windowed_test.avsc @@ -1,6 +1,6 @@ {"namespace": "org.radarcns.kafka.key", "type": "record", - "name": "KeyWindowedTest", + "name": "WindowedKeyTest", "doc": "Windowed key in the RADAR-CNS project", "fields": [ {"name": "userTestId", "type": "string", "doc": "User Identifier created during the enrolment."}, diff --git a/specifications/monitor/radar_prmt.yml b/specifications/monitor/radar_prmt.yml index c3e5961e..ede0f1f8 100644 --- a/specifications/monitor/radar_prmt.yml +++ b/specifications/monitor/radar_prmt.yml @@ -1,27 +1,26 @@ name: ANDROID_PHONE doc: Status updates from the RADAR-CNS pRMT app. +app_provider: .application.ApplicationServiceProvider data: - type: EXTERNAL_TIME - app_provider: .application.ApplicationServiceProvider doc: Information sent by the Android pRMT about time synchronisation with a NTS different from the default one. default_sample_interval: 300 + unit: SECOND topic: application_external_time value_schema: .monitor.application.ApplicationExternalTime - type: RECORD_COUNTS - app_provider: .application.ApplicationServiceProvider doc: Monitor used by the Android pRMT to report the number of cached and created records. default_sample_interval: 300 topic: application_record_counts value_schema: .monitor.application.ApplicationRecordCounts - type: SERVER_STATUS doc: Monitor used by the Android pRMT to report the server connection status between the android client and the RADAR-CNS Platform. - app_provider: .application.ApplicationServiceProvider default_sample_interval: 300 topic: application_server_status value_schema: .monitor.application.ApplicationServerStatus - type: UPTIME doc: Monitor used by the Android pRMT to notify the time duration since last reboot. - app_provider: .application.ApplicationServiceProvider default_sample_interval: 300 + unit: SECOND topic: application_uptime value_schema: .monitor.application.ApplicationUptime \ No newline at end of file diff --git a/specifications/stream/android_phone.yml b/specifications/stream/android_phone.yml index c2313f03..050bb553 100644 --- a/specifications/stream/android_phone.yml +++ b/specifications/stream/android_phone.yml @@ -1,40 +1,4 @@ name: ANDROID_PHONE -doc: Aggregation of Biovotion data -master: .kafka.stream.biovotion.BiovotionVsm1Master -data: - - input_topic: android_biovotion_vsm1_acceleration - value_schema: .kafka.aggregator.AggregatorDoubleArray - windowed: true - - input_topic: android_biovotion_vsm1_battery_level - value_schema: .kafka.aggregator.AggregatorDouble - windowed: true - - input_topic: android_biovotion_vsm1_blood_volume_pulse - value_schema: .kafka.aggregator.AggregatorDouble - windowed: true - - input_topic: android_biovotion_vsm1_energy - value_schema: .kafka.aggregator.AggregatorDouble - windowed: true - - input_topic: android_biovotion_vsm1_galvanic_skin_response - value_schema: .kafka.aggregator.AggregatorDoubleArray - windowed: true - - input_topic: android_biovotion_vsm1_heartrate - value_schema: .kafka.aggregator.AggregatorDouble - windowed: true - - input_topic: android_biovotion_vsm1_heartrate_variability - value_schema: .kafka.aggregator.AggregatorDouble - windowed: true - - input_topic: android_biovotion_vsm1_led_current - value_schema: .kafka.aggregator.AggregatorDoubleArray - windowed: true - - input_topic: android_biovotion_vsm1_ppg_raw - value_schema: .kafka.aggregator.AggregatorDoubleArray - windowed: true - - input_topic: android_biovotion_vsm1_respiration_rate - value_schema: .kafka.aggregator.AggregatorDouble - windowed: true - - input_topic: android_biovotion_vsm1_oxygen_saturation - value_schema: .kafka.aggregator.AggregatorDouble - windowed: true - - input_topic: android_biovotion_vsm1_temperature - value_schema: .kafka.aggregator.AggregatorDouble - windowed: true +doc: Aggregation of Phone data +master: .stream.phone.PhoneStreamMaster +data: [] \ No newline at end of file diff --git a/specifications/stream/biovotion_vsm1.yml b/specifications/stream/biovotion_vsm1.yml index 09c38407..e5ba4376 100644 --- a/specifications/stream/biovotion_vsm1.yml +++ b/specifications/stream/biovotion_vsm1.yml @@ -3,38 +3,38 @@ doc: Aggregation of Biovotion data master: .kafka.stream.biovotion.BiovotionVsm1Master data: - input_topic: android_biovotion_vsm1_acceleration - value_schema: .kafka.aggregator.AggregatorDoubleArray + value_schema: .stream.aggregator.DoubleArrayAggregation windowed: true - input_topic: android_biovotion_vsm1_battery_level - value_schema: .kafka.aggregator.AggregatorDouble + value_schema: .stream.aggregator.DoubleAggregation windowed: true - input_topic: android_biovotion_vsm1_blood_volume_pulse - value_schema: .kafka.aggregator.AggregatorDouble + value_schema: .stream.aggregator.DoubleAggregation windowed: true - input_topic: android_biovotion_vsm1_energy - value_schema: .kafka.aggregator.AggregatorDouble + value_schema: .stream.aggregator.DoubleAggregation windowed: true - input_topic: android_biovotion_vsm1_galvanic_skin_response - value_schema: .kafka.aggregator.AggregatorDoubleArray + value_schema: .stream.aggregator.DoubleArrayAggregation windowed: true - input_topic: android_biovotion_vsm1_heartrate - value_schema: .kafka.aggregator.AggregatorDouble + value_schema: .stream.aggregator.DoubleAggregation windowed: true - input_topic: android_biovotion_vsm1_heartrate_variability - value_schema: .kafka.aggregator.AggregatorDouble + value_schema: .stream.aggregator.DoubleAggregation windowed: true - input_topic: android_biovotion_vsm1_led_current - value_schema: .kafka.aggregator.AggregatorDoubleArray + value_schema: .stream.aggregator.DoubleArrayAggregation windowed: true - input_topic: android_biovotion_vsm1_ppg_raw - value_schema: .kafka.aggregator.AggregatorDoubleArray + value_schema: .stream.aggregator.DoubleArrayAggregation windowed: true - input_topic: android_biovotion_vsm1_respiration_rate - value_schema: .kafka.aggregator.AggregatorDouble + value_schema: .stream.aggregator.DoubleAggregation windowed: true - input_topic: android_biovotion_vsm1_oxygen_saturation - value_schema: .kafka.aggregator.AggregatorDouble + value_schema: .stream.aggregator.DoubleAggregation windowed: true - input_topic: android_biovotion_vsm1_temperature - value_schema: .kafka.aggregator.AggregatorDouble + value_schema: .stream.aggregator.DoubleAggregation windowed: true diff --git a/specifications/stream/empatica_e4.yml b/specifications/stream/empatica_e4.yml index 0b4985dd..a28e26ad 100644 --- a/specifications/stream/empatica_e4.yml +++ b/specifications/stream/empatica_e4.yml @@ -3,29 +3,29 @@ doc: Aggregation and conversion of Empatica E4 data master: .kafka.stream.biovotion.EmpaticaE4Master data: - input_topic: android_empatica_e4_acceleration - value_schema: .kafka.aggregator.AggregatorDoubleArray + value_schema: .stream.aggregator.DoubleArrayAggregation windowed: true - input_topic: android_empatica_e4_battery_level - value_schema: .kafka.aggregator.AggregatorDouble + value_schema: .stream.aggregator.DoubleAggregation windowed: true - input_topic: android_empatica_e4_blood_volume_pulse - value_schema: .kafka.aggregator.AggregatorDouble + value_schema: .stream.aggregator.DoubleAggregation windowed: true - input_topic: android_empatica_e4_electrodermal_activity - value_schema: .kafka.aggregator.AggregatorDouble + value_schema: .stream.aggregator.DoubleAggregation windowed: true - input_topic: android_empatica_e4_inter_beat_interval - value_schema: .kafka.aggregator.AggregatorDouble + value_schema: .stream.aggregator.DoubleAggregation windowed: true - input_topic: android_empatica_e4_temperature - value_schema: .kafka.aggregator.AggregatorDouble + value_schema: .stream.aggregator.DoubleAggregation windowed: true - type: HEART_RATE unit: BEATS_PER_MIN input_topic: android_empatica_e4_inter_beat_interval - topic: android_empatica_e4_heartrate - value_schema: .passive.empatica.EmpaticaE4HeartRate - default_sample_rate: 1.0 + topic_base: android_empatica_e4_heart_rate + windowed: true + value_schema: .stream.aggregator.DoubleAggregation - input_topic: android_empatica_e4_heartrate - value_schema: .kafka.aggregator.AggregatorDouble + value_schema: .stream.aggregator.DoubleAggregation windowed: true From d9c738a1b3dd5e68032cd291b56d53d01d51a0e0 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Thu, 21 Sep 2017 15:57:08 +0200 Subject: [PATCH 075/112] Merged and fixed validation --- .../active/questionnaire/questionnaire.avsc | 2 +- .../phone/phone_bluetooth_devices.avsc | 13 +++++++ .../phone/phone_contact_list.avsc | 6 ++-- commons/passive/weather/weather_current.avsc | 35 +++++++++++++++++++ commons/phone/phone_bluetooth_devices.avsc | 13 ------- commons/weather/weather_current.avsc | 35 ------------------- .../src/test/resources/key_windowed_test.avsc | 2 +- restapi/app/application.avsc | 14 ++++---- restapi/data/acceleration.avsc | 6 ++-- restapi/data/double_sample.avsc | 2 +- restapi/data/quartiles.avsc | 8 ++--- restapi/dataset/dataset.avsc | 4 +-- restapi/dataset/item.avsc | 2 +- restapi/header/descriptive_statistic.avsc | 2 +- restapi/header/effective_time_frame.avsc | 2 +- restapi/message.avsc | 2 +- restapi/source/sensor.avsc | 10 +++--- restapi/source/source.avsc | 8 ++--- restapi/source/source_summary.avsc | 10 +++--- restapi/source/states.avsc | 2 +- restapi/spec/sensor_specification.avsc | 10 +++--- restapi/spec/source_specification.avsc | 6 ++-- restapi/subject/cohort.avsc | 6 ++-- restapi/subject/subject.avsc | 10 +++--- 24 files changed, 105 insertions(+), 105 deletions(-) create mode 100644 commons/passive/phone/phone_bluetooth_devices.avsc rename commons/{ => passive}/phone/phone_contact_list.avsc (80%) create mode 100644 commons/passive/weather/weather_current.avsc delete mode 100644 commons/phone/phone_bluetooth_devices.avsc delete mode 100644 commons/weather/weather_current.avsc diff --git a/commons/active/questionnaire/questionnaire.avsc b/commons/active/questionnaire/questionnaire.avsc index bfcfd4c0..f4d47f2d 100644 --- a/commons/active/questionnaire/questionnaire.avsc +++ b/commons/active/questionnaire/questionnaire.avsc @@ -13,7 +13,7 @@ "items": { "name": "Answer", "type": "record", - "doc": "Questionnaire answer", + "doc": "Questionnaire answer.", "fields": [ { "name": "value", "type": ["int", "string", "double"], "doc": "Subject answer." }, { "name": "startTime", "type": "double", "doc": "Timestamp in UTC (s) when the question is shown." }, diff --git a/commons/passive/phone/phone_bluetooth_devices.avsc b/commons/passive/phone/phone_bluetooth_devices.avsc new file mode 100644 index 00000000..4f5d6b29 --- /dev/null +++ b/commons/passive/phone/phone_bluetooth_devices.avsc @@ -0,0 +1,13 @@ +{ + "namespace": "org.radarcns.passive.phone", + "type": "record", + "name": "PhoneBluetoothDevices", + "doc": "Phone Bluetooth devices info.", + "fields": [ + {"name": "time", "type": "double", "doc": "Device timestamp in UTC (s)."}, + {"name": "timeReceived", "type": "double", "doc": "Device receiver timestamp in UTC (s)."}, + {"name": "pairedDevices", "type": ["null", "int"], "default": null, "doc": "Number of paired devices."}, + {"name": "nearbyDevices", "type": ["null", "int"], "default": null, "doc": "Number of nearby devices."}, + {"name": "bluetoothEnabled", "type": "boolean", "doc": "Whether Bluetooth is enabled."} + ] +} diff --git a/commons/phone/phone_contact_list.avsc b/commons/passive/phone/phone_contact_list.avsc similarity index 80% rename from commons/phone/phone_contact_list.avsc rename to commons/passive/phone/phone_contact_list.avsc index fd1df052..a9e06bf4 100644 --- a/commons/phone/phone_contact_list.avsc +++ b/commons/passive/phone/phone_contact_list.avsc @@ -1,11 +1,11 @@ { - "namespace": "org.radarcns.phone", + "namespace": "org.radarcns.passive.phone", "type": "record", "name": "PhoneContactList", "doc": "Data describing the number of contacts in the the list of contacts and its change since the previous check.", "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, + {"name": "time", "type": "double", "doc": "Device timestamp in UTC (s)."}, + {"name": "timeReceived", "type": "double", "doc": "Device receiver timestamp in UTC (s)."}, {"name": "contactsAdded", "type": ["null", "int"], "default": null, "doc": "Number of new contacts added to the list of contacts since the previous measurement that was sent. The value is null if this is the first measurement or if the previous measurement is unknown to the sender."}, {"name": "contactsRemoved", "type": ["null", "int"], "default": null, "doc": "Number of new contacts removed from the list of contacts since the previous measurement that was sent. The value is null if this is the first measurement or if the previous measurement is unknown to the sender."}, {"name": "contacts", "type": "int", "doc": "Current number of contacts in the list of contacts."} diff --git a/commons/passive/weather/weather_current.avsc b/commons/passive/weather/weather_current.avsc new file mode 100644 index 00000000..01b578a2 --- /dev/null +++ b/commons/passive/weather/weather_current.avsc @@ -0,0 +1,35 @@ +{ + "namespace": "org.radarcns.passive.weather", + "type": "record", + "name": "WeatherCurrent", + "doc": "Current weather information at the location of the user.", + "fields": [ + {"name": "time", "type": "double", "doc": "Device timestamp in UTC (s)."}, + {"name": "timeReceived", "type": "double", "doc": "Device receiver timestamp in UTC (s)."}, + {"name": "sunrise", "type": ["null","int"], "doc": "Sunrise time of day in minutes after midnight. The difference with sunset is the minutes of daylight.", "default": null}, + {"name": "sunset", "type": ["null","int"], "doc": "Sunset time of day in minutes after midnight. The difference with sunrise is the minutes of daylight.", "default": null}, + {"name": "temperature", "type": ["null","float"], "doc": "Current ambient temperature (C).", "default": null}, + {"name": "pressure", "type": ["null","float"], "doc": "Current atmospheric pressure on sea level (hPa).", "default": null}, + {"name": "humidity", "type": ["null","float"], "doc": "Current humidity (%).", "default": null}, + {"name": "cloudiness", "type": ["null","float"], "doc": "Current cloudiness (%).", "default": null}, + {"name": "precipitation", "type": ["null","float"], "doc": "Rain or snow volume over last hours reported in 'percipitationPeriod' (mm).", "default": null}, + {"name": "precipitationPeriod", "type": ["null","int"], "doc": "Period over which the precipitation was determined (h).", "default": null}, + {"name": "condition", "type": { + "name": "WeatherCondition", + "type": "enum", + "doc": "Types of weather condition.", + "symbols": ["CLEAR", "CLOUDY", "DRIZZLE", "RAINY", "SNOWY", "ICY", "FOGGY", "STORM", "THUNDER", "OTHER", "UNKNOWN"] + }, + "default": "UNKNOWN", + "doc": "Current weather condition."}, + {"name": "source", "type": "string", "doc": "From which source/API the weather data was retrieved."}, + {"name": "locationSource", "type": { + "name": "LocationType", + "type": "enum", + "doc": "How the location was determined.", + "symbols": ["GPS","NETWORK","CITY_NAME","OTHER", "UNKNOWN"] + }, + "default": "UNKNOWN", + "doc": "The source of the location used to get the weather details."} + ] +} diff --git a/commons/phone/phone_bluetooth_devices.avsc b/commons/phone/phone_bluetooth_devices.avsc deleted file mode 100644 index e931bb0b..00000000 --- a/commons/phone/phone_bluetooth_devices.avsc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "namespace": "org.radarcns.phone", - "type": "record", - "name": "PhoneBluetoothDevices", - "doc": "Phone Bluetooth devices info.", - "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "pairedDevices", "type": ["null", "int"], "default": "null", "doc": "Number of paired devices"}, - {"name": "nearbyDevices", "type": ["null", "int"], "default": "null", "doc": "Number of nearby devices"}, - {"name": "bluetoothEnabled", "type": "boolean", "doc": "whether Bluetooth is enabled"} - ] -} diff --git a/commons/weather/weather_current.avsc b/commons/weather/weather_current.avsc deleted file mode 100644 index 0cc27454..00000000 --- a/commons/weather/weather_current.avsc +++ /dev/null @@ -1,35 +0,0 @@ -{ - "namespace": "org.radarcns.weather", - "type": "record", - "name": "WeatherCurrent", - "doc": "Current weather information at the location of the user.", - "fields": [ - {"name": "time", "type": "double", "doc": "device timestamp in UTC (s)"}, - {"name": "timeReceived", "type": "double", "doc": "device receiver timestamp in UTC (s)"}, - {"name": "sunrise", "type": ["null","int"], "doc": "sunrise time of day in minutes after midnight. The difference with sunset is the minutes of daylight.", "default": null}, - {"name": "sunset", "type": ["null","int"], "doc": "sunset time of day in minutes after midnight. The difference with sunrise is the minutes of daylight.", "default": null}, - {"name": "temperature", "type": ["null","float"], "doc": "current ambient temperature (C)", "default": null}, - {"name": "pressure", "type": ["null","float"], "doc": "current atmospheric pressure on sea level (hPa)", "default": null}, - {"name": "humidity", "type": ["null","float"], "doc": "current humidity (%)", "default": null}, - {"name": "cloudiness", "type": ["null","float"], "doc": "current cloudiness (%)", "default": null}, - {"name": "precipitation", "type": ["null","float"], "doc": "rain or snow volume over last hours reported in 'percipitationPeriod' (mm)", "default": null}, - {"name": "precipitationPeriod", "type": ["null","int"], "doc": "period over which the precipitation was determined (h)", "default": null}, - {"name": "condition", "type": { - "name": "WeatherCondition", - "type": "enum", - "doc": "types of weather condition", - "symbols": ["CLEAR", "CLOUDY", "DRIZZLE", "RAINY", "SNOWY", "ICY", "FOGGY", "STORM", "THUNDER", "OTHER", "UNKNOWN"] - }, - "default": "UNKNOWN", - "doc": "current weather condition"}, - {"name": "source", "type": "string", "doc": "from which source/API the weather data was retrieved"}, - {"name": "locationSource", "type": { - "name": "LocationType", - "type": "enum", - "doc": "how the location was determined", - "symbols": ["GPS","NETWORK","CITY_NAME","OTHER", "UNKNOWN"] - }, - "default": "UNKNOWN", - "doc": "the source of the location used to get the weather details"} - ] -} diff --git a/java-sdk/radar-schemas-tools/src/test/resources/key_windowed_test.avsc b/java-sdk/radar-schemas-tools/src/test/resources/key_windowed_test.avsc index 11501954..4695338f 100644 --- a/java-sdk/radar-schemas-tools/src/test/resources/key_windowed_test.avsc +++ b/java-sdk/radar-schemas-tools/src/test/resources/key_windowed_test.avsc @@ -1,7 +1,7 @@ {"namespace": "org.radarcns.kafka.key", "type": "record", "name": "WindowedKeyTest", - "doc": "Windowed key in the RADAR-CNS project", + "doc": "Windowed key in the RADAR-CNS project.", "fields": [ {"name": "userTestId", "type": "string", "doc": "User Identifier created during the enrolment."}, {"name": "sourceTestId", "type": "string", "doc": "Unique identifier associated with the source."}, diff --git a/restapi/app/application.avsc b/restapi/app/application.avsc index 826b5556..080cf15f 100644 --- a/restapi/app/application.avsc +++ b/restapi/app/application.avsc @@ -2,15 +2,15 @@ "namespace": "org.radarcns.restapi.app", "type": "record", "name": "Application", - "doc": "Smartphone application status", + "doc": "Smartphone application status.", "fields": [ {"name": "ipAddress", "type": [ "null", - "string" ], "doc": "Hardware identifier of client application", "default": null}, - {"name": "uptime", "type": "double", "doc": "Time since last app start (s)"}, - {"name": "serverStatus", "type": "org.radarcns.monitor.application.ServerStatus", "doc": "Server connection status", "default": "UNKNOWN"}, - {"name": "recordsCached", "type": "int", "doc": "Number of records currently being cached", "default": -1}, - {"name": "recordsSent", "type": "int", "doc": "Number of records sent since application start"}, - {"name": "recordsUnsent", "type": "int", "doc": "Number of unsent records", "default": -1} + "string" ], "doc": "Hardware identifier of client application.", "default": null}, + {"name": "uptime", "type": "double", "doc": "Time since last app start (s)."}, + {"name": "serverStatus", "type": "org.radarcns.monitor.application.ServerStatus", "doc": "Server connection status.", "default": "UNKNOWN"}, + {"name": "recordsCached", "type": "int", "doc": "Number of records currently being cached.", "default": -1}, + {"name": "recordsSent", "type": "int", "doc": "Number of records sent since application start."}, + {"name": "recordsUnsent", "type": "int", "doc": "Number of unsent records.", "default": -1} ] } diff --git a/restapi/data/acceleration.avsc b/restapi/data/acceleration.avsc index 4bf0d891..9d69b3e2 100644 --- a/restapi/data/acceleration.avsc +++ b/restapi/data/acceleration.avsc @@ -4,8 +4,8 @@ "name": "Acceleration", "doc": "Acceleration sample with gravitational constant g as unit.", "fields": [ - {"name": "x", "type": [ "double" , "org.radarcns.restapi.data.Quartiles" ], "doc": "Acceleration in the x-axis (g)"}, - {"name": "y", "type": [ "double" , "org.radarcns.restapi.data.Quartiles" ], "doc": "Acceleration in the y-axis (g)"}, - {"name": "z", "type": [ "double" , "org.radarcns.restapi.data.Quartiles" ], "doc": "Acceleration in the z-axis (g)"} + {"name": "x", "type": [ "double" , "org.radarcns.restapi.data.Quartiles" ], "doc": "Acceleration in the x-axis (g)."}, + {"name": "y", "type": [ "double" , "org.radarcns.restapi.data.Quartiles" ], "doc": "Acceleration in the y-axis (g)."}, + {"name": "z", "type": [ "double" , "org.radarcns.restapi.data.Quartiles" ], "doc": "Acceleration in the z-axis (g)."} ] } diff --git a/restapi/data/double_sample.avsc b/restapi/data/double_sample.avsc index e9eeeef8..9c1b3717 100644 --- a/restapi/data/double_sample.avsc +++ b/restapi/data/double_sample.avsc @@ -4,6 +4,6 @@ "name": "DoubleSample", "doc": "Generic sample represented by a double value. A specific schema is provided to represent quartile values.", "fields": [ - {"name": "value", "type": [ "double" , "org.radarcns.restapi.data.Quartiles" ], "doc": "Sample value"} + {"name": "value", "type": [ "double" , "org.radarcns.restapi.data.Quartiles" ], "doc": "Sample value."} ] } diff --git a/restapi/data/quartiles.avsc b/restapi/data/quartiles.avsc index f07f6b38..9ce54b72 100644 --- a/restapi/data/quartiles.avsc +++ b/restapi/data/quartiles.avsc @@ -2,10 +2,10 @@ "namespace": "org.radarcns.restapi.data", "type": "record", "name": "Quartiles", - "doc": "List of quartiles", + "doc": "List of quartiles.", "fields": [ - {"name": "first", "type": "double", "doc": "The middle number between the smallest number and the median of the data set"}, - {"name": "second", "type": "double", "doc": "The median of the data"}, - {"name": "third", "type": "double", "doc": "The middle value between the median and the highest value of the data set"} + {"name": "first", "type": "double", "doc": "The middle number between the smallest number and the median of the data set."}, + {"name": "second", "type": "double", "doc": "The median of the data."}, + {"name": "third", "type": "double", "doc": "The middle value between the median and the highest value of the data set."} ] } diff --git a/restapi/dataset/dataset.avsc b/restapi/dataset/dataset.avsc index 600c2031..a790ea1c 100644 --- a/restapi/dataset/dataset.avsc +++ b/restapi/dataset/dataset.avsc @@ -4,7 +4,7 @@ "name": "Dataset", "doc": "A generic collection of samples. Its body is divide in Header and Dataset: metadata and sensor data.", "fields": [ - {"name": "header", "type": "org.radarcns.restapi.header.Header", "doc": "Information useful to contextualise the data set"}, - {"name": "dataset", "type": {"type": "array", "items": "Item" }, "doc": "Collection of samples"} + {"name": "header", "type": "org.radarcns.restapi.header.Header", "doc": "Information useful to contextualise the data set."}, + {"name": "dataset", "type": {"type": "array", "items": "Item" }, "doc": "Collection of samples."} ] } diff --git a/restapi/dataset/item.avsc b/restapi/dataset/item.avsc index 0db75d1e..e918efc8 100644 --- a/restapi/dataset/item.avsc +++ b/restapi/dataset/item.avsc @@ -8,7 +8,7 @@ "org.radarcns.restapi.data.DoubleSample" , "org.radarcns.restapi.data.Acceleration", "org.radarcns.active.questionnaire.Questionnaire" - ], "doc": "Sample value. For more details, check org.radarcns.restapi.data.Acceleration, org.radarcns.restapi.data.DoubleSample and org.radarcns.questionnaire.Questionnaire" } , + ], "doc": "Sample value. For more details, check org.radarcns.restapi.data.Acceleration, org.radarcns.restapi.data.DoubleSample and org.radarcns.questionnaire.Questionnaire." } , {"name": "startDateTime", "type": "string", "doc": "Point in time (ISO8601) with UTC timezone. It represents the timestamp of the first sample contained inside the aggregated data."} ] } diff --git a/restapi/header/descriptive_statistic.avsc b/restapi/header/descriptive_statistic.avsc index c2e7b61a..6fa8b02c 100644 --- a/restapi/header/descriptive_statistic.avsc +++ b/restapi/header/descriptive_statistic.avsc @@ -2,7 +2,7 @@ "namespace": "org.radarcns.restapi.header", "type": "enum", "name": "DescriptiveStatistic", - "doc": "Statical values", + "doc": "Statical values.", "symbols": [ "AVERAGE" , "COUNT" , diff --git a/restapi/header/effective_time_frame.avsc b/restapi/header/effective_time_frame.avsc index c35a5112..4737a589 100644 --- a/restapi/header/effective_time_frame.avsc +++ b/restapi/header/effective_time_frame.avsc @@ -2,7 +2,7 @@ "namespace": "org.radarcns.restapi.header", "type": "record", "name": "EffectiveTimeFrame", - "doc": "Provide the first and the last timestamp contained in the dataset", + "doc": "Provide the first and the last timestamp contained in the dataset.", "fields": [ {"name": "startDateTime", "type": "string", "doc": "It is a point in time (ISO8601) with UTC timezone."}, {"name": "endDateTime", "type": "string", "doc": "It is a point in time (ISO8601) with UTC timezone."} diff --git a/restapi/message.avsc b/restapi/message.avsc index a56f70a7..60a07535 100644 --- a/restapi/message.avsc +++ b/restapi/message.avsc @@ -2,7 +2,7 @@ "namespace": "org.radarcns.restapi.avro", "type": "record", "name": "Message", - "doc": "Message to provide information to the end user in case a function does not provide the expected result", + "doc": "Message to provide information to the end user in case a function does not provide the expected result.", "fields": [ {"name": "message", "type": "string"} ] diff --git a/restapi/source/sensor.avsc b/restapi/source/sensor.avsc index 17a613c9..afcdbb3d 100644 --- a/restapi/source/sensor.avsc +++ b/restapi/source/sensor.avsc @@ -2,11 +2,11 @@ "namespace": "org.radarcns.restapi.source", "type": "record", "name": "Sensor", - "doc": "Sensor details", + "doc": "Sensor details.", "fields": [ - {"name": "name", "type": "org.radarcns.catalogue.SensorName", "doc": "Sensor name"}, - {"name": "state", "type": "States", "default": "UNKNOWN", "doc": "Current sensor state computed using the received data"}, - {"name": "receivedMessage", "type": "int", "default": -1, "doc": "Amount of received messages"}, - {"name": "messageLoss", "type": "double", "default": -1.0, "doc": "Percentage of lost messages"} + {"name": "name", "type": "org.radarcns.catalogue.SensorName", "doc": "Sensor name."}, + {"name": "state", "type": "States", "default": "UNKNOWN", "doc": "Current sensor state computed using the received data."}, + {"name": "receivedMessage", "type": "int", "default": -1, "doc": "Amount of received messages."}, + {"name": "messageLoss", "type": "double", "default": -1.0, "doc": "Percentage of lost messages."} ] } diff --git a/restapi/source/source.avsc b/restapi/source/source.avsc index 0455913a..d78a8477 100644 --- a/restapi/source/source.avsc +++ b/restapi/source/source.avsc @@ -2,10 +2,10 @@ "namespace": "org.radarcns.restapi.source", "type": "record", "name": "Source", - "doc": "Source details", + "doc": "Source details.", "fields": [ - {"name": "id", "type": "string", "doc": "Source identifier" }, - {"name": "type", "type": "string", "doc": "Source name" }, - {"name": "summary", "type": ["null", "SourceSummary"], "default": null, "doc": "Source details" } + {"name": "id", "type": "string", "doc": "Source identifier." }, + {"name": "type", "type": "string", "doc": "Source name." }, + {"name": "summary", "type": ["null", "SourceSummary"], "default": null, "doc": "Source details." } ] } diff --git a/restapi/source/source_summary.avsc b/restapi/source/source_summary.avsc index 7afcd79e..88ab99a2 100644 --- a/restapi/source/source_summary.avsc +++ b/restapi/source/source_summary.avsc @@ -2,11 +2,11 @@ "namespace": "org.radarcns.restapi.source", "type": "record", "name": "SourceSummary", - "doc": "Details about the source with details for each sensor", + "doc": "Details about the source with details for each sensor.", "fields": [ - {"name": "state", "type": "States", "default": "UNKNOWN", "doc": "Current source state computed using the received data"}, - {"name": "receivedMessage", "type": "int", "default": -1, "doc": "Amount of received messages"}, - {"name": "messageLoss", "type": "double", "default": -1.0, "doc": "Percentage of lost messages"}, - {"name": "sensors", "type": {"type": "map", "values": "Sensor", "doc": "States of on board sensors. It is a Map where the key is the String conversion of a SensorType"} } + {"name": "state", "type": "States", "default": "UNKNOWN", "doc": "Current source state computed using the received data."}, + {"name": "receivedMessage", "type": "int", "default": -1, "doc": "Amount of received messages."}, + {"name": "messageLoss", "type": "double", "default": -1.0, "doc": "Percentage of lost messages."}, + {"name": "sensors", "type": {"type": "map", "values": "Sensor", "doc": "States of on board sensors. It is a Map where the key is the String conversion of a SensorType."} } ] } diff --git a/restapi/source/states.avsc b/restapi/source/states.avsc index 757695ea..cff06fe3 100644 --- a/restapi/source/states.avsc +++ b/restapi/source/states.avsc @@ -2,6 +2,6 @@ "namespace": "org.radarcns.restapi.source", "type": "enum", "name": "States", - "doc": "Set of device status", + "doc": "Set of device status.", "symbols": [ "FINE" , "OK", "WARNING", "DISCONNECTED", "UNKNOWN" ] } diff --git a/restapi/spec/sensor_specification.avsc b/restapi/spec/sensor_specification.avsc index f94e8e75..a3945889 100644 --- a/restapi/spec/sensor_specification.avsc +++ b/restapi/spec/sensor_specification.avsc @@ -2,11 +2,11 @@ "namespace": "org.radarcns.restapi.spec", "type": "record", "name": "SensorSpecification", - "doc": "Sensor specification", + "doc": "Sensor specification.", "fields": [ - {"name": "name", "type": "org.radarcns.catalogue.SensorName", "doc": "Sensor name"}, - {"name": "dataType", "type": "org.radarcns.catalogue.ProcessingState", "doc": "Explains if the values is a raw data, otherwise it reports who computes it"}, - {"name": "frequency", "type": "double", "default": -1.0, "doc": "Number of expected samples per second"}, - {"name": "unit", "type": "org.radarcns.catalogue.Unit", "doc": "Measurement unit used by the sensor"} + {"name": "name", "type": "org.radarcns.catalogue.SensorName", "doc": "Sensor name."}, + {"name": "dataType", "type": "org.radarcns.catalogue.ProcessingState", "doc": "Explains if the values is a raw data, otherwise it reports who computes it."}, + {"name": "frequency", "type": "double", "default": -1.0, "doc": "Number of expected samples per second."}, + {"name": "unit", "type": "org.radarcns.catalogue.Unit", "doc": "Measurement unit used by the sensor."} ] } diff --git a/restapi/spec/source_specification.avsc b/restapi/spec/source_specification.avsc index edc6e064..0e78e1b7 100644 --- a/restapi/spec/source_specification.avsc +++ b/restapi/spec/source_specification.avsc @@ -2,9 +2,9 @@ "namespace": "org.radarcns.restapi.spec", "type": "record", "name": "SourceSpecification", - "doc": "Source specification", + "doc": "Source specification.", "fields": [ - {"name": "name", "type": "string", "doc": "Source name"}, - {"name": "sensors", "type": {"type": "map", "values": "SensorSpecification" }, "doc": "Specifications of on board sensors. It is a map where the key is the String conversion of a SensorType"} + {"name": "name", "type": "string", "doc": "Source name."}, + {"name": "sensors", "type": {"type": "map", "values": "SensorSpecification" }, "doc": "Specifications of on board sensors. It is a map where the key is the String conversion of a SensorType."} ] } diff --git a/restapi/subject/cohort.avsc b/restapi/subject/cohort.avsc index 9a601dde..228f738e 100644 --- a/restapi/subject/cohort.avsc +++ b/restapi/subject/cohort.avsc @@ -2,9 +2,9 @@ "namespace": "org.radarcns.restapi.subject", "type": "record", "name": "Cohort", - "doc": "Cohort definition", + "doc": "Cohort definition.", "fields": [ - {"name": "studyId", "type": "int", "doc": "ID related to the study"}, - {"name": "subjects", "type": {"type": "array", "items": "Subject" }, "doc": "List of Subject involved in the study"} + {"name": "studyId", "type": "int", "doc": "ID related to the study."}, + {"name": "subjects", "type": {"type": "array", "items": "Subject" }, "doc": "List of Subject involved in the study."} ] } diff --git a/restapi/subject/subject.avsc b/restapi/subject/subject.avsc index e60b8afc..fec62498 100644 --- a/restapi/subject/subject.avsc +++ b/restapi/subject/subject.avsc @@ -2,11 +2,11 @@ "namespace": "org.radarcns.restapi.subject", "type": "record", "name": "Subject", - "doc": "Subject definition", + "doc": "Subject definition.", "fields": [ - {"name": "subjectId", "type": "string", "doc": "Subject identifier"}, - {"name": "active", "type": "boolean", "doc": "True if the subject is engaged, false otherwise. False means the subject is no longer monitored" }, - {"name": "effectiveTimeFrame", "type": "org.radarcns.restapi.header.EffectiveTimeFrame", "doc": "Timestamps of the first and the last samples received by the subject" }, - {"name": "sources", "type": {"type": "array", "items": "org.radarcns.restapi.source.Source" }, "doc": "List of sources used by the subject"} + {"name": "subjectId", "type": "string", "doc": "Subject identifier."}, + {"name": "active", "type": "boolean", "doc": "True if the subject is engaged, false otherwise. False means the subject is no longer monitored." }, + {"name": "effectiveTimeFrame", "type": "org.radarcns.restapi.header.EffectiveTimeFrame", "doc": "Timestamps of the first and the last samples received by the subject." }, + {"name": "sources", "type": {"type": "array", "items": "org.radarcns.restapi.source.Source" }, "doc": "List of sources used by the subject."} ] } From 15d95253f7f026c3bce81981bd0539c9d7507a16 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Thu, 21 Sep 2017 16:49:56 +0200 Subject: [PATCH 076/112] Updated README --- README.md | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 596cc3e9..d01ffbe7 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,17 @@ [![Build Status](https://travis-ci.org/RADAR-CNS/RADAR-Schemas.svg?branch=master)](https://travis-ci.org/RADAR-CNS/RADAR-Schemas) -[Avro schemas](https://avro.apache.org/docs/1.8.1/spec.html) used in RADAR-CNS. The schemas are divided into three parts: `commons` for the passive remote monitoring application and the backend, `restapi` for the REST API, and `questionnaire` for the active remote monitoring application. - -Java SDKs for each of the components are provided in the `java-sdk` folder, see installation instructions there. They are automatically generated from the Avro schemas using the Avro 1.8.1 specification. +[Avro schemas](https://avro.apache.org/docs/1.8.2/spec.html) used in RADAR-CNS. The schemas are organized as follows: + +- The `commons` directory contains all schemas used inside Kafka and data fed into Kafka. + - In the `passive` subdirectory, add schemas for passive data collection, like wearables. + - In the `active` subdirectory, add schemas for active data collection, like questionnaires or assignments. + - In the `monitor` subdirectory, add schemas for monitoring applications that gather data. + - In the `kafka` subdirectory, add schemas used throughtout Kafka, like record keys. + - In the `stream` subdirectory, add schemas used in Kafka Streams. +- The `restapi` directory contains schemas used to get data from the RADAR-CNS REST API. +- The `specifications` directory contains specifications of what data types are collected through which devices. +- Java SDKs for each of the components are provided in the `java-sdk` folder, see installation instructions there. They are automatically generated from the Avro schemas using the Avro 1.8.2 specification. ## Contributing @@ -16,12 +24,12 @@ In addition, schemas in the `commons` directory should follow the following guid - There should be no need to add `value` at the end of a field name. - Enumerator items should be written in uppercase characters separated by underscores. - Add documentation (the `doc` property) to each schema and each field. The documentation should show in text what is being measured, how, and what units or ranges are applicable. Abbreviations and acronyms in the documentation should be written out. -- Prefer a categorical specification (an Avro enum) over a free string. This disambiguates the possible values for analysis. +- Prefer a categorical specification (an Avro enum) over a free string if the number of values are almost never expected to change. This disambiguates the possible values for analysis. - Prefer a flat record over a hierarchical record. This simplifies the organization of the data downstream, for example, when mapping to CSV. - Prefer written out fields to arrays. This simplifies the organization of the data downstream, for example, when mapping to CSV. -- Give each schema a proper namespace, preferably `org.radarcns.` fully in lowercase, without any numbers, uppercase letters or symbols (except `.`). For the Empatica E4, the vendor is Empatica, so the namespace is `org.radarcns.empatica`. For generic types, like a phone, Android Wear device or Android application, the namespace could just be `org.radarcns.phone`, `org.radarcns.wear`, or `org.radarcns.application`. +- Give each schema a proper namespace, preferably `org.radarcns.passive.` fully in lowercase, without any numbers, uppercase letters or symbols (except `.`). For the Empatica E4, the vendor is Empatica, so the namespace is `org.radarcns.passive.empatica`. For generic types, like a phone, Android Wear device or Android application, the namespace could just be `org.radarcns.passive.phone`, `org.radarcns.passive.wear`, or `org.radarcns.monitor.application`. - In the schema name, use upper camel case and name the device explicitly (for example, `EmpaticaE4Temperature`). ### Validation phase -Avro schemas are automatically validated against RADAR-CNS guide lines while building. Record Name and field name validations can be suppressed configuring [skip.yml](java-sdk/radar-schemas-validator/src/test/resources/skip.yml). For more details, check [catalog validator](java-sdk/radar-schemas-validator). +Avro schemas are automatically validated against RADAR-CNS guide lines while building. For more details, check [catalog validator](java-sdk/radar-schemas-tools). From d041b062516bcb3e460426e229b64828aac35ad6 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Mon, 25 Sep 2017 10:30:40 +0200 Subject: [PATCH 077/112] Renamed weather --- .../weather/{weather_current.avsc => local_weather.avsc} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename commons/passive/weather/{weather_current.avsc => local_weather.avsc} (98%) diff --git a/commons/passive/weather/weather_current.avsc b/commons/passive/weather/local_weather.avsc similarity index 98% rename from commons/passive/weather/weather_current.avsc rename to commons/passive/weather/local_weather.avsc index 01b578a2..f3109699 100644 --- a/commons/passive/weather/weather_current.avsc +++ b/commons/passive/weather/local_weather.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.passive.weather", "type": "record", - "name": "WeatherCurrent", + "name": "LocalWeather", "doc": "Current weather information at the location of the user.", "fields": [ {"name": "time", "type": "double", "doc": "Device timestamp in UTC (s)."}, From 8905281607e48c111ec0c458306fb62660354f53 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Mon, 25 Sep 2017 10:37:31 +0200 Subject: [PATCH 078/112] Fixed tests and references to TimeFrame --- .../{time_frame.avsc => time_window.avsc} | 4 +-- .../specification/stream/StreamDataTopic.java | 27 +++++++++---------- restapi/header/header.avsc | 2 +- 3 files changed, 16 insertions(+), 17 deletions(-) rename commons/catalogue/{time_frame.avsc => time_window.avsc} (72%) diff --git a/commons/catalogue/time_frame.avsc b/commons/catalogue/time_window.avsc similarity index 72% rename from commons/catalogue/time_frame.avsc rename to commons/catalogue/time_window.avsc index 601d1ae6..e85cfb4b 100644 --- a/commons/catalogue/time_frame.avsc +++ b/commons/catalogue/time_window.avsc @@ -1,8 +1,8 @@ { "namespace": "org.radarcns.catalogue", "type": "enum", - "name": "TimeFrame", - "doc": "Interval between two consecutive samples.", + "name": "TimeWindow", + "doc": "Time window for aggregated measurements.", "symbols": [ "TEN_SECOND" , "ONE_MIN" , diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/stream/StreamDataTopic.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/stream/StreamDataTopic.java index f7f9e9b5..5c1ff220 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/stream/StreamDataTopic.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/stream/StreamDataTopic.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonSetter; -import org.radarcns.catalogue.TimeFrame; +import org.radarcns.catalogue.TimeWindow; import org.radarcns.catalogue.Unit; import org.radarcns.config.AvroTopicConfig; import org.radarcns.kafka.MeasurementKey; @@ -19,29 +19,28 @@ import static org.radarcns.schema.util.Utils.applyOrEmpty; -//@JsonDeserialize(builder = StreamDataTopic.StreamDataTopicBuilder) public class StreamDataTopic extends DataTopic { public enum TimeLabel { - TEN_SECOND(TimeFrame.TEN_SECOND, TimeUnit.SECONDS.toMillis(10), "_10sec"), - ONE_MIN(TimeFrame.ONE_MIN, TimeUnit.MINUTES.toMillis(1), "_1min"), - TEN_MIN(TimeFrame.TEN_MIN, TimeUnit.MINUTES.toMillis(10), "_10min"), - ONE_HOUR(TimeFrame.ONE_HOUR, TimeUnit.HOURS.toMillis(1), "_1hour"), - ONE_DAY(TimeFrame.ONE_DAY, TimeUnit.DAYS.toMillis(1), "_1day"), - ONE_WEEK(TimeFrame.ONE_WEEK, TimeUnit.DAYS.toMillis(7), "_1week"); - - private final TimeFrame timeFrame; + TEN_SECOND(TimeWindow.TEN_SECOND, TimeUnit.SECONDS.toMillis(10), "_10sec"), + ONE_MIN(TimeWindow.ONE_MIN, TimeUnit.MINUTES.toMillis(1), "_1min"), + TEN_MIN(TimeWindow.TEN_MIN, TimeUnit.MINUTES.toMillis(10), "_10min"), + ONE_HOUR(TimeWindow.ONE_HOUR, TimeUnit.HOURS.toMillis(1), "_1hour"), + ONE_DAY(TimeWindow.ONE_DAY, TimeUnit.DAYS.toMillis(1), "_1day"), + ONE_WEEK(TimeWindow.ONE_WEEK, TimeUnit.DAYS.toMillis(7), "_1week"); + + private final TimeWindow timeWindow; private final long intervalInMilliSec; private final String label; - TimeLabel(TimeFrame timeFrame, long intervalInMilliSec, String label) { - this.timeFrame = timeFrame; + TimeLabel(TimeWindow timeWindow, long intervalInMilliSec, String label) { + this.timeWindow = timeWindow; this.intervalInMilliSec = intervalInMilliSec; this.label = label; } - public TimeFrame getTimeFrame() { - return timeFrame; + public TimeWindow getTimeWindow() { + return timeWindow; } public long getIntervalInMilliSec() { diff --git a/restapi/header/header.avsc b/restapi/header/header.avsc index a8d8e638..e156372a 100644 --- a/restapi/header/header.avsc +++ b/restapi/header/header.avsc @@ -10,7 +10,7 @@ { "name": "type", "type": ["org.radarcns.catalogue.SensorName", "string"], "doc": "Report the sensor name or specific type of assessment." }, { "name": "descriptiveStatistic", "type": "DescriptiveStatistic", "doc": "Statical value expressed by samples." }, { "name": "unit", "type": "org.radarcns.catalogue.Unit", "doc": "Unit used by the source." }, - { "name": "timeFrame", "type": "org.radarcns.catalogue.TimeFrame", "doc": "Time interval between two consecutive samples." }, + { "name": "timeWindow", "type": "org.radarcns.catalogue.TimeWindow", "doc": "Time interval between two consecutive samples." }, { "name": "effectiveTimeFrame", "type": "EffectiveTimeFrame", "doc": "Timestamps of the first and the last samples contained in the dataset." } ] } From 82be2822918ca31af187e63461e5b3be0d48f3b2 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Tue, 26 Sep 2017 09:39:01 +0200 Subject: [PATCH 079/112] Made TimeWindow data available for commons --- .../radarcns/stream/TimeWindowMetadata.java | 37 ++++++++++++++++++ .../specification/stream/StreamDataTopic.java | 38 ++----------------- 2 files changed, 40 insertions(+), 35 deletions(-) create mode 100644 java-sdk/radar-schemas-commons/src/main/java/org/radarcns/stream/TimeWindowMetadata.java diff --git a/java-sdk/radar-schemas-commons/src/main/java/org/radarcns/stream/TimeWindowMetadata.java b/java-sdk/radar-schemas-commons/src/main/java/org/radarcns/stream/TimeWindowMetadata.java new file mode 100644 index 00000000..985bdcb1 --- /dev/null +++ b/java-sdk/radar-schemas-commons/src/main/java/org/radarcns/stream/TimeWindowMetadata.java @@ -0,0 +1,37 @@ +package org.radarcns.stream; + +import org.radarcns.catalogue.TimeWindow; + +import java.util.concurrent.TimeUnit; + +/** TimeWindow labels and window time period. */ +public enum TimeWindowMetadata { + TEN_SECOND(TimeWindow.TEN_SECOND, TimeUnit.SECONDS.toMillis(10), "_10sec"), + ONE_MIN(TimeWindow.ONE_MIN, TimeUnit.MINUTES.toMillis(1), "_1min"), + TEN_MIN(TimeWindow.TEN_MIN, TimeUnit.MINUTES.toMillis(10), "_10min"), + ONE_HOUR(TimeWindow.ONE_HOUR, TimeUnit.HOURS.toMillis(1), "_1hour"), + ONE_DAY(TimeWindow.ONE_DAY, TimeUnit.DAYS.toMillis(1), "_1day"), + ONE_WEEK(TimeWindow.ONE_WEEK, TimeUnit.DAYS.toMillis(7), "_1week"); + + private final TimeWindow timeWindow; + private final long intervalInMilliSec; + private final String label; + + TimeWindowMetadata(TimeWindow timeWindow, long intervalInMilliSec, String label) { + this.timeWindow = timeWindow; + this.intervalInMilliSec = intervalInMilliSec; + this.label = label; + } + + public TimeWindow getTimeWindow() { + return timeWindow; + } + + public long getIntervalInMilliSec() { + return intervalInMilliSec; + } + + public String getTopicLabel(String topic) { + return topic + label; + } +} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/stream/StreamDataTopic.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/stream/StreamDataTopic.java index 5c1ff220..5f7d87c7 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/stream/StreamDataTopic.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/stream/StreamDataTopic.java @@ -2,56 +2,24 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonSetter; -import org.radarcns.catalogue.TimeWindow; import org.radarcns.catalogue.Unit; import org.radarcns.config.AvroTopicConfig; import org.radarcns.kafka.MeasurementKey; import org.radarcns.kafka.WindowedKey; import org.radarcns.schema.specification.DataTopic; +import org.radarcns.stream.TimeWindowMetadata; import org.radarcns.topic.AvroTopic; import javax.validation.constraints.NotBlank; import java.io.IOException; import java.util.Arrays; import java.util.Map; -import java.util.concurrent.TimeUnit; import java.util.stream.Stream; import static org.radarcns.schema.util.Utils.applyOrEmpty; public class StreamDataTopic extends DataTopic { - public enum TimeLabel { - TEN_SECOND(TimeWindow.TEN_SECOND, TimeUnit.SECONDS.toMillis(10), "_10sec"), - ONE_MIN(TimeWindow.ONE_MIN, TimeUnit.MINUTES.toMillis(1), "_1min"), - TEN_MIN(TimeWindow.TEN_MIN, TimeUnit.MINUTES.toMillis(10), "_10min"), - ONE_HOUR(TimeWindow.ONE_HOUR, TimeUnit.HOURS.toMillis(1), "_1hour"), - ONE_DAY(TimeWindow.ONE_DAY, TimeUnit.DAYS.toMillis(1), "_1day"), - ONE_WEEK(TimeWindow.ONE_WEEK, TimeUnit.DAYS.toMillis(7), "_1week"); - - private final TimeWindow timeWindow; - private final long intervalInMilliSec; - private final String label; - - TimeLabel(TimeWindow timeWindow, long intervalInMilliSec, String label) { - this.timeWindow = timeWindow; - this.intervalInMilliSec = intervalInMilliSec; - this.label = label; - } - - public TimeWindow getTimeWindow() { - return timeWindow; - } - - public long getIntervalInMilliSec() { - return intervalInMilliSec; - } - - public String getLabel(String topic) { - return topic + label; - } - } - @JsonProperty private boolean windowed = false; @@ -110,8 +78,8 @@ public String getTopicBase() { public Stream getTopicNames() { if (windowed) { - return Arrays.stream(TimeLabel.values()) - .map(label -> label.getLabel(topicBase)); + return Arrays.stream(TimeWindowMetadata.values()) + .map(label -> label.getTopicLabel(topicBase)); } else { String currentTopic = getTopic(); if (currentTopic == null) { From 7bedb373ab6363d8edf33ac9daf114b9c6c34c92 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Tue, 26 Sep 2017 10:01:59 +0200 Subject: [PATCH 080/112] Moved sensor_name and added RadarSourceDataType --- commons/catalogue/sensor_name.avsc | 35 ------------------- .../passive/PassiveDataTopic.java | 10 +++++- 2 files changed, 9 insertions(+), 36 deletions(-) delete mode 100644 commons/catalogue/sensor_name.avsc diff --git a/commons/catalogue/sensor_name.avsc b/commons/catalogue/sensor_name.avsc deleted file mode 100644 index 81ada32b..00000000 --- a/commons/catalogue/sensor_name.avsc +++ /dev/null @@ -1,35 +0,0 @@ -{ - "namespace": "org.radarcns.catalogue", - "type": "enum", - "name": "SensorName", - "doc": "Sensor types.", - "symbols": [ - "ACCELEROMETER" , - "BATTERY", - "BLOOD_VOLUME_PULSE", - "BLOOD_PULSE_WAVE", - "ELECTRODERMAL_ACTIVITY", - "ENERGY", - "GALVANIC_SKIN_RESPONSE", - "GYROSCOPE", - "HEART_RATE", - "HEART_RATE_FILTERED", - "HEART_RATE_VARIABILITY", - "INTER_BEAT_INTERVAL", - "LED", - "LIGHT", - "MAGNETIC_FIELD", - "OXYGEN_SATURATION", - "PHONE_CALL", - "PHONE_SMS", - "PHONE_SMS_UNREAD", - "PHOTOPLETHYSMOGRAPHY", - "RELATIVE_LOCATION", - "RESPIRATION_RATE", - "STEP_COUNT", - "THERMOMETER", - "USAGE_EVENT", - "USER_INTERACTION", - "UNKNOWN" - ] -} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveDataTopic.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveDataTopic.java index ca2057df..808d84c8 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveDataTopic.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveDataTopic.java @@ -26,6 +26,14 @@ * TODO. */ public class PassiveDataTopic extends AppDataTopic { + public enum RadarSourceDataTypes { + ACCELEROMETER, BATTERY, BLOOD_VOLUME_PULSE, BLOOD_PULSE_WAVE, ELECTRODERMAL_ACTIVITY, + ENERGY, GALVANIC_SKIN_RESPONSE, GYROSCOPE, HEART_RATE, HEART_RATE_FILTERED, + HEART_RATE_VARIABILITY, INTER_BEAT_INTERVAL, LED, LIGHT, MAGNETIC_FIELD, OXYGEN_SATURATION, + PHONE_CALL, PHONE_SMS, PHONE_SMS_UNREAD, PHOTOPLETHYSMOGRAPHY, RELATIVE_LOCATION, + RESPIRATION_RATE, STEP_COUNT, THERMOMETER, USAGE_EVENT, USER_INTERACTION + } + @JsonProperty("processing_state") private ProcessingState processingState; @@ -38,7 +46,7 @@ public boolean equals(Object o) { if (this == o) { return true; } - if (o == null || getClass() != o.getClass() || !super.equals(o)) { + if (!super.equals(o)) { return false; } PassiveDataTopic passiveData = (PassiveDataTopic) o; From ecf7c9abfca56bf28bf04bf2b38240a1ef647cc5 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Tue, 26 Sep 2017 10:25:50 +0200 Subject: [PATCH 081/112] Added project ID to keys --- commons/kafka/{windowed_key.avsc => aggregate_key.avsc} | 5 +++-- .../kafka/{measurement_key.avsc => observation_key.avsc} | 5 +++-- .../java/org/radarcns/schema/specification/DataTopic.java | 6 +++--- .../schema/specification/stream/StreamDataTopic.java | 8 ++++---- .../src/test/resources/key_measurement_test.avsc | 2 +- .../src/test/resources/key_windowed_test.avsc | 2 +- 6 files changed, 15 insertions(+), 13 deletions(-) rename commons/kafka/{windowed_key.avsc => aggregate_key.avsc} (68%) rename commons/kafka/{measurement_key.avsc => observation_key.avsc} (55%) diff --git a/commons/kafka/windowed_key.avsc b/commons/kafka/aggregate_key.avsc similarity index 68% rename from commons/kafka/windowed_key.avsc rename to commons/kafka/aggregate_key.avsc index 7e0a6dd9..e60a04d2 100644 --- a/commons/kafka/windowed_key.avsc +++ b/commons/kafka/aggregate_key.avsc @@ -1,9 +1,10 @@ { "namespace": "org.radarcns.kafka", "type": "record", - "name": "WindowedKey", - "doc": "Windowed key in the RADAR-CNS project.", + "name": "AggregateKey", + "doc": "Key of an aggregated stream. The stream will work with time windows.", "fields": [ + {"name": "projectId", "type": ["null", "string"], "doc": "Project that the key belongs to.", "default": null}, {"name": "userId", "type": "string", "doc": "User Identifier created during the enrolment."}, {"name": "sourceId", "type": "string", "doc": "Unique identifier associated with the source."}, {"name": "start", "type": "long", "doc": "First timestamp in UNIX time contained in the time window."}, diff --git a/commons/kafka/measurement_key.avsc b/commons/kafka/observation_key.avsc similarity index 55% rename from commons/kafka/measurement_key.avsc rename to commons/kafka/observation_key.avsc index 8f2004ce..4c382462 100644 --- a/commons/kafka/measurement_key.avsc +++ b/commons/kafka/observation_key.avsc @@ -1,9 +1,10 @@ { "namespace": "org.radarcns.kafka", "type": "record", - "name": "MeasurementKey", - "doc": "Measurement key in the RADAR-CNS project.", + "name": "ObservationKey", + "doc": "Key of an observation.", "fields": [ + {"name": "projectId", "type": ["null", "string"], "doc": "Project identifier. Null if unknown or the user is not enrolled in a project.", "default": null}, {"name": "userId", "type": "string", "doc": "User Identifier created during the enrolment."}, {"name": "sourceId", "type": "string", "doc": "Unique identifier associated with the source."} ] diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/DataTopic.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/DataTopic.java index 680d62ca..ce423d2b 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/DataTopic.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/DataTopic.java @@ -7,7 +7,7 @@ import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import org.radarcns.catalogue.Unit; import org.radarcns.config.AvroTopicConfig; -import org.radarcns.kafka.MeasurementKey; +import org.radarcns.kafka.ObservationKey; import org.radarcns.topic.AvroTopic; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -47,11 +47,11 @@ public class DataTopic extends AvroTopicConfig { private List fields; /** - * DataTopic using MeasurementKey as the default key. + * DataTopic using ObservationKey as the default key. */ public DataTopic() { // default value - setKeySchema(MeasurementKey.class.getName()); + setKeySchema(ObservationKey.class.getName()); } /** Get all topic names that are provided by the data. */ diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/stream/StreamDataTopic.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/stream/StreamDataTopic.java index 5f7d87c7..9a7e62cc 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/stream/StreamDataTopic.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/stream/StreamDataTopic.java @@ -4,8 +4,8 @@ import com.fasterxml.jackson.annotation.JsonSetter; import org.radarcns.catalogue.Unit; import org.radarcns.config.AvroTopicConfig; -import org.radarcns.kafka.MeasurementKey; -import org.radarcns.kafka.WindowedKey; +import org.radarcns.kafka.ObservationKey; +import org.radarcns.kafka.AggregateKey; import org.radarcns.schema.specification.DataTopic; import org.radarcns.stream.TimeWindowMetadata; import org.radarcns.topic.AvroTopic; @@ -38,8 +38,8 @@ public class StreamDataTopic extends DataTopic { private void setWindowed(boolean windowed) { this.windowed = windowed; if (windowed && (this.getKeySchema() == null - || this.getKeySchema().equals(MeasurementKey.class.getName()))) { - this.setKeySchema(WindowedKey.class.getName()); + || this.getKeySchema().equals(ObservationKey.class.getName()))) { + this.setKeySchema(AggregateKey.class.getName()); } } diff --git a/java-sdk/radar-schemas-tools/src/test/resources/key_measurement_test.avsc b/java-sdk/radar-schemas-tools/src/test/resources/key_measurement_test.avsc index 30e3314a..a8fc5f2b 100644 --- a/java-sdk/radar-schemas-tools/src/test/resources/key_measurement_test.avsc +++ b/java-sdk/radar-schemas-tools/src/test/resources/key_measurement_test.avsc @@ -1,7 +1,7 @@ { "namespace": "org.radarcns.kafka.key", "type": "record", - "name": "MeasurementKeyTest", + "name": "ObservationKeyTest", "doc": "Measurement key in the RADAR-CNS project.", "fields": [ {"name": "userTestId", "type": "string", "doc": "User Identifier created during the enrolment."}, diff --git a/java-sdk/radar-schemas-tools/src/test/resources/key_windowed_test.avsc b/java-sdk/radar-schemas-tools/src/test/resources/key_windowed_test.avsc index 4695338f..bf682e32 100644 --- a/java-sdk/radar-schemas-tools/src/test/resources/key_windowed_test.avsc +++ b/java-sdk/radar-schemas-tools/src/test/resources/key_windowed_test.avsc @@ -1,6 +1,6 @@ {"namespace": "org.radarcns.kafka.key", "type": "record", - "name": "WindowedKeyTest", + "name": "AggregateKeyTest", "doc": "Windowed key in the RADAR-CNS project.", "fields": [ {"name": "userTestId", "type": "string", "doc": "User Identifier created during the enrolment."}, From 17a0a035741cde6782b3a2c7b230b73faf4aced0 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Tue, 26 Sep 2017 10:35:25 +0200 Subject: [PATCH 082/112] Fixed tests --- .../schema/validation/rules/SensorRoles.java | 13 +++++++++---- restapi/header/header.avsc | 2 +- restapi/source/sensor.avsc | 2 +- restapi/spec/sensor_specification.avsc | 2 +- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SensorRoles.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SensorRoles.java index 2ae9349a..229042d3 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SensorRoles.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/rules/SensorRoles.java @@ -17,9 +17,10 @@ package org.radarcns.schema.validation.rules; import org.radarcns.catalogue.ProcessingState; -import org.radarcns.catalogue.SensorName; import org.radarcns.schema.specification.passive.PassiveDataTopic; +import java.util.Arrays; + import static org.radarcns.schema.util.Utils.testOrFalse; import static org.radarcns.schema.validation.rules.PassiveSourceRoles.RADAR_PROVIDERS; import static org.radarcns.schema.validation.rules.Validator.validateNonNull; @@ -35,8 +36,8 @@ public final class SensorRoles { "PassiveDataTopic data type cannot be null and should differ from " + ProcessingState.UNKNOWN.name() + "."; private static final String NAME = - "PassiveDataTopic name cannot be not null and should different from " - + SensorName.UNKNOWN.name() + "."; + "PassiveDataTopic name cannot be not null and should be one of " + + Arrays.toString(PassiveDataTopic.RadarSourceDataTypes.values()) + "."; private SensorRoles() { // utility class @@ -66,6 +67,10 @@ static Validator validateDataType() { */ static Validator validateName() { return validateNonNull(PassiveDataTopic::getType, - testOrFalse(name -> SensorName.valueOf(name) != SensorName.UNKNOWN), NAME); + testOrFalse(name -> { + // is a valid RADAR source + PassiveDataTopic.RadarSourceDataTypes.valueOf(name); + return true; + }), NAME); } } diff --git a/restapi/header/header.avsc b/restapi/header/header.avsc index e156372a..c7b664f0 100644 --- a/restapi/header/header.avsc +++ b/restapi/header/header.avsc @@ -7,7 +7,7 @@ { "name": "subjectId", "type": "string", "doc": "Subject identifier." }, { "name": "sourceId", "type": "string", "doc": "Source identifier." }, { "name": "source", "type": "string", "doc": "Source information, it can be a device or assessment name." }, - { "name": "type", "type": ["org.radarcns.catalogue.SensorName", "string"], "doc": "Report the sensor name or specific type of assessment." }, + { "name": "type", "type": "string", "doc": "Report the sensor name or specific type of assessment." }, { "name": "descriptiveStatistic", "type": "DescriptiveStatistic", "doc": "Statical value expressed by samples." }, { "name": "unit", "type": "org.radarcns.catalogue.Unit", "doc": "Unit used by the source." }, { "name": "timeWindow", "type": "org.radarcns.catalogue.TimeWindow", "doc": "Time interval between two consecutive samples." }, diff --git a/restapi/source/sensor.avsc b/restapi/source/sensor.avsc index afcdbb3d..7b3a9283 100644 --- a/restapi/source/sensor.avsc +++ b/restapi/source/sensor.avsc @@ -4,7 +4,7 @@ "name": "Sensor", "doc": "Sensor details.", "fields": [ - {"name": "name", "type": "org.radarcns.catalogue.SensorName", "doc": "Sensor name."}, + {"name": "name", "type": "string", "doc": "Sensor name."}, {"name": "state", "type": "States", "default": "UNKNOWN", "doc": "Current sensor state computed using the received data."}, {"name": "receivedMessage", "type": "int", "default": -1, "doc": "Amount of received messages."}, {"name": "messageLoss", "type": "double", "default": -1.0, "doc": "Percentage of lost messages."} diff --git a/restapi/spec/sensor_specification.avsc b/restapi/spec/sensor_specification.avsc index a3945889..34d7c0a6 100644 --- a/restapi/spec/sensor_specification.avsc +++ b/restapi/spec/sensor_specification.avsc @@ -4,7 +4,7 @@ "name": "SensorSpecification", "doc": "Sensor specification.", "fields": [ - {"name": "name", "type": "org.radarcns.catalogue.SensorName", "doc": "Sensor name."}, + {"name": "name", "type": "string", "doc": "Sensor name."}, {"name": "dataType", "type": "org.radarcns.catalogue.ProcessingState", "doc": "Explains if the values is a raw data, otherwise it reports who computes it."}, {"name": "frequency", "type": "double", "default": -1.0, "doc": "Number of expected samples per second."}, {"name": "unit", "type": "org.radarcns.catalogue.Unit", "doc": "Measurement unit used by the sensor."} From 9acf5a257725f6cdc0eef207b167503eb97f7b1e Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Tue, 26 Sep 2017 12:16:09 +0200 Subject: [PATCH 083/112] Added back UNKNOWN symbol to phone usage event type --- commons/passive/phone/phone_usage_event.avsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/commons/passive/phone/phone_usage_event.avsc b/commons/passive/phone/phone_usage_event.avsc index 17982b89..99ed6459 100644 --- a/commons/passive/phone/phone_usage_event.avsc +++ b/commons/passive/phone/phone_usage_event.avsc @@ -13,7 +13,7 @@ "name": "UsageEventType", "type": "enum", "doc": "Android activity usage event type.", - "symbols": ["FOREGROUND", "BACKGROUND", "CONFIG", "SHORTCUT", "INTERACTION", "OTHER"] - }, "doc": "Whether the event brought app to foreground or background or neither." } + "symbols": ["FOREGROUND", "BACKGROUND", "CONFIG", "SHORTCUT", "INTERACTION", "OTHER", "UNKNOWN"] + }, "doc": "Whether the event brought app to foreground or background or neither.", "default": "UNKNOWN" } ] } From 0c89ad53d2df86e0b80f7bc9aec6f3b89c763bbc Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Wed, 27 Sep 2017 09:39:08 +0200 Subject: [PATCH 084/112] More specific about what freqency a topic has --- java-sdk/radar-schemas-tools/build.gradle | 2 + .../schema/specification/DataTopic.java | 18 ++------ .../specification/SampleRateConfig.java | 42 +++++++++++++++++++ specifications/monitor/radar_prmt.yml | 18 +++++--- specifications/passive/android_phone.yml | 34 +++++++++++++++ specifications/passive/biovotion_vsm1.yml | 36 ++++++++++------ specifications/passive/empatica_e4.yml | 18 +++++--- specifications/passive/pebble_2.yml | 12 ++++-- 8 files changed, 139 insertions(+), 41 deletions(-) create mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/SampleRateConfig.java diff --git a/java-sdk/radar-schemas-tools/build.gradle b/java-sdk/radar-schemas-tools/build.gradle index 64af8fe9..cfc802a1 100644 --- a/java-sdk/radar-schemas-tools/build.gradle +++ b/java-sdk/radar-schemas-tools/build.gradle @@ -43,6 +43,8 @@ task createStartScripts(type: CreateStartScripts) { // Test definition // //---------------------------------------------------------------------------// test { + inputs.dir "${project.rootDir}/../commons" + inputs.dir "${project.rootDir}/../specifications" testLogging { events "skipped", "failed" exceptionFormat "full" diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/DataTopic.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/DataTopic.java index ce423d2b..ff32383f 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/DataTopic.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/DataTopic.java @@ -34,11 +34,8 @@ public class DataTopic extends AvroTopicConfig { @JsonProperty private String doc; - @JsonProperty("default_sample_interval") - private Double sampleInterval; - - @JsonProperty("default_sample_rate") - private Double sampleRate; + @JsonProperty("sample_rate") + private SampleRateConfig sampleRate; @JsonProperty private Unit unit; @@ -81,11 +78,7 @@ public String getDoc() { return doc; } - public Double getSampleInterval() { - return sampleInterval; - } - - public Double getSampleRate() { + public SampleRateConfig getSampleRate() { return sampleRate; } @@ -151,11 +144,8 @@ protected void propertiesMap(Map map, boolean reduced) { map.put("value_schema", getValueSchema()); if (!reduced) { - if (sampleInterval != null) { - map.put("default_sample_interval", sampleInterval); - } if (sampleRate != null) { - map.put("default_sample_rate", sampleRate); + map.put("sample_rate", sampleRate); } if (unit != null) { map.put("unit", unit); diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/SampleRateConfig.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/SampleRateConfig.java new file mode 100644 index 00000000..55d272b2 --- /dev/null +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/SampleRateConfig.java @@ -0,0 +1,42 @@ +package org.radarcns.schema.specification; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class SampleRateConfig { + @JsonProperty + private Double interval; + + @JsonProperty + private Double frequency; + + @JsonProperty + private boolean dynamic; + + @JsonProperty + private boolean configurable; + + public Double getInterval() { + return interval; + } + + public Double getFrequency() { + return frequency; + } + + public boolean isDynamic() { + return dynamic; + } + + public boolean isConfigurable() { + return configurable; + } + + @Override + public String toString() { + return "SampleRateConfig{interval=" + interval + + ", frequency=" + frequency + + ", dynamic=" + dynamic + + ", configurable=" + configurable + + '}'; + } +} diff --git a/specifications/monitor/radar_prmt.yml b/specifications/monitor/radar_prmt.yml index ede0f1f8..e5d454ed 100644 --- a/specifications/monitor/radar_prmt.yml +++ b/specifications/monitor/radar_prmt.yml @@ -4,23 +4,31 @@ app_provider: .application.ApplicationServiceProvider data: - type: EXTERNAL_TIME doc: Information sent by the Android pRMT about time synchronisation with a NTS different from the default one. - default_sample_interval: 300 + sample_rate: + interval: 300 + configurable: true unit: SECOND topic: application_external_time value_schema: .monitor.application.ApplicationExternalTime - type: RECORD_COUNTS doc: Monitor used by the Android pRMT to report the number of cached and created records. - default_sample_interval: 300 + sample_rate: + interval: 300 + configurable: true topic: application_record_counts value_schema: .monitor.application.ApplicationRecordCounts - type: SERVER_STATUS doc: Monitor used by the Android pRMT to report the server connection status between the android client and the RADAR-CNS Platform. - default_sample_interval: 300 + sample_rate: + interval: 300 + configurable: true topic: application_server_status value_schema: .monitor.application.ApplicationServerStatus - type: UPTIME doc: Monitor used by the Android pRMT to notify the time duration since last reboot. - default_sample_interval: 300 + sample_rate: + interval: 300 + configurable: true unit: SECOND topic: application_uptime - value_schema: .monitor.application.ApplicationUptime \ No newline at end of file + value_schema: .monitor.application.ApplicationUptime diff --git a/specifications/passive/android_phone.yml b/specifications/passive/android_phone.yml index bbe449c1..d45d29d0 100644 --- a/specifications/passive/android_phone.yml +++ b/specifications/passive/android_phone.yml @@ -10,6 +10,9 @@ data: - name: x - name: y - name: z + sample_rate: + frequency: 5 + configurable: true processing_state: RAW topic: android_phone_acceleration value_schema: .passive.phone.PhoneAcceleration @@ -19,6 +22,8 @@ data: processing_state: RAW topic: android_phone_battery_level value_schema: .passive.phone.PhoneBatteryLevel + sample_rate: + dynamic: true fields: - name: batteryLevel - type: GYROSCOPE @@ -27,6 +32,9 @@ data: processing_state: RAW topic: android_phone_gyroscope value_schema: .passive.phone.PhoneGyroscope + sample_rate: + frequency: 5 + configurable: true fields: - name: x - name: y @@ -37,6 +45,9 @@ data: processing_state: RAW topic: android_phone_light value_schema: .passive.phone.PhoneLight + sample_rate: + frequency: 5 + configurable: true fields: - name: light - type: MAGNETIC_FIELD @@ -45,6 +56,9 @@ data: processing_state: RAW topic: android_phone_magnetic_field value_schema: .passive.phone.PhoneMagneticField + sample_rate: + frequency: 5 + configurable: true fields: - name: x - name: y @@ -55,6 +69,9 @@ data: processing_state: VENDOR topic: android_phone_step_count value_schema: .passive.phone.PhoneStepCount + sample_rate: + frequency: 5 + dynamic: true fields: - name: steps # Location @@ -67,33 +84,50 @@ data: fields: - name: longitude - name: latitude + sample_rate: + interval: 600 + configurable: true + dynamic: true # Log - type: PHONE_CALL app_provider: .phone.PhoneLogProvider processing_state: RAW topic: android_phone_call value_schema: .passive.phone.PhoneCall + sample_rate: + interval: 86400 + configurable: true - type: PHONE_SMS app_provider: .phone.PhoneLogProvider unit: NON_DIMENSIONAL processing_state: RAW topic: android_phone_sms value_schema: .passive.phone.PhoneSms + sample_rate: + interval: 86400 + configurable: true - type: PHONE_SMS_UNREAD app_provider: .phone.PhoneLogProvider unit: NON_DIMENSIONAL processing_state: RAW topic: android_phone_sms_unread value_schema: .passive.phone.PhoneSmsUnread + sample_rate: + interval: 86400 + configurable: true # Usage - type: USAGE_EVENT app_provider: .phone.PhoneUsageProvider processing_state: RAW topic: android_phone_usage_event value_schema: .passive.phone.PhoneUsageEvent + sample_rate: + dynamic: true - type: USER_INTERACTION app_provider: .phone.PhoneUsageProvider unit: NON_DIMENSIONAL processing_state: RAW topic: android_phone_user_interaction value_schema: .passive.phone.PhoneUserInteraction + sample_rate: + dynamic: true diff --git a/specifications/passive/biovotion_vsm1.yml b/specifications/passive/biovotion_vsm1.yml index 06859fdc..4e3b51c7 100644 --- a/specifications/passive/biovotion_vsm1.yml +++ b/specifications/passive/biovotion_vsm1.yml @@ -4,73 +4,85 @@ model: VSM1 app_provider: .biovotion.BiovotionServiceProvider data: - type: ACCELEROMETER - default_sample_rate: 51.2 unit: G processing_state: RAW topic: android_biovotion_vsm1_acceleration value_schema: .passive.biovotion.BiovotionVsm1Acceleration + sample_rate: + frequency: 51.2 - type: BATTERY - default_sample_rate: 1.0 + sample_rate: + frequency: 1 unit: PERCENTAGE processing_state: RAW topic: android_biovotion_vsm1_battery_level value_schema: .passive.biovotion.BiovotionVsm1BatteryLevel - type: BLOOD_PULSE_WAVE - default_sample_rate: 1.0 + sample_rate: + frequency: 1 unit: NON_DIMENSIONAL processing_state: VENDOR topic: android_biovotion_vsm1_blood_volume_pulse value_schema: .passive.biovotion.BiovotionVsm1BloodPulseWave - type: ENERGY - default_sample_rate: 1.0 + sample_rate: + frequency: 1 unit: CALORIES_PER_SEC processing_state: VENDOR topic: android_biovotion_vsm1_energy value_schema: .passive.biovotion.BiovotionVsm1Energy - type: GALVANIC_SKIN_RESPONSE - default_sample_rate: 1.0 + sample_rate: + frequency: 1 unit: KILO_OHM processing_state: VENDOR topic: android_biovotion_vsm1_galvanic_skin_response value_schema: .passive.biovotion.BiovotionVsm1GalvanicSkinResponse - type: HEART_RATE - default_sample_rate: 1.0 + sample_rate: + frequency: 1 unit: BEATS_PER_MIN processing_state: VENDOR topic: android_biovotion_vsm1_heartrate value_schema: .passive.biovotion.BiovotionVsm1HeartRate - type: HEART_RATE_VARIABILITY - default_sample_rate: 1.0 + sample_rate: + frequency: 1 unit: RMSSD_IN_MILLI_SEC processing_state: VENDOR topic: android_biovotion_vsm1_heartrate_variability value_schema: .passive.biovotion.BiovotionVsm1HeartRateVariability - type: LED - default_sample_rate: 1.0 + sample_rate: + frequency: 1 unit: MILLI_AMPERE processing_state: VENDOR topic: android_biovotion_vsm1_led_current value_schema: .passive.biovotion.BiovotionVsm1LedCurrent - type: PHOTOPLETHYSMOGRAPHY - default_sample_rate: 51.2 + sample_rate: + frequency: 51.2 unit: NON_DIMENSIONAL processing_state: RAW topic: android_biovotion_vsm1_ppg_raw value_schema: .passive.biovotion.BiovotionVsm1PpgRaw - type: RESPIRATION_RATE - default_sample_rate: 1.0 + sample_rate: + frequency: 1 unit: BEATS_PER_MIN processing_state: VENDOR topic: android_biovotion_vsm1_respiration_rate value_schema: .passive.biovotion.BiovotionVsm1RespirationRate - type: OXYGEN_SATURATION - default_sample_rate: 1.0 + sample_rate: + frequency: 1 unit: PERCENTAGE processing_state: VENDOR topic: android_biovotion_vsm1_oxygen_saturation value_schema: .passive.biovotion.BiovotionVsm1OxygenSaturation - type: THERMOMETER - default_sample_rate: 1.0 + sample_rate: + frequency: 1 unit: CELSIUS processing_state: RAW topic: android_biovotion_vsm1_temperature diff --git a/specifications/passive/empatica_e4.yml b/specifications/passive/empatica_e4.yml index 2ecb4c65..01ea00e2 100644 --- a/specifications/passive/empatica_e4.yml +++ b/specifications/passive/empatica_e4.yml @@ -4,37 +4,43 @@ model: E4 app_provider: .empatica.E4ServiceProvider data: - type: ACCELEROMETER - default_sample_rate: 32.0 + sample_rate: + frequency: 32 unit: G processing_state: RAW topic: android_empatica_e4_acceleration value_schema: .passive.empatica.EmpaticaE4Acceleration - type: BATTERY - default_sample_rate: 1.0 + sample_rate: + dynamic: true unit: PERCENTAGE processing_state: RAW topic: android_empatica_e4_battery_level value_schema: .passive.empatica.EmpaticaE4BatteryLevel - type: BLOOD_VOLUME_PULSE - default_sample_rate: 64.0 + sample_rate: + frequency: 32 unit: NANO_WATT processing_state: RAW topic: android_empatica_e4_blood_volume_pulse value_schema: .passive.empatica.EmpaticaE4BloodVolumePulse - type: ELECTRODERMAL_ACTIVITY - default_sample_rate: 4.0 + sample_rate: + frequency: 4 unit: MICRO_SIEMENS processing_state: RAW topic: android_empatica_e4_electrodermal_activity value_schema: .passive.empatica.EmpaticaE4ElectroDermalActivity - type: INTER_BEAT_INTERVAL - default_sample_rate: 1.0 + sample_rate: + dynamic: true unit: BEATS_PER_MIN processing_state: VENDOR topic: android_empatica_e4_inter_beat_interval value_schema: .passive.empatica.EmpaticaE4InterBeatInterval - type: THERMOMETER - default_sample_rate: 4.0 + sample_rate: + frequency: 4 unit: CELSIUS processing_state: RAW topic: android_empatica_e4_temperature diff --git a/specifications/passive/pebble_2.yml b/specifications/passive/pebble_2.yml index 8e9f4284..b66fedd8 100644 --- a/specifications/passive/pebble_2.yml +++ b/specifications/passive/pebble_2.yml @@ -5,25 +5,29 @@ doc: Pebble 2 data collected over Bluetooth by a RADAR Pebble app app_provider: .pebble.PebbleServiceProvider data: - type: ACCELEROMETER - default_sample_rate: 10.0 + sample_rate: + frequency: 10 unit: G processing_state: RAW topic: android_pebble_2_acceleration value_schema: .passive.pebble.Pebble2Acceleration - type: BATTERY - default_sample_rate: 1.0 + sample_rate: + dynamic: true unit: PERCENTAGE processing_state: RAW topic: android_pebble_2_battery_level value_schema: .passive.pebble.Pebble2BatteryLevel - type: HEART_RATE - default_sample_rate: 1.0 + sample_rate: + dynamic: true unit: BEATS_PER_MIN processing_state: VENDOR topic: android_pebble_2_heartrate value_schema: .passive.pebble.Pebble2HeartRate - type: HEART_RATE_FILTERED - default_sample_rate: 1.0 + sample_rate: + dynamic: true unit: BEATS_PER_MIN processing_state: VENDOR topic: android_pebble_2_heartrate_filtered From 67ba5cba2edc789ec1a024e27e5fc8b9fe316225 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Wed, 27 Sep 2017 09:46:39 +0200 Subject: [PATCH 085/112] Enabled radar-schemas-tools publishing --- java-sdk/build.gradle | 2 +- java-sdk/radar-schemas-tools/build.gradle | 53 ++++++++++++++++++++++- 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/java-sdk/build.gradle b/java-sdk/build.gradle index cad66bf5..fae8d591 100644 --- a/java-sdk/build.gradle +++ b/java-sdk/build.gradle @@ -23,7 +23,7 @@ subprojects { targetCompatibility = '1.7' sourceCompatibility = '1.7' - ext.avroVersion = '1.8.1' + ext.avroVersion = '1.8.2' ext.githubUrl = "https://github.com/${githubRepoName}.git" ext.issueUrl = "https://github.com/${githubRepoName}/issues" diff --git a/java-sdk/radar-schemas-tools/build.gradle b/java-sdk/radar-schemas-tools/build.gradle index cfc802a1..667029ad 100644 --- a/java-sdk/radar-schemas-tools/build.gradle +++ b/java-sdk/radar-schemas-tools/build.gradle @@ -5,8 +5,8 @@ plugins { id 'application' } -ext.artifactName = 'radar-schemas-validation' -ext.description = 'RADAR Schemas Validator. JUnit tests to check schema acceptance.' +ext.artifactName = 'radar-schemas-tools' +ext.description = 'RADAR Schemas specification and validation tools.' targetCompatibility = '1.8' sourceCompatibility = '1.8' @@ -77,3 +77,52 @@ pmd { ruleSetFiles = files("$projectDir/config/pmd/ruleset.xml") } + + +//---------------------------------------------------------------------------// +// Publishing // +//---------------------------------------------------------------------------// + +publishing { + publications { + RadarCommonsPublication(MavenPublication) { + from components.java + artifact sourcesJar + artifact javadocJar + groupId project.group + artifactId artifactName + version project.version + pom.withXml { + def root = asNode() + root.appendNode('description', description) + root.appendNode('name', artifactName) + root.appendNode('url', githubUrl) + root.children().last() + pomConfig + } + } + } +} + +bintray { + user = project.hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER') + key = project.hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') + override = false + publications = ['RadarCommonsPublication'] + pkg { + repo = project.group + name = artifactName + userOrg = 'radar-cns' + licenses = ['Apache-2.0'] + websiteUrl = website + issueTrackerUrl = issueUrl + vcsUrl = githubUrl + githubRepo = githubRepoName + githubReleaseNotesFile = 'README.md' + version { + name = project.version + desc = description + vcsTag = System.getenv('TRAVIS_TAG') + released = new Date() + } + } +} From be87e9bb9513d5ca77b433cf8582cf7f8bb8ab05 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Wed, 27 Sep 2017 10:02:51 +0200 Subject: [PATCH 086/112] Corrected folder layout --- README.md | 5 ++-- java-sdk/radar-schemas-tools/README.md | 29 +++++-------------- .../org/radarcns/schema/SchemaRepository.java | 22 +------------- 3 files changed, 12 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index d01ffbe7..602b69a9 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,11 @@ [Avro schemas](https://avro.apache.org/docs/1.8.2/spec.html) used in RADAR-CNS. The schemas are organized as follows: - The `commons` directory contains all schemas used inside Kafka and data fed into Kafka. - - In the `passive` subdirectory, add schemas for passive data collection, like wearables. - In the `active` subdirectory, add schemas for active data collection, like questionnaires or assignments. - - In the `monitor` subdirectory, add schemas for monitoring applications that gather data. + - In the `catalogue` subdirectory, modify schemas for cataloguing data types. - In the `kafka` subdirectory, add schemas used throughtout Kafka, like record keys. + - In the `monitor` subdirectory, add schemas for monitoring applications that gather data. + - In the `passive` subdirectory, add schemas for passive data collection, like wearables. - In the `stream` subdirectory, add schemas used in Kafka Streams. - The `restapi` directory contains schemas used to get data from the RADAR-CNS REST API. - The `specifications` directory contains specifications of what data types are collected through which devices. diff --git a/java-sdk/radar-schemas-tools/README.md b/java-sdk/radar-schemas-tools/README.md index bf96b953..53d434b4 100644 --- a/java-sdk/radar-schemas-tools/README.md +++ b/java-sdk/radar-schemas-tools/README.md @@ -1,18 +1,21 @@ -# RADAR Schemas Validator +# RADAR Schemas tools The RADAR Schemas Validator checks if the `Schema Catalog` is in a valid state. It first checks the folder structure, it has to be compliant with: - commons * active + * catalogue * kafka * monitor * passive + * stream - rest - specification * active * monitor * passive + * stream For each Avro schema under `commons` folder checks if: - in case of `ENUM` @@ -25,7 +28,7 @@ For each Avro schema under `commons` folder checks if: * the `namespace` differs from null and it is a lowercase string dot separated without numeric * the `name` matches the .avsc file name and it is an UpperCamelCase string * fields is not empty - * the `field name` is a lowerCamelCase string and does not contain string such as `value`, `Value`, `val` and `Val`. + * the `field name` is a lowerCamelCase string and does not contain string such as `value`, `Value`. * schemas under `active` folder have `time` and `timeCompleted` fields, and do not contain a field named `timeReceived` * schemas under `monitor` folder have `time` field, and do not contain a field named either `timeCompleted` or `timeReceived` * schemas under `passive` folder have `time` and `timeReceived` fields, and do not have a field named `timeCompleted` @@ -33,8 +36,6 @@ For each Avro schema under `commons` folder checks if: * `ENUM` fields have `UNKNOWN` as `default` value * `nullable`/`optional` fields have `null` as default value -The validation process generates a field name collision summary. It is shown to the end user only in presence of collisions. - Upon rule violation, the end user is notified with a message explaining how to fix it. ## How to use @@ -43,11 +44,11 @@ The validation is implemented as a `JUnit` test. To run the validation, simply t ## Suppress checks -Record name, field name validations, and field name collision check can be suppressed modifying the [skip](src/test/resources/skip.yml) configuration file. +Record name and field name validations can be suppressed modifying the [skip](src/test/resources/schema.yml) configuration file. `files` lists file paths that can be ignored. It can contain values like - entire path like `commons/active/questionnaire/questionnaire.avsc` -- folder and subfolder `commons/active/**`: all file under `active` and all its subfolder will be skipped +- folder and subfolder `commons/active/**/*`: all file under `active` and all its subfolder will be skipped - folder and subfolder `commons/active/**/*.avsc`: all file with format `avsc` under `active` and all its subfolder will be skipped - file name `.DS_Store`: all file named `.DS_Store` will be skipped - file extension `*.md`: all file with extension `*.md` will be skipped @@ -55,7 +56,7 @@ Record name, field name validations, and field name collision check can be suppr ```yaml files: - path/to/avoid/README.md - - path/to/** + - path/to/**/* - path/to/**/README.md - .DS_Store - *.md @@ -76,17 +77,3 @@ validation: - fieldnameOne - fieldnameTwo ``` - -`collision` can be set to suppress collision checks: - -```yaml -field_name: - - * - - schema.to.skip.* - - schema.to.skip.two -``` - -The schema can be specified as follow: -- `*` turns off collision check for all schemas -- `schema.to.skip.*` turns off collision check in package `schema.to.skip`. In case `field_name` appears in other schemas contained in a different package, the collision check will then highlight this -- `schema.to.skip.one` turns off the collision check only for the set schema. In case `field_name` appears in other schemas, the collision check will highlight this diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/SchemaRepository.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/SchemaRepository.java index d76ca520..c309ff04 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/SchemaRepository.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/SchemaRepository.java @@ -17,27 +17,7 @@ package org.radarcns.schema; /** - * Checks the schema catalog. - * Checks that the tree folder structure respects the following structure: - *

      - *
    • commons - *
        - *
      • active
      • - *
      • kafka
      • - *
      • monitor
      • - *
      • passive
      • - *
      - *
    • - *
    • rest
    • - *
    • specifications - *
        - *
      • active
      • - *
      • monitor
      • - *
      • passive
      • - *
      - *
    • - *
    - * At moment, the {@code restApi} does not have a well defined structure. + * Overview of a schema repository directories. */ public final class SchemaRepository { From 300a63e74e982ba0e406e65c2d2de3c7bf6b0351 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Wed, 27 Sep 2017 10:04:35 +0200 Subject: [PATCH 087/112] Small doc fix --- java-sdk/radar-schemas-tools/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/java-sdk/radar-schemas-tools/README.md b/java-sdk/radar-schemas-tools/README.md index 53d434b4..c48d5e65 100644 --- a/java-sdk/radar-schemas-tools/README.md +++ b/java-sdk/radar-schemas-tools/README.md @@ -22,8 +22,7 @@ For each Avro schema under `commons` folder checks if: * the `namespace` differs from null and it is a lowercase string dot separated without numeric * the `name` matches the .avsc file name and it is an UpperCamelCase string * there is documentation - * `symbols` match UPPER_CASE format - * the `UNKNOWN` symbol is present + * `symbols` match `UPPER_CASE` format - in case of `RECORD` * the `namespace` differs from null and it is a lowercase string dot separated without numeric * the `name` matches the .avsc file name and it is an UpperCamelCase string @@ -33,7 +32,7 @@ For each Avro schema under `commons` folder checks if: * schemas under `monitor` folder have `time` field, and do not contain a field named either `timeCompleted` or `timeReceived` * schemas under `passive` folder have `time` and `timeReceived` fields, and do not have a field named `timeCompleted` * the record and any provided fields are documented - * `ENUM` fields have `UNKNOWN` as `default` value + * `ENUM` fields have `UNKNOWN` as `default` value, if any * `nullable`/`optional` fields have `null` as default value Upon rule violation, the end user is notified with a message explaining how to fix it. From 6b43df732cd1100ea85d293604707f30310ed387 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Wed, 27 Sep 2017 10:09:32 +0200 Subject: [PATCH 088/112] Publish commons to artifactory (fixes #41) --- java-sdk/build.gradle | 1 + java-sdk/radar-schemas-commons/build.gradle | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/java-sdk/build.gradle b/java-sdk/build.gradle index fae8d591..ef78cb7a 100644 --- a/java-sdk/build.gradle +++ b/java-sdk/build.gradle @@ -5,6 +5,7 @@ plugins { id 'com.commercehub.gradle.plugin.avro-base' version '0.9.0' id 'com.jfrog.bintray' version '1.7.3' + id 'com.jfrog.artifactory' version '4.4.18' } subprojects { diff --git a/java-sdk/radar-schemas-commons/build.gradle b/java-sdk/radar-schemas-commons/build.gradle index 19603786..cac71038 100644 --- a/java-sdk/radar-schemas-commons/build.gradle +++ b/java-sdk/radar-schemas-commons/build.gradle @@ -1,3 +1,5 @@ +apply plugin: 'com.jfrog.artifactory' + ext.artifactName = 'radar-schemas-commons' ext.description = 'RADAR Schemas Commons SDK' @@ -73,3 +75,19 @@ bintray { } } } + +artifactory { + contextUrl = 'https://oss.jfrog.org/artifactory' + publish { + repository { + repoKey = 'oss-snapshot-local' + username = project.hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER') + password = project.hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') + maven = true + } + } +} + +artifactoryPublish { + publications('RadarCommonsPublication') +} From 69c16118b9848570970e6726f0f1cf2ae3a19ca5 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Wed, 27 Sep 2017 12:21:01 +0200 Subject: [PATCH 089/112] Removed old questionnaire --- commons/questionnaire/questionnaire.avsc | 28 ------------------------ 1 file changed, 28 deletions(-) delete mode 100644 commons/questionnaire/questionnaire.avsc diff --git a/commons/questionnaire/questionnaire.avsc b/commons/questionnaire/questionnaire.avsc deleted file mode 100644 index bc7c9e58..00000000 --- a/commons/questionnaire/questionnaire.avsc +++ /dev/null @@ -1,28 +0,0 @@ -{ - "namespace": "org.radarcns.questionnaire", - "type": "record", - "name": "Questionnaire", - "doc": "General schema for questionnaire. Check the specification folder to see how the questionnaire has been defined. For each QuestionnaireType there is a JSON file reporting the questions set and possible answers if available", - "fields": [ - { "name": "name", "type": {"name": "QuestionnaireType", "type": "enum", "symbols": ["PHQ8", "ESM", "PDQ5D", "UNKNOWN"]}, "doc": "Questionnaire names", "default": "UNKNOWN" }, - { "name": "version", "type": "string", "doc": "It reports the questionnaire version stated in the JSON specification" }, - { "name": "answers", - "type": { - "type": "array", - "items": { - "name": "Answer", - "type": "record", - "doc": "Questionnaire answer", - "fields": [ - { "name": "value", "type": ["int", "string", "double"], "doc": "Subject answer" }, - { "name": "startTime", "type": "double", "doc": "timestamp in UTC (s) when the question is shown" }, - { "name": "endTime", "type": "double", "doc": "timestamp in UTC (s) when the question is answered" } - ] - } - }, - "doc": "Answers list. The answers order must follow the questions order" - }, - { "name": "startTime", "type": "double", "doc": "timestamp in UTC (s) when the questionnaire is submitted to the subject" }, - { "name": "endTime", "type": "double", "doc": "timestamp in UTC (s) when the questionnaire is sent out to the platform" } - ] -} From 5de48b11176c2fd34882437a8d496b574160ce8b Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Wed, 27 Sep 2017 13:20:08 +0200 Subject: [PATCH 090/112] Proper travis deployment --- .travis.yml | 29 +++++++++++++++-------- java-sdk/radar-schemas-tools/build.gradle | 5 ++++ 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index 242767ec..72e0f4e1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,19 +5,28 @@ env: - TERM=dumb deploy: - provider: releases - api_key: ${GH_TOKEN} - file_glob: true - file: "*/build/libs/*.jar" - skip_cleanup: true - on: - tags: true + - provider: releases + api_key: ${GH_TOKEN} + file_glob: true + file: + - "*/build/libs/*.jar" + - "radar-schemas-tools/build/distributions/*" + skip_cleanup: true + on: + tags: true + - provider: script + script: ./gradlew artifactoryPublish + skip_cleanup: true + on: + branch: dev + - provider: script + script: ./gradlew bintrayUpload + skip_cleanup: true + on: + tags: true before_install: - cd java-sdk before_deploy: - pwd - -after_deploy: - - ./gradlew bintrayUpload diff --git a/java-sdk/radar-schemas-tools/build.gradle b/java-sdk/radar-schemas-tools/build.gradle index 667029ad..7456973b 100644 --- a/java-sdk/radar-schemas-tools/build.gradle +++ b/java-sdk/radar-schemas-tools/build.gradle @@ -83,6 +83,11 @@ pmd { // Publishing // //---------------------------------------------------------------------------// +tasks.withType(Tar){ + compression = Compression.GZIP + extension = 'tar.gz' +} + publishing { publications { RadarCommonsPublication(MavenPublication) { From 83ae8f09d5593dae4e7f422f233bd1cb1f6e813c Mon Sep 17 00:00:00 2001 From: Pavel Mikhailovskii Date: Fri, 29 Sep 2017 17:06:39 +0200 Subject: [PATCH 091/112] Added specifications for the new topics --- .../passive/PassiveDataTopic.java | 2 +- specifications/passive/android_phone.yml | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveDataTopic.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveDataTopic.java index 808d84c8..f1afb012 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveDataTopic.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveDataTopic.java @@ -30,7 +30,7 @@ public enum RadarSourceDataTypes { ACCELEROMETER, BATTERY, BLOOD_VOLUME_PULSE, BLOOD_PULSE_WAVE, ELECTRODERMAL_ACTIVITY, ENERGY, GALVANIC_SKIN_RESPONSE, GYROSCOPE, HEART_RATE, HEART_RATE_FILTERED, HEART_RATE_VARIABILITY, INTER_BEAT_INTERVAL, LED, LIGHT, MAGNETIC_FIELD, OXYGEN_SATURATION, - PHONE_CALL, PHONE_SMS, PHONE_SMS_UNREAD, PHOTOPLETHYSMOGRAPHY, RELATIVE_LOCATION, + PHONE_CALL, PHONE_SMS, PHONE_BLUETOOTH_DEVICES, PHONE_SMS_UNREAD, PHONE_CONTACTS, PHOTOPLETHYSMOGRAPHY, RELATIVE_LOCATION, RESPIRATION_RATE, STEP_COUNT, THERMOMETER, USAGE_EVENT, USER_INTERACTION } diff --git a/specifications/passive/android_phone.yml b/specifications/passive/android_phone.yml index d45d29d0..ebe57d5d 100644 --- a/specifications/passive/android_phone.yml +++ b/specifications/passive/android_phone.yml @@ -115,6 +115,24 @@ data: sample_rate: interval: 86400 configurable: true + - type: PHONE_CONTACTS + app_provider: .phone.PhoneContactListProvider + unit: NON_DIMENSIONAL + processing_state: RAW + topic: android_phone_contacts + value_schema: .passive.phone.PhoneContactList + sample_rate: + interval: 86400 + configurable: true + - type: PHONE_BLUETOOTH_DEVICES + app_provider: .phone.PhoneBluetoothService + unit: NON_DIMENSIONAL + processing_state: RAW + topic: android_phone_bluetooth_devices + value_schema: .passive.phone.PhoneBluetoothDevices + sample_rate: + interval: 3600 + configurable: true # Usage - type: USAGE_EVENT app_provider: .phone.PhoneUsageProvider From 7a3b5a7023516ab5ebd476efc9cb263e2a323db3 Mon Sep 17 00:00:00 2001 From: Pavel Mikhailovskii Date: Mon, 2 Oct 2017 11:50:31 +0200 Subject: [PATCH 092/112] Fixed code formatting --- .../schema/specification/passive/PassiveDataTopic.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveDataTopic.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveDataTopic.java index f1afb012..65135fb4 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveDataTopic.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveDataTopic.java @@ -30,8 +30,8 @@ public enum RadarSourceDataTypes { ACCELEROMETER, BATTERY, BLOOD_VOLUME_PULSE, BLOOD_PULSE_WAVE, ELECTRODERMAL_ACTIVITY, ENERGY, GALVANIC_SKIN_RESPONSE, GYROSCOPE, HEART_RATE, HEART_RATE_FILTERED, HEART_RATE_VARIABILITY, INTER_BEAT_INTERVAL, LED, LIGHT, MAGNETIC_FIELD, OXYGEN_SATURATION, - PHONE_CALL, PHONE_SMS, PHONE_BLUETOOTH_DEVICES, PHONE_SMS_UNREAD, PHONE_CONTACTS, PHOTOPLETHYSMOGRAPHY, RELATIVE_LOCATION, - RESPIRATION_RATE, STEP_COUNT, THERMOMETER, USAGE_EVENT, USER_INTERACTION + PHONE_CALL, PHONE_SMS, PHONE_BLUETOOTH_DEVICES, PHONE_SMS_UNREAD, PHONE_CONTACTS, PHOTOPLETHYSMOGRAPHY, + RELATIVE_LOCATION, RESPIRATION_RATE, STEP_COUNT, THERMOMETER, USAGE_EVENT, USER_INTERACTION } @JsonProperty("processing_state") From 44054a74187ac1bdfab8f6d16d2bd4ceb6e92251 Mon Sep 17 00:00:00 2001 From: Pavel Mikhailovskii Date: Mon, 2 Oct 2017 11:58:21 +0200 Subject: [PATCH 093/112] Fixed code formatting - 2 --- .../schema/specification/passive/PassiveDataTopic.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveDataTopic.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveDataTopic.java index 65135fb4..733b7830 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveDataTopic.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/passive/PassiveDataTopic.java @@ -30,8 +30,9 @@ public enum RadarSourceDataTypes { ACCELEROMETER, BATTERY, BLOOD_VOLUME_PULSE, BLOOD_PULSE_WAVE, ELECTRODERMAL_ACTIVITY, ENERGY, GALVANIC_SKIN_RESPONSE, GYROSCOPE, HEART_RATE, HEART_RATE_FILTERED, HEART_RATE_VARIABILITY, INTER_BEAT_INTERVAL, LED, LIGHT, MAGNETIC_FIELD, OXYGEN_SATURATION, - PHONE_CALL, PHONE_SMS, PHONE_BLUETOOTH_DEVICES, PHONE_SMS_UNREAD, PHONE_CONTACTS, PHOTOPLETHYSMOGRAPHY, - RELATIVE_LOCATION, RESPIRATION_RATE, STEP_COUNT, THERMOMETER, USAGE_EVENT, USER_INTERACTION + PHONE_CALL, PHONE_SMS, PHONE_BLUETOOTH_DEVICES, PHONE_SMS_UNREAD, PHONE_CONTACTS, + PHOTOPLETHYSMOGRAPHY, RELATIVE_LOCATION, RESPIRATION_RATE, STEP_COUNT, THERMOMETER, + USAGE_EVENT, USER_INTERACTION } @JsonProperty("processing_state") From 8d3d6c1a2a7065711a876228cdc95471252c83de Mon Sep 17 00:00:00 2001 From: Pavel Mikhailovskii Date: Tue, 3 Oct 2017 17:16:00 +0200 Subject: [PATCH 094/112] Schema registration command --- java-sdk/radar-schemas-tools/build.gradle | 2 + .../org/radarcns/schema/CommandLineApp.java | 195 ++++++++++++++---- .../util/PermissiveHttpClientFactory.java | 64 ++++++ .../schema/util/PermissiveSocketFactory.java | 73 +++++++ 4 files changed, 290 insertions(+), 44 deletions(-) create mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/PermissiveHttpClientFactory.java create mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/PermissiveSocketFactory.java diff --git a/java-sdk/radar-schemas-tools/build.gradle b/java-sdk/radar-schemas-tools/build.gradle index 7456973b..9620ed3e 100644 --- a/java-sdk/radar-schemas-tools/build.gradle +++ b/java-sdk/radar-schemas-tools/build.gradle @@ -29,6 +29,8 @@ dependencies { implementation project(':radar-schemas-commons') implementation group: 'org.radarcns', name: 'radar-commons', version: '0.5' implementation group: 'net.sourceforge.argparse4j', name: 'argparse4j', version: '0.7.0' + compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.3' + runtimeOnly group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25' diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java index 7c3a2a1e..4db87569 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java @@ -16,6 +16,8 @@ package org.radarcns.schema; +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonGenerator; import net.sourceforge.argparse4j.ArgumentParsers; import net.sourceforge.argparse4j.impl.Arguments; import net.sourceforge.argparse4j.inf.ArgumentParser; @@ -23,6 +25,12 @@ import net.sourceforge.argparse4j.inf.Namespace; import net.sourceforge.argparse4j.inf.Subparser; import net.sourceforge.argparse4j.inf.Subparsers; +import org.apache.avro.Schema; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpPut; +import org.apache.http.entity.StringEntity; +import org.radarcns.schema.util.PermissiveHttpClientFactory; import org.radarcns.schema.specification.DataTopic; import org.radarcns.schema.specification.DataProducer; import org.radarcns.schema.specification.SourceCatalogue; @@ -30,10 +38,12 @@ import org.radarcns.schema.validation.SchemaValidator; import org.radarcns.schema.validation.ValidationException; import org.radarcns.schema.validation.config.ExcludeConfig; +import org.radarcns.topic.AvroTopic; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; +import java.io.StringWriter; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; @@ -44,6 +54,8 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import static java.util.stream.Collectors.toList; + /** * TODO. */ @@ -61,16 +73,18 @@ public CommandLineApp(Path root) throws IOException { /** * TODO. + * * @return TODO */ public List getTopicsToCreate() { return catalogue.getTopicNames() .sorted() - .collect(Collectors.toList()); + .collect(toList()); } /** * TODO. + * * @return TODO */ public List getRawTopics() { @@ -81,22 +95,24 @@ public List getRawTopics() { .flatMap(map -> map.values().stream()) .flatMap(DataProducer::getTopicNames) .sorted() - .collect(Collectors.toList()); + .collect(toList()); } /** * TODO. + * * @return TODO */ public List getResultsCacheTopics() { return catalogue.getStreamGroups().values().stream() .flatMap(StreamGroup::getTimedTopicNames) .sorted() - .collect(Collectors.toList()); + .collect(toList()); } /** * TODO. + * * @return TODO */ public String getTopicsVerbose(boolean prettyPrint, String source) { @@ -132,6 +148,7 @@ public String getTopicsVerbose(boolean prettyPrint, String source) { /** * TODO. + * * @param prettyPrint TODO * @return TODO */ @@ -140,8 +157,8 @@ private Map> getTopicsInfoVerbose(boolean prettyPrin .collect(Collectors.toMap( source -> source.getScope() + " - " + source.getName(), source -> source.getData().stream() - .collect(Collectors.toMap( - DataTopic::getTopic, d -> d.toString(prettyPrint))))); + .collect(Collectors.toMap( + DataTopic::getTopic, d -> d.toString(prettyPrint))))); } public int validateSchemas(Namespace ns) { @@ -194,17 +211,65 @@ private ExcludeConfig loadConfig(String configSubPath) throws IOException { } public static void main(String... args) { + ArgumentParser parser = getArgumentParser(); + + Namespace ns = null; + try { + ns = parser.parseArgs(args); + } catch (ArgumentParserException e) { + parser.handleError(e); + System.exit(1); + } + + CommandLineApp app = null; + try { + app = new CommandLineApp(Paths.get(ns.getString("root")).toAbsolutePath()); + } catch (IOException e) { + logger.error("Failed to load catalog from root."); + System.exit(1); + } + switch (ns.getString("subparser")) { + case "list": + listTopics(ns, app); + break; + case "validate": + System.exit(app.validateSchemas(ns)); + break; + case "register": + System.exit(app.registerSchemas(ns.getString("url")) ? 0 : 1); + break; + default: + parser.handleError(new ArgumentParserException( + "Subcommand " + ns.getString("subparser") + " not implemented", + parser)); + break; + } + } + + private static void listTopics(Namespace ns, CommandLineApp app) { + if (ns.getBoolean("raw")) { + System.out.println(String.join("\n", app.getRawTopics())); + } else if (ns.getBoolean("stream")) { + System.out.println(String.join("\n", app.getResultsCacheTopics())); + } else if (ns.getBoolean("quiet")) { + System.out.println(String.join("\n", app.getTopicsToCreate())); + } else { + System.out.println(app.getTopicsVerbose(true, ns.getString("match"))); + } + } + + private static ArgumentParser getArgumentParser() { ArgumentParser parser = ArgumentParsers.newArgumentParser("radar-schema") .defaultHelp(true) .description("Validate and list schema specifications"); + parser.addArgument("root") + .nargs("?") + .help("Root schemas directory with a specifications and commons directory") + .setDefault("."); Subparsers subParsers = parser.addSubparsers().dest("subparser"); Subparser validateParser = subParsers.addParser("validate", true) .description("Validate a set of specifications"); - validateParser.addArgument("root") - .nargs("?") - .help("Root schemas directory with a specifications and commons directory") - .setDefault("."); validateParser.addArgument("-s", "--scope") .help("Type of specifications to validate") .choices(Scope.values()); @@ -219,10 +284,6 @@ public static void main(String... args) { Subparser listParser = subParsers.addParser("list", true) .description("list topics and schemas"); - listParser.addArgument("root") - .nargs("?") - .help("Root schemas directory with a specifications and commons directory") - .setDefault("."); listParser.addArgument("-r", "--raw") .help("List raw input topics") .action(Arguments.storeTrue()); @@ -235,41 +296,87 @@ public static void main(String... args) { .help("List the output topics of Kafka Streams") .action(Arguments.storeTrue()); - Namespace ns = null; + Subparser registerParser = subParsers.addParser("register", true) + .description("Register schemas in the schema registry"); + registerParser.addArgument("-u", "--url") + .help("REST API URL"); + return parser; + } + + private boolean registerSchemas(String url) { + return setCompatibility(url, "NONE") + && Stream.of( + catalogue.getActiveSources(), + catalogue.getPassiveSources(), + catalogue.getMonitorSources()) + .flatMap(m -> m.values().stream()) + .flatMap(DataProducer::getTopics) + .allMatch(topic -> registerSchemasForTopic(topic, url)) + && setCompatibility(url, "FULL"); + } + + private boolean registerSchemasForTopic( + AvroTopic topic, String url) { + return registerSchema(topic.getKeySchema(), + topic.getName() + "-key", url) + && registerSchema(topic.getValueSchema(), + topic.getName() + "-value", url); + } + + private boolean registerSchema( + Schema schema, String subject, String url) { + logger.info("Registering {}", subject); + HttpPost request = new HttpPost(url + "/subjects/" + subject + "/versions"); try { - ns = parser.parseArgs(args); - } catch (ArgumentParserException e) { - parser.handleError(e); - System.exit(1); + request.addHeader("Content-Type", "application/vnd.schemaregistry.v1+json"); + request.setEntity(new StringEntity(schemaEntity(schema))); + + HttpResponse response = PermissiveHttpClientFactory.getNewHttpClient().execute(request); + boolean ok = response.getStatusLine().getStatusCode() == 200; + if (ok) { + logger.info("OK"); + return true; + } else { + logger.error(response.getStatusLine().toString()); + } + } catch (Exception e) { + logger.error("Error registering a schema for subject " + subject, e); + } finally { + request.releaseConnection(); } + return false; + } - CommandLineApp app = null; + private static String schemaEntity(Schema schema) throws IOException { + StringWriter writer = new StringWriter(); + JsonGenerator gen = new JsonFactory().createGenerator(writer); + gen.writeStartObject(); + gen.writeStringField("schema", schema.toString()); + gen.writeEndObject(); + gen.flush(); + return writer.toString(); + } + + private boolean setCompatibility(String url, String compatibility) { + logger.info("Setting compatibility to {}", compatibility); + HttpPut request = new HttpPut(url + "/config"); try { - app = new CommandLineApp(Paths.get(ns.getString("root")).toAbsolutePath()); - } catch (IOException e) { - logger.error("Failed to load catalog from root."); - System.exit(1); - } - switch (ns.getString("subparser")) { - case "list": - if (ns.getBoolean("raw")) { - System.out.println(String.join("\n", app.getRawTopics())); - } else if (ns.getBoolean("stream")) { - System.out.println(String.join("\n", app.getResultsCacheTopics())); - } else if (ns.getBoolean("quiet")) { - System.out.println(String.join("\n", app.getTopicsToCreate())); - } else { - System.out.println(app.getTopicsVerbose(true, ns.getString("match"))); - } - break; - case "validate": - System.exit(app.validateSchemas(ns)); - break; - default: - parser.handleError(new ArgumentParserException( - "Subcommand " + ns.getString("subparser") + " not implemented", - parser)); - break; + request.addHeader("Content-Type", "application/vnd.schemaregistry.v1+json"); + request.setEntity(new StringEntity("{\"compatibility\": \"" + compatibility + "\"}")); + + HttpResponse response = PermissiveHttpClientFactory.getNewHttpClient().execute(request); + boolean ok = response.getStatusLine().getStatusCode() == 200; + if (ok) { + logger.info("OK"); + return true; + } else { + logger.error(response.getStatusLine().toString()); + } + } catch (Exception e) { + logger.error("Error changing compatibility level", e); + } finally { + request.releaseConnection(); } + return false; } } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/PermissiveHttpClientFactory.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/PermissiveHttpClientFactory.java new file mode 100644 index 00000000..c68f7961 --- /dev/null +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/PermissiveHttpClientFactory.java @@ -0,0 +1,64 @@ +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.radarcns.schema.util; + +import org.apache.http.HttpVersion; +import org.apache.http.client.HttpClient; +import org.apache.http.conn.ClientConnectionManager; +import org.apache.http.conn.scheme.PlainSocketFactory; +import org.apache.http.conn.scheme.Scheme; +import org.apache.http.conn.scheme.SchemeRegistry; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; +import org.apache.http.params.BasicHttpParams; +import org.apache.http.params.HttpParams; +import org.apache.http.params.HttpProtocolParams; +import org.apache.http.protocol.HTTP; + +import java.security.KeyStore; + +public final class PermissiveHttpClientFactory { + private PermissiveHttpClientFactory() { + + } + + public static HttpClient getNewHttpClient() { + try { + KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); + trustStore.load(null, null); + + PermissiveSocketFactory sf = new PermissiveSocketFactory(trustStore); + sf.setHostnameVerifier(SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); + + HttpParams params = new BasicHttpParams(); + HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); + HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); + + SchemeRegistry registry = new SchemeRegistry(); + registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); + registry.register(new Scheme("https", sf, 443)); + + ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); + + return new DefaultHttpClient(ccm, params); + } catch (Exception e) { + return HttpClients.createDefault(); + } + } +} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/PermissiveSocketFactory.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/PermissiveSocketFactory.java new file mode 100644 index 00000000..40c82239 --- /dev/null +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/PermissiveSocketFactory.java @@ -0,0 +1,73 @@ +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.radarcns.schema.util; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +import org.apache.http.conn.ssl.SSLSocketFactory; + +import java.io.IOException; +import java.net.Socket; +import java.security.KeyManagementException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.UnrecoverableKeyException; +import java.security.cert.X509Certificate; + +public class PermissiveSocketFactory extends SSLSocketFactory { + private final SSLContext sslContext = SSLContext.getInstance("TLS"); + + PermissiveSocketFactory(KeyStore truststore) + throws NoSuchAlgorithmException, KeyManagementException, + KeyStoreException, UnrecoverableKeyException { + super(truststore); + + TrustManager tm = new X509TrustManager() { + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) { + // No check + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) { + // No check + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[0]; + } + }; + + sslContext.init(null, new TrustManager[] { tm }, null); + } + + @Override + public Socket createSocket(Socket socket, String host, int port, boolean autoClose) + throws IOException { + return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose); + } + + @Override + public Socket createSocket() throws IOException { + return sslContext.getSocketFactory().createSocket(); + } +} From 4695cb1680be6e067fe7600d2652390b5a31ac2e Mon Sep 17 00:00:00 2001 From: Pavel Mikhailovskii Date: Tue, 3 Oct 2017 17:59:06 +0200 Subject: [PATCH 095/112] Schema registration command should accept all SSL certificates --- java-sdk/build.gradle | 6 + .../org/radarcns/schema/CommandLineApp.java | 102 ++---------- .../registration/SchemaRegistration.java | 154 ++++++++++++++++++ .../util/PermissiveHttpClientFactory.java | 64 -------- .../schema/util/PermissiveSocketFactory.java | 73 --------- 5 files changed, 172 insertions(+), 227 deletions(-) create mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/SchemaRegistration.java delete mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/PermissiveHttpClientFactory.java delete mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/PermissiveSocketFactory.java diff --git a/java-sdk/build.gradle b/java-sdk/build.gradle index ef78cb7a..beb61b36 100644 --- a/java-sdk/build.gradle +++ b/java-sdk/build.gradle @@ -73,6 +73,12 @@ subprojects { email 'joris@thehyve.nl' organization 'The Hyve' } + developer { + id 'strangepleasures' + name 'Pavel Mikhailovskii' + email 'pavel@thehyve.nl' + organization 'The Hyve' + } } issueManagement { system 'GitHub' diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java index 4db87569..772ef502 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java @@ -16,8 +16,6 @@ package org.radarcns.schema; -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonGenerator; import net.sourceforge.argparse4j.ArgumentParsers; import net.sourceforge.argparse4j.impl.Arguments; import net.sourceforge.argparse4j.inf.ArgumentParser; @@ -25,12 +23,7 @@ import net.sourceforge.argparse4j.inf.Namespace; import net.sourceforge.argparse4j.inf.Subparser; import net.sourceforge.argparse4j.inf.Subparsers; -import org.apache.avro.Schema; -import org.apache.http.HttpResponse; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.client.methods.HttpPut; -import org.apache.http.entity.StringEntity; -import org.radarcns.schema.util.PermissiveHttpClientFactory; +import org.radarcns.schema.registration.SchemaRegistration; import org.radarcns.schema.specification.DataTopic; import org.radarcns.schema.specification.DataProducer; import org.radarcns.schema.specification.SourceCatalogue; @@ -38,12 +31,10 @@ import org.radarcns.schema.validation.SchemaValidator; import org.radarcns.schema.validation.ValidationException; import org.radarcns.schema.validation.config.ExcludeConfig; -import org.radarcns.topic.AvroTopic; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; -import java.io.StringWriter; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; @@ -236,7 +227,9 @@ public static void main(String... args) { System.exit(app.validateSchemas(ns)); break; case "register": - System.exit(app.registerSchemas(ns.getString("url")) ? 0 : 1); + System.exit(SchemaRegistration.registerSchemas(ns.getString("url"), app.catalogue) + ? 0 + : 1); break; default: parser.handleError(new ArgumentParserException( @@ -262,14 +255,11 @@ private static ArgumentParser getArgumentParser() { ArgumentParser parser = ArgumentParsers.newArgumentParser("radar-schema") .defaultHelp(true) .description("Validate and list schema specifications"); - parser.addArgument("root") - .nargs("?") - .help("Root schemas directory with a specifications and commons directory") - .setDefault("."); Subparsers subParsers = parser.addSubparsers().dest("subparser"); Subparser validateParser = subParsers.addParser("validate", true) .description("Validate a set of specifications"); + addRootArgument(validateParser); validateParser.addArgument("-s", "--scope") .help("Type of specifications to validate") .choices(Scope.values()); @@ -284,6 +274,7 @@ private static ArgumentParser getArgumentParser() { Subparser listParser = subParsers.addParser("list", true) .description("list topics and schemas"); + addRootArgument(listParser); listParser.addArgument("-r", "--raw") .help("List raw input topics") .action(Arguments.storeTrue()); @@ -298,85 +289,16 @@ private static ArgumentParser getArgumentParser() { Subparser registerParser = subParsers.addParser("register", true) .description("Register schemas in the schema registry"); + addRootArgument(registerParser); registerParser.addArgument("-u", "--url") .help("REST API URL"); return parser; } - private boolean registerSchemas(String url) { - return setCompatibility(url, "NONE") - && Stream.of( - catalogue.getActiveSources(), - catalogue.getPassiveSources(), - catalogue.getMonitorSources()) - .flatMap(m -> m.values().stream()) - .flatMap(DataProducer::getTopics) - .allMatch(topic -> registerSchemasForTopic(topic, url)) - && setCompatibility(url, "FULL"); - } - - private boolean registerSchemasForTopic( - AvroTopic topic, String url) { - return registerSchema(topic.getKeySchema(), - topic.getName() + "-key", url) - && registerSchema(topic.getValueSchema(), - topic.getName() + "-value", url); - } - - private boolean registerSchema( - Schema schema, String subject, String url) { - logger.info("Registering {}", subject); - HttpPost request = new HttpPost(url + "/subjects/" + subject + "/versions"); - try { - request.addHeader("Content-Type", "application/vnd.schemaregistry.v1+json"); - request.setEntity(new StringEntity(schemaEntity(schema))); - - HttpResponse response = PermissiveHttpClientFactory.getNewHttpClient().execute(request); - boolean ok = response.getStatusLine().getStatusCode() == 200; - if (ok) { - logger.info("OK"); - return true; - } else { - logger.error(response.getStatusLine().toString()); - } - } catch (Exception e) { - logger.error("Error registering a schema for subject " + subject, e); - } finally { - request.releaseConnection(); - } - return false; - } - - private static String schemaEntity(Schema schema) throws IOException { - StringWriter writer = new StringWriter(); - JsonGenerator gen = new JsonFactory().createGenerator(writer); - gen.writeStartObject(); - gen.writeStringField("schema", schema.toString()); - gen.writeEndObject(); - gen.flush(); - return writer.toString(); - } - - private boolean setCompatibility(String url, String compatibility) { - logger.info("Setting compatibility to {}", compatibility); - HttpPut request = new HttpPut(url + "/config"); - try { - request.addHeader("Content-Type", "application/vnd.schemaregistry.v1+json"); - request.setEntity(new StringEntity("{\"compatibility\": \"" + compatibility + "\"}")); - - HttpResponse response = PermissiveHttpClientFactory.getNewHttpClient().execute(request); - boolean ok = response.getStatusLine().getStatusCode() == 200; - if (ok) { - logger.info("OK"); - return true; - } else { - logger.error(response.getStatusLine().toString()); - } - } catch (Exception e) { - logger.error("Error changing compatibility level", e); - } finally { - request.releaseConnection(); - } - return false; + private static void addRootArgument(Subparser subparser) { + subparser.addArgument("root") + .nargs("?") + .help("Root schemas directory with a specifications and commons directory") + .setDefault("."); } } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/SchemaRegistration.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/SchemaRegistration.java new file mode 100644 index 00000000..90384cb2 --- /dev/null +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/SchemaRegistration.java @@ -0,0 +1,154 @@ +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.radarcns.schema.registration; + +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonGenerator; +import org.apache.avro.Schema; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpPut; +import org.apache.http.config.Registry; +import org.apache.http.config.RegistryBuilder; +import org.apache.http.conn.socket.ConnectionSocketFactory; +import org.apache.http.conn.socket.PlainConnectionSocketFactory; +import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.http.ssl.SSLContextBuilder; +import org.radarcns.schema.specification.DataProducer; +import org.radarcns.schema.specification.SourceCatalogue; +import org.radarcns.topic.AvroTopic; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.net.ssl.SSLContext; +import java.io.IOException; +import java.io.StringWriter; +import java.security.KeyManagementException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.util.stream.Stream; + +public final class SchemaRegistration { + private static final Logger logger = LoggerFactory.getLogger(SchemaRegistration.class); + + private SchemaRegistration() { + } + + public static boolean registerSchemas(String url, SourceCatalogue catalogue) { + return setCompatibility(url, "NONE") + && Stream.of( + catalogue.getActiveSources(), + catalogue.getPassiveSources(), + catalogue.getMonitorSources()) + .flatMap(m -> m.values().stream()) + .flatMap(DataProducer::getTopics) + .allMatch(topic -> registerSchemasForTopic(topic, url)) + && setCompatibility(url, "FULL"); + } + + private static boolean registerSchemasForTopic( + AvroTopic topic, String url) { + return registerSchema(topic.getKeySchema(), + topic.getName() + "-key", url) + && registerSchema(topic.getValueSchema(), + topic.getName() + "-value", url); + } + + private static boolean registerSchema( + Schema schema, String subject, String url) { + logger.info("Registering {}", subject); + HttpPost request = new HttpPost(url + "/subjects/" + subject + "/versions"); + try { + request.addHeader("Content-Type", "application/vnd.schemaregistry.v1+json"); + request.setEntity(new StringEntity(schemaEntity(schema))); + + HttpResponse response = createHttpClient().execute(request); + boolean ok = response.getStatusLine().getStatusCode() == 200; + if (ok) { + logger.info("OK"); + return true; + } else { + logger.error(response.getStatusLine().toString()); + } + } catch (Exception e) { + logger.error("Error registering a schema for subject " + subject, e); + } finally { + request.releaseConnection(); + } + return false; + } + + private static String schemaEntity(Schema schema) throws IOException { + StringWriter writer = new StringWriter(); + JsonGenerator gen = new JsonFactory().createGenerator(writer); + gen.writeStartObject(); + gen.writeStringField("schema", schema.toString()); + gen.writeEndObject(); + gen.flush(); + return writer.toString(); + } + + private static boolean setCompatibility(String url, String compatibility) { + logger.info("Setting compatibility to {}", compatibility); + HttpPut request = new HttpPut(url + "/config"); + try { + request.addHeader("Content-Type", "application/vnd.schemaregistry.v1+json"); + request.setEntity(new StringEntity("{\"compatibility\": \"" + compatibility + "\"}")); + + HttpResponse response = createHttpClient().execute(request); + boolean ok = response.getStatusLine().getStatusCode() == 200; + if (ok) { + logger.info("OK"); + return true; + } else { + logger.error(response.getStatusLine().toString()); + } + } catch (Exception e) { + logger.error("Error changing compatibility level", e); + } finally { + request.releaseConnection(); + } + return false; + } + + private static HttpClient createHttpClient() + throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException { + + SSLContext sslContext = SSLContextBuilder.create() + .loadTrustMaterial((chain, authType) -> true) + .build(); + + SSLConnectionSocketFactory sslSocketFactory = + new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE); + + Registry socketFactoryRegistry = + RegistryBuilder.create() + .register("http", PlainConnectionSocketFactory.getSocketFactory()) + .register("https", sslSocketFactory) + .build(); + + return HttpClientBuilder.create() + .setSSLContext(sslContext) + .setConnectionManager(new PoolingHttpClientConnectionManager(socketFactoryRegistry)) + .build(); + } +} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/PermissiveHttpClientFactory.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/PermissiveHttpClientFactory.java deleted file mode 100644 index c68f7961..00000000 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/PermissiveHttpClientFactory.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.radarcns.schema.util; - -import org.apache.http.HttpVersion; -import org.apache.http.client.HttpClient; -import org.apache.http.conn.ClientConnectionManager; -import org.apache.http.conn.scheme.PlainSocketFactory; -import org.apache.http.conn.scheme.Scheme; -import org.apache.http.conn.scheme.SchemeRegistry; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; -import org.apache.http.params.BasicHttpParams; -import org.apache.http.params.HttpParams; -import org.apache.http.params.HttpProtocolParams; -import org.apache.http.protocol.HTTP; - -import java.security.KeyStore; - -public final class PermissiveHttpClientFactory { - private PermissiveHttpClientFactory() { - - } - - public static HttpClient getNewHttpClient() { - try { - KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); - trustStore.load(null, null); - - PermissiveSocketFactory sf = new PermissiveSocketFactory(trustStore); - sf.setHostnameVerifier(SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); - - HttpParams params = new BasicHttpParams(); - HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); - HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); - - SchemeRegistry registry = new SchemeRegistry(); - registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); - registry.register(new Scheme("https", sf, 443)); - - ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); - - return new DefaultHttpClient(ccm, params); - } catch (Exception e) { - return HttpClients.createDefault(); - } - } -} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/PermissiveSocketFactory.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/PermissiveSocketFactory.java deleted file mode 100644 index 40c82239..00000000 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/PermissiveSocketFactory.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -package org.radarcns.schema.util; - -import javax.net.ssl.SSLContext; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; - -import org.apache.http.conn.ssl.SSLSocketFactory; - -import java.io.IOException; -import java.net.Socket; -import java.security.KeyManagementException; -import java.security.KeyStore; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.UnrecoverableKeyException; -import java.security.cert.X509Certificate; - -public class PermissiveSocketFactory extends SSLSocketFactory { - private final SSLContext sslContext = SSLContext.getInstance("TLS"); - - PermissiveSocketFactory(KeyStore truststore) - throws NoSuchAlgorithmException, KeyManagementException, - KeyStoreException, UnrecoverableKeyException { - super(truststore); - - TrustManager tm = new X509TrustManager() { - @Override - public void checkClientTrusted(X509Certificate[] chain, String authType) { - // No check - } - - @Override - public void checkServerTrusted(X509Certificate[] chain, String authType) { - // No check - } - - @Override - public X509Certificate[] getAcceptedIssuers() { - return new X509Certificate[0]; - } - }; - - sslContext.init(null, new TrustManager[] { tm }, null); - } - - @Override - public Socket createSocket(Socket socket, String host, int port, boolean autoClose) - throws IOException { - return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose); - } - - @Override - public Socket createSocket() throws IOException { - return sslContext.getSocketFactory().createSocket(); - } -} From 338713bc4b89e8d08292c33cc9fa6ea448737580 Mon Sep 17 00:00:00 2001 From: Pavel Mikhailovskii Date: Wed, 4 Oct 2017 11:50:57 +0200 Subject: [PATCH 096/112] Code formatting --- .../radarcns/schema/registration/SchemaRegistration.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/SchemaRegistration.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/SchemaRegistration.java index 90384cb2..d7c50142 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/SchemaRegistration.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/SchemaRegistration.java @@ -65,16 +65,14 @@ public static boolean registerSchemas(String url, SourceCatalogue catalogue) { && setCompatibility(url, "FULL"); } - private static boolean registerSchemasForTopic( - AvroTopic topic, String url) { + private static boolean registerSchemasForTopic(AvroTopic topic, String url) { return registerSchema(topic.getKeySchema(), topic.getName() + "-key", url) && registerSchema(topic.getValueSchema(), topic.getName() + "-value", url); } - private static boolean registerSchema( - Schema schema, String subject, String url) { + private static boolean registerSchema(Schema schema, String subject, String url) { logger.info("Registering {}", subject); HttpPost request = new HttpPost(url + "/subjects/" + subject + "/versions"); try { From 0606806e42cf4a6110c36616102ba9eb84d66008 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Tue, 10 Oct 2017 13:22:47 +0200 Subject: [PATCH 097/112] Add REST-API snapshot schemas to artifactory --- java-sdk/radar-schemas-restapi/build.gradle | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/java-sdk/radar-schemas-restapi/build.gradle b/java-sdk/radar-schemas-restapi/build.gradle index 761cee02..2191584d 100644 --- a/java-sdk/radar-schemas-restapi/build.gradle +++ b/java-sdk/radar-schemas-restapi/build.gradle @@ -1,3 +1,5 @@ +apply plugin: 'com.jfrog.artifactory' + ext.artifactName = 'radar-schemas-restapi' ext.description = 'RADAR Schemas REST API SDK' @@ -77,3 +79,19 @@ bintray { } } } + +artifactory { + contextUrl = 'https://oss.jfrog.org/artifactory' + publish { + repository { + repoKey = 'oss-snapshot-local' + username = project.hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER') + password = project.hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') + maven = true + } + } +} + +artifactoryPublish { + publications('RadarRestApiPublication') +} From 9a93850b3ca74994b856c41b89629d37603fc0a4 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Tue, 10 Oct 2017 15:39:53 +0200 Subject: [PATCH 098/112] Made schema registration use an object class and reuse radar-commons code --- .../org/radarcns/schema/CommandLineApp.java | 28 +++- .../registration/SchemaRegistration.java | 152 ------------------ .../schema/registration/SchemaRegistry.java | 136 ++++++++++++++++ 3 files changed, 156 insertions(+), 160 deletions(-) delete mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/SchemaRegistration.java create mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/SchemaRegistry.java diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java index 772ef502..0b306c92 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java @@ -23,7 +23,7 @@ import net.sourceforge.argparse4j.inf.Namespace; import net.sourceforge.argparse4j.inf.Subparser; import net.sourceforge.argparse4j.inf.Subparsers; -import org.radarcns.schema.registration.SchemaRegistration; +import org.radarcns.schema.registration.SchemaRegistry; import org.radarcns.schema.specification.DataTopic; import org.radarcns.schema.specification.DataProducer; import org.radarcns.schema.specification.SourceCatalogue; @@ -35,6 +35,7 @@ import org.slf4j.LoggerFactory; import java.io.IOException; +import java.net.MalformedURLException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; @@ -201,6 +202,15 @@ private ExcludeConfig loadConfig(String configSubPath) throws IOException { return ExcludeConfig.load(configPath); } + public int registerSchemas(String url, boolean force) { + try (SchemaRegistry registration = new SchemaRegistry(url)) { + return registration.registerSchemas(catalogue, force) ? 0 : 1; + } catch (MalformedURLException ex) { + logger.error("Schema registry URL {} is invalid: {}", url, ex.toString()); + return 1; + } + } + public static void main(String... args) { ArgumentParser parser = getArgumentParser(); @@ -227,9 +237,8 @@ public static void main(String... args) { System.exit(app.validateSchemas(ns)); break; case "register": - System.exit(SchemaRegistration.registerSchemas(ns.getString("url"), app.catalogue) - ? 0 - : 1); + System.exit(app.registerSchemas( + ns.getString("url"), ns.getBoolean("force"))); break; default: parser.handleError(new ArgumentParserException( @@ -289,14 +298,17 @@ private static ArgumentParser getArgumentParser() { Subparser registerParser = subParsers.addParser("register", true) .description("Register schemas in the schema registry"); + registerParser.addArgument("-f", "--force") + .help("Force registering schema, even if it is incompatible.") + .action(Arguments.storeTrue()); + registerParser.addArgument("url") + .help("URL of the schema registry."); addRootArgument(registerParser); - registerParser.addArgument("-u", "--url") - .help("REST API URL"); return parser; } - private static void addRootArgument(Subparser subparser) { - subparser.addArgument("root") + private static void addRootArgument(ArgumentParser parser) { + parser.addArgument("root") .nargs("?") .help("Root schemas directory with a specifications and commons directory") .setDefault("."); diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/SchemaRegistration.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/SchemaRegistration.java deleted file mode 100644 index d7c50142..00000000 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/SchemaRegistration.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright 2017 King's College London and The Hyve - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.radarcns.schema.registration; - -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonGenerator; -import org.apache.avro.Schema; -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.client.methods.HttpPut; -import org.apache.http.config.Registry; -import org.apache.http.config.RegistryBuilder; -import org.apache.http.conn.socket.ConnectionSocketFactory; -import org.apache.http.conn.socket.PlainConnectionSocketFactory; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.entity.StringEntity; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; -import org.apache.http.ssl.SSLContextBuilder; -import org.radarcns.schema.specification.DataProducer; -import org.radarcns.schema.specification.SourceCatalogue; -import org.radarcns.topic.AvroTopic; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.net.ssl.SSLContext; -import java.io.IOException; -import java.io.StringWriter; -import java.security.KeyManagementException; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.util.stream.Stream; - -public final class SchemaRegistration { - private static final Logger logger = LoggerFactory.getLogger(SchemaRegistration.class); - - private SchemaRegistration() { - } - - public static boolean registerSchemas(String url, SourceCatalogue catalogue) { - return setCompatibility(url, "NONE") - && Stream.of( - catalogue.getActiveSources(), - catalogue.getPassiveSources(), - catalogue.getMonitorSources()) - .flatMap(m -> m.values().stream()) - .flatMap(DataProducer::getTopics) - .allMatch(topic -> registerSchemasForTopic(topic, url)) - && setCompatibility(url, "FULL"); - } - - private static boolean registerSchemasForTopic(AvroTopic topic, String url) { - return registerSchema(topic.getKeySchema(), - topic.getName() + "-key", url) - && registerSchema(topic.getValueSchema(), - topic.getName() + "-value", url); - } - - private static boolean registerSchema(Schema schema, String subject, String url) { - logger.info("Registering {}", subject); - HttpPost request = new HttpPost(url + "/subjects/" + subject + "/versions"); - try { - request.addHeader("Content-Type", "application/vnd.schemaregistry.v1+json"); - request.setEntity(new StringEntity(schemaEntity(schema))); - - HttpResponse response = createHttpClient().execute(request); - boolean ok = response.getStatusLine().getStatusCode() == 200; - if (ok) { - logger.info("OK"); - return true; - } else { - logger.error(response.getStatusLine().toString()); - } - } catch (Exception e) { - logger.error("Error registering a schema for subject " + subject, e); - } finally { - request.releaseConnection(); - } - return false; - } - - private static String schemaEntity(Schema schema) throws IOException { - StringWriter writer = new StringWriter(); - JsonGenerator gen = new JsonFactory().createGenerator(writer); - gen.writeStartObject(); - gen.writeStringField("schema", schema.toString()); - gen.writeEndObject(); - gen.flush(); - return writer.toString(); - } - - private static boolean setCompatibility(String url, String compatibility) { - logger.info("Setting compatibility to {}", compatibility); - HttpPut request = new HttpPut(url + "/config"); - try { - request.addHeader("Content-Type", "application/vnd.schemaregistry.v1+json"); - request.setEntity(new StringEntity("{\"compatibility\": \"" + compatibility + "\"}")); - - HttpResponse response = createHttpClient().execute(request); - boolean ok = response.getStatusLine().getStatusCode() == 200; - if (ok) { - logger.info("OK"); - return true; - } else { - logger.error(response.getStatusLine().toString()); - } - } catch (Exception e) { - logger.error("Error changing compatibility level", e); - } finally { - request.releaseConnection(); - } - return false; - } - - private static HttpClient createHttpClient() - throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException { - - SSLContext sslContext = SSLContextBuilder.create() - .loadTrustMaterial((chain, authType) -> true) - .build(); - - SSLConnectionSocketFactory sslSocketFactory = - new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE); - - Registry socketFactoryRegistry = - RegistryBuilder.create() - .register("http", PlainConnectionSocketFactory.getSocketFactory()) - .register("https", sslSocketFactory) - .build(); - - return HttpClientBuilder.create() - .setSSLContext(sslContext) - .setConnectionManager(new PoolingHttpClientConnectionManager(socketFactoryRegistry)) - .build(); - } -} 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 new file mode 100644 index 00000000..3a74b083 --- /dev/null +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/SchemaRegistry.java @@ -0,0 +1,136 @@ +/* + * Copyright 2017 King's College London and The Hyve + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.radarcns.schema.registration; + +import okhttp3.MediaType; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; +import okio.BufferedSink; +import org.radarcns.config.ServerConfig; +import org.radarcns.producer.rest.ManagedConnectionPool; +import org.radarcns.producer.rest.ParsedSchemaMetadata; +import org.radarcns.producer.rest.RestClient; +import org.radarcns.producer.rest.SchemaRetriever; +import org.radarcns.schema.specification.DataProducer; +import org.radarcns.schema.specification.SourceCatalogue; +import org.radarcns.topic.AvroTopic; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.Closeable; +import java.io.IOException; +import java.net.MalformedURLException; +import java.util.stream.Stream; + +public class SchemaRegistry implements Closeable { + private enum Compatibility { + NONE, FULL, BACKWARD, FORWARD, BACKWARD_TRANSITIVE, FORWARD_TRANSITIVE, FULL_TRANSITIVE + } + + private static final Logger logger = LoggerFactory.getLogger(SchemaRegistry.class); + private final SchemaRetriever schemaClient; + private final RestClient httpClient; + + public SchemaRegistry(String baseUrl) throws MalformedURLException { + ServerConfig config = new ServerConfig(baseUrl); + config.setUnsafe(true); + this.schemaClient = new SchemaRetriever(config, 10); + this.httpClient = new RestClient(config, 10, ManagedConnectionPool.GLOBAL_POOL); + } + + public boolean registerSchemas(SourceCatalogue catalogue, boolean force) { + if (force) { + force = setCompatibility(Compatibility.NONE); + } + boolean result = Stream.of( + catalogue.getActiveSources(), + catalogue.getPassiveSources(), + catalogue.getMonitorSources()) + .flatMap(m -> m.values().stream()) + .flatMap(DataProducer::getTopics) + .allMatch(this::registerSchema); + + if (force) { + setCompatibility(Compatibility.FULL); + } + + return result; + } + + public boolean registerSchema(AvroTopic topic) { + try { + logger.info("Registering topic {} key schema: {}", topic.getName(), topic.getKeySchema().getFullName()); + ParsedSchemaMetadata key = new ParsedSchemaMetadata(null, null, topic.getKeySchema()); + this.schemaClient.addSchemaMetadata(topic.getName(), false, key); + logger.info("Registering topic {} value schema: {}", topic.getName(), topic.getValueSchema().getFullName()); + ParsedSchemaMetadata value = new ParsedSchemaMetadata(null, null, topic.getValueSchema()); + this.schemaClient.addSchemaMetadata(topic.getName(), true, value); + return true; + } catch (IOException ex) { + logger.error("Failed to register schemas for topic {}", topic.getName(), ex); + return false; + } + } + + private boolean setCompatibility(Compatibility compatibility) { + logger.info("Setting compatibility to {}", compatibility); + + Request request; + try { + request = httpClient.requestBuilder("config") + .put(new RequestBody() { + @Override + public MediaType contentType() { + return MediaType.parse("application/vnd.schemaregistry.v1+json; charset=utf-8"); + } + + @Override + public void writeTo(BufferedSink sink) throws IOException { + sink.writeUtf8("{\"compatibility\": \""); + sink.writeUtf8(compatibility.name()); + sink.writeUtf8("\"}"); + } + }) + .build(); + } catch (MalformedURLException ex) { + // should not occur with valid base URL + return false; + } + + try (Response response = httpClient.request(request)) { + ResponseBody body = response.body(); + if (response.isSuccessful()) { + logger.info("Compatibility set to {}", compatibility); + return true; + } else { + String bodyString = body == null ? null : body.string(); + logger.info("Failed to set compatibility set to {}: {}", compatibility, bodyString); + return false; + } + } catch (IOException ex) { + logger.error("Error changing compatibility level to {}", compatibility, ex); + return false; + } + } + + public void close() { + schemaClient.close(); + httpClient.close(); + } +} From 4573523a3def052dae1a37d683d961b832229ad1 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Tue, 10 Oct 2017 16:02:24 +0200 Subject: [PATCH 099/112] Code style fixes --- java-sdk/radar-schemas-tools/build.gradle | 2 -- .../schema/registration/SchemaRegistry.java | 28 ++++++++++++------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/java-sdk/radar-schemas-tools/build.gradle b/java-sdk/radar-schemas-tools/build.gradle index 9620ed3e..7456973b 100644 --- a/java-sdk/radar-schemas-tools/build.gradle +++ b/java-sdk/radar-schemas-tools/build.gradle @@ -29,8 +29,6 @@ dependencies { implementation project(':radar-schemas-commons') implementation group: 'org.radarcns', name: 'radar-commons', version: '0.5' implementation group: 'net.sourceforge.argparse4j', name: 'argparse4j', version: '0.7.0' - compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.3' - runtimeOnly group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25' 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 3a74b083..16334e41 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 @@ -22,6 +22,7 @@ import okhttp3.Response; import okhttp3.ResponseBody; import okio.BufferedSink; +import org.apache.avro.Schema; import org.radarcns.config.ServerConfig; import org.radarcns.producer.rest.ManagedConnectionPool; import org.radarcns.producer.rest.ParsedSchemaMetadata; @@ -55,8 +56,9 @@ public SchemaRegistry(String baseUrl) throws MalformedURLException { } public boolean registerSchemas(SourceCatalogue catalogue, boolean force) { - if (force) { - force = setCompatibility(Compatibility.NONE); + boolean forced = force; + if (forced) { + forced = setCompatibility(Compatibility.NONE); } boolean result = Stream.of( catalogue.getActiveSources(), @@ -66,7 +68,7 @@ public boolean registerSchemas(SourceCatalogue catalogue, boolean force) { .flatMap(DataProducer::getTopics) .allMatch(this::registerSchema); - if (force) { + if (forced) { setCompatibility(Compatibility.FULL); } @@ -75,12 +77,17 @@ public boolean registerSchemas(SourceCatalogue catalogue, boolean force) { public boolean registerSchema(AvroTopic topic) { try { - logger.info("Registering topic {} key schema: {}", topic.getName(), topic.getKeySchema().getFullName()); - ParsedSchemaMetadata key = new ParsedSchemaMetadata(null, null, topic.getKeySchema()); - this.schemaClient.addSchemaMetadata(topic.getName(), false, key); - logger.info("Registering topic {} value schema: {}", topic.getName(), topic.getValueSchema().getFullName()); - ParsedSchemaMetadata value = new ParsedSchemaMetadata(null, null, topic.getValueSchema()); - this.schemaClient.addSchemaMetadata(topic.getName(), true, value); + Schema schema = topic.getKeySchema(); + logger.info("Registering topic {} key schema: {}", + topic.getName(), schema.getFullName()); + ParsedSchemaMetadata metadata = new ParsedSchemaMetadata(null, null, schema); + this.schemaClient.addSchemaMetadata(topic.getName(), false, metadata); + + schema = topic.getValueSchema(); + logger.info("Registering topic {} value schema: {}", + topic.getName(), schema.getFullName()); + metadata = new ParsedSchemaMetadata(null, null, schema); + this.schemaClient.addSchemaMetadata(topic.getName(), true, metadata); return true; } catch (IOException ex) { logger.error("Failed to register schemas for topic {}", topic.getName(), ex); @@ -97,7 +104,8 @@ private boolean setCompatibility(Compatibility compatibility) { .put(new RequestBody() { @Override public MediaType contentType() { - return MediaType.parse("application/vnd.schemaregistry.v1+json; charset=utf-8"); + return MediaType.parse( + "application/vnd.schemaregistry.v1+json; charset=utf-8"); } @Override From cbdfb80f29ff9277d7710a06154220398f38ea44 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Tue, 10 Oct 2017 16:18:01 +0200 Subject: [PATCH 100/112] Added topic creation command --- java-sdk/radar-schemas-tools/build.gradle | 4 ++ .../org/radarcns/schema/CommandLineApp.java | 37 ++++++++++- .../schema/registration/KafkaTopics.java | 66 +++++++++++++++++++ .../schema/registration/SchemaRegistry.java | 18 ++--- 4 files changed, 110 insertions(+), 15 deletions(-) create mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/KafkaTopics.java diff --git a/java-sdk/radar-schemas-tools/build.gradle b/java-sdk/radar-schemas-tools/build.gradle index 7456973b..e581d580 100644 --- a/java-sdk/radar-schemas-tools/build.gradle +++ b/java-sdk/radar-schemas-tools/build.gradle @@ -29,6 +29,10 @@ dependencies { implementation project(':radar-schemas-commons') implementation group: 'org.radarcns', name: 'radar-commons', version: '0.5' implementation group: 'net.sourceforge.argparse4j', name: 'argparse4j', version: '0.7.0' + implementation (group: 'org.apache.kafka', name: 'kafka_2.11', version: '0.10.2.1') { + exclude group: 'org.slf4j', module: 'slf4j-log4j12' + exclude group: 'log4j', module: 'log4j' + } runtimeOnly group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25' diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java index 0b306c92..e56f29c5 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java @@ -23,6 +23,7 @@ import net.sourceforge.argparse4j.inf.Namespace; import net.sourceforge.argparse4j.inf.Subparser; import net.sourceforge.argparse4j.inf.Subparsers; +import org.radarcns.schema.registration.KafkaTopics; import org.radarcns.schema.registration.SchemaRegistry; import org.radarcns.schema.specification.DataTopic; import org.radarcns.schema.specification.DataProducer; @@ -204,13 +205,27 @@ private ExcludeConfig loadConfig(String configSubPath) throws IOException { public int registerSchemas(String url, boolean force) { try (SchemaRegistry registration = new SchemaRegistry(url)) { - return registration.registerSchemas(catalogue, force) ? 0 : 1; + boolean forced = force; + if (forced) { + forced = registration.setCompatibility(SchemaRegistry.Compatibility.NONE); + } + int result = registration.registerSchemas(catalogue) ? 0 : 1; + if (forced) { + registration.setCompatibility(SchemaRegistry.Compatibility.FULL); + } + return result; } catch (MalformedURLException ex) { logger.error("Schema registry URL {} is invalid: {}", url, ex.toString()); return 1; } } + public int createTopics(String zookeeper, int partitions, int replication) { + try (KafkaTopics topics = new KafkaTopics(zookeeper)) { + return topics.createTopics(catalogue, partitions, replication) ? 0 : 1; + } + } + public static void main(String... args) { ArgumentParser parser = getArgumentParser(); @@ -240,6 +255,10 @@ public static void main(String... args) { System.exit(app.registerSchemas( ns.getString("url"), ns.getBoolean("force"))); break; + case "create": + System.exit(app.createTopics(ns.getString("zookeeper"), + ns.getInt("partitions"), ns.getInt("replication"))); + break; default: parser.handleError(new ArgumentParserException( "Subcommand " + ns.getString("subparser") + " not implemented", @@ -304,6 +323,22 @@ private static ArgumentParser getArgumentParser() { registerParser.addArgument("url") .help("URL of the schema registry."); addRootArgument(registerParser); + + + Subparser createParser = subParsers.addParser("create", true) + .description("Create all topics that are missing"); + createParser.addArgument("-p", "--partitions") + .help("Number of partitions per topic") + .type(Integer.class) + .setDefault(3); + createParser.addArgument("-r", "--replication") + .help("Number of replicas per data packet.") + .type(Integer.class) + .setDefault(3); + registerParser.addArgument("zookeeper") + .help("Zookeeper hosts and ports, comma-separated."); + addRootArgument(registerParser); + return parser; } 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 new file mode 100644 index 00000000..b21ef4ad --- /dev/null +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/registration/KafkaTopics.java @@ -0,0 +1,66 @@ +package org.radarcns.schema.registration; + +import kafka.admin.AdminUtils; +import kafka.admin.RackAwareMode; +import kafka.utils.ZKStringSerializer; +import kafka.utils.ZkUtils; +import org.I0Itec.zkclient.ZkClient; +import org.I0Itec.zkclient.ZkConnection; +import org.I0Itec.zkclient.exception.ZkMarshallingError; +import org.I0Itec.zkclient.serialize.ZkSerializer; +import org.radarcns.schema.specification.SourceCatalogue; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.Closeable; +import java.util.Properties; + +public class KafkaTopics implements Closeable { + private final ZkUtils zkUtils; + private static final Logger logger = LoggerFactory.getLogger(KafkaTopics.class); + + public KafkaTopics(String zookeeper) { + ZkClient zkClient = new ZkClient(zookeeper, 15_000, 10_000); + + zkClient.setZkSerializer(new ZkSerializer() { + @Override + public byte[] serialize(Object o) throws ZkMarshallingError { + return ZKStringSerializer.serialize(o); + } + + @Override + public Object deserialize(byte[] bytes) throws ZkMarshallingError { + return ZKStringSerializer.deserialize(bytes); + } + }); + + zkUtils = new ZkUtils(zkClient, new ZkConnection(zookeeper), false); + } + + public boolean createTopics(SourceCatalogue catalogue, int partitions, int replication) { + return catalogue.getTopicNames() + .allMatch(topic -> createTopic(topic, partitions, replication)); + } + + public boolean createTopic(String topic, int partitions, int replication) { + Properties props = new Properties(); + try { + if (!AdminUtils.topicExists(zkUtils, topic)) { + logger.info("Creating topic {}", topic); + AdminUtils.createTopic(zkUtils, topic, partitions, replication, props, + RackAwareMode.Enforced$.MODULE$); + } else { + logger.info("Topic {} already exists", topic); + } + return true; + } catch (Exception ex) { + logger.error("Failed to create topic {}", topic, ex); + return false; + } + } + + @Override + public void close() { + zkUtils.close(); + } +} 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 16334e41..89201ee7 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 @@ -40,7 +40,7 @@ import java.util.stream.Stream; public class SchemaRegistry implements Closeable { - private enum Compatibility { + public enum Compatibility { NONE, FULL, BACKWARD, FORWARD, BACKWARD_TRANSITIVE, FORWARD_TRANSITIVE, FULL_TRANSITIVE } @@ -55,24 +55,14 @@ public SchemaRegistry(String baseUrl) throws MalformedURLException { this.httpClient = new RestClient(config, 10, ManagedConnectionPool.GLOBAL_POOL); } - public boolean registerSchemas(SourceCatalogue catalogue, boolean force) { - boolean forced = force; - if (forced) { - forced = setCompatibility(Compatibility.NONE); - } - boolean result = Stream.of( + public boolean registerSchemas(SourceCatalogue catalogue) { + return Stream.of( catalogue.getActiveSources(), catalogue.getPassiveSources(), catalogue.getMonitorSources()) .flatMap(m -> m.values().stream()) .flatMap(DataProducer::getTopics) .allMatch(this::registerSchema); - - if (forced) { - setCompatibility(Compatibility.FULL); - } - - return result; } public boolean registerSchema(AvroTopic topic) { @@ -95,7 +85,7 @@ public boolean registerSchema(AvroTopic topic) { } } - private boolean setCompatibility(Compatibility compatibility) { + public boolean setCompatibility(Compatibility compatibility) { logger.info("Setting compatibility to {}", compatibility); Request request; From ed2e3b569f06ab7015e3d40848031486f0b8f018 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Tue, 10 Oct 2017 16:38:30 +0200 Subject: [PATCH 101/112] Updated command-line descriptions --- .../org/radarcns/schema/CommandLineApp.java | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java index e56f29c5..47005335 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java @@ -282,62 +282,62 @@ private static void listTopics(Namespace ns, CommandLineApp app) { private static ArgumentParser getArgumentParser() { ArgumentParser parser = ArgumentParsers.newArgumentParser("radar-schema") .defaultHelp(true) - .description("Validate and list schema specifications"); + .description("Schema tools"); Subparsers subParsers = parser.addSubparsers().dest("subparser"); Subparser validateParser = subParsers.addParser("validate", true) - .description("Validate a set of specifications"); + .description("Validate a set of specifications."); addRootArgument(validateParser); validateParser.addArgument("-s", "--scope") - .help("Type of specifications to validate") + .help("type of specifications to validate") .choices(Scope.values()); validateParser.addArgument("-c", "--config") - .help("Configuration file to use"); + .help("configuration file to use"); validateParser.addArgument("-v", "--verbose") - .help("Verbose validation message") + .help("verbose validation message") .action(Arguments.storeTrue()); validateParser.addArgument("-q", "--quiet") - .help("Only set exit code.") + .help("only set exit code.") .action(Arguments.storeTrue()); Subparser listParser = subParsers.addParser("list", true) .description("list topics and schemas"); addRootArgument(listParser); listParser.addArgument("-r", "--raw") - .help("List raw input topics") + .help("list raw input topics") .action(Arguments.storeTrue()); listParser.addArgument("-q", "--quiet") - .help("Only print the requested topics") + .help("only print the requested topics") .action(Arguments.storeTrue()); listParser.addArgument("-m", "--match") - .help("Only print the requested topics"); + .help("only print the requested topics"); listParser.addArgument("-S", "--stream") - .help("List the output topics of Kafka Streams") + .help("list the output topics of Kafka Streams") .action(Arguments.storeTrue()); Subparser registerParser = subParsers.addParser("register", true) - .description("Register schemas in the schema registry"); + .description("Register schemas in the schema registry."); registerParser.addArgument("-f", "--force") - .help("Force registering schema, even if it is incompatible.") + .help("force registering schema, even if it is incompatible") .action(Arguments.storeTrue()); - registerParser.addArgument("url") - .help("URL of the schema registry."); + registerParser.addArgument("schemaRegistry") + .help("schema registry URL"); addRootArgument(registerParser); Subparser createParser = subParsers.addParser("create", true) - .description("Create all topics that are missing"); + .description("Create all topics that are missing on the Kafka server."); createParser.addArgument("-p", "--partitions") - .help("Number of partitions per topic") + .help("number of partitions per topic") .type(Integer.class) .setDefault(3); createParser.addArgument("-r", "--replication") - .help("Number of replicas per data packet.") + .help("number of replicas per data packet") .type(Integer.class) .setDefault(3); - registerParser.addArgument("zookeeper") - .help("Zookeeper hosts and ports, comma-separated."); - addRootArgument(registerParser); + createParser.addArgument("zookeeper") + .help("zookeeper hosts and ports, comma-separated"); + addRootArgument(createParser); return parser; } From 7e9f4f1c1213e4de50450b050dc2221c15f8f718 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Thu, 12 Oct 2017 11:51:29 +0200 Subject: [PATCH 102/112] Tested schema and topic registration --- java-sdk/radar-schemas-tools/build.gradle | 3 +-- .../src/main/java/org/radarcns/schema/CommandLineApp.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/java-sdk/radar-schemas-tools/build.gradle b/java-sdk/radar-schemas-tools/build.gradle index e581d580..8007c725 100644 --- a/java-sdk/radar-schemas-tools/build.gradle +++ b/java-sdk/radar-schemas-tools/build.gradle @@ -29,9 +29,8 @@ dependencies { implementation project(':radar-schemas-commons') implementation group: 'org.radarcns', name: 'radar-commons', version: '0.5' implementation group: 'net.sourceforge.argparse4j', name: 'argparse4j', version: '0.7.0' - implementation (group: 'org.apache.kafka', name: 'kafka_2.11', version: '0.10.2.1') { + implementation (group: 'org.apache.kafka', name: 'kafka_2.11', version: '0.11.0.1') { exclude group: 'org.slf4j', module: 'slf4j-log4j12' - exclude group: 'log4j', module: 'log4j' } runtimeOnly group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25' diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java index 47005335..de07560f 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java @@ -253,7 +253,7 @@ public static void main(String... args) { break; case "register": System.exit(app.registerSchemas( - ns.getString("url"), ns.getBoolean("force"))); + ns.getString("schemaRegistry"), ns.getBoolean("force"))); break; case "create": System.exit(app.createTopics(ns.getString("zookeeper"), From 5e3a60fe1746e88bfdeae3a081fb691ba375d520 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Thu, 12 Oct 2017 11:51:48 +0200 Subject: [PATCH 103/112] Added docker-compose test stack --- java-sdk/Dockerfile | 23 +++++++++++++ java-sdk/docker-compose.yml | 65 +++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 java-sdk/Dockerfile create mode 100644 java-sdk/docker-compose.yml diff --git a/java-sdk/Dockerfile b/java-sdk/Dockerfile new file mode 100644 index 00000000..e642c8a9 --- /dev/null +++ b/java-sdk/Dockerfile @@ -0,0 +1,23 @@ +FROM openjdk:8-jdk-alpine + +RUN mkdir /code +WORKDIR /code + +COPY gradle /code/gradle +COPY gradle.properties build.gradle settings.gradle gradlew /code/ +RUN ./gradlew tasks +COPY radar-schemas-commons/src /code/radar-schemas-commons/src +COPY radar-schemas-commons/build.gradle /code/radar-schemas-commons/ +COPY radar-schemas-tools/src /code/radar-schemas-tools/src +COPY radar-schemas-tools/build.gradle /code/radar-schemas-tools/ +RUN ./gradlew distTar && cd radar-schemas-tools/build/distributions && tar xzf radar-schemas-tools*.tar.gz + +FROM openjdk:8-jre-alpine + +COPY --from=0 /code/radar-schemas-tools/build/distributions/radar-schemas-tools-*/lib/* /usr/lib/ +COPY --from=0 /code/radar-schemas-tools/build/distributions/radar-schemas-tools-*/bin/radar-schemas-tools /usr/bin/ + +WORKDIR /schemas +VOLUME /schemas + +CMD ["radar-schemas-tools", "-h"] diff --git a/java-sdk/docker-compose.yml b/java-sdk/docker-compose.yml new file mode 100644 index 00000000..d6f335ec --- /dev/null +++ b/java-sdk/docker-compose.yml @@ -0,0 +1,65 @@ +--- +version: '2' + +services: + #---------------------------------------------------------------------------# + # Zookeeper Cluster # + #---------------------------------------------------------------------------# + zookeeper-1: + image: confluentinc/cp-zookeeper:3.3.0 + environment: + ZOOKEEPER_SERVER_ID: 1 + ZOOKEEPER_CLIENT_PORT: 2181 + ZOOKEEPER_TICK_TIME: 2000 + ZOOKEEPER_INIT_LIMIT: 5 + ZOOKEEPER_SYNC_LIMIT: 2 + ZOOKEEPER_SERVERS: zookeeper-1:2888:3888 + + #---------------------------------------------------------------------------# + # Kafka Cluster # + #---------------------------------------------------------------------------# + kafka-1: + image: confluentinc/cp-kafka:3.3.0 + depends_on: + - zookeeper-1 + environment: + KAFKA_BROKER_ID: 1 + KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:2181 + KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-1:9092 + KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true" + KAFKA_GROUP_MIN_SESSION_TIMEOUT_MS: 5000 + KAFKA_INTER_BROKER_PROTOCOL_VERSION: 0.11.0 + KAFKA_LOG_MESSAGE_FORMAT_VERSION: 0.11.0 + KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0 + KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 + KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 + KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1 + + + #---------------------------------------------------------------------------# + # Schema Registry # + #---------------------------------------------------------------------------# + schema-registry-1: + image: confluentinc/cp-schema-registry:3.3.0 + depends_on: + - zookeeper-1 + - kafka-1 + restart: always + environment: + SCHEMA_REGISTRY_KAFKASTORE_CONNECTION_URL: zookeeper-1:2181 + SCHEMA_REGISTRY_HOST_NAME: schema-registry-1 + SCHEMA_REGISTRY_LISTENERS: http://0.0.0.0:8081 + KAFKA_GROUP_MIN_SESSION_TIMEOUT_MS: 5000 + + #---------------------------------------------------------------------------# + # Integration test # + #---------------------------------------------------------------------------# + integration-test: + build: . + # Right now, only direct connections to kafka are tested + depends_on: + - zookeeper-1 + - kafka-1 + - schema-registry-1 + volumes: + - ../:/schemas From 5b6b18517f56f8d96c07db1c6b47ad72ba9c6b5b Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Thu, 12 Oct 2017 12:00:09 +0200 Subject: [PATCH 104/112] Updated docker documentation --- java-sdk/README.md | 22 ++++++++++++++++++++++ java-sdk/docker-compose.yml | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/java-sdk/README.md b/java-sdk/README.md index 92b34160..4a503c99 100644 --- a/java-sdk/README.md +++ b/java-sdk/README.md @@ -41,3 +41,25 @@ public class Deserialize { ``` Alternatively, use `org.radarcns.data.SpecificRecordEncoder` and `org.radarcns.data.SpecificRecordDecoder` from the `radar-commons` package. + +## Test setup + +The RADAR schema tools can be tested locally using Docker. To run the tools, first install Docker. Then run + +```shell +docker-compose build +docker-compose up -d zookeeper-1 kafka-1 schema-registry-1 +``` +Now you can run tools commands with +```shell +# usage +docker-compose run --rm tools +# validation +docker-compose run --rm radar-schemas-tools validate +# list topic information +docker-compose run --rm radar-schemas-tools list +# register schemas with the schema registry +docker-compose run --rm radar-schemas-tools register http://schema-registry:8081 +# create topics with zookeeper +docker-compose run --rm radar-schemas-tools create zookeeper-1:2181 +``` diff --git a/java-sdk/docker-compose.yml b/java-sdk/docker-compose.yml index d6f335ec..bc6ec254 100644 --- a/java-sdk/docker-compose.yml +++ b/java-sdk/docker-compose.yml @@ -54,7 +54,7 @@ services: #---------------------------------------------------------------------------# # Integration test # #---------------------------------------------------------------------------# - integration-test: + tools: build: . # Right now, only direct connections to kafka are tested depends_on: From f7eb69b47bd3dc5da25c9e2ead3ef989ad76be9e Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Thu, 12 Oct 2017 12:06:03 +0200 Subject: [PATCH 105/112] Fixed README commands --- java-sdk/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/java-sdk/README.md b/java-sdk/README.md index 4a503c99..5a08b440 100644 --- a/java-sdk/README.md +++ b/java-sdk/README.md @@ -55,11 +55,11 @@ Now you can run tools commands with # usage docker-compose run --rm tools # validation -docker-compose run --rm radar-schemas-tools validate +docker-compose run --rm tools radar-schemas-tools validate # list topic information -docker-compose run --rm radar-schemas-tools list +docker-compose run --rm tools radar-schemas-tools list # register schemas with the schema registry -docker-compose run --rm radar-schemas-tools register http://schema-registry:8081 +docker-compose run --rm tools radar-schemas-tools register http://schema-registry:8081 # create topics with zookeeper -docker-compose run --rm radar-schemas-tools create zookeeper-1:2181 +docker-compose run --rm tools radar-schemas-tools create zookeeper-1:2181 ``` From 1e9ae293cc3a8ae577c410fda80b489ece06480b Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Thu, 12 Oct 2017 12:50:52 +0200 Subject: [PATCH 106/112] Check current number of brokers before creating topics --- java-sdk/Dockerfile | 5 ++- .../org/radarcns/schema/CommandLineApp.java | 37 ++++++++++++++++++- .../schema/registration/KafkaTopics.java | 5 +++ 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/java-sdk/Dockerfile b/java-sdk/Dockerfile index e642c8a9..335ce62f 100644 --- a/java-sdk/Dockerfile +++ b/java-sdk/Dockerfile @@ -6,10 +6,11 @@ WORKDIR /code COPY gradle /code/gradle COPY gradle.properties build.gradle settings.gradle gradlew /code/ RUN ./gradlew tasks -COPY radar-schemas-commons/src /code/radar-schemas-commons/src COPY radar-schemas-commons/build.gradle /code/radar-schemas-commons/ -COPY radar-schemas-tools/src /code/radar-schemas-tools/src +COPY radar-schemas-commons/src /code/radar-schemas-commons/src +RUN ./gradlew :radar-schemas-commons:classes COPY radar-schemas-tools/build.gradle /code/radar-schemas-tools/ +COPY radar-schemas-tools/src /code/radar-schemas-tools/src RUN ./gradlew distTar && cd radar-schemas-tools/build/distributions && tar xzf radar-schemas-tools*.tar.gz FROM openjdk:8-jre-alpine diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java index de07560f..c37f6335 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java @@ -23,6 +23,7 @@ import net.sourceforge.argparse4j.inf.Namespace; import net.sourceforge.argparse4j.inf.Subparser; import net.sourceforge.argparse4j.inf.Subparsers; +import org.apache.zookeeper.KeeperException; import org.radarcns.schema.registration.KafkaTopics; import org.radarcns.schema.registration.SchemaRegistry; import org.radarcns.schema.specification.DataTopic; @@ -55,6 +56,7 @@ @SuppressWarnings("PMD.SystemPrintln") public class CommandLineApp { private static final Logger logger = LoggerFactory.getLogger(CommandLineApp.class); + private static final int MAX_SLEEP = 32; private final SourceCatalogue catalogue; private final Path root; @@ -220,9 +222,37 @@ public int registerSchemas(String url, boolean force) { } } - public int createTopics(String zookeeper, int partitions, int replication) { + public int createTopics(String zookeeper, int brokers, int partitions, int replication) { + if (brokers < replication) { + logger.error("Cannot assign a higher replication factor {} than number of brokers {}", + replication, brokers); + return 1; + } try (KafkaTopics topics = new KafkaTopics(zookeeper)) { + boolean brokersAvailable = false; + int sleep = 2; + for (int tries = 0; tries < 10; tries++) { + int activeBrokers = topics.getNumberOfBrokers(); + brokersAvailable = activeBrokers >= brokers; + if (brokersAvailable) { + logger.info("Kafka brokers available. Starting topic creation."); + break; + } + logger.warn("Only {} out of {} Kafka brokers available. Waiting {} seconds.", + activeBrokers, brokers, sleep); + Thread.sleep(sleep * 1000L); + sleep = Math.min(MAX_SLEEP, sleep * 2); + } + if (!brokersAvailable) { + logger.error("Kafka brokers not yet available. Aborting."); + return 1; + } + return topics.createTopics(catalogue, partitions, replication) ? 0 : 1; + } catch (InterruptedException | KeeperException e) { + logger.error("Cannot retrieve number of active Kafka brokers." + + " Please check that Zookeeper is running."); + return 1; } } @@ -257,6 +287,7 @@ public static void main(String... args) { break; case "create": System.exit(app.createTopics(ns.getString("zookeeper"), + ns.getInt("brokers"), ns.getInt("partitions"), ns.getInt("replication"))); break; default: @@ -335,6 +366,10 @@ private static ArgumentParser getArgumentParser() { .help("number of replicas per data packet") .type(Integer.class) .setDefault(3); + createParser.addArgument("-b", "--brokers") + .help("number of brokers that are expected to be available.") + .type(Integer.class) + .setDefault(3); createParser.addArgument("zookeeper") .help("zookeeper hosts and ports, comma-separated"); addRootArgument(createParser); 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 b21ef4ad..9190acc8 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 @@ -8,6 +8,7 @@ import org.I0Itec.zkclient.ZkConnection; import org.I0Itec.zkclient.exception.ZkMarshallingError; import org.I0Itec.zkclient.serialize.ZkSerializer; +import org.apache.zookeeper.KeeperException; import org.radarcns.schema.specification.SourceCatalogue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -59,6 +60,10 @@ public boolean createTopic(String topic, int partitions, int replication) { } } + public int getNumberOfBrokers() throws KeeperException, InterruptedException { + return zkUtils.getAllBrokersInCluster().length(); + } + @Override public void close() { zkUtils.close(); From 1e239e9d7304046c2699ed6aaeaf686408570126 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Thu, 12 Oct 2017 14:16:42 +0200 Subject: [PATCH 107/112] Moved docker files to root --- Dockerfile | 27 +++++++++++++++++++ README.md | 24 +++++++++++++++++ .../docker-compose.yml => docker-compose.yml | 2 +- java-sdk/Dockerfile | 24 ----------------- java-sdk/README.md | 22 --------------- 5 files changed, 52 insertions(+), 47 deletions(-) create mode 100644 Dockerfile rename java-sdk/docker-compose.yml => docker-compose.yml (99%) delete mode 100644 java-sdk/Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..28b1b617 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,27 @@ +FROM openjdk:8-jdk-alpine + +RUN mkdir -p /code/java-sdk +WORKDIR /code/java-sdk + +COPY commons /code/commons +COPY specifications /code/specifications +COPY restapi /code/restapi +COPY java-sdk/gradle /code/java-sdk/gradle +COPY java-sdk/gradle.properties java-sdk/build.gradle java-sdk/settings.gradle java-sdk/gradlew /code/java-sdk/ +RUN ./gradlew tasks +COPY java-sdk/radar-schemas-commons/build.gradle /code/java-sdk/radar-schemas-commons/ +COPY java-sdk/radar-schemas-commons/src /code/java-sdk/radar-schemas-commons/src +RUN ./gradlew :radar-schemas-commons:classes +COPY java-sdk/radar-schemas-tools/build.gradle /code/java-sdk/radar-schemas-tools/ +COPY java-sdk/radar-schemas-tools/src /code/java-sdk/radar-schemas-tools/src +RUN ./gradlew distTar && cd radar-schemas-tools/build/distributions && tar xzf radar-schemas-tools*.tar.gz + +FROM openjdk:8-jre-alpine + +COPY --from=0 /code/java-sdk/radar-schemas-tools/build/distributions/radar-schemas-tools-*/lib/* /usr/lib/ +COPY --from=0 /code/java-sdk/radar-schemas-tools/build/distributions/radar-schemas-tools-*/bin/radar-schemas-tools /usr/bin/ + +WORKDIR /schemas +VOLUME /schemas + +CMD ["radar-schemas-tools", "-h"] diff --git a/README.md b/README.md index 602b69a9..0fd4b6bd 100644 --- a/README.md +++ b/README.md @@ -34,3 +34,27 @@ In addition, schemas in the `commons` directory should follow the following guid ### Validation phase Avro schemas are automatically validated against RADAR-CNS guide lines while building. For more details, check [catalog validator](java-sdk/radar-schemas-tools). + + +### Test setup + +The RADAR schema tools can be tested locally using Docker. To run the tools, first install Docker. Then run + +```shell +docker-compose build +docker-compose up -d zookeeper-1 kafka-1 schema-registry-1 +``` +Now you can run tools commands with +```shell +# usage +docker-compose run --rm tools +# validation +docker-compose run --rm tools radar-schemas-tools validate +# list topic information +docker-compose run --rm tools radar-schemas-tools list +# register schemas with the schema registry +docker-compose run --rm tools radar-schemas-tools register http://schema-registry:8081 +# create topics with zookeeper +docker-compose run --rm tools radar-schemas-tools create zookeeper-1:2181 +``` + diff --git a/java-sdk/docker-compose.yml b/docker-compose.yml similarity index 99% rename from java-sdk/docker-compose.yml rename to docker-compose.yml index bc6ec254..5251f4c3 100644 --- a/java-sdk/docker-compose.yml +++ b/docker-compose.yml @@ -62,4 +62,4 @@ services: - kafka-1 - schema-registry-1 volumes: - - ../:/schemas + - .:/schemas diff --git a/java-sdk/Dockerfile b/java-sdk/Dockerfile deleted file mode 100644 index 335ce62f..00000000 --- a/java-sdk/Dockerfile +++ /dev/null @@ -1,24 +0,0 @@ -FROM openjdk:8-jdk-alpine - -RUN mkdir /code -WORKDIR /code - -COPY gradle /code/gradle -COPY gradle.properties build.gradle settings.gradle gradlew /code/ -RUN ./gradlew tasks -COPY radar-schemas-commons/build.gradle /code/radar-schemas-commons/ -COPY radar-schemas-commons/src /code/radar-schemas-commons/src -RUN ./gradlew :radar-schemas-commons:classes -COPY radar-schemas-tools/build.gradle /code/radar-schemas-tools/ -COPY radar-schemas-tools/src /code/radar-schemas-tools/src -RUN ./gradlew distTar && cd radar-schemas-tools/build/distributions && tar xzf radar-schemas-tools*.tar.gz - -FROM openjdk:8-jre-alpine - -COPY --from=0 /code/radar-schemas-tools/build/distributions/radar-schemas-tools-*/lib/* /usr/lib/ -COPY --from=0 /code/radar-schemas-tools/build/distributions/radar-schemas-tools-*/bin/radar-schemas-tools /usr/bin/ - -WORKDIR /schemas -VOLUME /schemas - -CMD ["radar-schemas-tools", "-h"] diff --git a/java-sdk/README.md b/java-sdk/README.md index 5a08b440..92b34160 100644 --- a/java-sdk/README.md +++ b/java-sdk/README.md @@ -41,25 +41,3 @@ public class Deserialize { ``` Alternatively, use `org.radarcns.data.SpecificRecordEncoder` and `org.radarcns.data.SpecificRecordDecoder` from the `radar-commons` package. - -## Test setup - -The RADAR schema tools can be tested locally using Docker. To run the tools, first install Docker. Then run - -```shell -docker-compose build -docker-compose up -d zookeeper-1 kafka-1 schema-registry-1 -``` -Now you can run tools commands with -```shell -# usage -docker-compose run --rm tools -# validation -docker-compose run --rm tools radar-schemas-tools validate -# list topic information -docker-compose run --rm tools radar-schemas-tools list -# register schemas with the schema registry -docker-compose run --rm tools radar-schemas-tools register http://schema-registry:8081 -# create topics with zookeeper -docker-compose run --rm tools radar-schemas-tools create zookeeper-1:2181 -``` From bcc988e69bb2b9ff59167626c43ef10de1b9bdff Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Thu, 12 Oct 2017 14:17:10 +0200 Subject: [PATCH 108/112] Made subcommands use an interface --- .../org/radarcns/schema/CommandLineApp.java | 281 +++++------------- .../schema/registration/KafkaTopics.java | 80 ++++- .../schema/registration/SchemaRegistry.java | 45 +++ .../org/radarcns/schema/util/SubCommand.java | 20 ++ .../schema/validation/SchemaValidator.java | 93 +++++- 5 files changed, 312 insertions(+), 207 deletions(-) create mode 100644 java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/SubCommand.java diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java index c37f6335..a7bbb86e 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java @@ -21,30 +21,26 @@ import net.sourceforge.argparse4j.inf.ArgumentParser; import net.sourceforge.argparse4j.inf.ArgumentParserException; import net.sourceforge.argparse4j.inf.Namespace; -import net.sourceforge.argparse4j.inf.Subparser; import net.sourceforge.argparse4j.inf.Subparsers; -import org.apache.zookeeper.KeeperException; import org.radarcns.schema.registration.KafkaTopics; -import org.radarcns.schema.registration.SchemaRegistry; -import org.radarcns.schema.specification.DataTopic; import org.radarcns.schema.specification.DataProducer; +import org.radarcns.schema.specification.DataTopic; import org.radarcns.schema.specification.SourceCatalogue; import org.radarcns.schema.specification.stream.StreamGroup; +import org.radarcns.schema.util.SubCommand; import org.radarcns.schema.validation.SchemaValidator; -import org.radarcns.schema.validation.ValidationException; -import org.radarcns.schema.validation.config.ExcludeConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; -import java.net.MalformedURLException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.TreeSet; +import java.util.SortedMap; +import java.util.TreeMap; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -56,7 +52,6 @@ @SuppressWarnings("PMD.SystemPrintln") public class CommandLineApp { private static final Logger logger = LoggerFactory.getLogger(CommandLineApp.class); - private static final int MAX_SLEEP = 32; private final SourceCatalogue catalogue; private final Path root; @@ -141,6 +136,14 @@ public String getTopicsVerbose(boolean prettyPrint, String source) { return result.toString(); } + public SourceCatalogue getCatalogue() { + return catalogue; + } + + public Path getRoot() { + return root; + } + /** * TODO. * @@ -156,108 +159,14 @@ private Map> getTopicsInfoVerbose(boolean prettyPrin DataTopic::getTopic, d -> d.toString(prettyPrint))))); } - public int validateSchemas(Namespace ns) { - try { - ExcludeConfig config = loadConfig(ns.getString("config")); - SchemaValidator validator = new SchemaValidator(root, config); - Stream stream = validateSchemas( - ns.getString("scope"), validator); - - if (ns.getBoolean("quiet")) { - return stream.count() > 0 ? 1 : 0; - } else { - String result = SchemaValidator.format(stream); - - System.out.println(result); - if (ns.getBoolean("verbose")) { - System.out.println("Validated schemas:"); - for (String name : new TreeSet<>(validator.getValidatedSchemas().keySet())) { - System.out.println(" - " + name); - } - System.out.println(); - } - return result.isEmpty() ? 0 : 1; - } - } catch (IOException e) { - System.err.println("Failed to load schemas: " + e); - return 1; - } - } - - private Stream validateSchemas(String scopeString, - SchemaValidator validator) throws IOException { - if (scopeString == null) { - return validator.analyseFiles(); - } else { - return validator.analyseFiles(Scope.valueOf(scopeString)); - } - } - - private ExcludeConfig loadConfig(String configSubPath) throws IOException { - Path configPath = null; - if (configSubPath != null) { - if (configSubPath.charAt(0) == '/') { - configPath = Paths.get(configSubPath); - } else { - configPath = root.resolve(configSubPath); - } - } - return ExcludeConfig.load(configPath); - } - - public int registerSchemas(String url, boolean force) { - try (SchemaRegistry registration = new SchemaRegistry(url)) { - boolean forced = force; - if (forced) { - forced = registration.setCompatibility(SchemaRegistry.Compatibility.NONE); - } - int result = registration.registerSchemas(catalogue) ? 0 : 1; - if (forced) { - registration.setCompatibility(SchemaRegistry.Compatibility.FULL); - } - return result; - } catch (MalformedURLException ex) { - logger.error("Schema registry URL {} is invalid: {}", url, ex.toString()); - return 1; - } - } - - public int createTopics(String zookeeper, int brokers, int partitions, int replication) { - if (brokers < replication) { - logger.error("Cannot assign a higher replication factor {} than number of brokers {}", - replication, brokers); - return 1; - } - try (KafkaTopics topics = new KafkaTopics(zookeeper)) { - boolean brokersAvailable = false; - int sleep = 2; - for (int tries = 0; tries < 10; tries++) { - int activeBrokers = topics.getNumberOfBrokers(); - brokersAvailable = activeBrokers >= brokers; - if (brokersAvailable) { - logger.info("Kafka brokers available. Starting topic creation."); - break; - } - logger.warn("Only {} out of {} Kafka brokers available. Waiting {} seconds.", - activeBrokers, brokers, sleep); - Thread.sleep(sleep * 1000L); - sleep = Math.min(MAX_SLEEP, sleep * 2); - } - if (!brokersAvailable) { - logger.error("Kafka brokers not yet available. Aborting."); - return 1; - } - - return topics.createTopics(catalogue, partitions, replication) ? 0 : 1; - } catch (InterruptedException | KeeperException e) { - logger.error("Cannot retrieve number of active Kafka brokers." - + " Please check that Zookeeper is running."); - return 1; - } - } - public static void main(String... args) { - ArgumentParser parser = getArgumentParser(); + SortedMap subCommands = commandsToMap( + KafkaTopics.command(), + SchemaValidator.command(), + listCommand(), + SchemaValidator.command()); + + ArgumentParser parser = getArgumentParser(subCommands); Namespace ns = null; try { @@ -274,113 +183,77 @@ public static void main(String... args) { logger.error("Failed to load catalog from root."); System.exit(1); } - switch (ns.getString("subparser")) { - case "list": - listTopics(ns, app); - break; - case "validate": - System.exit(app.validateSchemas(ns)); - break; - case "register": - System.exit(app.registerSchemas( - ns.getString("schemaRegistry"), ns.getBoolean("force"))); - break; - case "create": - System.exit(app.createTopics(ns.getString("zookeeper"), - ns.getInt("brokers"), - ns.getInt("partitions"), ns.getInt("replication"))); - break; - default: - parser.handleError(new ArgumentParserException( - "Subcommand " + ns.getString("subparser") + " not implemented", - parser)); - break; - } - } - private static void listTopics(Namespace ns, CommandLineApp app) { - if (ns.getBoolean("raw")) { - System.out.println(String.join("\n", app.getRawTopics())); - } else if (ns.getBoolean("stream")) { - System.out.println(String.join("\n", app.getResultsCacheTopics())); - } else if (ns.getBoolean("quiet")) { - System.out.println(String.join("\n", app.getTopicsToCreate())); + SubCommand command = subCommands.get(ns.getString("subparser")); + if (command != null) { + System.exit(command.execute(ns, app)); } else { - System.out.println(app.getTopicsVerbose(true, ns.getString("match"))); + parser.handleError(new ArgumentParserException( + "Subcommand " + ns.getString("subparser") + " not implemented", + parser)); } } - private static ArgumentParser getArgumentParser() { + private static ArgumentParser getArgumentParser(SortedMap subCommands) { ArgumentParser parser = ArgumentParsers.newArgumentParser("radar-schema") .defaultHelp(true) .description("Schema tools"); Subparsers subParsers = parser.addSubparsers().dest("subparser"); - Subparser validateParser = subParsers.addParser("validate", true) - .description("Validate a set of specifications."); - addRootArgument(validateParser); - validateParser.addArgument("-s", "--scope") - .help("type of specifications to validate") - .choices(Scope.values()); - validateParser.addArgument("-c", "--config") - .help("configuration file to use"); - validateParser.addArgument("-v", "--verbose") - .help("verbose validation message") - .action(Arguments.storeTrue()); - validateParser.addArgument("-q", "--quiet") - .help("only set exit code.") - .action(Arguments.storeTrue()); - - Subparser listParser = subParsers.addParser("list", true) - .description("list topics and schemas"); - addRootArgument(listParser); - listParser.addArgument("-r", "--raw") - .help("list raw input topics") - .action(Arguments.storeTrue()); - listParser.addArgument("-q", "--quiet") - .help("only print the requested topics") - .action(Arguments.storeTrue()); - listParser.addArgument("-m", "--match") - .help("only print the requested topics"); - listParser.addArgument("-S", "--stream") - .help("list the output topics of Kafka Streams") - .action(Arguments.storeTrue()); - - Subparser registerParser = subParsers.addParser("register", true) - .description("Register schemas in the schema registry."); - registerParser.addArgument("-f", "--force") - .help("force registering schema, even if it is incompatible") - .action(Arguments.storeTrue()); - registerParser.addArgument("schemaRegistry") - .help("schema registry URL"); - addRootArgument(registerParser); - - - Subparser createParser = subParsers.addParser("create", true) - .description("Create all topics that are missing on the Kafka server."); - createParser.addArgument("-p", "--partitions") - .help("number of partitions per topic") - .type(Integer.class) - .setDefault(3); - createParser.addArgument("-r", "--replication") - .help("number of replicas per data packet") - .type(Integer.class) - .setDefault(3); - createParser.addArgument("-b", "--brokers") - .help("number of brokers that are expected to be available.") - .type(Integer.class) - .setDefault(3); - createParser.addArgument("zookeeper") - .help("zookeeper hosts and ports, comma-separated"); - addRootArgument(createParser); + + for (SubCommand command : subCommands.values()) { + command.addParser(subParsers.addParser(command.getName(), true)); + } return parser; } - private static void addRootArgument(ArgumentParser parser) { - parser.addArgument("root") - .nargs("?") - .help("Root schemas directory with a specifications and commons directory") - .setDefault("."); + private static SortedMap commandsToMap(SubCommand... commands) { + SortedMap map = new TreeMap<>(); + for (SubCommand sub : commands) { + map.put(sub.getName(), sub); + } + return map; + } + + private static SubCommand listCommand() { + return new SubCommand() { + @Override + public String getName() { + return "list"; + } + + @Override + public int execute(Namespace options, CommandLineApp app) { + if (options.getBoolean("raw")) { + System.out.println(String.join("\n", app.getRawTopics())); + } else if (options.getBoolean("stream")) { + System.out.println(String.join("\n", app.getResultsCacheTopics())); + } else if (options.getBoolean("quiet")) { + System.out.println(String.join("\n", app.getTopicsToCreate())); + } else { + System.out.println(app.getTopicsVerbose(true, + options.getString("match"))); + } + return 0; + } + + @Override + public void addParser(ArgumentParser parser) { + parser.description("list topics and schemas"); + parser.addArgument("-r", "--raw") + .help("list raw input topics") + .action(Arguments.storeTrue()); + parser.addArgument("-q", "--quiet") + .help("only print the requested topics") + .action(Arguments.storeTrue()); + parser.addArgument("-m", "--match") + .help("only print the requested topics"); + parser.addArgument("-S", "--stream") + .help("list the output topics of Kafka Streams") + .action(Arguments.storeTrue()); + SubCommand.addRootArgument(parser); + } + }; } } 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 9190acc8..4875d4ce 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 @@ -4,12 +4,16 @@ import kafka.admin.RackAwareMode; import kafka.utils.ZKStringSerializer; import kafka.utils.ZkUtils; +import net.sourceforge.argparse4j.inf.ArgumentParser; +import net.sourceforge.argparse4j.inf.Namespace; import org.I0Itec.zkclient.ZkClient; import org.I0Itec.zkclient.ZkConnection; import org.I0Itec.zkclient.exception.ZkMarshallingError; import org.I0Itec.zkclient.serialize.ZkSerializer; import org.apache.zookeeper.KeeperException; +import org.radarcns.schema.CommandLineApp; import org.radarcns.schema.specification.SourceCatalogue; +import org.radarcns.schema.util.SubCommand; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -17,8 +21,10 @@ import java.util.Properties; public class KafkaTopics implements Closeable { - private final ZkUtils zkUtils; private static final Logger logger = LoggerFactory.getLogger(KafkaTopics.class); + private static final int MAX_SLEEP = 32; + + private final ZkUtils zkUtils; public KafkaTopics(String zookeeper) { ZkClient zkClient = new ZkClient(zookeeper, 15_000, 10_000); @@ -68,4 +74,76 @@ public int getNumberOfBrokers() throws KeeperException, InterruptedException { public void close() { zkUtils.close(); } + + public static SubCommand command() { + return new KafkaTopicsCommand(); + } + + private static class KafkaTopicsCommand implements SubCommand { + @Override + public String getName() { + return "create"; + } + + @Override + public int execute(Namespace options, CommandLineApp app) { + int brokers = options.getInt("brokers"); + int replication = options.getInt("replication"); + + if (brokers < replication) { + logger.error("Cannot assign a replication factor {}" + + " higher than number of brokers {}", replication, brokers); + return 1; + } + + int partitions = options.getInt("partitions"); + String zookeeper = options.getString("zookeeper"); + try (KafkaTopics topics = new KafkaTopics(zookeeper)) { + boolean brokersAvailable = false; + int sleep = 2; + for (int tries = 0; tries < 10; tries++) { + int activeBrokers = topics.getNumberOfBrokers(); + brokersAvailable = activeBrokers >= brokers; + if (brokersAvailable) { + logger.info("Kafka brokers available. Starting topic creation."); + break; + } + logger.warn("Only {} out of {} Kafka brokers available. Waiting {} seconds.", + activeBrokers, brokers, sleep); + Thread.sleep(sleep * 1000L); + sleep = Math.min(MAX_SLEEP, sleep * 2); + } + if (!brokersAvailable) { + logger.error("Kafka brokers not yet available. Aborting."); + return 1; + } + + return topics.createTopics(app.getCatalogue(), partitions, replication) ? 0 : 1; + } catch (InterruptedException | KeeperException e) { + logger.error("Cannot retrieve number of active Kafka brokers." + + " Please check that Zookeeper is running."); + return 1; + } + } + + @Override + public void addParser(ArgumentParser parser) { + parser.description("Create all topics that are missing on the Kafka server."); + parser.addArgument("-p", "--partitions") + .help("number of partitions per topic") + .type(Integer.class) + .setDefault(3); + parser.addArgument("-r", "--replication") + .help("number of replicas per data packet") + .type(Integer.class) + .setDefault(3); + parser.addArgument("-b", "--brokers") + .help("number of brokers that are expected to be available.") + .type(Integer.class) + .setDefault(3); + parser.addArgument("zookeeper") + .help("zookeeper hosts and ports, comma-separated"); + SubCommand.addRootArgument(parser); + } + } } 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 89201ee7..264ce4b2 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 @@ -16,6 +16,9 @@ package org.radarcns.schema.registration; +import net.sourceforge.argparse4j.impl.Arguments; +import net.sourceforge.argparse4j.inf.ArgumentParser; +import net.sourceforge.argparse4j.inf.Namespace; import okhttp3.MediaType; import okhttp3.Request; import okhttp3.RequestBody; @@ -28,8 +31,10 @@ import org.radarcns.producer.rest.ParsedSchemaMetadata; import org.radarcns.producer.rest.RestClient; import org.radarcns.producer.rest.SchemaRetriever; +import org.radarcns.schema.CommandLineApp; import org.radarcns.schema.specification.DataProducer; import org.radarcns.schema.specification.SourceCatalogue; +import org.radarcns.schema.util.SubCommand; import org.radarcns.topic.AvroTopic; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -131,4 +136,44 @@ public void close() { schemaClient.close(); httpClient.close(); } + + public static SubCommand command() { + return new SubCommand() { + @Override + public String getName() { + return "register"; + } + + @Override + public int execute(Namespace options, CommandLineApp app) { + String url = options.get("schemaRegistry"); + try (SchemaRegistry registration = new SchemaRegistry(url)) { + boolean forced = options.getBoolean("force"); + if (forced) { + forced = registration.setCompatibility(SchemaRegistry.Compatibility.NONE); + } + int result = registration.registerSchemas(app.getCatalogue()) ? 0 : 1; + if (forced) { + registration.setCompatibility(SchemaRegistry.Compatibility.FULL); + } + return result; + } catch (MalformedURLException ex) { + logger.error("Schema registry URL {} is invalid: {}", url, ex.toString()); + return 1; + } + } + + @Override + public void addParser(ArgumentParser parser) { + parser.description("Register schemas in the schema registry."); + parser.addArgument("-f", "--force") + .help("force registering schema, even if it is incompatible") + .action(Arguments.storeTrue()); + parser.addArgument("schemaRegistry") + .help("schema registry URL"); + SubCommand.addRootArgument(parser); + } + }; + } + } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/SubCommand.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/SubCommand.java new file mode 100644 index 00000000..27855214 --- /dev/null +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/util/SubCommand.java @@ -0,0 +1,20 @@ +package org.radarcns.schema.util; + +import net.sourceforge.argparse4j.inf.ArgumentParser; +import net.sourceforge.argparse4j.inf.Namespace; +import org.radarcns.schema.CommandLineApp; + +public interface SubCommand { + String getName(); + + int execute(Namespace options, CommandLineApp app); + + void addParser(ArgumentParser parser); + + static void addRootArgument(ArgumentParser parser) { + parser.addArgument("root") + .nargs("?") + .help("Root schemas directory with a specifications and commons directory") + .setDefault("."); + } +} diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaValidator.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaValidator.java index 03c0057c..ff30a32d 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaValidator.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/validation/SchemaValidator.java @@ -1,5 +1,3 @@ -package org.radarcns.schema.validation; - /* * Copyright 2017 King's College London and The Hyve * @@ -16,8 +14,15 @@ * limitations under the License. */ +package org.radarcns.schema.validation; + +import net.sourceforge.argparse4j.impl.Arguments; +import net.sourceforge.argparse4j.inf.ArgumentParser; +import net.sourceforge.argparse4j.inf.Namespace; import org.apache.avro.Schema; +import org.radarcns.schema.CommandLineApp; import org.radarcns.schema.Scope; +import org.radarcns.schema.util.SubCommand; import org.radarcns.schema.validation.config.ExcludeConfig; import org.radarcns.schema.validation.rules.RadarSchemaMetadataRules; import org.radarcns.schema.validation.rules.RadarSchemaRules; @@ -28,11 +33,14 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.AbstractMap; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.TreeSet; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -161,4 +169,85 @@ public SchemaMetadataRules getRules() { public Map getValidatedSchemas() { return ((RadarSchemaRules) rules.getSchemaRules()).getSchemaStore(); } + + public static SubCommand command() { + return new SchemaValidatorCommand(); + } + + @SuppressWarnings("PMD.SystemPrintln") + private static class SchemaValidatorCommand implements SubCommand { + @Override + public String getName() { + return "validate"; + } + + @Override + public int execute(Namespace options, CommandLineApp app) { + try { + ExcludeConfig config = loadConfig(app.getRoot(), options.getString("config")); + SchemaValidator validator = new SchemaValidator(app.getRoot(), config); + Stream stream = validateSchemas( + options.getString("scope"), validator); + + if (options.getBoolean("quiet")) { + return stream.count() > 0 ? 1 : 0; + } else { + String result = SchemaValidator.format(stream); + + System.out.println(result); + if (options.getBoolean("verbose")) { + System.out.println("Validated schemas:"); + Set names = new TreeSet<>(validator.getValidatedSchemas().keySet()); + for (String name : names) { + System.out.println(" - " + name); + } + System.out.println(); + } + return result.isEmpty() ? 0 : 1; + } + } catch (IOException e) { + System.err.println("Failed to load schemas: " + e); + return 1; + } + } + + @Override + public void addParser(ArgumentParser parser) { + parser.description("Validate a set of specifications."); + parser.addArgument("-s", "--scope") + .help("type of specifications to validate") + .choices(Scope.values()); + parser.addArgument("-c", "--config") + .help("configuration file to use"); + parser.addArgument("-v", "--verbose") + .help("verbose validation message") + .action(Arguments.storeTrue()); + parser.addArgument("-q", "--quiet") + .help("only set exit code.") + .action(Arguments.storeTrue()); + SubCommand.addRootArgument(parser); + } + + + private Stream validateSchemas(String scopeString, + SchemaValidator validator) throws IOException { + if (scopeString == null) { + return validator.analyseFiles(); + } else { + return validator.analyseFiles(Scope.valueOf(scopeString)); + } + } + + private ExcludeConfig loadConfig(Path root, String configSubPath) throws IOException { + Path configPath = null; + if (configSubPath != null) { + if (configSubPath.charAt(0) == '/') { + configPath = Paths.get(configSubPath); + } else { + configPath = root.resolve(configSubPath); + } + } + return ExcludeConfig.load(configPath); + } + } } From 3dad6e24e07f8ee40a5823e930a119ee8eb4c993 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Thu, 12 Oct 2017 15:38:58 +0200 Subject: [PATCH 109/112] Testing with latest RADAR-Commons --- java-sdk/build.gradle | 1 + java-sdk/radar-schemas-tools/build.gradle | 2 +- .../java/org/radarcns/schema/specification/DataTopic.java | 6 +----- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/java-sdk/build.gradle b/java-sdk/build.gradle index beb61b36..cdb2e0e7 100644 --- a/java-sdk/build.gradle +++ b/java-sdk/build.gradle @@ -34,6 +34,7 @@ subprojects { repositories { jcenter() mavenCentral() + maven { url 'https://oss.jfrog.org/artifactory/oss-snapshot-local' } } dependencies { diff --git a/java-sdk/radar-schemas-tools/build.gradle b/java-sdk/radar-schemas-tools/build.gradle index 8007c725..382a488d 100644 --- a/java-sdk/radar-schemas-tools/build.gradle +++ b/java-sdk/radar-schemas-tools/build.gradle @@ -27,7 +27,7 @@ dependencies { api group: 'javax.validation', name: 'validation-api', version: '2.0.0.Final' implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.8.10' implementation project(':radar-schemas-commons') - implementation group: 'org.radarcns', name: 'radar-commons', version: '0.5' + implementation group: 'org.radarcns', name: 'radar-commons', version: '0.6-SNAPSHOT' implementation group: 'net.sourceforge.argparse4j', name: 'argparse4j', version: '0.7.0' implementation (group: 'org.apache.kafka', name: 'kafka_2.11', version: '0.11.0.1') { exclude group: 'org.slf4j', module: 'slf4j-log4j12' diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/DataTopic.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/DataTopic.java index ff32383f..731f382e 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/DataTopic.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/DataTopic.java @@ -13,7 +13,6 @@ import org.slf4j.LoggerFactory; import java.io.IOException; -import java.lang.reflect.InvocationTargetException; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; @@ -60,10 +59,7 @@ public Stream getTopicNames() { public Stream> getTopics() throws IOException { try { return Stream.of(parseAvroTopic()); - } catch (ClassNotFoundException - | NoSuchMethodException - | InvocationTargetException - | IllegalAccessException ex) { + } catch (IllegalArgumentException ex) { throw new IOException("Cannot parse Avro Topic " + getTopic() + " schemas, with key_schema " + getKeySchema() + " and value_schema " + getValueSchema(), ex); From 85eb3a9e345fc7ee40f83f41a1a2e40c88cdd32a Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Thu, 12 Oct 2017 15:57:11 +0200 Subject: [PATCH 110/112] Bumped version --- java-sdk/README.md | 6 +++--- java-sdk/build.gradle | 2 +- java-sdk/radar-schemas-tools/build.gradle | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/java-sdk/README.md b/java-sdk/README.md index 92b34160..19e421ce 100644 --- a/java-sdk/README.md +++ b/java-sdk/README.md @@ -9,13 +9,13 @@ repositories { dependencies { // Commons schemas (backend, passive remote monitoring app) - compile 'org.radarcns:radar-schemas-commons:0.1' + compile 'org.radarcns:radar-schemas-commons:0.2' // REST API schemas (REST API, testing) - compile 'org.radarcns:radar-schemas-restapi:0.1' + compile 'org.radarcns:radar-schemas-restapi:0.2' // Questionnaire schemas (active remote monitoring app) - compile 'org.radarcns:radar-schemas-questionnaire:0.1' + compile 'org.radarcns:radar-schemas-questionnaire:0.2' } ``` Usually, you only need to include the schemas you actually need in your dependencies. diff --git a/java-sdk/build.gradle b/java-sdk/build.gradle index cdb2e0e7..e046df8c 100644 --- a/java-sdk/build.gradle +++ b/java-sdk/build.gradle @@ -17,7 +17,7 @@ subprojects { apply plugin: 'idea' // Configuration - version = '0.2-alpha.3-SNAPSHOT' + version = '0.2' group = 'org.radarcns' ext.githubRepoName = 'RADAR-CNS/RADAR-Schemas' diff --git a/java-sdk/radar-schemas-tools/build.gradle b/java-sdk/radar-schemas-tools/build.gradle index 382a488d..a66cb54b 100644 --- a/java-sdk/radar-schemas-tools/build.gradle +++ b/java-sdk/radar-schemas-tools/build.gradle @@ -27,7 +27,7 @@ dependencies { api group: 'javax.validation', name: 'validation-api', version: '2.0.0.Final' implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.8.10' implementation project(':radar-schemas-commons') - implementation group: 'org.radarcns', name: 'radar-commons', version: '0.6-SNAPSHOT' + implementation group: 'org.radarcns', name: 'radar-commons', version: '0.6-alpha.1' implementation group: 'net.sourceforge.argparse4j', name: 'argparse4j', version: '0.7.0' implementation (group: 'org.apache.kafka', name: 'kafka_2.11', version: '0.11.0.1') { exclude group: 'org.slf4j', module: 'slf4j-log4j12' From 7210859b13103739f2d8961df13b03995db75b76 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Thu, 12 Oct 2017 17:04:46 +0200 Subject: [PATCH 111/112] Allow submitting a subset of topics/schemas --- .../org/radarcns/schema/CommandLineApp.java | 14 ++++++- .../schema/registration/KafkaTopics.java | 32 +++++++++++++++- .../schema/registration/SchemaRegistry.java | 37 ++++++++++++++++++- .../schema/specification/SourceCatalogue.java | 18 ++++----- 4 files changed, 88 insertions(+), 13 deletions(-) diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java index a7bbb86e..da511824 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/CommandLineApp.java @@ -23,6 +23,7 @@ import net.sourceforge.argparse4j.inf.Namespace; import net.sourceforge.argparse4j.inf.Subparsers; import org.radarcns.schema.registration.KafkaTopics; +import org.radarcns.schema.registration.SchemaRegistry; import org.radarcns.schema.specification.DataProducer; import org.radarcns.schema.specification.DataTopic; import org.radarcns.schema.specification.SourceCatalogue; @@ -41,6 +42,7 @@ import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; +import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -162,7 +164,7 @@ private Map> getTopicsInfoVerbose(boolean prettyPrin public static void main(String... args) { SortedMap subCommands = commandsToMap( KafkaTopics.command(), - SchemaValidator.command(), + SchemaRegistry.command(), listCommand(), SchemaValidator.command()); @@ -256,4 +258,14 @@ public void addParser(ArgumentParser parser) { } }; } + + public static Pattern matchTopic(String exact, String regex) { + if (exact != null) { + return Pattern.compile("^" + Pattern.quote(exact) + "$"); + } + if (regex != null) { + return Pattern.compile(regex); + } + return null; + } } 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 4875d4ce..bafa9ba1 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 @@ -18,7 +18,11 @@ import org.slf4j.LoggerFactory; import java.io.Closeable; +import java.util.Optional; import java.util.Properties; +import java.util.regex.Pattern; + +import static org.radarcns.schema.CommandLineApp.matchTopic; public class KafkaTopics implements Closeable { private static final Logger logger = LoggerFactory.getLogger(KafkaTopics.class); @@ -118,7 +122,26 @@ public int execute(Namespace options, CommandLineApp app) { return 1; } - return topics.createTopics(app.getCatalogue(), partitions, replication) ? 0 : 1; + Pattern pattern = matchTopic( + options.getString("topic"), options.getString("match")); + + if (pattern == null) { + return topics.createTopics(app.getCatalogue(), partitions, replication) ? 0 : 1; + } else { + Optional result = app.getCatalogue().getTopicNames() + .filter(s -> pattern.matcher(s).find()) + .map(s -> topics.createTopic(s, partitions, replication)) + .reduce((a, b) -> a && b); + if (!result.isPresent()) { + logger.error("Topic {} does not match a known topic." + + " Find the list of acceptable topics" + + " with the `radar-schemas-tools list` command. Aborting.", + pattern); + return 1; + } else { + return result.get() ? 0 : 1; + } + } } catch (InterruptedException | KeeperException e) { logger.error("Cannot retrieve number of active Kafka brokers." + " Please check that Zookeeper is running."); @@ -141,6 +164,13 @@ public void addParser(ArgumentParser parser) { .help("number of brokers that are expected to be available.") .type(Integer.class) .setDefault(3); + parser.addArgument("-t", "--topic") + .help("register the schemas of one topic") + .type(String.class); + parser.addArgument("-m", "--match") + .help("register the schemas of all topics matching the given regex" + + "; does not do anything if --topic is specified") + .type(String.class); parser.addArgument("zookeeper") .help("zookeeper hosts and ports, comma-separated"); SubCommand.addRootArgument(parser); 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 264ce4b2..cdeeac66 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 @@ -42,8 +42,12 @@ import java.io.Closeable; import java.io.IOException; import java.net.MalformedURLException; +import java.util.Optional; +import java.util.regex.Pattern; import java.util.stream.Stream; +import static org.radarcns.schema.CommandLineApp.matchTopic; + public class SchemaRegistry implements Closeable { public enum Compatibility { NONE, FULL, BACKWARD, FORWARD, BACKWARD_TRANSITIVE, FORWARD_TRANSITIVE, FULL_TRANSITIVE @@ -152,11 +156,33 @@ public int execute(Namespace options, CommandLineApp app) { if (forced) { forced = registration.setCompatibility(SchemaRegistry.Compatibility.NONE); } - int result = registration.registerSchemas(app.getCatalogue()) ? 0 : 1; + boolean result; + + Pattern pattern = matchTopic( + options.getString("topic"), options.getString("match")); + + if (pattern == null) { + result = registration.registerSchemas(app.getCatalogue()); + } else { + Optional didUpload = app.getCatalogue().getTopics() + .filter(t -> pattern.matcher(t.getName()).find()) + .map(registration::registerSchema) + .reduce((a, b) -> a && b); + + if (!didUpload.isPresent()) { + logger.error("Topic {} does not match a known topic." + + " Find the list of acceptable topics" + + " with the `radar-schemas-tools list` command. Aborting.", + pattern); + result = false; + } else { + result = didUpload.get(); + } + } if (forced) { registration.setCompatibility(SchemaRegistry.Compatibility.FULL); } - return result; + return result ? 0 : 1; } catch (MalformedURLException ex) { logger.error("Schema registry URL {} is invalid: {}", url, ex.toString()); return 1; @@ -169,6 +195,13 @@ public void addParser(ArgumentParser parser) { parser.addArgument("-f", "--force") .help("force registering schema, even if it is incompatible") .action(Arguments.storeTrue()); + parser.addArgument("-t", "--topic") + .help("register the schemas of one topic") + .type(String.class); + parser.addArgument("-m", "--match") + .help("register the schemas of all topics matching the given regex" + + "; does not do anything if --topic is specified") + .type(String.class); parser.addArgument("schemaRegistry") .help("schema registry URL"); SubCommand.addRootArgument(parser); diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java index 979cf1e5..b1c418a9 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/SourceCatalogue.java @@ -137,11 +137,11 @@ public Map> getActiveSources() { /** * TODO. - * @param type TODO + * @param topic TODO * @return TODO */ - public ActiveSource getActiveSource(String type) { - return activeSources.get(type); + public ActiveSource getActiveSource(String topic) { + return activeSources.get(topic); } /** @@ -154,11 +154,11 @@ public Map getMonitorSources() { /** * TODO. - * @param type TODO + * @param topic TODO * @return TODO */ - public MonitorSource getMonitorSource(String type) { - return monitorSources.get(type); + public MonitorSource getMonitorSource(String topic) { + return monitorSources.get(topic); } /** @@ -171,11 +171,11 @@ public Map getPassiveSources() { /** * TODO. - * @param type TODO + * @param topic TODO * @return TODO */ - public PassiveSource getPassiveSource(String type) { - return passiveSources.get(type); + public PassiveSource getPassiveSource(String topic) { + return passiveSources.get(topic); } public Map getStreamGroups() { From a4003c537510dcff62b75f47769b476370061752 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Thu, 12 Oct 2017 17:13:34 +0200 Subject: [PATCH 112/112] Reduced cyclomatic complexity --- .../schema/registration/KafkaTopics.java | 35 +++--- .../schema/registration/SchemaRegistry.java | 118 +++++++++--------- 2 files changed, 79 insertions(+), 74 deletions(-) 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 bafa9ba1..8d2651d7 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 @@ -103,21 +103,7 @@ public int execute(Namespace options, CommandLineApp app) { int partitions = options.getInt("partitions"); String zookeeper = options.getString("zookeeper"); try (KafkaTopics topics = new KafkaTopics(zookeeper)) { - boolean brokersAvailable = false; - int sleep = 2; - for (int tries = 0; tries < 10; tries++) { - int activeBrokers = topics.getNumberOfBrokers(); - brokersAvailable = activeBrokers >= brokers; - if (brokersAvailable) { - logger.info("Kafka brokers available. Starting topic creation."); - break; - } - logger.warn("Only {} out of {} Kafka brokers available. Waiting {} seconds.", - activeBrokers, brokers, sleep); - Thread.sleep(sleep * 1000L); - sleep = Math.min(MAX_SLEEP, sleep * 2); - } - if (!brokersAvailable) { + if (!waitForBrokers(topics, brokers)) { logger.error("Kafka brokers not yet available. Aborting."); return 1; } @@ -149,6 +135,25 @@ public int execute(Namespace options, CommandLineApp app) { } } + private boolean waitForBrokers(KafkaTopics topics, int brokers) + throws InterruptedException, KeeperException { + boolean brokersAvailable = false; + int sleep = 2; + for (int tries = 0; tries < 10; tries++) { + int activeBrokers = topics.getNumberOfBrokers(); + brokersAvailable = activeBrokers >= brokers; + if (brokersAvailable) { + logger.info("Kafka brokers available. Starting topic creation."); + break; + } + logger.warn("Only {} out of {} Kafka brokers available. Waiting {} seconds.", + activeBrokers, brokers, sleep); + Thread.sleep(sleep * 1000L); + sleep = Math.min(MAX_SLEEP, sleep * 2); + } + return brokersAvailable; + } + @Override public void addParser(ArgumentParser parser) { parser.description("Create all topics that are missing on the Kafka server."); 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 cdeeac66..9a44db5c 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 @@ -142,71 +142,71 @@ public void close() { } public static SubCommand command() { - return new SubCommand() { - @Override - public String getName() { - return "register"; - } - - @Override - public int execute(Namespace options, CommandLineApp app) { - String url = options.get("schemaRegistry"); - try (SchemaRegistry registration = new SchemaRegistry(url)) { - boolean forced = options.getBoolean("force"); - if (forced) { - forced = registration.setCompatibility(SchemaRegistry.Compatibility.NONE); - } - boolean result; + return new RegisterCommand(); + } - Pattern pattern = matchTopic( - options.getString("topic"), options.getString("match")); + private static class RegisterCommand implements SubCommand { + @Override + public String getName() { + return "register"; + } - if (pattern == null) { - result = registration.registerSchemas(app.getCatalogue()); + @Override + public int execute(Namespace options, CommandLineApp app) { + String url = options.get("schemaRegistry"); + try (SchemaRegistry registration = new SchemaRegistry(url)) { + boolean forced = options.getBoolean("force"); + if (forced) { + forced = registration.setCompatibility(Compatibility.NONE); + } + boolean result; + Pattern pattern = matchTopic( + options.getString("topic"), options.getString("match")); + + if (pattern == null) { + result = registration.registerSchemas(app.getCatalogue()); + } else { + Optional didUpload = app.getCatalogue().getTopics() + .filter(t -> pattern.matcher(t.getName()).find()) + .map(registration::registerSchema) + .reduce((a, b) -> a && b); + + if (!didUpload.isPresent()) { + logger.error("Topic {} does not match a known topic." + + " Find the list of acceptable topics" + + " with the `radar-schemas-tools list` command. Aborting.", + pattern); + result = false; } else { - Optional didUpload = app.getCatalogue().getTopics() - .filter(t -> pattern.matcher(t.getName()).find()) - .map(registration::registerSchema) - .reduce((a, b) -> a && b); - - if (!didUpload.isPresent()) { - logger.error("Topic {} does not match a known topic." - + " Find the list of acceptable topics" - + " with the `radar-schemas-tools list` command. Aborting.", - pattern); - result = false; - } else { - result = didUpload.get(); - } + result = didUpload.get(); } - if (forced) { - registration.setCompatibility(SchemaRegistry.Compatibility.FULL); - } - return result ? 0 : 1; - } catch (MalformedURLException ex) { - logger.error("Schema registry URL {} is invalid: {}", url, ex.toString()); - return 1; } + if (forced) { + registration.setCompatibility(Compatibility.FULL); + } + return result ? 0 : 1; + } catch (MalformedURLException ex) { + logger.error("Schema registry URL {} is invalid: {}", url, ex.toString()); + return 1; } + } - @Override - public void addParser(ArgumentParser parser) { - parser.description("Register schemas in the schema registry."); - parser.addArgument("-f", "--force") - .help("force registering schema, even if it is incompatible") - .action(Arguments.storeTrue()); - parser.addArgument("-t", "--topic") - .help("register the schemas of one topic") - .type(String.class); - parser.addArgument("-m", "--match") - .help("register the schemas of all topics matching the given regex" - + "; does not do anything if --topic is specified") - .type(String.class); - parser.addArgument("schemaRegistry") - .help("schema registry URL"); - SubCommand.addRootArgument(parser); - } - }; + @Override + public void addParser(ArgumentParser parser) { + parser.description("Register schemas in the schema registry."); + parser.addArgument("-f", "--force") + .help("force registering schema, even if it is incompatible") + .action(Arguments.storeTrue()); + parser.addArgument("-t", "--topic") + .help("register the schemas of one topic") + .type(String.class); + parser.addArgument("-m", "--match") + .help("register the schemas of all topics matching the given regex" + + "; does not do anything if --topic is specified") + .type(String.class); + parser.addArgument("schemaRegistry") + .help("schema registry URL"); + SubCommand.addRootArgument(parser); + } } - }