From 0af974d239eefb8f57e42832bc5a1355c51a3a90 Mon Sep 17 00:00:00 2001 From: Brenton Poke Date: Sun, 16 Aug 2020 08:46:34 -0400 Subject: [PATCH 1/7] fix for #661: null values coming into the pojo should --- .../java/org/influxdb/annotation/Default.java | 12 +++++++ src/main/java/org/influxdb/dto/Point.java | 6 +++- src/test/java/org/influxdb/dto/PointTest.java | 34 +++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/influxdb/annotation/Default.java diff --git a/src/main/java/org/influxdb/annotation/Default.java b/src/main/java/org/influxdb/annotation/Default.java new file mode 100644 index 000000000..58e0d10ed --- /dev/null +++ b/src/main/java/org/influxdb/annotation/Default.java @@ -0,0 +1,12 @@ +package org.influxdb.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(value = ElementType.FIELD) +public @interface Default { + String value() default ""; +} diff --git a/src/main/java/org/influxdb/dto/Point.java b/src/main/java/org/influxdb/dto/Point.java index 422884e8a..8bf7cf5b0 100755 --- a/src/main/java/org/influxdb/dto/Point.java +++ b/src/main/java/org/influxdb/dto/Point.java @@ -16,6 +16,7 @@ import java.util.concurrent.TimeUnit; import org.influxdb.BuilderException; import org.influxdb.annotation.Column; +import org.influxdb.annotation.Default; import org.influxdb.annotation.Measurement; import org.influxdb.annotation.TimeColumn; import org.influxdb.impl.Preconditions; @@ -274,7 +275,6 @@ public Builder addFieldsFromPOJO(final Object pojo) { if (column == null) { continue; } - field.setAccessible(true); String fieldName = column.name(); addFieldByAttribute(pojo, field, column, fieldName); @@ -322,6 +322,10 @@ private void addFieldByAttribute(final Object pojo, final Field field, final Col this.fields.put(fieldName, fieldValue); } } + if(field.isAnnotationPresent(Default.class)) { + Default val = field.getAnnotation(Default.class); + field.set(pojo,val.value()); + } } catch (IllegalArgumentException | IllegalAccessException e) { // Can not happen since we use metadata got from the object diff --git a/src/test/java/org/influxdb/dto/PointTest.java b/src/test/java/org/influxdb/dto/PointTest.java index a49454177..41d79b827 100755 --- a/src/test/java/org/influxdb/dto/PointTest.java +++ b/src/test/java/org/influxdb/dto/PointTest.java @@ -19,6 +19,7 @@ import org.influxdb.BuilderException; import org.influxdb.InfluxDB; import org.influxdb.annotation.Column; +import org.influxdb.annotation.Default; import org.influxdb.annotation.Measurement; import org.influxdb.annotation.TimeColumn; import org.influxdb.impl.InfluxDBImpl; @@ -793,6 +794,15 @@ public void testAddFieldsFromPOJOWithPublicAttributes() { Assertions.assertEquals(pojo.time, p.getFields().get("time")); Assertions.assertEquals(pojo.uuid, p.getTags().get("uuid")); } + @Test + public void testAddFieldsFromPOJOWithDefaultAnnotation() { + PojoWithDefaultAnnotation pojo = new PojoWithDefaultAnnotation(); + pojo.setAuthor(""); + pojo.setId("1"); + Point p = Point.measurementByPOJO(pojo.getClass()).addFieldsFromPOJO(pojo).build(); + Assertions.assertEquals(pojo.getAuthor(),p.getFields().get("author")); + Assertions.assertEquals(pojo.getId(),p.getFields().get("id")); + } @Test public void testInheritMeasurement() { @@ -822,6 +832,30 @@ public void setId(String id) { this.id = id; } } + @Measurement(name = "mymeasurement") + static class PojoWithDefaultAnnotation { + + @Default("1") + @Column(name = "id") + private String id; + //check alternate order of annotations. ¯\_(ツ)_/¯ + @Column(name = "author") + @Default + private String author; + + public String getAuthor() { + return author; + } + public void setAuthor(String name) { + this.author = name; + } + public String getId() { + return id; + } + public void setId(String id) { + this.id = id; + } + } @Measurement(name = "mymeasurement") static class PojoWithMeasurement { From a31e4392fa13c579fb76dbe416d83c0070834d9d Mon Sep 17 00:00:00 2001 From: Brenton Poke Date: Sun, 16 Aug 2020 08:48:04 -0400 Subject: [PATCH 2/7] checkstyle fix >_> --- src/main/java/org/influxdb/dto/Point.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/influxdb/dto/Point.java b/src/main/java/org/influxdb/dto/Point.java index 8bf7cf5b0..a65a61de5 100755 --- a/src/main/java/org/influxdb/dto/Point.java +++ b/src/main/java/org/influxdb/dto/Point.java @@ -322,9 +322,9 @@ private void addFieldByAttribute(final Object pojo, final Field field, final Col this.fields.put(fieldName, fieldValue); } } - if(field.isAnnotationPresent(Default.class)) { + if (field.isAnnotationPresent(Default.class)) { Default val = field.getAnnotation(Default.class); - field.set(pojo,val.value()); + field.set(pojo, val.value()); } } catch (IllegalArgumentException | IllegalAccessException e) { From 9719e0c378c1f8a4deef5a7deee36fdd6e880b1c Mon Sep 17 00:00:00 2001 From: Brenton Poke Date: Sun, 16 Aug 2020 09:02:45 -0400 Subject: [PATCH 3/7] slightly more relevent unit test --- src/test/java/org/influxdb/dto/PointTest.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/influxdb/dto/PointTest.java b/src/test/java/org/influxdb/dto/PointTest.java index 41d79b827..c2008ad5e 100755 --- a/src/test/java/org/influxdb/dto/PointTest.java +++ b/src/test/java/org/influxdb/dto/PointTest.java @@ -797,11 +797,15 @@ public void testAddFieldsFromPOJOWithPublicAttributes() { @Test public void testAddFieldsFromPOJOWithDefaultAnnotation() { PojoWithDefaultAnnotation pojo = new PojoWithDefaultAnnotation(); + PojoWithDefaultAnnotation pojo1 = new PojoWithDefaultAnnotation(); pojo.setAuthor(""); pojo.setId("1"); Point p = Point.measurementByPOJO(pojo.getClass()).addFieldsFromPOJO(pojo).build(); - Assertions.assertEquals(pojo.getAuthor(),p.getFields().get("author")); - Assertions.assertEquals(pojo.getId(),p.getFields().get("id")); + //Completely separate pojo with different reference to compare against + pojo1.setAuthor(""); + pojo1.setId("1"); + Assertions.assertEquals(pojo1.getAuthor(),p.getFields().get("author")); + Assertions.assertEquals(pojo1.getId(),p.getFields().get("id")); } @Test From b7e401a813974192af055ff37dea74f6ff4004a2 Mon Sep 17 00:00:00 2001 From: Brenton Poke Date: Sun, 16 Aug 2020 20:08:17 -0400 Subject: [PATCH 4/7] Revert "slightly more relevent unit test" This reverts commit 9719e0c378c1f8a4deef5a7deee36fdd6e880b1c. --- src/test/java/org/influxdb/dto/PointTest.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/test/java/org/influxdb/dto/PointTest.java b/src/test/java/org/influxdb/dto/PointTest.java index c2008ad5e..41d79b827 100755 --- a/src/test/java/org/influxdb/dto/PointTest.java +++ b/src/test/java/org/influxdb/dto/PointTest.java @@ -797,15 +797,11 @@ public void testAddFieldsFromPOJOWithPublicAttributes() { @Test public void testAddFieldsFromPOJOWithDefaultAnnotation() { PojoWithDefaultAnnotation pojo = new PojoWithDefaultAnnotation(); - PojoWithDefaultAnnotation pojo1 = new PojoWithDefaultAnnotation(); pojo.setAuthor(""); pojo.setId("1"); Point p = Point.measurementByPOJO(pojo.getClass()).addFieldsFromPOJO(pojo).build(); - //Completely separate pojo with different reference to compare against - pojo1.setAuthor(""); - pojo1.setId("1"); - Assertions.assertEquals(pojo1.getAuthor(),p.getFields().get("author")); - Assertions.assertEquals(pojo1.getId(),p.getFields().get("id")); + Assertions.assertEquals(pojo.getAuthor(),p.getFields().get("author")); + Assertions.assertEquals(pojo.getId(),p.getFields().get("id")); } @Test From 4132fd74a9799169718ba0cc6c72b1534547e339 Mon Sep 17 00:00:00 2001 From: Brenton Poke Date: Thu, 20 Aug 2020 09:18:45 -0400 Subject: [PATCH 5/7] fixed according to feedback --- .../java/org/influxdb/annotation/Default.java | 5 ++ src/main/java/org/influxdb/dto/Point.java | 24 +++++- src/test/java/org/influxdb/dto/PointTest.java | 79 +++++++++++++++++-- 3 files changed, 99 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/influxdb/annotation/Default.java b/src/main/java/org/influxdb/annotation/Default.java index 58e0d10ed..0ce8a0bd0 100644 --- a/src/main/java/org/influxdb/annotation/Default.java +++ b/src/main/java/org/influxdb/annotation/Default.java @@ -9,4 +9,9 @@ @Target(value = ElementType.FIELD) public @interface Default { String value() default ""; + long longValue() default 0L; + int intValue() default 0; + double doubleValue() default 0.0d; + float floatValue() default 0.0f; + boolean boolValue() default false; } diff --git a/src/main/java/org/influxdb/dto/Point.java b/src/main/java/org/influxdb/dto/Point.java index a65a61de5..b06a4b8db 100755 --- a/src/main/java/org/influxdb/dto/Point.java +++ b/src/main/java/org/influxdb/dto/Point.java @@ -293,6 +293,26 @@ public Builder addFieldsFromPOJO(final Object pojo) { private void addFieldByAttribute(final Object pojo, final Field field, final Column column, final String fieldName) { try { + if (field.isAnnotationPresent(Default.class)) { + Default val = field.getAnnotation(Default.class); + if (field.getType().equals(String.class)) { + field.set(pojo, val.value()); + } else if (field.getType().equals(Long.class)) { + field.set(pojo, val.longValue()); + } else if (field.getType().equals(Integer.class)) { + field.set(pojo, val.intValue()); + } else if (field.getType().equals(BigDecimal.class)) { + field.set(pojo, BigDecimal.valueOf(0L)); + } else if (field.getType().equals(BigInteger.class)) { + field.set(pojo, BigInteger.valueOf(0)); + } else if (field.getType().equals(Boolean.class)) { + field.set(pojo, val.boolValue()); + } else if (field.getType().equals(Float.class)) { + field.set(pojo, val.floatValue()); + } else if (field.getType().equals(Double.class)) { + field.set(pojo, val.doubleValue()); + } + } Object fieldValue = field.get(pojo); TimeColumn tc = field.getAnnotation(TimeColumn.class); @@ -322,10 +342,6 @@ private void addFieldByAttribute(final Object pojo, final Field field, final Col this.fields.put(fieldName, fieldValue); } } - if (field.isAnnotationPresent(Default.class)) { - Default val = field.getAnnotation(Default.class); - field.set(pojo, val.value()); - } } catch (IllegalArgumentException | IllegalAccessException e) { // Can not happen since we use metadata got from the object diff --git a/src/test/java/org/influxdb/dto/PointTest.java b/src/test/java/org/influxdb/dto/PointTest.java index 41d79b827..bdebe697c 100755 --- a/src/test/java/org/influxdb/dto/PointTest.java +++ b/src/test/java/org/influxdb/dto/PointTest.java @@ -797,11 +797,23 @@ public void testAddFieldsFromPOJOWithPublicAttributes() { @Test public void testAddFieldsFromPOJOWithDefaultAnnotation() { PojoWithDefaultAnnotation pojo = new PojoWithDefaultAnnotation(); - pojo.setAuthor(""); - pojo.setId("1"); + Point p = Point.measurementByPOJO(pojo.getClass()).addFieldsFromPOJO(pojo).build(); - Assertions.assertEquals(pojo.getAuthor(),p.getFields().get("author")); - Assertions.assertEquals(pojo.getId(),p.getFields().get("id")); + Assertions.assertTrue(pojo.getISBN().equals(20L)); + Assertions.assertTrue(pojo.booleanObject.equals(false)); + Assertions.assertTrue(pojo.integerObject.equals(20)); + Assertions.assertTrue(pojo.doubleObject.equals(20.0d)); + Assertions.assertTrue(pojo.floatObject.equals(0.0f)); + Assertions.assertTrue(pojo.bigDecimal.equals(BigDecimal.ZERO)); + Assertions.assertTrue(pojo.bigInteger.equals(BigInteger.ZERO)); + + Assertions.assertTrue(p.getFields().get("author").equals("")); + Assertions.assertTrue(p.getFields().get("id").equals("2")); + Assertions.assertTrue(p.getFields().get("booleanObject").equals(false)); + Assertions.assertTrue(p.getFields().get("doubleObject").equals(20.0d)); + Assertions.assertTrue(p.getFields().get("floatObject").equals(0.0f)); + Assertions.assertTrue(p.getFields().get("bigDecimal").equals(BigDecimal.ZERO)); + Assertions.assertTrue(p.getFields().get("bigInteger").equals(BigInteger.ZERO)); } @Test @@ -835,14 +847,65 @@ public void setId(String id) { @Measurement(name = "mymeasurement") static class PojoWithDefaultAnnotation { - @Default("1") + @Default("2") @Column(name = "id") private String id; //check alternate order of annotations. ¯\_(ツ)_/¯ @Column(name = "author") @Default private String author; + + @Default(doubleValue = 20.0d) + @Column(name = "doubleObject") + private Double doubleObject; + + @Default(intValue = 20) + @Column(name = "integerObject") + private Integer integerObject; + + @Default + @Column(name = "booleanObject") + private Boolean booleanObject; + @Default + @Column(name = "floatObject") + private Float floatObject; + + @Default + @Column(name = "bigDecimal") + private BigDecimal bigDecimal; + + @Default + @Column(name = "bigInteger") + private BigInteger bigInteger; + @Default(longValue = 20L) + @Column(name = "ISBN") + private Long ISBN; + + public Double getDoubleObject() { + return doubleObject; + } + + public Integer getIntegerObject() { + return integerObject; + } + + public Boolean getBooleanObject() { + return booleanObject; + } + + public Float getFloatObject() { + return floatObject; + } + + public BigDecimal getBigDecimal() { + return bigDecimal; + } + + public BigInteger getBigInteger() { + return bigInteger; + } + public String getAuthor() { return author; } @@ -855,6 +918,12 @@ public String getId() { public void setId(String id) { this.id = id; } + public Long getISBN() { + return ISBN; + } + public void setISBN(Long ISBN) { + this.ISBN = ISBN; + } } @Measurement(name = "mymeasurement") From 2cb74d07c8ef4a1cfaa03bb690fa8cc39bc9337c Mon Sep 17 00:00:00 2001 From: Brenton Poke Date: Thu, 20 Aug 2020 10:18:06 -0400 Subject: [PATCH 6/7] further fix and soundness check --- src/main/java/org/influxdb/dto/Point.java | 3 +- src/test/java/org/influxdb/dto/PointTest.java | 47 +++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/influxdb/dto/Point.java b/src/main/java/org/influxdb/dto/Point.java index b06a4b8db..1d091ab92 100755 --- a/src/main/java/org/influxdb/dto/Point.java +++ b/src/main/java/org/influxdb/dto/Point.java @@ -293,7 +293,8 @@ public Builder addFieldsFromPOJO(final Object pojo) { private void addFieldByAttribute(final Object pojo, final Field field, final Column column, final String fieldName) { try { - if (field.isAnnotationPresent(Default.class)) { + + if (field.isAnnotationPresent(Default.class) && field.get(pojo) == null) { Default val = field.getAnnotation(Default.class); if (field.getType().equals(String.class)) { field.set(pojo, val.value()); diff --git a/src/test/java/org/influxdb/dto/PointTest.java b/src/test/java/org/influxdb/dto/PointTest.java index bdebe697c..b04ad370b 100755 --- a/src/test/java/org/influxdb/dto/PointTest.java +++ b/src/test/java/org/influxdb/dto/PointTest.java @@ -814,6 +814,29 @@ public void testAddFieldsFromPOJOWithDefaultAnnotation() { Assertions.assertTrue(p.getFields().get("floatObject").equals(0.0f)); Assertions.assertTrue(p.getFields().get("bigDecimal").equals(BigDecimal.ZERO)); Assertions.assertTrue(p.getFields().get("bigInteger").equals(BigInteger.ZERO)); + + //Soundness check + pojo.setId("41"); + pojo.setAuthor("William Gibson"); + pojo.setISBN(342134566545L); + pojo.setBigDecimal(BigDecimal.valueOf(12435125.435434)); + pojo.setBooleanObject(true); + pojo.setBigInteger(new BigInteger(String.valueOf(54635265426256L))); + pojo.setDoubleObject(453.654d); + pojo.setFloatObject(5434.787f); + pojo.setIntegerObject(5346546); + p = Point.measurementByPOJO(pojo.getClass()).addFieldsFromPOJO(pojo).build(); + + Assertions.assertFalse(p.getFields().get("id").equals("2")); + Assertions.assertTrue(p.getFields().get("id").equals("41")); + Assertions.assertTrue(p.getFields().get("author").equals("William Gibson")); + Assertions.assertFalse(p.getFields().get("author").equals("")); + Assertions.assertFalse(p.getFields().get("booleanObject").equals(false)); + Assertions.assertFalse(p.getFields().get("doubleObject").equals(20.0d)); + Assertions.assertFalse(p.getFields().get("floatObject").equals(0.0f)); + Assertions.assertFalse(p.getFields().get("bigDecimal").equals(BigDecimal.ZERO)); + Assertions.assertFalse(p.getFields().get("bigInteger").equals(BigInteger.ZERO)); + } @Test @@ -906,6 +929,30 @@ public BigInteger getBigInteger() { return bigInteger; } + public void setDoubleObject(Double doubleObject) { + this.doubleObject = doubleObject; + } + + public void setIntegerObject(Integer integerObject) { + this.integerObject = integerObject; + } + + public void setBooleanObject(Boolean booleanObject) { + this.booleanObject = booleanObject; + } + + public void setFloatObject(Float floatObject) { + this.floatObject = floatObject; + } + + public void setBigDecimal(BigDecimal bigDecimal) { + this.bigDecimal = bigDecimal; + } + + public void setBigInteger(BigInteger bigInteger) { + this.bigInteger = bigInteger; + } + public String getAuthor() { return author; } From f54d76a9b345ccc742cb5d6bc6d1868c5902f111 Mon Sep 17 00:00:00 2001 From: Brenton Poke Date: Thu, 20 Aug 2020 10:25:30 -0400 Subject: [PATCH 7/7] =?UTF-8?q?checkstyle=20=F0=9F=98=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/influxdb/dto/Point.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/influxdb/dto/Point.java b/src/main/java/org/influxdb/dto/Point.java index 1d091ab92..9dfac79c9 100755 --- a/src/main/java/org/influxdb/dto/Point.java +++ b/src/main/java/org/influxdb/dto/Point.java @@ -293,7 +293,6 @@ public Builder addFieldsFromPOJO(final Object pojo) { private void addFieldByAttribute(final Object pojo, final Field field, final Column column, final String fieldName) { try { - if (field.isAnnotationPresent(Default.class) && field.get(pojo) == null) { Default val = field.getAnnotation(Default.class); if (field.getType().equals(String.class)) {