From 4e67948cef56897b02c267f71dfbf6a82f6cec0a Mon Sep 17 00:00:00 2001 From: Yatharth Ranjan Date: Mon, 4 Jun 2018 18:29:12 +0100 Subject: [PATCH 1/9] Snapshot version --- java-sdk/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java-sdk/build.gradle b/java-sdk/build.gradle index a032431d..44649496 100644 --- a/java-sdk/build.gradle +++ b/java-sdk/build.gradle @@ -17,7 +17,7 @@ subprojects { apply plugin: 'idea' // Configuration - version = '0.3.4' + version = '0.3.4-SNAPSHOT' group = 'org.radarcns' ext.githubRepoName = 'RADAR-CNS/RADAR-Schemas' From 3e0ab3c50a1208bcc9d229546a3a8312ac5d2b60 Mon Sep 17 00:00:00 2001 From: yatharthranjan Date: Thu, 7 Jun 2018 11:36:09 +0100 Subject: [PATCH 2/9] Add question id to tasks and notifications --- commons/active/notification/notification.avsc | 1 + commons/active/task/task.avsc | 1 + 2 files changed, 2 insertions(+) diff --git a/commons/active/notification/notification.avsc b/commons/active/notification/notification.avsc index 6d451e14..5bbefdd7 100644 --- a/commons/active/notification/notification.avsc +++ b/commons/active/notification/notification.avsc @@ -15,6 +15,7 @@ "type": "record", "doc": "Notification answer.", "fields": [ + { "name": "questionId", "type": ["null", "string"], "doc": "Unique identifier for the specific question.", "default": null }, { "name": "value", "type": ["int", "string", "double"], "doc": "Subject answer." }, { "name": "startTime", "type": "double", "doc": "Timestamp in UTC (s) when the notification is shown." }, { "name": "endTime", "type": "double", "doc": "Timestamp in UTC (s) when the notification is answered." } diff --git a/commons/active/task/task.avsc b/commons/active/task/task.avsc index 76151131..f229fcb9 100644 --- a/commons/active/task/task.avsc +++ b/commons/active/task/task.avsc @@ -15,6 +15,7 @@ "type": "record", "doc": "Task answer.", "fields": [ + { "name": "questionId", "type": ["null", "string"], "doc": "Unique identifier for the specific question.", "default": null }, { "name": "value", "type": ["int", "string", "double"], "doc": "Subject answer." }, { "name": "startTime", "type": "double", "doc": "Timestamp in UTC (s) when the task is shown." }, { "name": "endTime", "type": "double", "doc": "Timestamp in UTC (s) when the task is answered." } From 42fbb5f3efc1b951d39db8e27a89a62b08f24894 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Wed, 20 Jun 2018 14:20:57 +0200 Subject: [PATCH 3/9] Update bittium_faros-1.0.0.yml --- specifications/passive/bittium_faros-1.0.0.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specifications/passive/bittium_faros-1.0.0.yml b/specifications/passive/bittium_faros-1.0.0.yml index 4938cd70..8a97dda6 100644 --- a/specifications/passive/bittium_faros-1.0.0.yml +++ b/specifications/passive/bittium_faros-1.0.0.yml @@ -37,5 +37,5 @@ data: dynamic: true unit: CELSIUS processing_state: VENDOR - topic: android_bittium_faros_acceleration + topic: android_bittium_faros_temperature value_schema: .passive.bittium.BittiumFarosTemperature From e7a41471d23c60d75a2254c6ac8de4b3bae334b1 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Wed, 1 Aug 2018 17:19:35 +0200 Subject: [PATCH 4/9] Updated gradle and dependencies --- java-sdk/build.gradle | 12 +- java-sdk/gradle/wrapper/gradle-wrapper.jar | Bin 54329 -> 54413 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- java-sdk/radar-schemas-commons/build.gradle | 10 +- java-sdk/radar-schemas-tools/build.gradle | 47 ++++---- .../org/radarcns/schema/CommandLineApp.java | 5 +- .../schema/registration/KafkaTopics.java | 113 +++++++++--------- java-sdk/settings.gradle | 2 + 8 files changed, 99 insertions(+), 92 deletions(-) diff --git a/java-sdk/build.gradle b/java-sdk/build.gradle index 44649496..fe624cc5 100644 --- a/java-sdk/build.gradle +++ b/java-sdk/build.gradle @@ -4,8 +4,8 @@ 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' + id 'com.jfrog.bintray' version '1.8.1' + id 'com.jfrog.artifactory' version '4.7.5' } subprojects { @@ -17,9 +17,9 @@ subprojects { apply plugin: 'idea' // Configuration - version = '0.3.4-SNAPSHOT' + version = '0.3.5-SNAPSHOT' group = 'org.radarcns' - ext.githubRepoName = 'RADAR-CNS/RADAR-Schemas' + ext.githubRepoName = 'RADAR-base/RADAR-Schemas' targetCompatibility = '1.7' sourceCompatibility = '1.7' @@ -144,6 +144,6 @@ subprojects { } } -task wrapper(type: Wrapper) { - gradleVersion '4.4' +wrapper { + gradleVersion '4.9' } diff --git a/java-sdk/gradle/wrapper/gradle-wrapper.jar b/java-sdk/gradle/wrapper/gradle-wrapper.jar index 01b8bf6b1f99cad9213fc495b33ad5bbab8efd20..0d4a9516871afd710a9d84d89e31ba77745607bd 100644 GIT binary patch delta 7399 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 KPzU?}WBw1fHw(7_ diff --git a/java-sdk/gradle/wrapper/gradle-wrapper.properties b/java-sdk/gradle/wrapper/gradle-wrapper.properties index 933b6473..a95009c3 100644 --- a/java-sdk/gradle/wrapper/gradle-wrapper.properties +++ b/java-sdk/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-bin.zip diff --git a/java-sdk/radar-schemas-commons/build.gradle b/java-sdk/radar-schemas-commons/build.gradle index cac71038..89e73eb4 100644 --- a/java-sdk/radar-schemas-commons/build.gradle +++ b/java-sdk/radar-schemas-commons/build.gradle @@ -38,9 +38,7 @@ publishing { from components.java artifact sourcesJar artifact javadocJar - groupId project.group artifactId artifactName - version project.version pom.withXml { def root = asNode() root.appendNode('description', description) @@ -53,10 +51,10 @@ publishing { } 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'] + 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 diff --git a/java-sdk/radar-schemas-tools/build.gradle b/java-sdk/radar-schemas-tools/build.gradle index 65def6ec..d6fc6e8f 100644 --- a/java-sdk/radar-schemas-tools/build.gradle +++ b/java-sdk/radar-schemas-tools/build.gradle @@ -6,9 +6,6 @@ plugins { id 'com.jfrog.artifactory' } -ext.artifactName = 'radar-schemas-tools' -ext.description = 'RADAR Schemas specification and validation tools.' - targetCompatibility = '1.8' sourceCompatibility = '1.8' mainClassName = 'org.radarcns.schema.CommandLineApp' @@ -20,19 +17,29 @@ sourceSets { } } -ext.junitVersion = '4.12' -ext.slf4jVersion = '1.7.25' -ext.jettyVersion = '9.4.8.v20171121' -ext.jerseyVersion = '2.26' +ext { + artifactName = 'radar-schemas-tools' + description = 'RADAR Schemas specification and validation tools.' + + argparseVersion = '0.8.1' + jacksonVersion = '2.9.6' + jerseyVersion = '2.27' + jettyVersion = '9.4.11.v20180605' + junitVersion = '4.12' + kafkaVersion = '2.0.0' + radarCommonsVersion = '0.9.0' + slf4jVersion = '1.7.25' +} dependencies { - api group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.8.10' + api group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: jacksonVersion 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 group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: jacksonVersion implementation project(':radar-schemas-commons') - 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') { + implementation group: 'org.radarcns', name: 'radar-commons', version: radarCommonsVersion + implementation group: 'org.radarcns', name: 'radar-commons-server', version: radarCommonsVersion + implementation group: 'net.sourceforge.argparse4j', name: 'argparse4j', version: argparseVersion + implementation (group: 'org.apache.kafka', name: 'kafka_2.12', version: kafkaVersion) { exclude group: 'org.slf4j', module: 'slf4j-log4j12' } implementation group: 'org.eclipse.jetty', name: 'jetty-server', version: jettyVersion @@ -43,7 +50,7 @@ dependencies { api group: 'org.glassfish.jersey.containers', name: 'jersey-container-servlet-core', version: jerseyVersion runtimeOnly group: 'org.glassfish.jersey.media', name: 'jersey-media-json-jackson', version: jerseyVersion - runtimeOnly group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25' + runtimeOnly group: 'org.slf4j', name: 'slf4j-simple', version: slf4jVersion runtimeOnly group: 'org.glassfish.jersey.inject', name: 'jersey-hk2', version: jerseyVersion testCompile group: 'junit', name: 'junit', version: junitVersion @@ -104,13 +111,11 @@ tasks.withType(Tar){ publishing { publications { - RadarCommonsPublication(MavenPublication) { + RadarToolsPublication(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) @@ -128,10 +133,10 @@ publishing { } 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'] + 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 'RadarToolsPublication' pkg { repo = project.group name = artifactName @@ -164,5 +169,5 @@ artifactory { } artifactoryPublish { - publications('RadarCommonsPublication') + publications('RadarToolsPublication') } 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 be7cb7b7..75478db0 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 @@ -208,8 +208,9 @@ public static void main(String... args) { } private static ArgumentParser getArgumentParser(SortedMap subCommands) { - ArgumentParser parser = ArgumentParsers.newArgumentParser("radar-schema") - .defaultHelp(true) + ArgumentParser parser = ArgumentParsers.newFor("radar-schema") + .addHelp(true) + .build() .description("Schema tools"); Subparsers subParsers = parser.addSubparsers().dest("subparser"); 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 94b2dea0..70f54284 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 @@ -1,27 +1,28 @@ package org.radarcns.schema.registration; +import static org.apache.kafka.clients.admin.AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG; import static org.radarcns.schema.CommandLineApp.matchTopic; import java.io.Closeable; -import java.util.Optional; -import java.util.Properties; +import java.util.Collections; +import java.util.List; +import java.util.Set; import java.util.regex.Pattern; -import kafka.admin.AdminUtils; -import kafka.admin.RackAwareMode; -import kafka.utils.ZKStringSerializer; -import kafka.utils.ZkUtils; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import kafka.zk.KafkaZkClient; +import kafka.zookeeper.ZooKeeperClientException; 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.ZkException; -import org.I0Itec.zkclient.exception.ZkMarshallingError; -import org.I0Itec.zkclient.serialize.ZkSerializer; +import org.apache.kafka.clients.admin.AdminClient; +import org.apache.kafka.clients.admin.NewTopic; +import org.apache.kafka.common.utils.Time; 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; +import scala.collection.JavaConverters$; /** * Registers Kafka topics with Zookeeper. @@ -30,28 +31,17 @@ public class KafkaTopics implements Closeable { private static final Logger logger = LoggerFactory.getLogger(KafkaTopics.class); private static final int MAX_SLEEP = 32; - private final ZkUtils zkUtils; + private final KafkaZkClient zkClient; + private AdminClient kafkaClient; /** * Create Kafka topics registration object with given Zookeeper. * @param zookeeper comma-separated list of Zookeeper 'hostname:port'. */ 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); + this.zkClient = KafkaZkClient + .apply(zookeeper, false, 15_000, 10_000, 30, Time.SYSTEM, "kafka.server", + "SessionExpireListener"); } /** @@ -60,10 +50,9 @@ public Object deserialize(byte[] bytes) throws ZkMarshallingError { * @param brokers number of brokers to wait for * @return whether the brokers where available * @throws InterruptedException when waiting for the brokers is interrepted. - * @throws ZkException if the Zookeeper instance cannot be reached or returns an unexpected - * result. */ - public boolean waitForBrokers(int brokers) throws InterruptedException, ZkException { + public boolean waitForBrokers(int brokers) throws InterruptedException, + ZooKeeperClientException { boolean brokersAvailable = false; int sleep = 2; for (int tries = 0; tries < 10; tries++) { @@ -85,6 +74,15 @@ public boolean waitForBrokers(int brokers) throws InterruptedException, ZkExcept activeBrokers, brokers, sleep); } } + + String bootstrapServers = JavaConverters$.MODULE$ + .seqAsJavaList(zkClient.getAllBrokersInCluster()).stream() + .map(b -> b.endPoints().mkString(",")) + .collect(Collectors.joining(",")); + + kafkaClient = AdminClient.create(Collections.singletonMap( + BOOTSTRAP_SERVERS_CONFIG, bootstrapServers)); + return brokersAvailable; } @@ -95,42 +93,44 @@ public boolean waitForBrokers(int brokers) throws InterruptedException, ZkExcept * @param replication number of replicas for a topic * @return whether the whole catalogue was registered */ - public boolean createTopics(SourceCatalogue catalogue, int partitions, int replication) { - return catalogue.getTopicNames() - .allMatch(topic -> createTopic(topic, partitions, replication)); + public boolean createTopics(SourceCatalogue catalogue, int partitions, short replication) { + return createTopics(catalogue.getTopicNames(), partitions, replication); } /** * Create a single topic. - * @param topic name of the topic to create + * @param topics names of the topic to create * @param partitions number of partitions per topic * @param replication number of replicas for a topic * @return whether the topic was registered */ - public boolean createTopic(String topic, int partitions, int replication) { - Properties props = new Properties(); + public boolean createTopics(Stream topics, int partitions, short replication) { 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); - } + Set existingTopics = kafkaClient.listTopics().names().get(); + + List newTopics = topics + .filter(t -> !existingTopics.contains(t)) + .map(t -> new NewTopic(t, partitions, replication)) + .collect(Collectors.toList()); + + kafkaClient.createTopics(newTopics).all().get(); return true; } catch (Exception ex) { - logger.error("Failed to create topic {}", topic, ex); + logger.error("Failed to create topics {}", ex.toString()); return false; } } - public int getNumberOfBrokers() throws ZkException { - return zkUtils.getAllBrokersInCluster().length(); + public int getNumberOfBrokers() throws ZooKeeperClientException { + return zkClient.getAllBrokersInCluster().length(); } @Override public void close() { - zkUtils.close(); + zkClient.close(); + if (kafkaClient != null) { + kafkaClient.close(); + } } /** @@ -149,7 +149,7 @@ public String getName() { @Override public int execute(Namespace options, CommandLineApp app) { int brokers = options.getInt("brokers"); - int replication = options.getInt("replication"); + short replication = options.getShort("replication"); if (brokers < replication) { logger.error("Cannot assign a replication factor {}" @@ -171,21 +171,22 @@ public int execute(Namespace options, CommandLineApp app) { if (pattern == null) { return topics.createTopics(app.getCatalogue(), partitions, replication) ? 0 : 1; } else { - Optional result = app.getCatalogue().getTopicNames() + List topicNames = app.getCatalogue().getTopicNames() .filter(s -> pattern.matcher(s).find()) - .map(s -> topics.createTopic(s, partitions, replication)) - .reduce((a, b) -> a && b); - if (!result.isPresent()) { + .collect(Collectors.toList()); + + if (topicNames.isEmpty()) { 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; } + + return topics.createTopics(topicNames.stream(), partitions, replication) + ? 0 : 1; } - } catch (InterruptedException | ZkException e) { + } catch (InterruptedException | ZooKeeperClientException e) { logger.error("Cannot retrieve number of addActive Kafka brokers." + " Please check that Zookeeper is running."); return 1; @@ -201,7 +202,7 @@ public void addParser(ArgumentParser parser) { .setDefault(3); parser.addArgument("-r", "--replication") .help("number of replicas per data packet") - .type(Integer.class) + .type(Short.class) .setDefault(3); parser.addArgument("-b", "--brokers") .help("number of brokers that are expected to be available.") diff --git a/java-sdk/settings.gradle b/java-sdk/settings.gradle index 85b666dd..dbf93651 100644 --- a/java-sdk/settings.gradle +++ b/java-sdk/settings.gradle @@ -3,3 +3,5 @@ rootProject.name = 'radar-schemas' include ':radar-schemas-tools' include ':radar-schemas-commons' include ':radar-schemas-restapi' + +enableFeaturePreview('STABLE_PUBLISHING') \ No newline at end of file From 13d51b8e97f68d35f7e65f98095d10f694e8c146 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Thu, 2 Aug 2018 12:04:57 +0200 Subject: [PATCH 5/9] Added comment about Scala --- .../main/java/org/radarcns/schema/registration/KafkaTopics.java | 1 + 1 file changed, 1 insertion(+) 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 70f54284..6cc1b9a3 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 @@ -75,6 +75,7 @@ public boolean waitForBrokers(int brokers) throws InterruptedException, } } + // convert Scala sequence of servers to Java String bootstrapServers = JavaConverters$.MODULE$ .seqAsJavaList(zkClient.getAllBrokersInCluster()).stream() .map(b -> b.endPoints().mkString(",")) From e9880435421bf0a1104389c38dd6d2ac19b4c05d Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Thu, 2 Aug 2018 13:04:51 +0200 Subject: [PATCH 6/9] Increased the timeout --- .../java/org/radarcns/schema/registration/KafkaTopics.java | 5 +++-- 1 file changed, 3 insertions(+), 2 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 6cc1b9a3..ab8f21d3 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 @@ -55,7 +55,8 @@ public boolean waitForBrokers(int brokers) throws InterruptedException, ZooKeeperClientException { boolean brokersAvailable = false; int sleep = 2; - for (int tries = 0; tries < 10; tries++) { + int numTries = 20; + for (int tries = 0; tries < numTries; tries++) { int activeBrokers = getNumberOfBrokers(); brokersAvailable = activeBrokers >= brokers; if (brokersAvailable) { @@ -63,7 +64,7 @@ public boolean waitForBrokers(int brokers) throws InterruptedException, break; } - if (tries < 9) { + if (tries < numTries - 1) { logger.warn("Only {} out of {} Kafka brokers available. Waiting {} seconds.", activeBrokers, brokers, sleep); Thread.sleep(sleep * 1000L); From 8ca7b0d2801d1b1c9eda52f7c209f7182ad551f1 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Thu, 2 Aug 2018 13:13:14 +0200 Subject: [PATCH 7/9] Catch zookeeper connection failure while waiting for brokers --- .../schema/registration/KafkaTopics.java | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 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 ab8f21d3..6ab7aaaa 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 @@ -10,6 +10,7 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; +import kafka.cluster.Broker; import kafka.zk.KafkaZkClient; import kafka.zookeeper.ZooKeeperClientException; import net.sourceforge.argparse4j.inf.ArgumentParser; @@ -56,35 +57,43 @@ public boolean waitForBrokers(int brokers) throws InterruptedException, boolean brokersAvailable = false; int sleep = 2; int numTries = 20; + for (int tries = 0; tries < numTries; tries++) { - int activeBrokers = getNumberOfBrokers(); - brokersAvailable = activeBrokers >= brokers; + List brokerList; + try { + // convert Scala sequence of servers to Java + brokerList = JavaConverters$.MODULE$ + .seqAsJavaList(zkClient.getAllBrokersInCluster()); + } catch (ZooKeeperClientException ex) { + logger.warn("Failed to reach zookeeper"); + brokerList = Collections.emptyList(); + } + + brokersAvailable = brokerList.size() >= brokers; if (brokersAvailable) { logger.info("Kafka brokers available. Starting topic creation."); + + String bootstrapServers = brokerList.stream() + .map(b -> b.endPoints().mkString(",")) + .collect(Collectors.joining(",")); + + kafkaClient = AdminClient.create(Collections.singletonMap( + BOOTSTRAP_SERVERS_CONFIG, bootstrapServers)); break; } if (tries < numTries - 1) { logger.warn("Only {} out of {} Kafka brokers available. Waiting {} seconds.", - activeBrokers, brokers, sleep); + brokerList.size(), brokers, sleep); Thread.sleep(sleep * 1000L); sleep = Math.min(MAX_SLEEP, sleep * 2); } else { logger.error("Only {} out of {} Kafka brokers available." + " Failed to wait on all brokers.", - activeBrokers, brokers, sleep); + brokerList.size(), brokers, sleep); } } - // convert Scala sequence of servers to Java - String bootstrapServers = JavaConverters$.MODULE$ - .seqAsJavaList(zkClient.getAllBrokersInCluster()).stream() - .map(b -> b.endPoints().mkString(",")) - .collect(Collectors.joining(",")); - - kafkaClient = AdminClient.create(Collections.singletonMap( - BOOTSTRAP_SERVERS_CONFIG, bootstrapServers)); - return brokersAvailable; } From 814f8df8b799257da876cbe4f6aa901291ddaba6 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Wed, 8 Aug 2018 14:46:42 +0200 Subject: [PATCH 8/9] Fix gradle warnings and fix #131 --- .../config/checkstyle/checkstyle.xml | 0 .../config/intellij-java-google-style.xml | 0 .../config/pmd/ruleset.xml | 0 java-sdk/radar-schemas-tools/build.gradle | 4 +- .../service/SourceCatalogueService.java | 80 ++++++++++--------- .../specification/active/ActiveSource.java | 11 ++- .../connector/ConnectorSource.java | 21 +++++ .../schema/validation/SchemaValidator.java | 6 +- .../validation/SpecificationsValidator.java | 7 +- .../SpecificationsValidatorTest.java | 10 +++ .../connector/radar-fitbit-connector.yml | 3 + 11 files changed, 87 insertions(+), 55 deletions(-) rename java-sdk/{radar-schemas-tools => }/config/checkstyle/checkstyle.xml (100%) rename java-sdk/{radar-schemas-tools => }/config/intellij-java-google-style.xml (100%) rename java-sdk/{radar-schemas-tools => }/config/pmd/ruleset.xml (100%) diff --git a/java-sdk/radar-schemas-tools/config/checkstyle/checkstyle.xml b/java-sdk/config/checkstyle/checkstyle.xml similarity index 100% rename from java-sdk/radar-schemas-tools/config/checkstyle/checkstyle.xml rename to java-sdk/config/checkstyle/checkstyle.xml diff --git a/java-sdk/radar-schemas-tools/config/intellij-java-google-style.xml b/java-sdk/config/intellij-java-google-style.xml similarity index 100% rename from java-sdk/radar-schemas-tools/config/intellij-java-google-style.xml rename to java-sdk/config/intellij-java-google-style.xml diff --git a/java-sdk/radar-schemas-tools/config/pmd/ruleset.xml b/java-sdk/config/pmd/ruleset.xml similarity index 100% rename from java-sdk/radar-schemas-tools/config/pmd/ruleset.xml rename to java-sdk/config/pmd/ruleset.xml diff --git a/java-sdk/radar-schemas-tools/build.gradle b/java-sdk/radar-schemas-tools/build.gradle index d6fc6e8f..40a3b25d 100644 --- a/java-sdk/radar-schemas-tools/build.gradle +++ b/java-sdk/radar-schemas-tools/build.gradle @@ -84,7 +84,7 @@ checkstyle { toolVersion '6.16' ignoreFailures false - configFile = file("$projectDir/config/checkstyle/checkstyle.xml") + configFile = file("$rootDir/config/checkstyle/checkstyle.xml") } pmd { @@ -96,7 +96,7 @@ pmd { ruleSets = [] - ruleSetFiles = files("$projectDir/config/pmd/ruleset.xml") + ruleSetFiles = files("$rootDir/config/pmd/ruleset.xml") } diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/service/SourceCatalogueService.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/service/SourceCatalogueService.java index 5baf8a18..de06ba38 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/service/SourceCatalogueService.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/service/SourceCatalogueService.java @@ -1,19 +1,17 @@ package org.radarcns.schema.service; -import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; -import org.radarcns.schema.specification.SourceCatalogue; -import org.radarcns.schema.specification.active.ActiveSource; -import org.radarcns.schema.specification.monitor.MonitorSource; -import org.radarcns.schema.specification.passive.PassiveSource; - +import java.util.ArrayList; +import java.util.List; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import java.util.ArrayList; -import java.util.List; +import org.radarcns.schema.specification.SourceCatalogue; +import org.radarcns.schema.specification.active.ActiveSource; +import org.radarcns.schema.specification.connector.ConnectorSource; +import org.radarcns.schema.specification.monitor.MonitorSource; +import org.radarcns.schema.specification.passive.PassiveSource; /** * Webservice resource to share SourceCatalogues. The response has a "Source-Type-Class" header that @@ -32,46 +30,44 @@ public class SourceCatalogueService { /** Get all passive sources from the source catalogue. */ @GET @Path("/passive") - public Response getPassiveSources() { - return Response.ok() - .entity(new SourceTypeResponse(this.sourceCatalogue).addPassive()) - .build(); + public SourceTypeResponse getPassiveSources() { + return new SourceTypeResponse().addPassive(); } /** Get all passive sources from the source catalogue. */ @GET @Path("/active") - public Response getActiveSources() { - return Response.ok() - .entity(new SourceTypeResponse(this.sourceCatalogue).addActive()) - .build(); + public SourceTypeResponse getActiveSources() { + return new SourceTypeResponse().addActive(); } /** Get all monitor sources from the source catalogue. */ @GET @Path("/monitor") - public Response getMonitorSources() { - return Response.ok() - .entity(new SourceTypeResponse(this.sourceCatalogue).addMonitor()) - .build(); + public SourceTypeResponse getMonitorSources() { + return new SourceTypeResponse().addMonitor(); + } + + + /** Get all connector sources from the source catalogue. */ + @GET + @Path("/connector") + public SourceTypeResponse getConnectorSources() { + return new SourceTypeResponse().addConnector(); } /** Get all sources from the source catalogue. */ @GET - public Response getAllSourceTypes() { - return Response.ok() - .entity(new SourceTypeResponse(this.sourceCatalogue) - .addPassive() - .addActive() - .addMonitor()) - .build(); + public SourceTypeResponse getAllSourceTypes() { + return new SourceTypeResponse() + .addPassive() + .addActive() + .addMonitor() + .addConnector(); } /** Response with source types. */ public class SourceTypeResponse { - @JsonIgnore - private final SourceCatalogue sourceCatalogue; - @JsonProperty("passive-source-types") private List passiveSources; @@ -81,24 +77,26 @@ public class SourceTypeResponse { @JsonProperty("monitor-source-types") private List monitorSources; - private SourceTypeResponse(SourceCatalogue sourceCatalogue) { - this.sourceCatalogue = sourceCatalogue; - } + @JsonProperty("connector-source-types") + private List connectorSources; private SourceTypeResponse addPassive() { - this.passiveSources = new ArrayList<>( - this.sourceCatalogue.getPassiveSources().values()); + this.passiveSources = new ArrayList<>(sourceCatalogue.getPassiveSources().values()); return this; } private SourceTypeResponse addActive() { - this.activeSources = new ArrayList<>(this.sourceCatalogue.getActiveSources().values()); + this.activeSources = new ArrayList<>(sourceCatalogue.getActiveSources().values()); return this; } private SourceTypeResponse addMonitor() { - this.monitorSources = new ArrayList<>( - this.sourceCatalogue.getMonitorSources().values()); + this.monitorSources = new ArrayList<>(sourceCatalogue.getMonitorSources().values()); + return this; + } + + private SourceTypeResponse addConnector() { + this.connectorSources = new ArrayList<>(sourceCatalogue.getConnectorSources().values()); return this; } @@ -113,5 +111,9 @@ public List getActiveSources() { public List getMonitorSources() { return monitorSources; } + + public List getConnectorSources() { + return connectorSources; + } } } 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 44a46809..c009015c 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 @@ -1,5 +1,3 @@ -package org.radarcns.schema.specification.active; - /* * Copyright 2017 King's College London and The Hyve * @@ -16,6 +14,8 @@ * limitations under the License. */ +package org.radarcns.schema.specification.active; + import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; @@ -30,9 +30,7 @@ /** * TODO. */ -@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, - include = JsonTypeInfo.As.PROPERTY, - property = "assessment_type") +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "assessment_type") @JsonSubTypes(value = { @JsonSubTypes.Type(name = "QUESTIONNAIRE", value = QuestionnaireSource.class), @JsonSubTypes.Type(name = "APP", value = AppActiveSource.class)}) @@ -41,7 +39,8 @@ public enum RadarSourceTypes { QUESTIONNAIRE } - @JsonProperty("assessment_type") @NotBlank + @JsonProperty("assessment_type") + @NotBlank private String assessmentType; @JsonProperty diff --git a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/connector/ConnectorSource.java b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/connector/ConnectorSource.java index 5daf47ff..aed95f51 100644 --- a/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/connector/ConnectorSource.java +++ b/java-sdk/radar-schemas-tools/src/main/java/org/radarcns/schema/specification/connector/ConnectorSource.java @@ -16,6 +16,15 @@ public class ConnectorSource extends DataProducer { @JsonProperty private List data; + @JsonProperty + private String vendor; + + @JsonProperty + private String model; + + @JsonProperty + private String version; + public ConnectorSource() { registerSchema = false; } @@ -29,4 +38,16 @@ public List getData() { public Scope getScope() { return Scope.CONNECTOR; } + + public String getVendor() { + return vendor; + } + + public String getModel() { + return model; + } + + public String getVersion() { + return version; + } } 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 8fe8f8f2..e0a7cba4 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 @@ -94,7 +94,7 @@ public Stream analyseFiles(Scope scope) { }) .filter(s -> s != null && s.getValue().getType() == Schema.Type.ENUM) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> { - if (v1.equals(v2)) { + if (v1 == v2) { return v1; } else { throw new IllegalStateException("Duplicate enum: " + v1); @@ -131,10 +131,8 @@ public Stream analyseFiles(Scope scope) { /** * TODO. - * @throws IOException TODO. */ - public Stream analyseFiles() - throws IOException { + public Stream analyseFiles() { return Arrays.stream(Scope.values()) .flatMap(this::analyseFiles); } 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 14fd1763..b6bafd0d 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 @@ -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.radarcns.schema.Scope; import org.radarcns.schema.validation.config.ExcludeConfig; @@ -46,8 +46,7 @@ public SpecificationsValidator(Path root, ExcludeConfig config) { /** Check that all files in the specifications directory are YAML files. */ public boolean specificationsAreYmlFiles(Scope scope) throws IOException { return Files.walk(scope.getPath(root.resolve(SPECIFICATIONS_PATH))) - .filter(Files::isRegularFile) - .filter(p -> !config.skipFile(p)) + .filter(p -> Files.isRegularFile(p) && !config.skipFile(p)) .allMatch(SpecificationsValidator::isYmlFile); } 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 b0e179fe..6fafed47 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 @@ -32,4 +32,14 @@ public void monitorIsYml() throws IOException { public void passiveIsYml() throws IOException { assertTrue(validator.specificationsAreYmlFiles(Scope.PASSIVE)); } + + @Test + public void connectorIsYml() throws IOException { + assertTrue(validator.specificationsAreYmlFiles(Scope.CONNECTOR)); + } + + @Test + public void streamIsYml() throws IOException { + assertTrue(validator.specificationsAreYmlFiles(Scope.STREAM)); + } } diff --git a/specifications/connector/radar-fitbit-connector.yml b/specifications/connector/radar-fitbit-connector.yml index ff08e6a3..96e46df5 100644 --- a/specifications/connector/radar-fitbit-connector.yml +++ b/specifications/connector/radar-fitbit-connector.yml @@ -1,4 +1,7 @@ name: RADAR-FITBIT-CONNECTOR +vendor: RADAR-base +model: radar-connect-fitbit-source +version: 0.1.0-SNAPSHOT doc: Spec for Radar fitbit connector. Schemas should be registered in the connector. data: - doc: The intraday time series for heart rate. From c06272476e576f8e1319400f60eb3c749d48c512 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Wed, 8 Aug 2018 14:51:10 +0200 Subject: [PATCH 9/9] Bump version --- commons/active/notification/notification.avsc | 2 +- commons/active/task/task.avsc | 2 +- java-sdk/README.md | 6 +++--- java-sdk/build.gradle | 2 +- specifications/connector/radar-fitbit-connector.yml | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/commons/active/notification/notification.avsc b/commons/active/notification/notification.avsc index 5bbefdd7..7e13387c 100644 --- a/commons/active/notification/notification.avsc +++ b/commons/active/notification/notification.avsc @@ -15,7 +15,7 @@ "type": "record", "doc": "Notification answer.", "fields": [ - { "name": "questionId", "type": ["null", "string"], "doc": "Unique identifier for the specific question.", "default": null }, + { "name": "questionId", "type": ["null", "string"], "doc": "Unique identifier for the specific question.", "default": null }, { "name": "value", "type": ["int", "string", "double"], "doc": "Subject answer." }, { "name": "startTime", "type": "double", "doc": "Timestamp in UTC (s) when the notification is shown." }, { "name": "endTime", "type": "double", "doc": "Timestamp in UTC (s) when the notification is answered." } diff --git a/commons/active/task/task.avsc b/commons/active/task/task.avsc index f229fcb9..321d211a 100644 --- a/commons/active/task/task.avsc +++ b/commons/active/task/task.avsc @@ -15,7 +15,7 @@ "type": "record", "doc": "Task answer.", "fields": [ - { "name": "questionId", "type": ["null", "string"], "doc": "Unique identifier for the specific question.", "default": null }, + { "name": "questionId", "type": ["null", "string"], "doc": "Unique identifier for the specific question.", "default": null }, { "name": "value", "type": ["int", "string", "double"], "doc": "Subject answer." }, { "name": "startTime", "type": "double", "doc": "Timestamp in UTC (s) when the task is shown." }, { "name": "endTime", "type": "double", "doc": "Timestamp in UTC (s) when the task is answered." } diff --git a/java-sdk/README.md b/java-sdk/README.md index 63e76b01..9c06e10c 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.3.4' + compile 'org.radarcns:radar-schemas-commons:0.3.5' // REST API schemas (REST API, testing) - compile 'org.radarcns:radar-schemas-restapi:0.3.4' + compile 'org.radarcns:radar-schemas-restapi:0.3.5' // Questionnaire schemas (active remote monitoring app) - compile 'org.radarcns:radar-schemas-tools:0.3.4' + compile 'org.radarcns:radar-schemas-tools:0.3.5' } ``` 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 fe624cc5..76d586fd 100644 --- a/java-sdk/build.gradle +++ b/java-sdk/build.gradle @@ -17,7 +17,7 @@ subprojects { apply plugin: 'idea' // Configuration - version = '0.3.5-SNAPSHOT' + version = '0.3.5' group = 'org.radarcns' ext.githubRepoName = 'RADAR-base/RADAR-Schemas' diff --git a/specifications/connector/radar-fitbit-connector.yml b/specifications/connector/radar-fitbit-connector.yml index 96e46df5..795da90b 100644 --- a/specifications/connector/radar-fitbit-connector.yml +++ b/specifications/connector/radar-fitbit-connector.yml @@ -1,7 +1,7 @@ name: RADAR-FITBIT-CONNECTOR vendor: RADAR-base model: radar-connect-fitbit-source -version: 0.1.0-SNAPSHOT +version: 0.1.0 doc: Spec for Radar fitbit connector. Schemas should be registered in the connector. data: - doc: The intraday time series for heart rate.