diff --git a/pom.xml b/pom.xml index 0aaeaafe7..77aca86ce 100644 --- a/pom.xml +++ b/pom.xml @@ -192,6 +192,7 @@ com.google.guava guava 21.0 + test com.squareup.retrofit2 diff --git a/src/main/java/org/influxdb/InfluxDBFactory.java b/src/main/java/org/influxdb/InfluxDBFactory.java index 01c3281fa..309e2e7b7 100644 --- a/src/main/java/org/influxdb/InfluxDBFactory.java +++ b/src/main/java/org/influxdb/InfluxDBFactory.java @@ -2,10 +2,10 @@ import org.influxdb.impl.InfluxDBImpl; -import com.google.common.base.Preconditions; -import com.google.common.base.Strings; - import okhttp3.OkHttpClient; +import org.influxdb.impl.Preconditions; + +import java.util.Objects; /** @@ -25,7 +25,7 @@ public enum InfluxDBFactory { * @return a InfluxDB adapter suitable to access a InfluxDB. */ public static InfluxDB connect(final String url) { - Preconditions.checkArgument(!Strings.isNullOrEmpty(url), "The URL may not be null or empty."); + Preconditions.checkNonEmptyString(url, "url"); return new InfluxDBImpl(url, null, null, new OkHttpClient.Builder()); } @@ -42,8 +42,8 @@ public static InfluxDB connect(final String url) { * @return a InfluxDB adapter suitable to access a InfluxDB. */ public static InfluxDB connect(final String url, final String username, final String password) { - Preconditions.checkArgument(!Strings.isNullOrEmpty(url), "The URL may not be null or empty."); - Preconditions.checkArgument(!Strings.isNullOrEmpty(username), "The username may not be null or empty."); + Preconditions.checkNonEmptyString(url, "url"); + Preconditions.checkNonEmptyString(username, "username"); return new InfluxDBImpl(url, username, password, new OkHttpClient.Builder()); } @@ -57,8 +57,8 @@ public static InfluxDB connect(final String url, final String username, final St * @return a InfluxDB adapter suitable to access a InfluxDB. */ public static InfluxDB connect(final String url, final OkHttpClient.Builder client) { - Preconditions.checkArgument(!Strings.isNullOrEmpty(url), "The URL may not be null or empty."); - Preconditions.checkNotNull(client, "The client may not be null."); + Preconditions.checkNonEmptyString(url, "url"); + Objects.requireNonNull(client, "client"); return new InfluxDBImpl(url, null, null, client); } @@ -78,9 +78,9 @@ public static InfluxDB connect(final String url, final OkHttpClient.Builder clie */ public static InfluxDB connect(final String url, final String username, final String password, final OkHttpClient.Builder client) { - Preconditions.checkArgument(!Strings.isNullOrEmpty(url), "The URL may not be null or empty."); - Preconditions.checkArgument(!Strings.isNullOrEmpty(username), "The username may not be null or empty."); - Preconditions.checkNotNull(client, "The client may not be null."); + Preconditions.checkNonEmptyString(url, "url"); + Preconditions.checkNonEmptyString(username, "username"); + Objects.requireNonNull(client, "client"); return new InfluxDBImpl(url, username, password, client); } } diff --git a/src/main/java/org/influxdb/dto/BatchPoints.java b/src/main/java/org/influxdb/dto/BatchPoints.java index 0f39540d7..e56ced195 100644 --- a/src/main/java/org/influxdb/dto/BatchPoints.java +++ b/src/main/java/org/influxdb/dto/BatchPoints.java @@ -1,17 +1,15 @@ package org.influxdb.dto; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.TreeMap; import org.influxdb.InfluxDB.ConsistencyLevel; -import com.google.common.base.Preconditions; -import com.google.common.base.Strings; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.collect.Ordering; +import org.influxdb.impl.Preconditions; /** * {Purpose of This Type}. @@ -49,8 +47,8 @@ public static Builder database(final String database) { public static final class Builder { private final String database; private String retentionPolicy; - private final Map tags = Maps.newTreeMap(Ordering.natural()); - private final List points = Lists.newArrayList(); + private final Map tags = new TreeMap<>(); + private final List points = new ArrayList<>(); private ConsistencyLevel consistency; /** @@ -124,8 +122,7 @@ public Builder consistency(final ConsistencyLevel consistencyLevel) { * @return the created BatchPoints. */ public BatchPoints build() { - Preconditions.checkArgument(!Strings.isNullOrEmpty(this.database), - "Database must not be null or empty."); + Preconditions.checkNonEmptyString(this.database, "database"); BatchPoints batchPoints = new BatchPoints(); batchPoints.setDatabase(this.database); for (Point point : this.points) { diff --git a/src/main/java/org/influxdb/dto/Point.java b/src/main/java/org/influxdb/dto/Point.java index d1dd78a7c..90dbf515b 100644 --- a/src/main/java/org/influxdb/dto/Point.java +++ b/src/main/java/org/influxdb/dto/Point.java @@ -9,11 +9,9 @@ import java.util.Objects; import java.util.TreeMap; import java.util.concurrent.TimeUnit; +import java.util.function.Function; -import com.google.common.base.Preconditions; -import com.google.common.base.Strings; -import com.google.common.escape.Escaper; -import com.google.common.escape.Escapers; +import org.influxdb.impl.Preconditions; /** * Representation of a InfluxDB database Point. @@ -28,15 +26,10 @@ public class Point { private TimeUnit precision = TimeUnit.NANOSECONDS; private Map fields; - private static final Escaper FIELD_ESCAPER = Escapers.builder() - .addEscape('\\', "\\\\") - .addEscape('"', "\\\"") - .build(); - private static final Escaper KEY_ESCAPER = Escapers.builder() - .addEscape(' ', "\\ ") - .addEscape(',', "\\,") - .addEscape('=', "\\=") - .build(); + private static final Function FIELD_ESCAPER = s -> + s.replace("\\", "\\\\").replace("\"", "\\\""); + private static final Function KEY_ESCAPER = s -> + s.replace(" ", "\\ ").replace(",", "\\,").replace("=", "\\="); private static final int MAX_FRACTION_DIGITS = 340; Point() { @@ -84,8 +77,8 @@ public static final class Builder { * @return the Builder instance. */ public Builder tag(final String tagName, final String value) { - Preconditions.checkArgument(tagName != null); - Preconditions.checkArgument(value != null); + Objects.requireNonNull(tagName, "tagName"); + Objects.requireNonNull(value, "value"); if (!tagName.isEmpty() && !value.isEmpty()) { tags.put(tagName, value); } @@ -189,7 +182,7 @@ public Builder fields(final Map fieldsToAdd) { * @return the Builder instance. */ public Builder time(final long timeToSet, final TimeUnit precisionToSet) { - Preconditions.checkNotNull(precisionToSet, "Precision must be not null!"); + Objects.requireNonNull(precisionToSet, "precisionToSet"); this.time = timeToSet; this.precision = precisionToSet; return this; @@ -201,12 +194,8 @@ public Builder time(final long timeToSet, final TimeUnit precisionToSet) { * @return the newly created Point. */ public Point build() { - Preconditions - .checkArgument(!Strings.isNullOrEmpty(this.measurement), - "Point name must not be null or empty."); - Preconditions - .checkArgument(this.fields.size() > 0, - "Point must have at least one field specified."); + Preconditions.checkNonEmptyString(this.measurement, "measurement"); + Preconditions.checkPositiveNumber(this.fields.size(), "fields size"); Point point = new Point(); point.setFields(this.fields); point.setMeasurement(this.measurement); @@ -321,7 +310,7 @@ public String toString() { */ public String lineProtocol() { final StringBuilder sb = new StringBuilder(); - sb.append(KEY_ESCAPER.escape(this.measurement)); + sb.append(KEY_ESCAPER.apply(this.measurement)); sb.append(concatenatedTags()); sb.append(concatenateFields()); sb.append(formatedTime()); @@ -332,9 +321,9 @@ private StringBuilder concatenatedTags() { final StringBuilder sb = new StringBuilder(); for (Entry tag : this.tags.entrySet()) { sb.append(",") - .append(KEY_ESCAPER.escape(tag.getKey())) + .append(KEY_ESCAPER.apply(tag.getKey())) .append("=") - .append(KEY_ESCAPER.escape(tag.getValue())); + .append(KEY_ESCAPER.apply(tag.getValue())); } sb.append(" "); return sb; @@ -357,10 +346,10 @@ private StringBuilder concatenateFields() { continue; } - sb.append(KEY_ESCAPER.escape(field.getKey())).append("="); + sb.append(KEY_ESCAPER.apply(field.getKey())).append("="); if (value instanceof String) { String stringValue = (String) value; - sb.append("\"").append(FIELD_ESCAPER.escape(stringValue)).append("\""); + sb.append("\"").append(FIELD_ESCAPER.apply(stringValue)).append("\""); } else if (value instanceof Number) { if (value instanceof Double || value instanceof Float || value instanceof BigDecimal) { sb.append(numberFormat.format(value)); diff --git a/src/main/java/org/influxdb/dto/Pong.java b/src/main/java/org/influxdb/dto/Pong.java index 22ab79e33..0245a1fde 100644 --- a/src/main/java/org/influxdb/dto/Pong.java +++ b/src/main/java/org/influxdb/dto/Pong.java @@ -1,7 +1,5 @@ package org.influxdb.dto; -import com.google.common.base.MoreObjects; - /** * Representation of the response for a influxdb ping. * @@ -47,11 +45,7 @@ public void setResponseTime(final long responseTime) { */ @Override public String toString() { - return MoreObjects - .toStringHelper(this.getClass()) - .add("version", this.version) - .add("responseTime", this.responseTime) - .toString(); + return "Pong{version=" + version + ", responseTime=" + responseTime + "}"; } } diff --git a/src/main/java/org/influxdb/impl/BatchProcessor.java b/src/main/java/org/influxdb/impl/BatchProcessor.java index cea38f0b4..c637282c2 100644 --- a/src/main/java/org/influxdb/impl/BatchProcessor.java +++ b/src/main/java/org/influxdb/impl/BatchProcessor.java @@ -1,9 +1,11 @@ package org.influxdb.impl; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Objects; import java.util.concurrent.BlockingQueue; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; @@ -18,9 +20,6 @@ import org.influxdb.dto.BatchPoints; import org.influxdb.dto.Point; -import com.google.common.base.Preconditions; -import com.google.common.collect.Maps; - /** * A BatchProcessor can be attached to a InfluxDB Instance to collect single point writes and * aggregates them to BatchPoints to get a better write performance. @@ -114,12 +113,12 @@ public Builder exceptionHandler(final BiConsumer, Throwable> han * @return the BatchProcessor instance. */ public BatchProcessor build() { - Preconditions.checkNotNull(this.influxDB, "influxDB may not be null"); - Preconditions.checkArgument(this.actions > 0, "actions should > 0"); - Preconditions.checkArgument(this.flushInterval > 0, "flushInterval should > 0"); - Preconditions.checkNotNull(this.flushIntervalUnit, "flushIntervalUnit may not be null"); - Preconditions.checkNotNull(this.threadFactory, "threadFactory may not be null"); - Preconditions.checkNotNull(this.exceptionHandler, "exceptionHandler may not be null"); + Objects.requireNonNull(this.influxDB, "influxDB"); + Preconditions.checkPositiveNumber(this.actions, "actions"); + Preconditions.checkPositiveNumber(this.flushInterval, "flushInterval"); + Objects.requireNonNull(this.flushIntervalUnit, "flushIntervalUnit"); + Objects.requireNonNull(this.threadFactory, "threadFactory"); + Objects.requireNonNull(this.exceptionHandler, "exceptionHandler"); return new BatchProcessor(this.influxDB, this.threadFactory, this.actions, this.flushIntervalUnit, this.flushInterval, exceptionHandler); } @@ -212,9 +211,9 @@ void write() { return; } //for batch on HTTP. - Map batchKeyToBatchPoints = Maps.newHashMap(); + Map batchKeyToBatchPoints = new HashMap<>(); //for batch on UDP. - Map> udpPortToBatchPoints = Maps.newHashMap(); + Map> udpPortToBatchPoints = new HashMap<>(); List batchEntries = new ArrayList<>(this.queue.size()); this.queue.drainTo(batchEntries); currentBatch = new ArrayList<>(batchEntries.size()); diff --git a/src/main/java/org/influxdb/impl/InfluxDBImpl.java b/src/main/java/org/influxdb/impl/InfluxDBImpl.java index 884787cab..bf23d7f3e 100644 --- a/src/main/java/org/influxdb/impl/InfluxDBImpl.java +++ b/src/main/java/org/influxdb/impl/InfluxDBImpl.java @@ -1,11 +1,6 @@ package org.influxdb.impl; -import com.google.common.base.Joiner; -import com.google.common.base.Preconditions; -import com.google.common.base.Stopwatch; -import com.google.common.base.Strings; -import com.google.common.collect.Lists; import com.squareup.moshi.JsonAdapter; import com.squareup.moshi.Moshi; @@ -41,6 +36,7 @@ import java.net.SocketException; import java.net.UnknownHostException; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; @@ -204,7 +200,7 @@ public boolean isBatchEnabled() { @Override public Pong ping() { - Stopwatch watch = Stopwatch.createStarted(); + final long started = System.currentTimeMillis(); Call call = this.influxDBService.ping(); try { Response response = call.execute(); @@ -218,7 +214,7 @@ public Pong ping() { } Pong pong = new Pong(); pong.setVersion(version); - pong.setResponseTime(watch.elapsed(TimeUnit.MILLISECONDS)); + pong.setResponseTime(System.currentTimeMillis() - started); return pong; } catch (IOException e) { throw new RuntimeException(e); @@ -290,8 +286,7 @@ public void write(final String database, final String retentionPolicy, final Con @Override public void write(final String database, final String retentionPolicy, final ConsistencyLevel consistency, final List records) { - final String joinedRecords = Joiner.on("\n").join(records); - write(database, retentionPolicy, consistency, joinedRecords); + write(database, retentionPolicy, consistency, String.join("\n", records)); } /** @@ -327,8 +322,7 @@ private void initialDatagramSocket() { */ @Override public void write(final int udpPort, final List records) { - final String joinedRecords = Joiner.on("\n").join(records); - write(udpPort, joinedRecords); + write(udpPort, String.join("\n", records)); } /** @@ -406,7 +400,7 @@ public QueryResult query(final Query query, final TimeUnit timeUnit) { */ @Override public void createDatabase(final String name) { - Preconditions.checkArgument(!Strings.isNullOrEmpty(name), "Database name may not be null or empty"); + Preconditions.checkNonEmptyString(name, "name"); String createDatabaseQueryString = String.format("CREATE DATABASE \"%s\"", name); if (this.version().startsWith("0.")) { createDatabaseQueryString = String.format("CREATE DATABASE IF NOT EXISTS \"%s\"", name); @@ -433,7 +427,7 @@ public List describeDatabases() { // {"results":[{"series":[{"name":"databases","columns":["name"],"values":[["mydb"]]}]}]} // Series [name=databases, columns=[name], values=[[mydb], [unittest_1433605300968]]] List> databaseNames = result.getResults().get(0).getSeries().get(0).getValues(); - List databases = Lists.newArrayList(); + List databases = new ArrayList<>(); if (databaseNames != null) { for (List database : databaseNames) { databases.add(database.get(0).toString()); diff --git a/src/main/java/org/influxdb/impl/Preconditions.java b/src/main/java/org/influxdb/impl/Preconditions.java new file mode 100644 index 000000000..079441087 --- /dev/null +++ b/src/main/java/org/influxdb/impl/Preconditions.java @@ -0,0 +1,33 @@ +package org.influxdb.impl; + +public final class Preconditions { + + private Preconditions() { + } + + /** + * Enforces that the string is {@linkplain String#isEmpty() not empty}. + * @param string the string to test + * @param name variable name for reporting + * @return {@code string} + * @throws IllegalArgumentException if the string is empty + */ + public static String checkNonEmptyString(final String string, final String name) throws IllegalArgumentException { + if (string == null || string.isEmpty()) { + throw new IllegalArgumentException("Expecting a non-empty string for " + name); + } + return string; + } + + /** + * Enforces that the number is larger than 0. + * @param number the number to test + * @param name variable name for reporting + * @throws IllegalArgumentException if the number is less or equal to 0 + */ + public static void checkPositiveNumber(final Number number, final String name) throws IllegalArgumentException { + if (number == null || number.doubleValue() <= 0) { + throw new IllegalArgumentException("Expecting a positive number for " + name); + } + } +} diff --git a/src/test/java/org/influxdb/dto/BatchPointTest.java b/src/test/java/org/influxdb/dto/BatchPointTest.java index cd6af1dd4..5cef6653c 100644 --- a/src/test/java/org/influxdb/dto/BatchPointTest.java +++ b/src/test/java/org/influxdb/dto/BatchPointTest.java @@ -2,6 +2,8 @@ import static org.assertj.core.api.Assertions.assertThat; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -9,22 +11,20 @@ import org.influxdb.InfluxDB; import org.junit.Test; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; public class BatchPointTest { @Test public void testEquals() throws Exception { // GIVEN two batchpoint objects with the same values - Map tags = Maps.newHashMap(); + Map tags = new HashMap<>(); tags.put("key", "value"); InfluxDB.ConsistencyLevel consistencyLevel = InfluxDB.ConsistencyLevel.ANY; String db = "my database"; - List points = Lists.newArrayList(); + List points = new ArrayList<>(); Point p = new Point(); p.setPrecision(TimeUnit.MILLISECONDS); p.setMeasurement("my measurements"); @@ -56,10 +56,10 @@ public void testEquals() throws Exception { @Test public void testUnEquals() throws Exception { // GIVEN two batchpoint objects with different values - Map tags1 = Maps.newHashMap(); + Map tags1 = new HashMap<>(); tags1.put("key", "value1"); - Map tags2 = Maps.newHashMap(); + Map tags2 = new HashMap<>(); tags2.put("key", "value2"); InfluxDB.ConsistencyLevel consistencyLevel1 = InfluxDB.ConsistencyLevel.ANY; @@ -68,7 +68,7 @@ public void testUnEquals() throws Exception { String db1 = "my database 1"; String db2 = "my database 2"; - List points = Lists.newArrayList(); + List points = new ArrayList<>(); Point p = new Point(); p.setPrecision(TimeUnit.MILLISECONDS); p.setMeasurement("my measurements"); diff --git a/src/test/java/org/influxdb/dto/PointTest.java b/src/test/java/org/influxdb/dto/PointTest.java index 62301db39..8ede5e3cc 100644 --- a/src/test/java/org/influxdb/dto/PointTest.java +++ b/src/test/java/org/influxdb/dto/PointTest.java @@ -4,16 +4,15 @@ import java.math.BigDecimal; import java.math.BigInteger; +import java.util.Collections; +import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; -import com.google.common.collect.ImmutableMap; import org.junit.Test; -import com.google.common.collect.Maps; - /** * Test for the Point DTO. * @@ -196,26 +195,26 @@ public void testIgnoreNullPointerValue() { /** * Tests for issue #110 */ - @Test(expected = IllegalArgumentException.class) + @Test(expected = NullPointerException.class) public void testAddingTagsWithNullNameThrowsAnError() { Point.measurement("dontcare").tag(null, "DontCare"); } - @Test(expected = IllegalArgumentException.class) + @Test(expected = NullPointerException.class) public void testAddingTagsWithNullValueThrowsAnError() { Point.measurement("dontcare").tag("DontCare", null); } - @Test(expected = IllegalArgumentException.class) + @Test(expected = NullPointerException.class) public void testAddingMapOfTagsWithNullNameThrowsAnError() { - Map map = Maps.newHashMap(); + Map map = new HashMap<>(); map.put(null, "DontCare"); Point.measurement("dontcare").tag(map); } - @Test(expected = IllegalArgumentException.class) + @Test(expected = NullPointerException.class) public void testAddingMapOfTagsWithNullValueThrowsAnError() { - Map map = Maps.newHashMap(); + Map map = new HashMap<>(); map.put("DontCare", null); Point.measurement("dontcare").tag(map); } @@ -233,10 +232,10 @@ public void testEmptyValuesAreIgnored() { point = Point.measurement("dontcare").tag("","value").addField("dontcare", true).build(); assertThat(point.getTags().size()).isEqualTo(0); - point = Point.measurement("dontcare").tag(ImmutableMap.of("key","")).addField("dontcare", true).build(); + point = Point.measurement("dontcare").tag(Collections.singletonMap("key", "")).addField("dontcare", true).build(); assertThat(point.getTags().size()).isEqualTo(0); - point = Point.measurement("dontcare").tag(ImmutableMap.of("","value")).addField("dontcare", true).build(); + point = Point.measurement("dontcare").tag(Collections.singletonMap("", "value")).addField("dontcare", true).build(); assertThat(point.getTags().size()).isEqualTo(0); } @@ -246,14 +245,14 @@ public void testEmptyValuesAreIgnored() { @Test public void testEquals() throws Exception { // GIVEN two point objects with identical data - Map fields = Maps.newHashMap(); + Map fields = new HashMap<>(); fields.put("foo", "bar"); String measurement = "measurement"; TimeUnit precision = TimeUnit.NANOSECONDS; - Map tags = Maps.newHashMap(); + Map tags = new HashMap<>(); tags.put("bar", "baz"); Long time = System.currentTimeMillis(); @@ -282,17 +281,17 @@ public void testEquals() throws Exception { @Test public void testUnEquals() throws Exception { // GIVEN two point objects with different data - Map fields1 = Maps.newHashMap(); + Map fields1 = new HashMap<>(); fields1.put("foo", "bar"); - Map fields2 = Maps.newHashMap(); + Map fields2 = new HashMap<>(); fields2.put("foo", "baz"); String measurement = "measurement"; TimeUnit precision = TimeUnit.NANOSECONDS; - Map tags = Maps.newHashMap(); + Map tags = new HashMap<>(); tags.put("bar", "baz"); Long time = System.currentTimeMillis();