diff --git a/.travis.yml b/.travis.yml index 37af9727..96be0d46 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,3 +35,6 @@ deploy: before_install: - cd java-sdk - ./gradlew downloadDependencies + +install: + - ./gradlew assemble --stacktrace diff --git a/commons/monitor/questionnaire/questionnaire_application_interaction_event.avsc b/commons/monitor/questionnaire/questionnaire_application_interaction_event.avsc new file mode 100644 index 00000000..bcab70e9 --- /dev/null +++ b/commons/monitor/questionnaire/questionnaire_application_interaction_event.avsc @@ -0,0 +1,19 @@ +{ + "namespace": "org.radarcns.monitor.questionnaire", + "type": "record", + "name": "QuestionnaireApplicationInteractionEvent", + "doc": "Schema of reporting events for user interaction with the questionnaire application. This describes significant user interactions, such as response to notifications and starting or completing questionnaires.", + "fields": [ + { "name": "time", "type": "double", "doc": "Device timestamp in UTC (s)." }, + { "name": "eventType", "type": { + "name": "InteractionEventType", + "doc": "NOTIFICATION_OPEN = When a user presses the notification to open the app, APP_OPEN = When a user opens the app directly, QUESTIONNAIRE_STARTED = When a user starts a questionnaire, QUESTIONNAIRE_FINISHED = When a user completes a questionnaire, QUESTIONNAIRE_CANCELLED = When a user closes a questionnaire without completing it.", + "type": "enum", + "symbols": ["NOTIFICATION_OPEN", "APP_OPEN", "QUESTIONNAIRE_STARTED", "QUESTIONNAIRE_FINISHED", "QUESTIONNAIRE_CANCELLED", "OTHER", "UNKNOWN"] + }, + "doc": "Questionnaire app activity usage event type.", + "default": "UNKNOWN" + }, + { "name": "questionnaireName", "type": ["null", "string"], "doc": "Name of the questionnaire.", "default": null } + ] +} diff --git a/java-sdk/build.gradle b/java-sdk/build.gradle index 3c4d500e..246b4d03 100644 --- a/java-sdk/build.gradle +++ b/java-sdk/build.gradle @@ -5,7 +5,7 @@ plugins { id 'com.commercehub.gradle.plugin.avro-base' version '0.16.0' id 'com.jfrog.bintray' version '1.8.4' apply false - id 'com.jfrog.artifactory' version '4.9.5' apply false + id 'com.jfrog.artifactory' version '4.9.8' apply false } subprojects { @@ -17,7 +17,7 @@ subprojects { apply plugin: 'idea' // Configuration - version = '0.5.1' + version = '0.5.2' group = 'org.radarcns' ext.githubRepoName = 'RADAR-base/RADAR-Schemas' @@ -27,8 +27,8 @@ subprojects { ext.issueUrl = "https://github.com/${githubRepoName}/issues" ext.website = 'http://radar-cns.org' - targetCompatibility = '1.8' - sourceCompatibility = '1.8' + targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_1_8 // dependencies @@ -128,5 +128,5 @@ subprojects { } wrapper { - gradleVersion '5.4' + gradleVersion '5.5.1' } diff --git a/java-sdk/radar-schemas-tools/build.gradle b/java-sdk/radar-schemas-tools/build.gradle index 42a9ae94..feb7a78a 100644 --- a/java-sdk/radar-schemas-tools/build.gradle +++ b/java-sdk/radar-schemas-tools/build.gradle @@ -6,8 +6,8 @@ plugins { id 'com.jfrog.artifactory' } -targetCompatibility = '1.11' -sourceCompatibility = '1.11' +targetCompatibility = JavaVersion.VERSION_11 +sourceCompatibility = JavaVersion.VERSION_11 mainClassName = 'org.radarcns.schema.CommandLineApp' configurations { @@ -31,13 +31,14 @@ ext { description = 'RADAR Schemas specification and validation tools.' argparseVersion = '0.8.1' - jacksonVersion = '2.9.9' + jacksonVersion = '2.9.9.1' + jacksonYamlVersion = '2.9.9' jerseyVersion = '2.28' jettyVersion = '9.4.17.v20190418' junitVersion = '4.12' - confluentVersion = '5.2.1' - kafkaVersion = '2.2.0-cp2' - okHttpVersion = '3.14.1' + confluentVersion = '5.3.0' + kafkaVersion = '2.3.0' + okHttpVersion = '4.0.0' radarCommonsVersion = '0.12.1' slf4jVersion = '1.7.26' } @@ -54,7 +55,7 @@ dependencies { api group: 'javax.validation', name: 'validation-api', version: '2.0.0.Final' api group: 'org.apache.kafka', name: 'kafka_2.12', version: kafkaVersion - implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: jacksonVersion + implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: jacksonYamlVersion implementation project(':radar-schemas-commons') implementation group: 'org.radarbase', name: 'radar-commons', version: radarCommonsVersion implementation group: 'org.radarbase', name: 'radar-commons-server', version: radarCommonsVersion 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 e5d49ad8..6c0c4d01 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 @@ -30,6 +30,7 @@ import org.radarcns.schema.util.SubCommand; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import scala.Option; import scala.collection.JavaConverters$; import scala.collection.Seq; @@ -53,7 +54,7 @@ public class KafkaTopics implements Closeable { public KafkaTopics(@NotNull String zookeeper) { this.zkClient = KafkaZkClient .apply(zookeeper, false, 15_000, 10_000, 30, Time.SYSTEM, "kafka.server", - "SessionExpireListener"); + "SessionExpireListener", Option.apply("radar-schemas")); bootstrapServers = null; initialized = false; } @@ -76,7 +77,6 @@ public boolean initialize(int brokers) throws InterruptedException, numBrokers = brokerList.size(); if (numBrokers >= brokers) { - logger.info("Kafka brokers available. Waiting for topics to become available."); // wait for 5sec before proceeding with topic creation bootstrapServers = brokerList.stream() .map(Broker::endPoints) @@ -84,6 +84,7 @@ public boolean initialize(int brokers) throws InterruptedException, .map(EndPoint::connectionString) .collect(Collectors.joining(",")); + logger.info("Creating Kafka client with bootstrap servers {}", bootstrapServers); kafkaClient = AdminClient.create(Map.of( BOOTSTRAP_SERVERS_CONFIG, bootstrapServers)); } else if (tries < numTries - 1) { @@ -116,6 +117,7 @@ private void ensureInitialized() { */ public boolean refreshTopics() throws InterruptedException { ensureInitialized(); + logger.info("Waiting for topics to become available."); int sleep = 10; int numTries = 10; diff --git a/specifications/active/aRMT-1.4.3.yml b/specifications/active/aRMT-1.4.3.yml index 6c91d138..271ccbd2 100644 --- a/specifications/active/aRMT-1.4.3.yml +++ b/specifications/active/aRMT-1.4.3.yml @@ -35,12 +35,19 @@ data: - type: AUDIO topic: questionnaire_audio value_schema: .active.questionnaire.Questionnaire + questionnaire_definition_url: https://raw.githubusercontent.com/RADAR-base/RADAR-REDCap-aRMT-Definitions/master/questionnaires/audio/audio_armt.json - type: AUDIO_2 topic: questionnaire_audio value_schema: .active.questionnaire.Questionnaire + questionnaire_definition_url: https://raw.githubusercontent.com/RADAR-base/RADAR-REDCap-aRMT-Definitions/master/questionnaires/audio_2/audio_2_armt.json - type: AUDIO_3 topic: questionnaire_audio value_schema: .active.questionnaire.Questionnaire + questionnaire_definition_url: https://raw.githubusercontent.com/RADAR-base/RADAR-REDCap-aRMT-Definitions/master/questionnaires/audio_3/audio_3_armt.json + - type: AUDIO_4 + topic: questionnaire_audio + value_schema: .active.questionnaire.Questionnaire + questionnaire_definition_url: https://raw.githubusercontent.com/RADAR-base/RADAR-REDCap-aRMT-Definitions/master/questionnaires/audio_4/audio_4_armt.json - type: RSES topic: questionnaire_rses value_schema: .active.questionnaire.Questionnaire @@ -61,3 +68,7 @@ data: doc: Timezone information sent along with each questionnaire. topic: questionnaire_timezone value_schema: .monitor.application.ApplicationTimeZone + - type: APP_EVENT + doc: Questionnaire application interaction event. + topic: questionnaire_app_event + value_schema: .monitor.questionnaire.QuestionnaireApplicationInteractionEvent